Skip to content

Commit b1647ba

Browse files
Reduce unnecessary calls in D3D12 driver.
1 parent 24e3ee6 commit b1647ba

2 files changed

Lines changed: 66 additions & 55 deletions

File tree

drivers/d3d12/rendering_device_driver_d3d12.cpp

Lines changed: 51 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2295,12 +2295,6 @@ void RenderingDeviceDriverD3D12::command_pipeline_barrier(CommandBufferID p_cmd_
22952295
return;
22962296
}
22972297

2298-
// The command list must support the required interface.
2299-
const CommandBufferInfo *cmd_buf_info = (const CommandBufferInfo *)(p_cmd_buffer.id);
2300-
ComPtr<ID3D12GraphicsCommandList7> cmd_list_7;
2301-
HRESULT res = cmd_buf_info->cmd_list->QueryInterface(cmd_list_7.GetAddressOf());
2302-
ERR_FAIL_COND(FAILED(res));
2303-
23042298
// Convert the RDD barriers to D3D12 enhanced barriers.
23052299
thread_local LocalVector<D3D12_GLOBAL_BARRIER> global_barriers;
23062300
thread_local LocalVector<D3D12_BUFFER_BARRIER> buffer_barriers;
@@ -2390,7 +2384,8 @@ void RenderingDeviceDriverD3D12::command_pipeline_barrier(CommandBufferID p_cmd_
23902384
}
23912385

23922386
if (barrier_groups_count) {
2393-
cmd_list_7->Barrier(barrier_groups_count, barrier_groups);
2387+
const CommandBufferInfo *cmd_buf_info = (const CommandBufferInfo *)(p_cmd_buffer.id);
2388+
cmd_buf_info->cmd_list_7->Barrier(barrier_groups_count, barrier_groups);
23942389
}
23952390
}
23962391

