Skip to content

Commit c8f68e4

Browse files
committed
Update CubeMapArray and ParallelRendering tutorials to use root constants instead of uniforms buffer views
1 parent c694b3a commit c8f68e4

File tree

15 files changed

+139
-130
lines changed

15 files changed

+139
-130
lines changed

Apps/04-ShadowCube/ShadowCubeApp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ void ShadowCubeApp::Init()
270270
// Final-pass resource bindings for floor rendering - patched a copy of cube bindings
271271
ShadowCubeFrame::PassResources::ProgramBindings& final_floor_binds = frame.final_pass.floor_bindings;
272272
final_floor_binds.program_bindings = rhi::ProgramBindings(frame.final_pass.cube_bindings.program_bindings, {
273-
{ { rhi::ShaderType::Pixel, "g_texture" }, m_floor_buffers_ptr->GetTexture().GetResourceView() },
273+
{ { rhi::ShaderType::Pixel, "g_texture" }, m_floor_buffers_ptr->GetTexture().GetResourceView() },
274274
}, frame.index);
275275
final_floor_binds.program_bindings.SetName(fmt::format("Floor Final-Pass Bindings {}", frame.index));
276276
final_floor_binds.scene_uniforms_binding_ptr = &final_floor_binds.program_bindings.Get({ rhi::ShaderType::Pixel, "g_scene_uniforms" });

Apps/06-CubeMapArray/CubeMapArrayApp.cpp

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,14 @@ void CubeMapArrayApp::Init()
105105
rhi::IProgram::InputBufferLayout::ArgumentSemantics { cube_mesh.GetVertexLayout().GetSemantics() }
106106
}
107107
},
108-
rhi::ProgramArgumentAccessors{ },
108+
rhi::ProgramArgumentAccessors
109+
{
110+
{
111+
{ rhi::ShaderType::Vertex, "g_uniforms" },
112+
rhi::ProgramArgumentAccessType::FrameConstant,
113+
rhi::ProgramArgumentValueType::RootConstant
114+
}
115+
},
109116
GetScreenRenderPattern().GetAttachmentFormats()
110117
}),
111118
GetScreenRenderPattern()
@@ -161,27 +168,18 @@ void CubeMapArrayApp::Init()
161168
});
162169

163170
// Create frame buffer resources
164-
const auto uniforms_data_size = m_cube_buffers_ptr->GetUniformsBufferSize();
165171
for(CubeMapArrayFrame& frame : GetFrames())
166172
{
167-
// Create uniforms buffer with volatile parameters for frame rendering
168-
frame.cube.uniforms_buffer = GetRenderContext().CreateBuffer(rhi::BufferSettings::ForConstantBuffer(uniforms_data_size, false, true));
169-
frame.cube.uniforms_buffer.SetName(fmt::format("Uniforms Buffer {}", frame.index));
170-
171173
// Configure program resource bindings
172174
frame.cube.program_bindings = m_render_state.GetProgram().CreateBindings({
173-
{ { rhi::ShaderType::Vertex, "g_uniforms" }, frame.cube.uniforms_buffer.GetResourceView() },
174175
{ { rhi::ShaderType::Pixel, "g_texture_array" }, m_cube_buffers_ptr->GetTexture().GetResourceView() },
175176
{ { rhi::ShaderType::Pixel, "g_sampler" }, m_texture_sampler.GetResourceView() },
176177
}, frame.index);
178+
frame.cube.uniforms_argument_binding_ptr = &frame.cube.program_bindings.Get({ rhi::ShaderType::Vertex, "g_uniforms" });
177179
frame.cube.program_bindings.SetName(fmt::format("Cube Bindings {}", frame.index));
178180

179-
// Create uniforms buffer for Sky-Box rendering
180-
frame.sky_box.uniforms_buffer = GetRenderContext().CreateBuffer(rhi::BufferSettings::ForConstantBuffer(gfx::SkyBox::GetUniformsSize(), false, true));
181-
frame.sky_box.uniforms_buffer.SetName(fmt::format("Sky-box Uniforms Buffer {}", frame.index));
182-
183181
// Resource bindings for Sky-Box rendering
184-
frame.sky_box.program_bindings = m_sky_box.CreateProgramBindings(frame.sky_box.uniforms_buffer, frame.index);
182+
std::tie(frame.sky_box.program_bindings, frame.sky_box.uniforms_argument_binding_ptr) = m_sky_box.CreateProgramBindings(frame.index);
185183
frame.sky_box.program_bindings.SetName(fmt::format("Space Sky-Box Bindings {}", frame.index));
186184

187185
// Create command list for rendering
@@ -243,8 +241,9 @@ bool CubeMapArrayApp::Update()
243241
uniforms.mvp_matrix_per_instance[i] = hlslpp::transpose(hlslpp::mul(hlslpp::mul(m_model_matrix, translation_matrix), m_camera.GetViewProjMatrix()));
244242
}
245243

