Skip to content

Commit cad23ab

Browse files
D3D12: Fix HDR rendering pipeline, resource states, and overlay support
Add separate HDR pipeline states (pipe_blend_hdr, pipe_noblend_hdr, pipe_font_hdr) for R10G10B10A2 render targets and select the correct pipeline based on the current render target format, tracked via a new current_rt_format field. Fix resource state management: create render target textures in RENDER_TARGET state instead of PIXEL_SHADER_RESOURCE, add mipmap generation with zero-size level guards, move resource transitions to correct positions in the frame loop, and add missing back buffer transitions after HDR compositing. Fix HDR compositing: always use R8G8B8A8_UNORM for the intermediate back buffer regardless of shader preset format, set root signature before descriptor table binds, populate source/output size in the HDR UBO, and set the blend pipeline after menu texture upload. Extend HDR back buffer compositing to handle overlays in addition to the menu (D3D12_ST_FLAG_OVERLAYS_ENABLE). Only request GPU descriptor handle for shader-visible descriptor heaps to avoid D3D12 validation errors.
1 parent dc44c08 commit cad23ab

1 file changed

Lines changed: 143 additions & 35 deletions

File tree

gfx/drivers/d3d12.c

Lines changed: 143 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ typedef struct
302302
D3D12Resource renderTargets[2];
303303
#ifdef HAVE_DXGI_HDR
304304
d3d12_texture_t back_buffer;
305+
DXGI_FORMAT current_rt_format;
305306
#endif
306307
D3D12_CPU_DESCRIPTOR_HANDLE desc_handles[2];
307308
D3D12_VIEWPORT viewport;
@@ -359,6 +360,11 @@ typedef struct
359360
D3D12PipelineState pipe_blend;
360361
D3D12PipelineState pipe_noblend;
361362
D3D12PipelineState pipe_font;
363+
#ifdef HAVE_DXGI_HDR
364+
D3D12PipelineState pipe_blend_hdr;
365+
D3D12PipelineState pipe_noblend_hdr;
366+
D3D12PipelineState pipe_font_hdr;
367+
#endif
362368
D3D12Resource vbo;
363369
D3D12_VERTEX_BUFFER_VIEW vbo_view;
364370
int offset;
@@ -755,8 +761,13 @@ static void d3d12_init_texture(D3D12Device device, d3d12_texture_t* texture)
755761
format_support.Support2 |= D3D12_FORMAT_SUPPORT2_UAV_TYPED_STORE;
756762
}
757763

764+
D3D12_RESOURCE_STATES initial_state = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
765+
758766
if (texture->desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET)
767+
{
759768
format_support.Support1 |= D3D12_FORMAT_SUPPORT1_RENDER_TARGET;
769+
initial_state = D3D12_RESOURCE_STATE_RENDER_TARGET;
770+
}
760771

761772
texture->desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
762773
texture->desc.DepthOrArraySize = 1;
@@ -765,7 +776,7 @@ static void d3d12_init_texture(D3D12Device device, d3d12_texture_t* texture)
765776

766777
device->lpVtbl->CreateCommittedResource(
767778
device, &heap_props, D3D12_HEAP_FLAG_NONE, &texture->desc,
768-
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, NULL, uuidof(ID3D12Resource), (void**)&texture->handle);
779+
initial_state, NULL, uuidof(ID3D12Resource), (void**)&texture->handle);
769780
}
770781