@@ -2558,6 +2553,9 @@ void RenderingDeviceDriverD3D12::command_pool_free(CommandPoolID p_cmd_pool) {
25582553
cmd_buf_elem = cmd_buf_elem->next();
25592554

25602555
cmd_buf_info->cmd_list.Reset();
2556+
cmd_buf_info->cmd_list_1.Reset();
2557+
cmd_buf_info->cmd_list_5.Reset();
2558+
cmd_buf_info->cmd_list_7.Reset();
25612559
cmd_buf_info->cmd_allocator.Reset();
25622560

25632561
resource_descriptor_heap_pool.free(cmd_buf_info->uav_alloc);
@@ -2624,6 +2622,10 @@ RDD::CommandBufferID RenderingDeviceDriverD3D12::command_buffer_create(CommandPo
26242622
cmd_buf_info->cmd_allocator = cmd_allocator;
26252623
cmd_buf_info->cmd_list = cmd_list;
26262624

2625+
cmd_list->QueryInterface(cmd_buf_info->cmd_list_1.GetAddressOf());
2626+
cmd_list->QueryInterface(cmd_buf_info->cmd_list_5.GetAddressOf());
2627+
cmd_list->QueryInterface(cmd_buf_info->cmd_list_7.GetAddressOf());
2628+
26272629
cmd_buf_info->uav_alloc = uav_alloc;
26282630
cmd_buf_info->rtv_alloc = rtv_alloc;
26292631

@@ -2660,6 +2662,7 @@ void RenderingDeviceDriverD3D12::command_buffer_end(CommandBufferID p_cmd_buffer
26602662
cmd_buf_info->graphics_root_signature_crc = 0;
26612663
cmd_buf_info->compute_pso = nullptr;
26622664
cmd_buf_info->compute_root_signature_crc = 0;
2665+
cmd_buf_info->pending_dyn_params = true;
26632666
cmd_buf_info->descriptor_heaps_set = false;
26642667
}
26652668

@@ -4246,15 +4249,11 @@ void RenderingDeviceDriverD3D12::command_begin_render_pass(CommandBufferID p_cmd
42464249
}
42474250

42484251
if (fb_info->vrs_attachment && fsr_capabilities.attachment_supported) {
4249-
ComPtr<ID3D12GraphicsCommandList5> cmd_list_5;
4250-
cmd_buf_info->cmd_list->QueryInterface(cmd_list_5.GetAddressOf());
4251-
if (cmd_list_5) {
4252-
static const D3D12_SHADING_RATE_COMBINER COMBINERS[D3D12_RS_SET_SHADING_RATE_COMBINER_COUNT] = {
4253-
D3D12_SHADING_RATE_COMBINER_PASSTHROUGH,
4254-
D3D12_SHADING_RATE_COMBINER_OVERRIDE,
4255-
};
4256-
cmd_list_5->RSSetShadingRate(D3D12_SHADING_RATE_1X1, COMBINERS);
4257-
}
4252+
static const D3D12_SHADING_RATE_COMBINER COMBINERS[D3D12_RS_SET_SHADING_RATE_COMBINER_COUNT] = {
4253+
D3D12_SHADING_RATE_COMBINER_PASSTHROUGH,
4254+
D3D12_SHADING_RATE_COMBINER_OVERRIDE,
4255+
};
4256+
cmd_buf_info->cmd_list_5->RSSetShadingRate(D3D12_SHADING_RATE_1X1, COMBINERS);
42584257
}
42594258

42604259
cmd_buf_info->render_pass_state.current_subpass = UINT32_MAX;
@@ -4466,12 +4465,8 @@ void RenderingDeviceDriverD3D12::command_end_render_pass(CommandBufferID p_cmd_b
44664465
const FramebufferInfo *fb_info = cmd_buf_info->render_pass_state.fb_info;
44674466
const RenderPassInfo *pass_info = cmd_buf_info->render_pass_state.pass_info;
44684467

4469-
if (fsr_capabilities.attachment_supported) {
4470-
ComPtr<ID3D12GraphicsCommandList5> cmd_list_5;
4471-
cmd_buf_info->cmd_list->QueryInterface(cmd_list_5.GetAddressOf());
4472-
if (cmd_list_5) {
4473-
cmd_list_5->RSSetShadingRateImage(nullptr);
4474-
}
4468+
if (fb_info->vrs_attachment && fsr_capabilities.attachment_supported) {
4469+
cmd_buf_info->cmd_list_5->RSSetShadingRateImage(nullptr);
44754470
}
44764471

44774472
for (uint32_t i = 0; i < pass_info->attachments.size(); i++) {
@@ -4651,37 +4646,46 @@ void RenderingDeviceDriverD3D12::command_render_clear_attachments(CommandBufferI
46514646

46524647
void RenderingDeviceDriverD3D12::command_bind_render_pipeline(CommandBufferID p_cmd_buffer, PipelineID p_pipeline) {
46534648
CommandBufferInfo *cmd_buf_info = (CommandBufferInfo *)p_cmd_buffer.id;
4654-
const PipelineInfo *pipeline_info = (const PipelineInfo *)p_pipeline.id;
4655-
4656-
if (cmd_buf_info->graphics_pso == pipeline_info->pso.Get()) {
4657-
return;
4658-
}
46594649

4650+
const PipelineInfo *pipeline_info = (const PipelineInfo *)p_pipeline.id;
46604651
const ShaderInfo *shader_info_in = pipeline_info->shader_info;
46614652
const RenderPipelineInfo &render_info = pipeline_info->render_info;
46624653

4663-
cmd_buf_info->cmd_list->SetPipelineState(pipeline_info->pso.Get());
4654+
if (cmd_buf_info->graphics_pso != pipeline_info->pso.Get()) {
4655+
cmd_buf_info->cmd_list->SetPipelineState(pipeline_info->pso.Get());
4656+
4657+
cmd_buf_info->graphics_pso = pipeline_info->pso.Get();
4658+
cmd_buf_info->compute_pso = nullptr;
4659+
}
4660+
46644661
if (cmd_buf_info->graphics_root_signature_crc != shader_info_in->root_signature_crc) {
46654662
cmd_buf_info->cmd_list->SetGraphicsRootSignature(shader_info_in->root_signature.Get());
46664663
cmd_buf_info->graphics_root_signature_crc = shader_info_in->root_signature_crc;
46674664
}
46684665

4669-
cmd_buf_info->cmd_list->IASetPrimitiveTopology(render_info.dyn_params.primitive_topology);
4670-
cmd_buf_info->cmd_list->OMSetBlendFactor(render_info.dyn_params.blend_constant.components);
4671-
cmd_buf_info->cmd_list->OMSetStencilRef(render_info.dyn_params.stencil_reference);
4666+
if (cmd_buf_info->pending_dyn_params || (cmd_buf_info->dyn_params.primitive_topology != render_info.dyn_params.primitive_topology)) {
4667+
cmd_buf_info->cmd_list->IASetPrimitiveTopology(render_info.dyn_params.primitive_topology);
4668+
cmd_buf_info->dyn_params.primitive_topology = render_info.dyn_params.primitive_topology;
4669+
}
46724670

4673-
if (misc_features_support.depth_bounds_supported) {
4674-
ComPtr<ID3D12GraphicsCommandList1> command_list_1;
4675-
cmd_buf_info->cmd_list->QueryInterface(command_list_1.GetAddressOf());
4676-
if (command_list_1) {
4677-
command_list_1->OMSetDepthBounds(render_info.dyn_params.depth_bounds_min, render_info.dyn_params.depth_bounds_max);
4678-
}
4671+
if (cmd_buf_info->pending_dyn_params || (cmd_buf_info->dyn_params.blend_constant != render_info.dyn_params.blend_constant)) {
4672+
cmd_buf_info->cmd_list->OMSetBlendFactor(render_info.dyn_params.blend_constant.components);
4673+
cmd_buf_info->dyn_params.blend_constant = render_info.dyn_params.blend_constant;
46794674
}
46804675

4681-
cmd_buf_info->render_pass_state.vf_info = render_info.vf_info;
4676+
if (cmd_buf_info->pending_dyn_params || (cmd_buf_info->dyn_params.stencil_reference != render_info.dyn_params.stencil_reference)) {
4677+
cmd_buf_info->cmd_list->OMSetStencilRef(render_info.dyn_params.stencil_reference);
4678+
cmd_buf_info->dyn_params.stencil_reference = render_info.dyn_params.stencil_reference;
4679+
}
46824680

4683-
cmd_buf_info->graphics_pso = pipeline_info->pso.Get();
4684-
cmd_buf_info->compute_pso = nullptr;
4681+
if (misc_features_support.depth_bounds_supported && (cmd_buf_info->pending_dyn_params || (cmd_buf_info->dyn_params.depth_bounds_min != render_info.dyn_params.depth_bounds_min) || (cmd_buf_info->dyn_params.depth_bounds_max != render_info.dyn_params.depth_bounds_max))) {
4682+
cmd_buf_info->cmd_list_1->OMSetDepthBounds(render_info.dyn_params.depth_bounds_min, render_info.dyn_params.depth_bounds_max);
4683+
cmd_buf_info->dyn_params.depth_bounds_min = render_info.dyn_params.depth_bounds_min;
4684+
cmd_buf_info->dyn_params.depth_bounds_max = render_info.dyn_params.depth_bounds_max;
4685+
}
4686+
4687+
cmd_buf_info->pending_dyn_params = false;
4688+
cmd_buf_info->render_pass_state.vf_info = render_info.vf_info;
46854689
}
46864690

46874691
void RenderingDeviceDriverD3D12::command_bind_render_uniform_sets(CommandBufferID p_cmd_buffer, VectorView<UniformSetID> p_uniform_sets, ShaderID p_shader, uint32_t p_first_set_index, uint32_t p_set_count, uint32_t p_dynamic_offsets) {
@@ -5225,21 +5229,21 @@ RDD::PipelineID RenderingDeviceDriverD3D12::render_pipeline_create(
52255229

52265230
void RenderingDeviceDriverD3D12::command_bind_compute_pipeline(CommandBufferID p_cmd_buffer, PipelineID p_pipeline) {
52275231
CommandBufferInfo *cmd_buf_info = (CommandBufferInfo *)p_cmd_buffer.id;
5232+
52285233
const PipelineInfo *pipeline_info = (const PipelineInfo *)p_pipeline.id;
5234+
const ShaderInfo *shader_info_in = pipeline_info->shader_info;
52295235

5230-
if (cmd_buf_info->compute_pso == pipeline_info->pso.Get()) {
5231-
return;
5236+
if (cmd_buf_info->compute_pso != pipeline_info->pso.Get()) {
5237+
cmd_buf_info->cmd_list->SetPipelineState(pipeline_info->pso.Get());
5238+
5239+
cmd_buf_info->compute_pso = pipeline_info->pso.Get();
5240+
cmd_buf_info->graphics_pso = nullptr;
52325241
}
52335242

5234-
const ShaderInfo *shader_info_in = pipeline_info->shader_info;
5235-
cmd_buf_info->cmd_list->SetPipelineState(pipeline_info->pso.Get());
52365243
if (cmd_buf_info->compute_root_signature_crc != shader_info_in->root_signature_crc) {
52375244
cmd_buf_info->cmd_list->SetComputeRootSignature(shader_info_in->root_signature.Get());
52385245
cmd_buf_info->compute_root_signature_crc = shader_info_in->root_signature_crc;
52395246
}
5240-
5241-
cmd_buf_info->compute_pso = pipeline_info->pso.Get();
5242-
cmd_buf_info->graphics_pso = nullptr;
52435247
}
52445248

52455249
void RenderingDeviceDriverD3D12::command_bind_compute_uniform_sets(CommandBufferID p_cmd_buffer, VectorView<UniformSetID> p_uniform_sets, ShaderID p_shader, uint32_t p_first_set_index, uint32_t p_set_count, uint32_t p_dynamic_offsets) {

drivers/d3d12/rendering_device_driver_d3d12.h

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,14 @@ class RenderingDeviceDriverD3D12 : public RenderingDeviceDriver {
483483
uint32_t vertex_buffer_count = 0;
484484
};
485485

486+
struct DynParams {
487+
D3D12_PRIMITIVE_TOPOLOGY primitive_topology = {};
488+
Color blend_constant;
489+
float depth_bounds_min = 0.0f;
490+
float depth_bounds_max = 1.0f;
491+
uint32_t stencil_reference = 0;
492+
};
493+
486494
// Leveraging knowledge of actual usage and D3D12 specifics (namely, command lists from the same allocator
487495
// can't be freely begun and ended), an allocator per list works better.
488496
struct CommandBufferInfo {
@@ -491,10 +499,16 @@ class RenderingDeviceDriverD3D12 : public RenderingDeviceDriver {
491499

492500
Microsoft::WRL::ComPtr<ID3D12CommandAllocator> cmd_allocator;
493501
Microsoft::WRL::ComPtr<ID3D12GraphicsCommandList> cmd_list;
502+
Microsoft::WRL::ComPtr<ID3D12GraphicsCommandList1> cmd_list_1;
503+
Microsoft::WRL::ComPtr<ID3D12GraphicsCommandList5> cmd_list_5;
504+
Microsoft::WRL::ComPtr<ID3D12GraphicsCommandList7> cmd_list_7;
494505

495506
ID3D12PipelineState *graphics_pso = nullptr;
496507
ID3D12PipelineState *compute_pso = nullptr;
497508

509+
DynParams dyn_params;
510+
bool pending_dyn_params = true;
511+
498512
uint32_t graphics_root_signature_crc = 0;
499513
uint32_t compute_root_signature_crc = 0;
500514

@@ -708,14 +722,7 @@ class RenderingDeviceDriverD3D12 : public RenderingDeviceDriver {
708722

709723
struct RenderPipelineInfo {
710724
const VertexFormatInfo *vf_info = nullptr;
711-
712-
struct {
713-
D3D12_PRIMITIVE_TOPOLOGY primitive_topology = {};
714-
Color blend_constant;
715-
float depth_bounds_min = 0.0f;
716-
float depth_bounds_max = 0.0f;
717-
uint32_t stencil_reference = 0;
718-
} dyn_params;
725+
DynParams dyn_params;
719726
};
720727

721728
struct PipelineInfo {

0 commit comments

Comments
 (0)