246-
m_cube_buffers_ptr->SetFinalPassUniforms(std::move(uniforms));
247-
m_sky_box.Update();
244+
const CubeMapArrayFrame& frame = GetCurrentFrame();
245+
frame.cube.uniforms_argument_binding_ptr->SetRootConstant(rhi::RootConstant(uniforms));
246+
m_sky_box.Update(*frame.sky_box.uniforms_argument_binding_ptr);
248247

249248
return true;
250249
}
@@ -257,7 +256,6 @@ bool CubeMapArrayApp::Render()
257256
// Update uniforms buffer related to current frame
258257
const CubeMapArrayFrame& frame = GetCurrentFrame();
259258
const rhi::CommandQueue render_cmd_queue = GetRenderContext().GetRenderCommandKit().GetQueue();
260-
frame.cube.uniforms_buffer.SetData(render_cmd_queue, m_cube_buffers_ptr->GetFinalPassUniformsSubresource());
261259

262260
// 1) Render cube instances of 'CUBE_MAP_ARRAY_SIZE' count
263261
META_DEBUG_GROUP_VAR(s_debug_group, "Cube Instances Rendering");
@@ -266,7 +264,7 @@ bool CubeMapArrayApp::Render()
266264
m_cube_buffers_ptr->Draw(frame.render_cmd_list, frame.cube.program_bindings, 0U, CUBE_MAP_ARRAY_SIZE);
267265

268266
// 2) Render sky-box after cubes to minimize overdraw
269-
m_sky_box.Draw(frame.render_cmd_list, frame.sky_box, GetViewState());
267+
m_sky_box.Draw(frame.render_cmd_list, frame.sky_box.program_bindings, GetViewState());
270268

271269
RenderOverlay(frame.render_cmd_list);
272270

Apps/06-CubeMapArray/CubeMapArrayApp.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,16 @@ namespace rhi = Methane::Graphics::Rhi;
4242
struct CubeMapArrayFrame final
4343
: Graphics::AppFrame
4444
{
45-
gfx::MeshBufferBindings cube;
46-
gfx::MeshBufferBindings sky_box;
47-
rhi::RenderCommandList render_cmd_list;
48-
rhi::CommandListSet execute_cmd_list_set;
45+
struct Bindings
46+
{
47+
rhi::ProgramBindings program_bindings;
48+
rhi::IProgramArgumentBinding* uniforms_argument_binding_ptr;
49+
};
50+
51+
Bindings cube;
52+
Bindings sky_box;
53+
rhi::RenderCommandList render_cmd_list;
54+
rhi::CommandListSet execute_cmd_list_set;
4955

5056
using gfx::AppFrame::AppFrame;
5157
};

Apps/06-CubeMapArray/Shaders/CubeMapArray.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ struct VSInput
3333
struct PSInput
3434
{
3535
float4 position : SV_POSITION;
36-
float4 uvwi : UVFACE;
36+
float4 uvwi : UVFACE;
3737
};
3838

3939
ConstantBuffer<Uniforms> g_uniforms : register(b0, META_ARG_FRAME_CONSTANT);

Apps/07-ParallelRendering/ParallelRenderingApp.cpp

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ void ParallelRenderingApp::Init()
152152
{
153153
{ rhi::ShaderType::All, "g_uniforms" },
154154
rhi::ProgramArgumentAccessor::Type::Mutable,
155-
rhi::ProgramArgumentAccessor::ValueType::ResourceAddress
155+
rhi::ProgramArgumentAccessor::ValueType::RootConstant
156156
},
157157
// Other arguments are defined in shader register spaces
158158
},
@@ -190,42 +190,26 @@ void ParallelRenderingApp::Init()
190190
);
191191

