@@ -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
46524647void 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
46874691void 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
52265230void 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
52455249void 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) {
0 commit comments