Validate renderer shader descriptors

This commit is contained in:
2026-06-01 09:05:43 +02:00
parent 44aebf61b2
commit 4eee018367
5 changed files with 114 additions and 4 deletions

View File

@@ -15,9 +15,12 @@ using pp::renderer::IShaderProgram;
using pp::renderer::MeshDesc;
using pp::renderer::PrimitiveTopology;
using pp::renderer::ReadbackRegion;
using pp::renderer::ShaderProgramDesc;
using pp::renderer::ShaderStageSource;
using pp::renderer::TextureDesc;
using pp::renderer::TextureFormat;
using pp::renderer::Viewport;
using pp::renderer::max_shader_source_bytes;
using pp::renderer::max_texture_dimension;
using pp::renderer::primitive_topology_name;
using pp::renderer::texture_byte_size;
@@ -25,6 +28,7 @@ using pp::renderer::texture_format_name;
using pp::renderer::validate_extent;
using pp::renderer::validate_mesh_desc;
using pp::renderer::validate_readback_region;
using pp::renderer::validate_shader_program_desc;
using pp::renderer::validate_viewport;
namespace {
@@ -220,6 +224,56 @@ void validates_viewports_and_mesh_descriptors(pp::tests::Harness& h)
PP_EXPECT(h, empty_mesh.code == StatusCode::invalid_argument);
}
void validates_shader_program_descriptors(pp::tests::Harness& h)
{
constexpr char vertex_source[] = "#version 330 core\nvoid main(){}";
constexpr char fragment_source[] = "#version 330 core\nout vec4 color; void main(){ color = vec4(1); }";
const ShaderProgramDesc valid {
.debug_name = "solid-color",
.vertex = ShaderStageSource {
.entry_point = "main",
.source = vertex_source,
.source_size = sizeof(vertex_source) - 1U,
},
.fragment = ShaderStageSource {
.entry_point = "main",
.source = fragment_source,
.source_size = sizeof(fragment_source) - 1U,
},
};
PP_EXPECT(h, validate_shader_program_desc(valid).ok());
auto missing_name = valid;
missing_name.debug_name = nullptr;
auto missing_vertex_entry = valid;
missing_vertex_entry.vertex.entry_point = "";
auto missing_fragment_source = valid;
missing_fragment_source.fragment.source = nullptr;
auto empty_fragment_source = valid;
empty_fragment_source.fragment.source_size = 0;
auto excessive_source = valid;
excessive_source.vertex.source_size = max_shader_source_bytes + 1U;
const auto missing_name_status = validate_shader_program_desc(missing_name);
const auto missing_vertex_entry_status = validate_shader_program_desc(missing_vertex_entry);
const auto missing_fragment_source_status = validate_shader_program_desc(missing_fragment_source);
const auto empty_fragment_source_status = validate_shader_program_desc(empty_fragment_source);
const auto excessive_source_status = validate_shader_program_desc(excessive_source);
PP_EXPECT(h, !missing_name_status.ok());
PP_EXPECT(h, missing_name_status.code == StatusCode::invalid_argument);
PP_EXPECT(h, !missing_vertex_entry_status.ok());
PP_EXPECT(h, missing_vertex_entry_status.code == StatusCode::invalid_argument);
PP_EXPECT(h, !missing_fragment_source_status.ok());
PP_EXPECT(h, missing_fragment_source_status.code == StatusCode::invalid_argument);
PP_EXPECT(h, !empty_fragment_source_status.ok());
PP_EXPECT(h, empty_fragment_source_status.code == StatusCode::invalid_argument);
PP_EXPECT(h, !excessive_source_status.ok());
PP_EXPECT(h, excessive_source_status.code == StatusCode::out_of_range);
}
void renderer_interfaces_support_backend_neutral_dispatch(pp::tests::Harness& h)
{
FakeRenderDevice device;
@@ -255,6 +309,7 @@ int main()
harness.run("rejects_invalid_or_excessive_extents", rejects_invalid_or_excessive_extents);
harness.run("validates_readback_bounds", validates_readback_bounds);
harness.run("validates_viewports_and_mesh_descriptors", validates_viewports_and_mesh_descriptors);
harness.run("validates_shader_program_descriptors", validates_shader_program_descriptors);
harness.run("renderer_interfaces_support_backend_neutral_dispatch", renderer_interfaces_support_backend_neutral_dispatch);
return harness.finish();
}