192192
// Create frame buffer resources
193-
const Data::Size uniforms_data_size = m_cube_array_buffers_ptr->GetUniformsBufferSize();
194-
const Data::Size uniform_data_size = MeshBuffers::GetUniformSize();
195193
tf::Taskflow program_bindings_task_flow;
196194
for(ParallelRenderingFrame& frame : GetFrames())
197195
{
198-
// Create buffer for uniforms array related to all cube instances
199-
frame.cubes_array.uniforms_buffer = GetRenderContext().CreateBuffer(rhi::BufferSettings::ForConstantBuffer(uniforms_data_size, true, true));
200-
frame.cubes_array.uniforms_buffer.SetName(fmt::format("Uniforms Buffer {}", frame.index));
201-
202196
// Configure program resource bindings
203-
frame.cubes_array.program_bindings_per_instance.resize(cubes_count);
204-
frame.cubes_array.program_bindings_per_instance[0] = render_state_settings.program.CreateBindings({
205-
{
206-
{ rhi::ShaderType::All, "g_uniforms" },
207-
frame.cubes_array.uniforms_buffer.GetBufferView(
208-
m_cube_array_buffers_ptr->GetUniformsBufferOffset(0U), uniform_data_size)
209-
},
197+
frame.cubes_program_bindings.resize(cubes_count);
198+
frame.cubes_uniform_argument_binding_ptrs.resize(cubes_count);
199+
frame.cubes_program_bindings[0] = render_state_settings.program.CreateBindings({
210200
{ { rhi::ShaderType::Pixel, "g_texture_array" }, m_texture_array.GetResourceView() },
211201
{ { rhi::ShaderType::Pixel, "g_sampler" }, m_texture_sampler.GetResourceView() },
212202
}, frame.index);
213-
frame.cubes_array.program_bindings_per_instance[0].SetName(fmt::format("Cube 0 Bindings {}", frame.index));
203+
frame.cubes_uniform_argument_binding_ptrs[0] = &frame.cubes_program_bindings[0].Get({ rhi::ShaderType::All, "g_uniforms" });
204+
frame.cubes_program_bindings[0].SetName(fmt::format("Cube 0 Bindings {}", frame.index));
214205

215206
program_bindings_task_flow.for_each_index(1U, cubes_count, 1U,
216-
[this, &frame, uniform_data_size](const uint32_t cube_index)
207+
[this, &frame](const uint32_t cube_index)
217208
{
218-
META_UNUSED(uniform_data_size); // workaround for Clang error unused-lambda-capture uniform_data_size (false positive)
219-
rhi::ProgramBindings& cube_program_bindings = frame.cubes_array.program_bindings_per_instance[cube_index];
220-
cube_program_bindings = rhi::ProgramBindings(frame.cubes_array.program_bindings_per_instance[0], {
221-
{
222-
{ rhi::ShaderType::All, "g_uniforms" },
223-
frame.cubes_array.uniforms_buffer.GetBufferView(
224-
m_cube_array_buffers_ptr->GetUniformsBufferOffset(cube_index),
225-
uniform_data_size)
226-
}
227-
}, frame.index);
209+
rhi::ProgramBindings& cube_program_bindings = frame.cubes_program_bindings[cube_index];
210+
cube_program_bindings = rhi::ProgramBindings(frame.cubes_program_bindings[0], {}, frame.index);
228211
cube_program_bindings.SetName(fmt::format("Cube {} Bindings {}", cube_index, frame.index));
212+
frame.cubes_uniform_argument_binding_ptrs[cube_index] = &cube_program_bindings.Get({ rhi::ShaderType::All, "g_uniforms" });
229213
});
230214

231215
if (m_settings.parallel_rendering_enabled)
@@ -376,14 +360,18 @@ bool ParallelRenderingApp::Update()
376360

377361
// Update MVP-matrices for all cube instances so that they are positioned in a cube grid
378362
tf::Taskflow task_flow;
363+
const ParallelRenderingFrame& frame = GetCurrentFrame();
379364
task_flow.for_each_index(0U, static_cast<uint32_t>(m_cube_array_parameters.size()), 1U,
380-
[this](const uint32_t cube_index)
365+
[this, &frame](const uint32_t cube_index)
381366
{
382367
const CubeParameters& cube_params = m_cube_array_parameters[cube_index];
368+
383369
hlslpp::Uniforms uniforms{};
384370
uniforms.mvp_matrix = hlslpp::transpose(hlslpp::mul(cube_params.model_matrix, m_camera.GetViewProjMatrix()));
385371
uniforms.texture_index = cube_params.thread_index;
386-
m_cube_array_buffers_ptr->SetFinalPassUniforms(std::move(uniforms), cube_index);
372+
373+
rhi::IProgramArgumentBinding& uniforms_argument_binding = *frame.cubes_uniform_argument_binding_ptrs[cube_index];
374+
uniforms_argument_binding.SetRootConstant(rhi::RootConstant(uniforms));
387375
});
388376

389377
GetRenderContext().GetParallelExecutor().run(task_flow).get();
@@ -399,7 +387,6 @@ bool ParallelRenderingApp::Render()
399387
// Update uniforms buffer related to current frame
400388
const ParallelRenderingFrame& frame = GetCurrentFrame();
401389
const rhi::CommandQueue render_cmd_queue = GetRenderContext().GetRenderCommandKit().GetQueue();
402-
frame.cubes_array.uniforms_buffer.SetData(render_cmd_queue, m_cube_array_buffers_ptr->GetFinalPassUniformsSubresource());
403390

404391
// Render cube instances of 'CUBE_MAP_ARRAY_SIZE' count
405392
if (m_settings.parallel_rendering_enabled)
@@ -419,7 +406,7 @@ bool ParallelRenderingApp::Render()
419406
{
420407
const uint32_t begin_instance_index = cmd_list_index * instance_count_per_command_list;
421408
const uint32_t end_instance_index = std::min(begin_instance_index + instance_count_per_command_list, m_cube_array_buffers_ptr->GetInstanceCount());
422-
RenderCubesRange(render_cmd_lists[cmd_list_index], frame.cubes_array.program_bindings_per_instance, begin_instance_index, end_instance_index);
409+
RenderCubesRange(render_cmd_lists[cmd_list_index], frame.cubes_program_bindings, begin_instance_index, end_instance_index);
423410
}
424411
);
425412

@@ -440,7 +427,7 @@ bool ParallelRenderingApp::Render()
440427
frame.serial_render_cmd_list.SetViewState(GetViewState());
441428

442429
#ifdef EXPLICIT_PARALLEL_RENDERING_ENABLED
443-
RenderCubesRange(frame.serial_render_cmd_list, frame.cubes_array.program_bindings_per_instance, 0U, m_cube_array_buffers_ptr->GetInstanceCount());
430+
RenderCubesRange(frame.serial_render_cmd_list, frame.cubes_program_bindings, 0U, m_cube_array_buffers_ptr->GetInstanceCount());
444431
#else
445432
m_cube_array_buffers_ptr->Draw(frame.serial_render_cmd_list, frame.cubes_array.program_bindings_per_instance);
446433
#endif

Apps/07-ParallelRendering/ParallelRenderingApp.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,15 @@ namespace rhi = Methane::Graphics::Rhi;
4444
struct ParallelRenderingFrame final
4545
: Graphics::AppFrame
4646
{
47-
gfx::InstancedMeshBufferBindings cubes_array;
47+
using InstancedProgramBindings = gfx::MeshBuffersBase::InstancedProgramBindings;
48+
using InstancedUniformArgumentBindings = std::vector<rhi::IProgramArgumentBinding*>;
49+
using gfx::AppFrame::AppFrame;
50+
51+
InstancedProgramBindings cubes_program_bindings;
52+
InstancedUniformArgumentBindings cubes_uniform_argument_binding_ptrs;
4853
rhi::ParallelRenderCommandList parallel_render_cmd_list;
4954
rhi::RenderCommandList serial_render_cmd_list;
5055
rhi::CommandListSet execute_cmd_list_set;
51-
52-
using gfx::AppFrame::AppFrame;
5356
};
5457

5558
using UserInterfaceApp = UserInterface::App<ParallelRenderingFrame>;

Apps/07-ParallelRendering/Shaders/ParallelRenderingUniforms.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,7 @@ Shader uniform structures shared between HLSL and C++ code via HLSL++
1616
using uint = uint32_t;
1717
#endif
1818

19-
#ifndef META_UNIFORM_ALIGN
20-
#define META_UNIFORM_ALIGN
21-
#endif
22-
23-
struct META_UNIFORM_ALIGN Uniforms
19+
struct Uniforms
2420
{
2521
float4x4 mvp_matrix;
2622
int texture_index;

Modules/Data/Events/Include/Methane/Data/Emitter.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,12 @@ class Emitter // NOSONAR - custom destructor is required, rule of zero is not ap
174174
}
175175
}
176176

177+
bool IsEmitting() const noexcept
178+
{
179+
return m_is_emitting;
180+
}
181+
182+
177183
size_t GetConnectedReceiversCount() const noexcept
178184
{
179185
return m_connected_receivers.size() + m_additional_connected_receivers.size();

Modules/Graphics/Primitives/Include/Methane/Graphics/MeshBuffers.hpp

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ class MeshBuffers
4545
using InstanceUniforms = std::vector<UniformsType, Data::AlignedAllocator<UniformsType, g_uniform_alignment>>;
4646

4747
// Uniform buffers are created separately in Frame dependent resources
48-
InstanceUniforms m_final_pass_instance_uniforms;
49-
Rhi::SubResource m_final_pass_instance_uniforms_subresource;
48+
InstanceUniforms m_final_pass_instance_uniforms;
5049

5150
public:
5251
template<typename VertexType>
@@ -68,11 +67,6 @@ class MeshBuffers
6867
return static_cast<Data::Size>(m_final_pass_instance_uniforms.size());
6968
}
7069

71-
[[nodiscard]] const Rhi::SubResource& GetFinalPassUniformsSubresource() const
72-
{
73-
return m_final_pass_instance_uniforms_subresource;
74-
}
75-
7670
[[nodiscard]]
7771
const UniformsType& GetFinalPassUniforms(Data::Index instance_index = 0U) const
7872
{
@@ -120,10 +114,6 @@ class MeshBuffers
120114
{
121115
META_FUNCTION_TASK();
122116
m_final_pass_instance_uniforms.resize(instance_count);
123-
m_final_pass_instance_uniforms_subresource = Rhi::SubResource(
124-
reinterpret_cast<Data::ConstRawPtr>(m_final_pass_instance_uniforms.data()), // NOSONAR
125-
GetUniformsBufferSize()
126-
);
127117
}
128118
};
129119

Modules/Graphics/Primitives/Include/Methane/Graphics/MeshBuffersBase.h

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,11 @@ class RenderCommandList;
4343
class ParallelRenderCommandList;
4444
}
4545

