Map renderer color write masks to OpenGL

This commit is contained in:
2026-06-02 20:15:56 +02:00
parent 77c2a68cc5
commit cc4eaef3e6
5 changed files with 48 additions and 4 deletions

View File

@@ -215,8 +215,9 @@ Known local toolchain state:
queries, active-uniform count query, and matrix-uniform transpose token used queries, active-uniform count query, and matrix-uniform transpose token used
by legacy `Shader` creation also live here. Renderer API blend factor/op to by legacy `Shader` creation also live here. Renderer API blend factor/op to
OpenGL token mapping is tested here with explicit support flags so `GL_ZERO` OpenGL token mapping is tested here with explicit support flags so `GL_ZERO`
stays distinguishable from unsupported enum values. Renderer API depth stays distinguishable from unsupported enum values. Renderer API blend-state
compare-op to OpenGL depth-function mapping is tested here too. `Shader` no longer spells GL enum color-write masks and depth compare-op to OpenGL depth-function mapping are
tested here too. `Shader` no longer spells GL enum
names directly. It also owns the PanoPainter shader uniform catalog and legacy hash names directly. It also owns the PanoPainter shader uniform catalog and legacy hash
mapping used by `Shader` active-uniform discovery and the uniform uniqueness mapping used by `Shader` active-uniform discovery and the uniform uniqueness
check. App OpenGL initialization debug severity, debug output, GL info string, check. App OpenGL initialization debug severity, debug output, GL info string,

View File

@@ -473,8 +473,8 @@ count query, and matrix-uniform transpose token also live in `pp_renderer_gl`
and are consumed by legacy `Shader` creation. Renderer API blend factor/op to and are consumed by legacy `Shader` creation. Renderer API blend factor/op to
OpenGL token mapping also lives in `pp_renderer_gl`, with explicit support flags OpenGL token mapping also lives in `pp_renderer_gl`, with explicit support flags
so `GL_ZERO` remains distinguishable from unsupported enum values. Renderer API so `GL_ZERO` remains distinguishable from unsupported enum values. Renderer API
depth compare-op to OpenGL depth-function mapping also lives in blend-state color-write masks and depth compare-op to OpenGL depth-function
`pp_renderer_gl`. Shader uniform hashing, catalog mapping also live in `pp_renderer_gl`. Shader uniform hashing, catalog
validation, active-uniform mapping, and the legacy uniform uniqueness check now validation, active-uniform mapping, and the legacy uniform uniqueness check now
delegate to `pp_renderer_gl` as well. `Shader` no longer spells GL enum names delegate to `pp_renderer_gl` as well. `Shader` no longer spells GL enum names
directly. App OpenGL initialization debug severity, debug output, GL info directly. App OpenGL initialization debug severity, debug output, GL info

View File

