Route shader runtime calls through renderer GL

This commit is contained in:
2026-06-03 06:53:51 +02:00
parent f20595aff6
commit acdaf3bb8e
6 changed files with 717 additions and 17 deletions

View File

@@ -883,6 +883,153 @@ pp::foundation::Status bind_opengl_sampler_object(
return pp::foundation::Status::success();
}
pp::foundation::Status use_opengl_program(
std::uint32_t program_id,
OpenGlProgramUseDispatch dispatch) noexcept
{
if (dispatch.use_program == nullptr) {
return pp::foundation::Status::invalid_argument("OpenGL program use dispatch callback must not be null");
}
dispatch.use_program(program_id);
return pp::foundation::Status::success();
}
pp::foundation::Status delete_opengl_program(
std::uint32_t program_id,
OpenGlProgramDeleteDispatch dispatch) noexcept
{
if (dispatch.use_program == nullptr || dispatch.delete_program == nullptr) {
return pp::foundation::Status::invalid_argument("OpenGL program delete dispatch callbacks must not be null");
}
if (program_id == 0U) {
return pp::foundation::Status::success();
}
dispatch.use_program(default_framebuffer_id());
dispatch.delete_program(program_id);
return pp::foundation::Status::success();
}
pp::foundation::Status set_opengl_uniform_vec4(
std::int32_t location,
const float* values,
OpenGlUniformVec4Dispatch dispatch) noexcept
{
if (dispatch.uniform_4fv == nullptr) {
return pp::foundation::Status::invalid_argument("OpenGL vec4 uniform dispatch callback must not be null");
}
if (values == nullptr) {
return pp::foundation::Status::invalid_argument("OpenGL vec4 uniform values must not be null");
}
dispatch.uniform_4fv(location, 1, values);
return pp::foundation::Status::success();
}
pp::foundation::Status set_opengl_uniform_vec3(
std::int32_t location,
const float* values,
OpenGlUniformVec3Dispatch dispatch) noexcept
{
if (dispatch.uniform_3fv == nullptr) {
return pp::foundation::Status::invalid_argument("OpenGL vec3 uniform dispatch callback must not be null");
}
if (values == nullptr) {
return pp::foundation::Status::invalid_argument("OpenGL vec3 uniform values must not be null");
}
dispatch.uniform_3fv(location, 1, values);
return pp::foundation::Status::success();
}
pp::foundation::Status set_opengl_uniform_vec2(
std::int32_t location,
const float* values,
OpenGlUniformVec2Dispatch dispatch) noexcept
{
if (dispatch.uniform_2fv == nullptr) {
return pp::foundation::Status::invalid_argument("OpenGL vec2 uniform dispatch callback must not be null");
}
if (values == nullptr) {
return pp::foundation::Status::invalid_argument("OpenGL vec2 uniform values must not be null");
}
dispatch.uniform_2fv(location, 1, values);
return pp::foundation::Status::success();
}
pp::foundation::Status set_opengl_uniform_mat4(
std::int32_t location,
const float* values,
OpenGlUniformMat4Dispatch dispatch) noexcept
{
if (dispatch.uniform_matrix_4fv == nullptr) {
return pp::foundation::Status::invalid_argument("OpenGL mat4 uniform dispatch callback must not be null");
}
if (values == nullptr) {
return pp::foundation::Status::invalid_argument("OpenGL mat4 uniform values must not be null");
}
dispatch.uniform_matrix_4fv(
location,
1,
static_cast<std::uint8_t>(matrix_uniform_not_transposed()),
values);
return pp::foundation::Status::success();
}
pp::foundation::Status set_opengl_uniform_int(
std::int32_t location,
std::int32_t value,
OpenGlUniformIntDispatch dispatch) noexcept
{
if (dispatch.uniform_1i == nullptr) {
return pp::foundation::Status::invalid_argument("OpenGL int uniform dispatch callback must not be null");
}
dispatch.uniform_1i(location, value);
return pp::foundation::Status::success();
}
pp::foundation::Status set_opengl_uniform_float(
std::int32_t location,
float value,
OpenGlUniformFloatDispatch dispatch) noexcept
{
if (dispatch.uniform_1f == nullptr) {
return pp::foundation::Status::invalid_argument("OpenGL float uniform dispatch callback must not be null");
}
dispatch.uniform_1f(location, value);
return pp::foundation::Status::success();
}
pp::foundation::Result<std::int32_t> get_opengl_attribute_location(
std::uint32_t program_id,
const char* attribute_name,
OpenGlAttributeLocationDispatch dispatch) noexcept
{
if (dispatch.get_attrib_location == nullptr) {
return pp::foundation::Result<std::int32_t>::failure(
pp::foundation::Status::invalid_argument(
"OpenGL attribute-location dispatch callback must not be null"));
}
if (program_id == 0U || attribute_name == nullptr || attribute_name[0] == '\0') {
return pp::foundation::Result<std::int32_t>::failure(
pp::foundation::Status::invalid_argument("OpenGL attribute-location parameters are invalid"));
}
return pp::foundation::Result<std::int32_t>::success(
dispatch.get_attrib_location(program_id, attribute_name));
}
std::uint32_t extension_count_query() noexcept
{
return gl_num_extensions;

View File

@@ -220,6 +220,18 @@ using OpenGlScissorFn = void (*)(std::int32_t x, std::int32_t y, std::int32_t wi
using OpenGlBlendFuncFn = void (*)(std::uint32_t source_factor, std::uint32_t destination_factor) noexcept;
using OpenGlBlendEquationSeparateFn = void (*)(std::uint32_t color_equation, std::uint32_t alpha_equation) noexcept;
using OpenGlUseProgramFn = void (*)(std::uint32_t program) noexcept;
using OpenGlDeleteProgramFn = void (*)(std::uint32_t program) noexcept;
using OpenGlUniform4fvFn = void (*)(std::int32_t location, std::int32_t count, const float* values) noexcept;
using OpenGlUniform3fvFn = void (*)(std::int32_t location, std::int32_t count, const float* values) noexcept;
using OpenGlUniform2fvFn = void (*)(std::int32_t location, std::int32_t count, const float* values) noexcept;
using OpenGlUniformMatrix4fvFn = void (*)(
std::int32_t location,
std::int32_t count,
std::uint8_t transpose,
const float* values) noexcept;
using OpenGlUniform1iFn = void (*)(std::int32_t location, std::int32_t value) noexcept;
using OpenGlUniform1fFn = void (*)(std::int32_t location, float value) noexcept;
using OpenGlGetAttribLocationFn = std::int32_t (*)(std::uint32_t program, const char* name) noexcept;
using OpenGlBindFramebufferFn = void (*)(std::uint32_t target, std::uint32_t framebuffer) noexcept;
using OpenGlBindTextureFn = void (*)(std::uint32_t target, std::uint32_t texture) noexcept;
using OpenGlBindSamplerFn = void (*)(std::uint32_t unit, std::uint32_t sampler) noexcept;
@@ -433,6 +445,43 @@ struct OpenGlSamplerBindDispatch {
OpenGlBindSamplerFn bind_sampler = nullptr;
};
struct OpenGlProgramUseDispatch {
OpenGlUseProgramFn use_program = nullptr;
};
struct OpenGlProgramDeleteDispatch {
OpenGlUseProgramFn use_program = nullptr;
OpenGlDeleteProgramFn delete_program = nullptr;
};
struct OpenGlUniformVec4Dispatch {
OpenGlUniform4fvFn uniform_4fv = nullptr;
};
struct OpenGlUniformVec3Dispatch {
OpenGlUniform3fvFn uniform_3fv = nullptr;
};
struct OpenGlUniformVec2Dispatch {
OpenGlUniform2fvFn uniform_2fv = nullptr;
};
struct OpenGlUniformMat4Dispatch {
OpenGlUniformMatrix4fvFn uniform_matrix_4fv = nullptr;
};
struct OpenGlUniformIntDispatch {
OpenGlUniform1iFn uniform_1i = nullptr;
};
struct OpenGlUniformFloatDispatch {
OpenGlUniform1fFn uniform_1f = nullptr;
};
struct OpenGlAttributeLocationDispatch {
OpenGlGetAttribLocationFn get_attrib_location = nullptr;
};
[[nodiscard]] OpenGlCapabilities detect_opengl_capabilities(
std::span<const std::string_view> extensions,
OpenGlRuntime runtime) noexcept;
@@ -520,6 +569,40 @@ struct OpenGlSamplerBindDispatch {
std::uint32_t unit,
std::uint32_t sampler_id,
OpenGlSamplerBindDispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Status use_opengl_program(
std::uint32_t program_id,
OpenGlProgramUseDispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Status delete_opengl_program(
std::uint32_t program_id,
OpenGlProgramDeleteDispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Status set_opengl_uniform_vec4(
std::int32_t location,
const float* values,
OpenGlUniformVec4Dispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Status set_opengl_uniform_vec3(
std::int32_t location,
const float* values,
OpenGlUniformVec3Dispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Status set_opengl_uniform_vec2(
std::int32_t location,
const float* values,
OpenGlUniformVec2Dispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Status set_opengl_uniform_mat4(
std::int32_t location,
const float* values,
OpenGlUniformMat4Dispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Status set_opengl_uniform_int(
std::int32_t location,
std::int32_t value,
OpenGlUniformIntDispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Status set_opengl_uniform_float(
std::int32_t location,
float value,
OpenGlUniformFloatDispatch dispatch) noexcept;
[[nodiscard]] pp::foundation::Result<std::int32_t> get_opengl_attribute_location(
std::uint32_t program_id,
const char* attribute_name,
OpenGlAttributeLocationDispatch dispatch) noexcept;
[[nodiscard]] std::uint32_t extension_count_query() noexcept;
[[nodiscard]] std::uint32_t extension_string_name() noexcept;