46-
struct MeshBufferBindings
47-
{
48-
Rhi::Buffer uniforms_buffer;
49-
Rhi::ProgramBindings program_bindings;
50-
};
51-
52-
struct InstancedMeshBufferBindings
53-
{
54-
Rhi::Buffer uniforms_buffer;
55-
std::vector<Rhi::ProgramBindings> program_bindings_per_instance;
56-
};
57-
5846
class MeshBuffersBase
5947
{
6048
public:
61-
using ProgramBindingsIteratorType = std::vector<Rhi::ProgramBindings>::const_iterator;
49+
using InstancedProgramBindings = std::vector<Rhi::ProgramBindings>;
50+
using ProgramBindingsIteratorType = InstancedProgramBindings::const_iterator;
6251

6352
MeshBuffersBase(const Rhi::CommandQueue& render_cmd_queue, const Mesh& mesh_data,
6453
std::string_view mesh_name, const Mesh::Subsets& mesh_subsets);
@@ -73,10 +62,14 @@ class MeshBuffersBase
7362

7463
Rhi::ResourceBarriers CreateBeginningResourceBarriers(const Rhi::Buffer* constants_buffer_ptr = nullptr) const;
7564

76-
void Draw(const Rhi::RenderCommandList& cmd_list, const Rhi::ProgramBindings& program_bindings,
77-
uint32_t mesh_subset_index = 0U, uint32_t instance_count = 1U, uint32_t start_instance = 0U) const;
65+
void Draw(const Rhi::RenderCommandList& cmd_list,
66+
const Rhi::ProgramBindings& program_bindings,
67+
uint32_t mesh_subset_index = 0U,
68+
uint32_t instance_count = 1U,
69+
uint32_t start_instance = 0U) const;
7870

79-
void Draw(const Rhi::RenderCommandList& cmd_list, const std::vector<Rhi::ProgramBindings>& instance_program_bindings,
71+
void Draw(const Rhi::RenderCommandList& cmd_list,
72+
const InstancedProgramBindings& instance_program_bindings,
8073
Rhi::ProgramBindingsApplyBehaviorMask bindings_apply_behavior = Rhi::ProgramBindingsApplyBehaviorMask(~0U),
8174
uint32_t first_instance_index = 0U, bool retain_bindings_once = false, bool set_resource_barriers = true) const;
8275

@@ -87,7 +80,7 @@ class MeshBuffersBase
8780
uint32_t first_instance_index = 0U, bool retain_bindings_once = false, bool set_resource_barriers = true) const;
8881

8982
void DrawParallel(const Rhi::ParallelRenderCommandList& parallel_cmd_list,
90-
const std::vector<Rhi::ProgramBindings>& instance_program_bindings,
83+
const InstancedProgramBindings& instance_program_bindings,
9184
Rhi::ProgramBindingsApplyBehaviorMask bindings_apply_behavior = Rhi::ProgramBindingsApplyBehaviorMask(~0U),
9285
bool retain_bindings_once = false, bool set_resource_barriers = true) const;
9386

Modules/Graphics/Primitives/Include/Methane/Graphics/SkyBox.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ class Texture;
3434
class Buffer;
3535
class ViewState;
3636
class CommandQueue;
37-
class ProgramBindings;
3837
class RenderPattern;
3938
class RenderCommandList;
39+
class ProgramBindings;
40+
struct IProgramArgumentBinding;
4041

4142
} // namespace Methane::Graphics::Rhi
4243

