Add renderer resource factory contract

This commit is contained in:
2026-06-02 16:09:52 +02:00
parent 881b5271a2
commit 23c308db1b
9 changed files with 389 additions and 48 deletions

View File

@@ -2211,22 +2211,22 @@ int record_render(int argc, char** argv)
}
pp::renderer::RecordingRenderDevice device;
pp::renderer::RecordingTexture2D texture(pp::renderer::TextureDesc {
const auto texture = device.create_texture(pp::renderer::TextureDesc {
.extent = pp::renderer::Extent2D { .width = args.width, .height = args.height },
.format = pp::renderer::TextureFormat::rgba8,
.render_target = true,
});
pp::renderer::RecordingRenderTarget target(pp::renderer::TextureDesc {
const auto target = device.create_render_target(pp::renderer::TextureDesc {
.extent = pp::renderer::Extent2D { .width = args.width, .height = args.height },
.format = pp::renderer::TextureFormat::rgba8,
.render_target = true,
});
pp::renderer::RecordingRenderTarget blit_target(pp::renderer::TextureDesc {
const auto blit_target = device.create_render_target(pp::renderer::TextureDesc {
.extent = pp::renderer::Extent2D { .width = args.width, .height = args.height },
.format = pp::renderer::TextureFormat::rgba8,
.render_target = true,
});
pp::renderer::RecordingReadbackBuffer readback_buffer(
const auto readback_buffer = device.create_readback_buffer(
static_cast<std::uint64_t>(args.width) * args.height * 4U);
const std::array<std::byte, 4> upload_pixel {
std::byte { 0xff },
@@ -2234,17 +2234,54 @@ int record_render(int argc, char** argv)
std::byte { 0xff },
std::byte { 0xff },
};
pp::renderer::RecordingShaderProgram shader("pano-cli-record-render");
pp::renderer::RecordingMesh mesh(pp::renderer::MeshDesc {
static constexpr char shader_source[] = "void main() {}";
const auto shader = device.create_shader_program(pp::renderer::ShaderProgramDesc {
.debug_name = "pano-cli-record-render",
.vertex = pp::renderer::ShaderStageSource {
.source = shader_source,
.source_size = sizeof(shader_source) - 1U,
},
.fragment = pp::renderer::ShaderStageSource {
.source = shader_source,
.source_size = sizeof(shader_source) - 1U,
},
});
const auto mesh = device.create_mesh(pp::renderer::MeshDesc {
.vertex_count = 3,
.index_count = 3,
.topology = pp::renderer::PrimitiveTopology::triangles,
});
if (!texture.ok()) {
print_error("record-render", texture.status().message);
return 2;
}
if (!target.ok()) {
print_error("record-render", target.status().message);
return 2;
}
if (!blit_target.ok()) {
print_error("record-render", blit_target.status().message);
return 2;
}
if (!readback_buffer.ok()) {
print_error("record-render", readback_buffer.status().message);
return 2;
}
if (!shader.ok()) {
print_error("record-render", shader.status().message);
return 2;
}
if (!mesh.ok()) {
print_error("record-render", mesh.status().message);
return 2;
}
constexpr std::size_t created_resources = 6;
device.trace()->marker("renderer", "pano_cli_record_render");
auto& context = device.immediate_context();
const auto upload_status = context.upload_texture(
texture,
*texture.value(),
pp::renderer::ReadbackRegion {
.x = 0,
.y = 0,
@@ -2258,7 +2295,7 @@ int record_render(int argc, char** argv)
}
const auto begin_status = context.begin_render_pass(
target,
*target.value(),
pp::renderer::ClearColor { .r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F });
if (!begin_status.ok()) {
print_error("record-render", begin_status.message);
@@ -2284,7 +2321,7 @@ int record_render(int argc, char** argv)
return 2;
}
const auto shader_status = context.bind_shader(shader);
const auto shader_status = context.bind_shader(*shader.value());
const auto blend_status = context.set_blend_state(pp::renderer::BlendState {
.enabled = true,
.source_color = pp::renderer::BlendFactor::source_alpha,
@@ -2297,7 +2334,7 @@ int record_render(int argc, char** argv)
.write_enabled = true,
.compare = pp::renderer::CompareOp::less_or_equal,
});
const auto bind_texture_status = context.bind_texture(0, texture);
const auto bind_texture_status = context.bind_texture(0, *texture.value());
const auto bind_sampler_status = context.bind_sampler(0, pp::renderer::SamplerDesc {
.min_filter = pp::renderer::SamplerFilter::linear,
.mag_filter = pp::renderer::SamplerFilter::linear,
@@ -2306,7 +2343,7 @@ int record_render(int argc, char** argv)
.address_v = pp::renderer::SamplerAddressMode::clamp_to_edge,
.address_w = pp::renderer::SamplerAddressMode::clamp_to_edge,
});
const auto mesh_status = context.bind_mesh(mesh);
const auto mesh_status = context.bind_mesh(*mesh.value());
const auto draw_status = context.draw();
context.end_render_pass();
@@ -2340,34 +2377,34 @@ int record_render(int argc, char** argv)
}
const auto readback_status = context.read_texture(
texture,
*texture.value(),
pp::renderer::ReadbackRegion {
.x = 0,
.y = 0,
.width = args.width,
.height = args.height,
},
readback_buffer);
*readback_buffer.value());
if (!readback_status.ok()) {
print_error("record-render", readback_status.message);
return 2;
}
const auto capture_status = context.capture_frame(target, readback_buffer);
const auto capture_status = context.capture_frame(*target.value(), *readback_buffer.value());
if (!capture_status.ok()) {
print_error("record-render", capture_status.message);
return 2;
}
const auto blit_status = context.blit_render_target(
target,
*target.value(),
pp::renderer::ReadbackRegion {
.x = 0,
.y = 0,
.width = args.width,
.height = args.height,
},
blit_target,
*blit_target.value(),
pp::renderer::ReadbackRegion {
.x = 0,
.y = 0,
@@ -2442,6 +2479,7 @@ int record_render(int argc, char** argv)
<< ",\"target\":{\"width\":" << args.width
<< ",\"height\":" << args.height
<< ",\"format\":\"rgba8\"}"
<< ",\"createdResources\":" << created_resources
<< ",\"commands\":" << commands.size()
<< ",\"drawCommands\":" << draw_commands
<< ",\"drawVertices\":" << draw_vertices