771782
{
@@ -875,6 +886,8 @@ static void d3d12_upload_texture(D3D12GraphicsCommandList cmd,
875886
{
876887
unsigned width = texture->desc.Width >> i;
877888
unsigned height = texture->desc.Height >> i;
889+
if (width == 0) width = 1;
890+
if (height == 0) height = 1;
878891
struct
879892
{
880893
uint32_t src_level;
@@ -946,15 +959,26 @@ static void gfx_display_d3d12_blend_begin(void *data)
946959
{
947960
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
948961
D3D12GraphicsCommandList cmd = d3d12->queue.cmd;
949-
d3d12->sprites.pipe = d3d12->sprites.pipe_blend;
962+
963+
#ifdef HAVE_DXGI_HDR
964+
if((d3d12->chain.current_rt_format == DXGI_FORMAT_R10G10B10A2_UNORM) || (d3d12->chain.current_rt_format == DXGI_FORMAT_R16G16B16A16_UNORM))
965+
d3d12->sprites.pipe = d3d12->sprites.pipe_blend_hdr;
966+
else
967+
#endif
968+
d3d12->sprites.pipe = d3d12->sprites.pipe_blend;
950969
cmd->lpVtbl->SetPipelineState(cmd, (D3D12PipelineState)d3d12->sprites.pipe);
951970
}
952971

953972
static void gfx_display_d3d12_blend_end(void *data)
954973
{
955974
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
956975
D3D12GraphicsCommandList cmd = d3d12->queue.cmd;
957-
d3d12->sprites.pipe = d3d12->sprites.pipe_noblend;
976+
#ifdef HAVE_DXGI_HDR
977+
if((d3d12->chain.current_rt_format == DXGI_FORMAT_R10G10B10A2_UNORM) || (d3d12->chain.current_rt_format == DXGI_FORMAT_R16G16B16A16_UNORM))
978+
d3d12->sprites.pipe = d3d12->sprites.pipe_noblend_hdr;
979+
else
980+
#endif
981+
d3d12->sprites.pipe = d3d12->sprites.pipe_noblend;
958982
cmd->lpVtbl->SetPipelineState(cmd, (D3D12PipelineState)d3d12->sprites.pipe);
959983
}
960984

@@ -1063,8 +1087,15 @@ static void gfx_display_d3d12_draw(gfx_display_ctx_draw_t *draw,
10631087

10641088
sprite++;
10651089
}
1066-
cmd->lpVtbl->SetPipelineState(cmd,
1067-
(D3D12PipelineState)d3d12->pipes[VIDEO_SHADER_STOCK_BLEND]);
1090+
1091+
#ifdef HAVE_DXGI_HDR
1092+
if((d3d12->chain.current_rt_format == DXGI_FORMAT_R10G10B10A2_UNORM) || (d3d12->chain.current_rt_format == DXGI_FORMAT_R16G16B16A16_UNORM))
1093+
cmd->lpVtbl->SetPipelineState(cmd,
1094+
(D3D12PipelineState)d3d12->pipes[VIDEO_SHADER_STOCK_HDR]);
1095+
else
1096+
#endif
1097+
cmd->lpVtbl->SetPipelineState(cmd,
1098+
(D3D12PipelineState)d3d12->pipes[VIDEO_SHADER_STOCK_BLEND]);
10681099
cmd->lpVtbl->IASetPrimitiveTopology(cmd,
10691100
D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
10701101
}
@@ -1081,8 +1112,16 @@ static void gfx_display_d3d12_draw(gfx_display_ctx_draw_t *draw,
10811112
d3d12_upload_texture(cmd, texture, d3d12);
10821113

10831114
if (vertex_count > 1)
1084-
cmd->lpVtbl->SetPipelineState(cmd,
1085-
(D3D12PipelineState)d3d12->pipes[VIDEO_SHADER_STOCK_BLEND]);
1115+
{
1116+
#ifdef HAVE_DXGI_HDR
1117+
if((d3d12->chain.current_rt_format == DXGI_FORMAT_R10G10B10A2_UNORM) || (d3d12->chain.current_rt_format == DXGI_FORMAT_R16G16B16A16_UNORM))
1118+
cmd->lpVtbl->SetPipelineState(cmd,
1119+
(D3D12PipelineState)d3d12->pipes[VIDEO_SHADER_STOCK_HDR]);
1120+
else
1121+
#endif
1122+
cmd->lpVtbl->SetPipelineState(cmd,
1123+
(D3D12PipelineState)d3d12->pipes[VIDEO_SHADER_STOCK_BLEND]);
1124+
}
10861125
else
10871126
cmd->lpVtbl->SetPipelineState(cmd,
10881127
(D3D12PipelineState)d3d12->sprites.pipe);
@@ -1426,7 +1465,12 @@ static void d3d12_font_render_line(
14261465
if (font->texture.dirty)
14271466
d3d12_upload_texture(cmd, &font->texture, d3d12);
14281467

1429-
cmd->lpVtbl->SetPipelineState(cmd, (D3D12PipelineState)d3d12->sprites.pipe_font);
1468+
#ifdef HAVE_DXGI_HDR
1469+
if((d3d12->chain.current_rt_format == DXGI_FORMAT_R10G10B10A2_UNORM) || (d3d12->chain.current_rt_format == DXGI_FORMAT_R16G16B16A16_UNORM))
1470+
cmd->lpVtbl->SetPipelineState(cmd, (D3D12PipelineState)d3d12->sprites.pipe_font_hdr);
1471+
else
1472+
#endif
1473+
cmd->lpVtbl->SetPipelineState(cmd, (D3D12PipelineState)d3d12->sprites.pipe_font);
14301474
cmd->lpVtbl->SetGraphicsRootDescriptorTable(cmd, ROOT_ID_TEXTURE_T,
14311475
font->texture.gpu_descriptor[0]);
14321476
cmd->lpVtbl->SetGraphicsRootDescriptorTable(cmd, ROOT_ID_SAMPLER_T,
@@ -2257,10 +2301,7 @@ static bool d3d12_gfx_set_shader(void* data, enum rarch_shader_type type, const
22572301
d3d_compile(ps_src, 0, _path, "main", "ps_5_0", &ps_code);
22582302

22592303
desc.BlendState.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
2260-
if (i == d3d12->shader_preset->passes - 1)
2261-
desc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
2262-
else
2263-
desc.RTVFormats[0] = glslang_format_to_dxgi(d3d12->pass[i].semantics.format);
2304+
desc.RTVFormats[0] = glslang_format_to_dxgi(d3d12->pass[i].semantics.format);
22642305

22652306
desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
22662307
desc.InputLayout.pInputElementDescs = inputElementDesc;
@@ -2531,6 +2572,21 @@ static bool d3d12_gfx_init_pipelines(d3d12_video_t* d3d12)
25312572
d3d12_init_pipeline(
25322573
d3d12->device, vs_code, ps_code, gs_code, &desc, &d3d12->sprites.pipe_font);
25332574

2575+
#ifdef HAVE_DXGI_HDR
2576+
desc.RTVFormats[0] = DXGI_FORMAT_R10G10B10A2_UNORM;
2577+
2578+
desc.BlendState.RenderTarget[0].BlendEnable = false;
2579+
d3d12_init_pipeline(
2580+
d3d12->device, vs_code, ps_code, gs_code, &desc, &d3d12->sprites.pipe_noblend_hdr);
2581+
2582+
desc.BlendState.RenderTarget[0].BlendEnable = true;
2583+
d3d12_init_pipeline(
2584+
d3d12->device, vs_code, ps_code, gs_code, &desc, &d3d12->sprites.pipe_blend_hdr);
2585+
2586+
d3d12_init_pipeline(
2587+
d3d12->device, vs_code, ps_code, gs_code, &desc, &d3d12->sprites.pipe_font_hdr);
2588+
#endif
2589+
25342590
Release(vs_code);
25352591
Release(ps_code);
25362592
Release(gs_code);
@@ -2943,7 +2999,7 @@ static bool d3d12_init_swapchain(d3d12_video_t* d3d12,
29432999
d3d12->chain.back_buffer.desc.Width = width;
29443000
d3d12->chain.back_buffer.desc.Height = height;
29453001
d3d12->chain.back_buffer.desc.Format =
2946-
d3d12->shader_preset && d3d12->shader_preset->passes ? glslang_format_to_dxgi(d3d12->pass[d3d12->shader_preset->passes - 1].semantics.format) : DXGI_FORMAT_R8G8B8A8_UNORM;
3002+
DXGI_FORMAT_R8G8B8A8_UNORM;
29473003
d3d12->chain.back_buffer.desc.Flags =
29483004
D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
29493005
d3d12->chain.back_buffer.srv_heap =
@@ -3074,7 +3130,12 @@ static void d3d12_init_descriptor_heap(D3D12Device device, d3d12_descriptor_heap
30743130
{
30753131
device->lpVtbl->CreateDescriptorHeap(device, &out->desc, uuidof(ID3D12DescriptorHeap), (void**)&out->handle);
30763132
out->cpu = D3D12GetCPUDescriptorHandleForHeapStart(out->handle);
3077-
out->gpu = D3D12GetGPUDescriptorHandleForHeapStart(out->handle);
3133+
3134+
if (out->desc.Flags & D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE)
3135+
out->gpu = D3D12GetGPUDescriptorHandleForHeapStart(out->handle);
3136+
else
3137+
out->gpu.ptr = 0;
3138+
30783139
out->stride = device->lpVtbl->GetDescriptorHandleIncrementSize(device, out->desc.Type);
30793140
out->map = (bool*)calloc(out->desc.NumDescriptors, sizeof(bool));
30803141
}
@@ -3822,6 +3883,8 @@ static bool d3d12_gfx_frame(
38223883
bool video_hdr_enable = video_info->hdr_enable;
38233884
DXGI_FORMAT back_buffer_format = d3d12->shader_preset && d3d12->shader_preset->passes ? glslang_format_to_dxgi(d3d12->pass[d3d12->shader_preset->passes - 1].semantics.format) : d3d12->chain.formats[d3d12->chain.bit_depth];
38243885
bool use_back_buffer = back_buffer_format != d3d12->chain.formats[d3d12->chain.bit_depth]; /* this is used when presets use scale_type in their last pass */
3886+
3887+
d3d12->chain.current_rt_format = back_buffer_format;
38253888
#endif
38263889
D3D12GraphicsCommandList cmd = d3d12->queue.cmd;
38273890

@@ -3926,7 +3989,7 @@ static bool d3d12_gfx_frame(
39263989
0, sizeof(d3d12->chain.back_buffer));
39273990
d3d12->chain.back_buffer.desc.Width = video_width;
39283991
d3d12->chain.back_buffer.desc.Height = video_height;
3929-
d3d12->chain.back_buffer.desc.Format = back_buffer_format;
3992+
d3d12->chain.back_buffer.desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
39303993
d3d12->chain.back_buffer.desc.Flags =
39313994
D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
39323995
d3d12->chain.back_buffer.srv_heap = &d3d12->desc.srv_heap;
@@ -4302,11 +4365,6 @@ static bool d3d12_gfx_frame(
43024365
if (d3d12->pass[i].rt.handle)
43034366
{
43044367
UINT start_vertex_location = 4;
4305-
D3D12_RESOURCE_TRANSITION(
4306-
cmd,
4307-
d3d12->pass[i].rt.handle,
4308-
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE,
4309-
D3D12_RESOURCE_STATE_RENDER_TARGET);
43104368

43114369
cmd->lpVtbl->OMSetRenderTargets(cmd, 1,
43124370
&d3d12->pass[i].rt.rt_view, FALSE, NULL);
@@ -4354,6 +4412,16 @@ static bool d3d12_gfx_frame(
43544412
d3d12->pass[i].rt.handle,
43554413
D3D12_RESOURCE_STATE_RENDER_TARGET,
43564414
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
4415+
4416+
/* Generate mipmaps for framebuffer if it has multiple mipmap levels */
4417+
d3d12_generate_mipmaps(cmd, &d3d12->pass[i].rt, d3d12);
4418+
4419+
D3D12_RESOURCE_TRANSITION(
4420+
cmd,
4421+
d3d12->pass[i].rt.handle,
4422+
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE,
4423+
D3D12_RESOURCE_STATE_RENDER_TARGET);
4424+
43574425
texture = &d3d12->pass[i].rt;
43584426
}
43594427
else
@@ -4422,6 +4490,24 @@ static bool d3d12_gfx_frame(
44224490
d3d12->chain.frame_index = DXGIGetCurrentBackBufferIndex(
44234491
d3d12->chain.handle);
44244492

4493+
#ifdef HAVE_DXGI_HDR
4494+
/* Copy over back buffer to swap chain render targets */
4495+
if ((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE) && use_back_buffer)
4496+
{
4497+
d3d12->chain.current_rt_format = d3d12->chain.back_buffer.desc.Format;
4498+
4499+
cmd->lpVtbl->OMSetRenderTargets(
4500+
cmd, 1,
4501+
&d3d12->chain.back_buffer.rt_view,
4502+
FALSE, NULL);
4503+
cmd->lpVtbl->ClearRenderTargetView(
4504+
cmd,
4505+
d3d12->chain.back_buffer.rt_view,
4506+
d3d12->chain.clearcolor,
4507+
0, NULL);
4508+
}
4509+
else
4510+
#endif
44254511
{
44264512
D3D12_RESOURCE_TRANSITION(
44274513
cmd,
@@ -4474,6 +4560,8 @@ static bool d3d12_gfx_frame(
44744560
/* Copy over back buffer to swap chain render targets */
44754561
if ((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE) && use_back_buffer)
44764562
{
4563+
cmd->lpVtbl->SetPipelineState(cmd, d3d12->pipes[VIDEO_SHADER_STOCK_HDR]);
4564+
44774565
D3D12_RESOURCE_TRANSITION(
44784566
cmd,
44794567
d3d12->chain.renderTargets[d3d12->chain.frame_index],
@@ -4485,18 +4573,20 @@ static bool d3d12_gfx_frame(
44854573
d3d12->chain.back_buffer.handle,
44864574
D3D12_RESOURCE_STATE_RENDER_TARGET,
44874575
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
4488-
cmd->lpVtbl->SetPipelineState(cmd, d3d12->pipes[VIDEO_SHADER_STOCK_HDR]);
4576+
4577+
d3d12->chain.current_rt_format = back_buffer_format;
44894578

44904579
cmd->lpVtbl->OMSetRenderTargets(
44914580
cmd, 1, &d3d12->chain.desc_handles[d3d12->chain.frame_index],
44924581
FALSE, NULL);
44934582
cmd->lpVtbl->ClearRenderTargetView(
44944583
cmd, d3d12->chain.desc_handles[d3d12->chain.frame_index],
44954584
d3d12->chain.clearcolor, 0, NULL);
4496-
4585+
44974586
cmd->lpVtbl->RSSetViewports(cmd, 1, &d3d12->chain.viewport);
44984587
cmd->lpVtbl->RSSetScissorRects(cmd, 1, &d3d12->chain.scissorRect);
44994588

4589+
cmd->lpVtbl->SetGraphicsRootSignature(cmd, d3d12->desc.rootSignature);
45004590
cmd->lpVtbl->SetGraphicsRootDescriptorTable(cmd, ROOT_ID_TEXTURE_T,
45014591
d3d12->chain.back_buffer.gpu_descriptor[0]);
45024592
cmd->lpVtbl->SetGraphicsRootDescriptorTable(cmd, ROOT_ID_SAMPLER_T,
@@ -4507,6 +4597,12 @@ static bool d3d12_gfx_frame(
45074597
const float prev_inverse_tonemap = d3d12->hdr.ubo_values.inverse_tonemap;
45084598
const float prev_hdr10 = d3d12->hdr.ubo_values.hdr10;
45094599

4600+
d3d12->hdr.ubo_values.source_size.width = d3d12->frame.output_size.x;
4601+
d3d12->hdr.ubo_values.source_size.height = d3d12->frame.output_size.y;
4602+
4603+
d3d12->hdr.ubo_values.output_size.width = d3d12->frame.output_size.x;
4604+
d3d12->hdr.ubo_values.output_size.height = d3d12->frame.output_size.y;
4605+
45104606
d3d12->hdr.ubo_values.scanlines = 0.0f;
45114607
d3d12->hdr.ubo_values.inverse_tonemap = 1.0f;
45124608
d3d12->hdr.ubo_values.hdr10 = 1.0f;
@@ -4531,6 +4627,15 @@ static bool d3d12_gfx_frame(
45314627
}
45324628

45334629
cmd->lpVtbl->DrawInstanced(cmd, 4, 1, 0, 0);
4630+
4631+
D3D12_RESOURCE_TRANSITION(
4632+
cmd,
4633+
d3d12->chain.back_buffer.handle,
4634+
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE,
4635+
D3D12_RESOURCE_STATE_RENDER_TARGET);
4636+
4637+
cmd->lpVtbl->RSSetViewports(cmd, 1, &d3d12->frame.viewport);
4638+
cmd->lpVtbl->RSSetScissorRects(cmd, 1, &d3d12->frame.scissorRect);
45344639
}
45354640
#endif
45364641

@@ -4539,13 +4644,9 @@ static bool d3d12_gfx_frame(
45394644

45404645
#ifdef HAVE_DXGI_HDR
45414646
if ((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE) &&
4542-
(d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE))
4647+
((d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE) || (d3d12->flags & D3D12_ST_FLAG_OVERLAYS_ENABLE)))
45434648
{
4544-
D3D12_RESOURCE_TRANSITION(
4545-
cmd,
4546-
d3d12->chain.back_buffer.handle,
4547-
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE,
4548-
D3D12_RESOURCE_STATE_RENDER_TARGET);
4649+
d3d12->chain.current_rt_format = d3d12->chain.back_buffer.desc.Format;
45494650

45504651
cmd->lpVtbl->OMSetRenderTargets(
45514652
cmd, 1,
@@ -4571,9 +4672,13 @@ static bool d3d12_gfx_frame(
45714672
&& d3d12->menu.texture.handle)
45724673
{
45734674
if (d3d12->menu.texture.dirty)
4675+
{
45744676
d3d12_upload_texture(cmd, &d3d12->menu.texture,
45754677
d3d12);
45764678

4679+
cmd->lpVtbl->SetPipelineState(cmd, d3d12->pipes[VIDEO_SHADER_STOCK_BLEND]);
4680+
}
4681+
45774682
cmd->lpVtbl->SetGraphicsRootConstantBufferView(
45784683
cmd, ROOT_ID_UBO, d3d12->ubo_view.BufferLocation);
45794684

@@ -4657,21 +4762,17 @@ static bool d3d12_gfx_frame(
46574762
#ifdef HAVE_DXGI_HDR
46584763
/* Copy over back buffer to swap chain render targets */
46594764
if ((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE) &&
4660-
(d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE))
4765+
((d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE) || (d3d12->flags & D3D12_ST_FLAG_OVERLAYS_ENABLE)))
46614766
{
4662-
D3D12_RESOURCE_TRANSITION(
4663-
cmd,
4664-
d3d12->chain.renderTargets[d3d12->chain.frame_index],
4665-
D3D12_RESOURCE_STATE_PRESENT,
4666-
D3D12_RESOURCE_STATE_RENDER_TARGET);
4667-
46684767
D3D12_RESOURCE_TRANSITION(
46694768
cmd,
46704769
d3d12->chain.back_buffer.handle,
46714770
D3D12_RESOURCE_STATE_RENDER_TARGET,
46724771
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
46734772
cmd->lpVtbl->SetPipelineState(cmd, d3d12->pipes[VIDEO_SHADER_STOCK_HDR]);
46744773

4774+
d3d12->chain.current_rt_format = back_buffer_format;
4775+
46754776
cmd->lpVtbl->OMSetRenderTargets(
46764777
cmd, 1, &d3d12->chain.desc_handles[d3d12->chain.frame_index],
46774778
FALSE, NULL);
@@ -4719,6 +4820,13 @@ static bool d3d12_gfx_frame(
47194820
cmd->lpVtbl->RSSetScissorRects(cmd, 1, &d3d12->chain.scissorRect);
47204821

47214822
cmd->lpVtbl->DrawInstanced(cmd, 4, 1, 0, 0);
4823+
4824+
D3D12_RESOURCE_TRANSITION(
4825+
cmd,
4826+
d3d12->chain.back_buffer.handle,
4827+
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE,
4828+
D3D12_RESOURCE_STATE_RENDER_TARGET
4829+
);
47224830
}
47234831
#endif
47244832

0 commit comments

Comments
 (0)