@@ -67,15 +68,22 @@ class SkyBox // NOSONAR - manual copy, move constructors and assignment operator
6768
float lod_bias = 0.F;
6869
};
6970

71+
using ProgramBindingsAndUniformArgumentBinding = std::pair<Rhi::ProgramBindings, Rhi::IProgramArgumentBinding*>;
72+
7073
static Data::Size GetUniformsSize();
7174

7275
META_PIMPL_DEFAULT_CONSTRUCT_METHODS_DECLARE_NO_INLINE(SkyBox);
7376

74-
SkyBox(const Rhi::CommandQueue& render_cmd_queue, const Rhi::RenderPattern& render_pattern, const Rhi::Texture& cube_map_texture, const Settings& settings);
77+
SkyBox(const Rhi::CommandQueue& render_cmd_queue,
78+
const Rhi::RenderPattern& render_pattern,
79+
const Rhi::Texture& cube_map_texture,
80+
const Settings& settings);
7581

76-
Rhi::ProgramBindings CreateProgramBindings(const Rhi::Buffer& uniforms_buffer, Data::Index frame_index) const;
77-
void Update() const;
78-
void Draw(const Rhi::RenderCommandList& render_cmd_list, const MeshBufferBindings& buffer_bindings, const Rhi::ViewState& view_state) const;
82+
ProgramBindingsAndUniformArgumentBinding CreateProgramBindings(Data::Index frame_index) const;
83+
void Update(Rhi::IProgramArgumentBinding& uniforms_argument_binding) const;
84+
void Draw(const Rhi::RenderCommandList& render_cmd_list,
85+
const Rhi::ProgramBindings& program_bindings,
86+
const Rhi::ViewState& view_state) const;
7987

8088
bool IsInitialized() const noexcept { return static_cast<bool>(m_impl_ptr); }
8189

0 commit comments

Comments
 (0)