@@ -803,6 +803,16 @@ std::uint8_t color_write_enabled() noexcept
return gl_boolean_true; return gl_boolean_true;
} }
OpenGlColorWriteMask color_write_mask_for_renderer_blend_state(pp::renderer::BlendState state) noexcept
{
return OpenGlColorWriteMask {
.r = state.write_r ? gl_boolean_true : gl_boolean_false,
.g = state.write_g ? gl_boolean_true : gl_boolean_false,
.b = state.write_b ? gl_boolean_true : gl_boolean_false,
.a = state.write_a ? gl_boolean_true : gl_boolean_false,
};
}
std::uint32_t linear_texture_filter() noexcept std::uint32_t linear_texture_filter() noexcept
{ {
return gl_linear; return gl_linear;

View File

@@ -39,6 +39,13 @@ struct OpenGlEnumMapping {
bool supported = false; bool supported = false;
}; };
struct OpenGlColorWriteMask {
std::uint8_t r = 0;
std::uint8_t g = 0;
std::uint8_t b = 0;
std::uint8_t a = 0;
};
struct OpenGlReadbackFormat { struct OpenGlReadbackFormat {
std::uint32_t pixel_format = 0; std::uint32_t pixel_format = 0;
std::uint32_t component_type = 0; std::uint32_t component_type = 0;
@@ -155,6 +162,8 @@ struct OpenGlWindowsWglContextConfig {
[[nodiscard]] std::uint32_t rgba32f_internal_format() noexcept; [[nodiscard]] std::uint32_t rgba32f_internal_format() noexcept;
[[nodiscard]] std::uint8_t color_write_disabled() noexcept; [[nodiscard]] std::uint8_t color_write_disabled() noexcept;
[[nodiscard]] std::uint8_t color_write_enabled() noexcept; [[nodiscard]] std::uint8_t color_write_enabled() noexcept;
[[nodiscard]] OpenGlColorWriteMask color_write_mask_for_renderer_blend_state(
pp::renderer::BlendState state) noexcept;
[[nodiscard]] std::uint32_t linear_texture_filter() noexcept; [[nodiscard]] std::uint32_t linear_texture_filter() noexcept;
[[nodiscard]] std::uint32_t linear_mipmap_linear_texture_filter() noexcept; [[nodiscard]] std::uint32_t linear_mipmap_linear_texture_filter() noexcept;
[[nodiscard]] std::uint32_t nearest_texture_filter() noexcept; [[nodiscard]] std::uint32_t nearest_texture_filter() noexcept;

View File

@@ -535,6 +535,29 @@ void maps_renderer_blend_state_tokens(pp::tests::Harness& h)
PP_EXPECT(h, invalid_op.value == 0U); PP_EXPECT(h, invalid_op.value == 0U);
} }
void maps_renderer_color_write_masks(pp::tests::Harness& h)
{
const auto default_mask = pp::renderer::gl::color_write_mask_for_renderer_blend_state(
pp::renderer::BlendState {});
const auto mixed_mask = pp::renderer::gl::color_write_mask_for_renderer_blend_state(
pp::renderer::BlendState { .write_r = true, .write_g = false, .write_b = true, .write_a = false });
const auto disabled_mask = pp::renderer::gl::color_write_mask_for_renderer_blend_state(
pp::renderer::BlendState { .write_r = false, .write_g = false, .write_b = false, .write_a = false });
PP_EXPECT(h, default_mask.r == 1U);
PP_EXPECT(h, default_mask.g == 1U);
PP_EXPECT(h, default_mask.b == 1U);
PP_EXPECT(h, default_mask.a == 1U);
PP_EXPECT(h, mixed_mask.r == 1U);
PP_EXPECT(h, mixed_mask.g == 0U);
PP_EXPECT(h, mixed_mask.b == 1U);
PP_EXPECT(h, mixed_mask.a == 0U);
PP_EXPECT(h, disabled_mask.r == 0U);
PP_EXPECT(h, disabled_mask.g == 0U);
PP_EXPECT(h, disabled_mask.b == 0U);
PP_EXPECT(h, disabled_mask.a == 0U);
}
void maps_renderer_depth_compare_tokens(pp::tests::Harness& h) void maps_renderer_depth_compare_tokens(pp::tests::Harness& h)
{ {
const auto never = pp::renderer::gl::compare_function_for_renderer_compare_op( const auto never = pp::renderer::gl::compare_function_for_renderer_compare_op(
@@ -706,6 +729,7 @@ int main()
harness.run("exposes_shader_attribute_binding_catalog", exposes_shader_attribute_binding_catalog); harness.run("exposes_shader_attribute_binding_catalog", exposes_shader_attribute_binding_catalog);
harness.run("maps_app_initialization_parameters", maps_app_initialization_parameters); harness.run("maps_app_initialization_parameters", maps_app_initialization_parameters);
harness.run("maps_renderer_blend_state_tokens", maps_renderer_blend_state_tokens); harness.run("maps_renderer_blend_state_tokens", maps_renderer_blend_state_tokens);
harness.run("maps_renderer_color_write_masks", maps_renderer_color_write_masks);
harness.run("maps_renderer_depth_compare_tokens", maps_renderer_depth_compare_tokens); harness.run("maps_renderer_depth_compare_tokens", maps_renderer_depth_compare_tokens);
harness.run("maps_windows_wgl_core_context_parameters", maps_windows_wgl_core_context_parameters); harness.run("maps_windows_wgl_core_context_parameters", maps_windows_wgl_core_context_parameters);
harness.run("rejects_invalid_shader_attribute_binding_catalogs", rejects_invalid_shader_attribute_binding_catalogs); harness.run("rejects_invalid_shader_attribute_binding_catalogs", rejects_invalid_shader_attribute_binding_catalogs);