Validate OpenGL command plan dependencies
This commit is contained in:
@@ -59,6 +59,16 @@ pp::renderer::RecordedRenderCommand shader_uniform_command(const char* name, std
|
||||
return command;
|
||||
}
|
||||
|
||||
pp::renderer::RecordedRenderCommand bind_mesh_command() noexcept
|
||||
{
|
||||
pp::renderer::RecordedRenderCommand command;
|
||||
command.kind = pp::renderer::RecordedRenderCommandKind::bind_mesh;
|
||||
command.mesh_desc.topology = pp::renderer::PrimitiveTopology::triangles;
|
||||
command.mesh_desc.vertex_count = 3U;
|
||||
command.mesh_desc.index_count = 3U;
|
||||
return command;
|
||||
}
|
||||
|
||||
pp::renderer::RecordedRenderCommand blit_command(pp::renderer::BlitFilter filter) noexcept
|
||||
{
|
||||
pp::renderer::RecordedRenderCommand command;
|
||||
@@ -380,6 +390,7 @@ void plans_valid_recorded_command_streams(pp::tests::Harness& h)
|
||||
viewport_command(),
|
||||
bind_shader_command("stream-shader"),
|
||||
shader_uniform_command("mvp", 64U),
|
||||
bind_mesh_command(),
|
||||
draw_command(),
|
||||
command_with_kind(pp::renderer::RecordedRenderCommandKind::end_render_pass),
|
||||
blit_command(pp::renderer::BlitFilter::nearest),
|
||||
@@ -397,14 +408,17 @@ void plans_valid_recorded_command_streams(pp::tests::Harness& h)
|
||||
PP_EXPECT(h, plan.trace_command_count == 1U);
|
||||
PP_EXPECT(h, plan.unsupported_command_count == 0U);
|
||||
PP_EXPECT(h, plan.render_pass_order_error_count == 0U);
|
||||
PP_EXPECT(h, plan.dependency_error_count == 0U);
|
||||
PP_EXPECT(h, plan.first_unsupported_command == pp::renderer::gl::OpenGlCommandPlan::npos);
|
||||
PP_EXPECT(h, plan.first_render_pass_order_error == pp::renderer::gl::OpenGlCommandPlan::npos);
|
||||
PP_EXPECT(h, plan.first_dependency_error == pp::renderer::gl::OpenGlCommandPlan::npos);
|
||||
PP_EXPECT(h, !plan.ended_in_render_pass);
|
||||
PP_EXPECT(h, plan.commands[1].kind == pp::renderer::gl::OpenGlPlannedCommandKind::begin_render_pass);
|
||||
PP_EXPECT(h, plan.commands[3].kind == pp::renderer::gl::OpenGlPlannedCommandKind::bind_shader);
|
||||
PP_EXPECT(h, plan.commands[4].kind == pp::renderer::gl::OpenGlPlannedCommandKind::set_shader_uniform);
|
||||
PP_EXPECT(h, plan.commands[5].kind == pp::renderer::gl::OpenGlPlannedCommandKind::draw);
|
||||
PP_EXPECT(h, plan.commands[7].kind == pp::renderer::gl::OpenGlPlannedCommandKind::blit_render_target);
|
||||
PP_EXPECT(h, plan.commands[5].kind == pp::renderer::gl::OpenGlPlannedCommandKind::bind_mesh);
|
||||
PP_EXPECT(h, plan.commands[6].kind == pp::renderer::gl::OpenGlPlannedCommandKind::draw);
|
||||
PP_EXPECT(h, plan.commands[8].kind == pp::renderer::gl::OpenGlPlannedCommandKind::blit_render_target);
|
||||
}
|
||||
|
||||
void flags_broken_render_pass_command_order(pp::tests::Harness& h)
|
||||
@@ -439,10 +453,65 @@ void flags_broken_render_pass_command_order(pp::tests::Harness& h)
|
||||
PP_EXPECT(h, unclosed.ended_in_render_pass);
|
||||
}
|
||||
|
||||
void flags_missing_render_dependencies(pp::tests::Harness& h)
|
||||
{
|
||||
const std::vector<pp::renderer::RecordedRenderCommand> uniform_before_shader {
|
||||
begin_render_pass_command(),
|
||||
shader_uniform_command("mvp", 64U),
|
||||
bind_shader_command("shader"),
|
||||
bind_mesh_command(),
|
||||
draw_command(),
|
||||
command_with_kind(pp::renderer::RecordedRenderCommandKind::end_render_pass),
|
||||
};
|
||||
const std::vector<pp::renderer::RecordedRenderCommand> draw_without_mesh {
|
||||
begin_render_pass_command(),
|
||||
bind_shader_command("shader"),
|
||||
draw_command(),
|
||||
command_with_kind(pp::renderer::RecordedRenderCommandKind::end_render_pass),
|
||||
};
|
||||
const std::vector<pp::renderer::RecordedRenderCommand> draw_without_shader {
|
||||
begin_render_pass_command(),
|
||||
bind_mesh_command(),
|
||||
draw_command(),
|
||||
command_with_kind(pp::renderer::RecordedRenderCommandKind::end_render_pass),
|
||||
};
|
||||
const std::vector<pp::renderer::RecordedRenderCommand> second_pass_missing_bindings {
|
||||
begin_render_pass_command(),
|
||||
bind_shader_command("shader"),
|
||||
bind_mesh_command(),
|
||||
draw_command(),
|
||||
command_with_kind(pp::renderer::RecordedRenderCommandKind::end_render_pass),
|
||||
begin_render_pass_command(),
|
||||
draw_command(),
|
||||
command_with_kind(pp::renderer::RecordedRenderCommandKind::end_render_pass),
|
||||
};
|
||||
|
||||
const auto bad_uniform = pp::renderer::gl::plan_recorded_render_commands(uniform_before_shader);
|
||||
const auto bad_mesh = pp::renderer::gl::plan_recorded_render_commands(draw_without_mesh);
|
||||
const auto bad_shader = pp::renderer::gl::plan_recorded_render_commands(draw_without_shader);
|
||||
const auto bad_second_pass = pp::renderer::gl::plan_recorded_render_commands(second_pass_missing_bindings);
|
||||
|
||||
PP_EXPECT(h, !bad_uniform.supported);
|
||||
PP_EXPECT(h, bad_uniform.dependency_error_count == 1U);
|
||||
PP_EXPECT(h, bad_uniform.first_dependency_error == 1U);
|
||||
PP_EXPECT(h, !bad_mesh.supported);
|
||||
PP_EXPECT(h, bad_mesh.dependency_error_count == 1U);
|
||||
PP_EXPECT(h, bad_mesh.first_dependency_error == 2U);
|
||||
PP_EXPECT(h, !bad_shader.supported);
|
||||
PP_EXPECT(h, bad_shader.dependency_error_count == 1U);
|
||||
PP_EXPECT(h, bad_shader.first_dependency_error == 2U);
|
||||
PP_EXPECT(h, !bad_second_pass.supported);
|
||||
PP_EXPECT(h, bad_second_pass.dependency_error_count == 1U);
|
||||
PP_EXPECT(h, bad_second_pass.first_dependency_error == 6U);
|
||||
PP_EXPECT(h, bad_second_pass.render_pass_order_error_count == 0U);
|
||||
}
|
||||
|
||||
void tracks_unsupported_commands_in_streams(pp::tests::Harness& h)
|
||||
{
|
||||
std::vector<pp::renderer::RecordedRenderCommand> commands {
|
||||
begin_render_pass_command(),
|
||||
bind_shader_command("shader"),
|
||||
bind_mesh_command(),
|
||||
draw_command(),
|
||||
command_with_kind(pp::renderer::RecordedRenderCommandKind::end_render_pass),
|
||||
command_with_kind(static_cast<pp::renderer::RecordedRenderCommandKind>(255U)),
|
||||
@@ -452,9 +521,10 @@ void tracks_unsupported_commands_in_streams(pp::tests::Harness& h)
|
||||
|
||||
PP_EXPECT(h, !plan.supported);
|
||||
PP_EXPECT(h, plan.unsupported_command_count == 1U);
|
||||
PP_EXPECT(h, plan.first_unsupported_command == 3U);
|
||||
PP_EXPECT(h, plan.first_unsupported_command == 5U);
|
||||
PP_EXPECT(h, plan.render_pass_order_error_count == 0U);
|
||||
PP_EXPECT(h, plan.commands[3].kind == pp::renderer::gl::OpenGlPlannedCommandKind::unknown);
|
||||
PP_EXPECT(h, plan.dependency_error_count == 0U);
|
||||
PP_EXPECT(h, plan.commands[5].kind == pp::renderer::gl::OpenGlPlannedCommandKind::unknown);
|
||||
}
|
||||
|
||||
void counts_typed_texture_commands_in_streams(pp::tests::Harness& h)
|
||||
@@ -525,6 +595,7 @@ int main()
|
||||
harness.run("names_planned_command_kinds", names_planned_command_kinds);
|
||||
harness.run("plans_valid_recorded_command_streams", plans_valid_recorded_command_streams);
|
||||
harness.run("flags_broken_render_pass_command_order", flags_broken_render_pass_command_order);
|
||||
harness.run("flags_missing_render_dependencies", flags_missing_render_dependencies);
|
||||
harness.run("tracks_unsupported_commands_in_streams", tracks_unsupported_commands_in_streams);
|
||||
harness.run("counts_typed_texture_commands_in_streams", counts_typed_texture_commands_in_streams);
|
||||
return harness.finish();
|
||||
|
||||
Reference in New Issue
Block a user