Skip to content

Commit 6c29e2d

Browse files
Fixes for HDR when using presets that use scale_type (#18657)
* Fixed menu system displaying incorrectly in HDR on D3D11, D3D12 and Vulkan * Fixed the menu in D3D11 and D3D12 when using HDR native shader's Vulkan still has issues * Fixed Vulkan driver HDR menu when we're using a HDR native shader Removed redundant constant buffer * Fix for HDR when using presets that use scale_type
1 parent f24b502 commit 6c29e2d

File tree

3 files changed

+190
-6
lines changed

3 files changed

+190
-6
lines changed

gfx/drivers/d3d11.c

Lines changed: 74 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3305,6 +3305,7 @@ static bool d3d11_gfx_frame(
33053305
bool d3d11_hdr_enable = (d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE) ? true : false;
33063306
bool video_hdr_enable = video_info->hdr_enable;
33073307
DXGI_FORMAT back_buffer_format = d3d11->shader_preset && d3d11->shader_preset->passes ? glslang_format_to_dxgi(d3d11->pass[d3d11->shader_preset->passes - 1].semantics.format) : d3d11->chain_formats[d3d11->chain_bit_depth];
3308+
bool use_back_buffer = back_buffer_format != d3d11->chain_formats[d3d11->chain_bit_depth]; /* this is used when presets use scale_type in their last pass */
33083309
#endif
33093310

33103311
if (d3d11->flags & D3D11_ST_FLAG_WAITABLE_SWAPCHAINS)
@@ -3735,15 +3736,30 @@ static bool d3d11_gfx_frame(
37353736
}
37363737
}
37373738

3738-
context->lpVtbl->OMSetRenderTargets(context, 1, &rtv, NULL);
3739-
context->lpVtbl->ClearRenderTargetView(context, rtv, d3d11->clearcolor);
3739+
3740+
#ifdef HAVE_DXGI_HDR
3741+
if ((d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE)
3742+
&& use_back_buffer)
3743+
{
3744+
context->lpVtbl->OMSetRenderTargets(context, 1,
3745+
&d3d11->back_buffer.rt_view, NULL);
3746+
context->lpVtbl->ClearRenderTargetView(context,
3747+
d3d11->back_buffer.rt_view, d3d11->clearcolor);
3748+
}
3749+
else
3750+
#endif
3751+
{
3752+
context->lpVtbl->OMSetRenderTargets(context, 1, &rtv, NULL);
3753+
context->lpVtbl->ClearRenderTargetView(context, rtv, d3d11->clearcolor);
3754+
}
37403755

37413756
context->lpVtbl->RSSetViewports(context, 1, &d3d11->frame.viewport);
37423757

37433758
if (texture)
37443759
{
37453760
#ifdef HAVE_DXGI_HDR
3746-
if (d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE)
3761+
if((d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE)
3762+
&& !use_back_buffer)
37473763
{
37483764
d3d11_shader_t *shader = &d3d11->shaders[VIDEO_SHADER_STOCK_HDR];
37493765
context->lpVtbl->IASetInputLayout(context, shader->layout);
@@ -3823,6 +3839,61 @@ static bool d3d11_gfx_frame(
38233839
context->lpVtbl->Draw(context, 4, 0);
38243840

38253841
#ifdef HAVE_DXGI_HDR
3842+
/* Copy over back buffer to swap chain render targets */
3843+
if ((d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE)
3844+
&& use_back_buffer)
3845+
{
3846+
ID3D11ShaderResourceView* nullSRV[1] = {NULL};
3847+
context->lpVtbl->OMSetRenderTargets(context, 1, &rtv, NULL);
3848+
context->lpVtbl->ClearRenderTargetView(context, rtv, d3d11->clearcolor);
3849+
context->lpVtbl->RSSetViewports(context, 1, &d3d11->viewport);
3850+
context->lpVtbl->RSSetScissorRects(context, 1, &d3d11->scissor);
3851+
3852+
{
3853+
d3d11_shader_t *shader = &d3d11->shaders[VIDEO_SHADER_STOCK_HDR];
3854+
context->lpVtbl->IASetInputLayout(context, shader->layout);
3855+
context->lpVtbl->VSSetShader(context, shader->vs, NULL, 0);
3856+
context->lpVtbl->PSSetShader(context, shader->ps, NULL, 0);
3857+
context->lpVtbl->GSSetShader(context, shader->gs, NULL, 0);
3858+
}
3859+
3860+
{
3861+
const float prev_iscanlines = d3d11->hdr.ubo_values.scanlines;
3862+
const float prev_inverse_tonemap = d3d11->hdr.ubo_values.inverse_tonemap;
3863+
const float prev_hdr10 = d3d11->hdr.ubo_values.hdr10;
3864+
3865+
d3d11->hdr.ubo_values.scanlines = 0.0f;
3866+
d3d11->hdr.ubo_values.inverse_tonemap = 1.0f;
3867+
d3d11->hdr.ubo_values.hdr10 = 1.0f;
3868+
3869+
D3D11_MAPPED_SUBRESOURCE mapped_ubo;
3870+
3871+
d3d11->context->lpVtbl->Map(
3872+
d3d11->context, (D3D11Resource)d3d11->hdr.ubo, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_ubo);
3873+
{
3874+
dxgi_hdr_uniform_t *ubo = (dxgi_hdr_uniform_t*)mapped_ubo.pData;
3875+
*ubo = d3d11->hdr.ubo_values;
3876+
}
3877+
d3d11->context->lpVtbl->Unmap(d3d11->context, (D3D11Resource)d3d11->hdr.ubo, 0);
3878+
3879+
d3d11->hdr.ubo_values.scanlines = prev_iscanlines;
3880+
d3d11->hdr.ubo_values.inverse_tonemap = prev_inverse_tonemap;
3881+
d3d11->hdr.ubo_values.hdr10 = prev_hdr10;
3882+
}
3883+
3884+
context->lpVtbl->VSSetConstantBuffers(context, 0, 1, &d3d11->hdr.ubo);
3885+
context->lpVtbl->PSSetConstantBuffers(context, 0, 1, &d3d11->hdr.ubo);
3886+
3887+
context->lpVtbl->PSSetShaderResources(
3888+
context, 0, 1,
3889+
&d3d11->back_buffer.view);
3890+
3891+
context->lpVtbl->Draw(context, 4, 0);
3892+
3893+
context->lpVtbl->PSSetShaderResources(
3894+
context, 0, 1, nullSRV);
3895+
}
3896+
38263897
if((d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE) &&
38273898
(d3d11->flags & D3D11_ST_FLAG_MENU_ENABLE))
38283899
{

gfx/drivers/d3d12.c

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3832,6 +3832,7 @@ static bool d3d12_gfx_frame(
38323832
bool d3d12_hdr_enable = false;
38333833
bool video_hdr_enable = video_info->hdr_enable;
38343834
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];
3835+
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 */
38353836
#endif
38363837
D3D12GraphicsCommandList cmd = d3d12->queue.cmd;
38373838

@@ -4383,7 +4384,8 @@ static bool d3d12_gfx_frame(
43834384
d3d12->desc.rootSignature);
43844385

43854386
#ifdef HAVE_DXGI_HDR
4386-
if (d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE)
4387+
if((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE)
4388+
&& !use_back_buffer)
43874389
{
43884390
cmd->lpVtbl->SetPipelineState(cmd, d3d12->pipes[VIDEO_SHADER_STOCK_NOBLEND_HDR]);
43894391

@@ -4482,6 +4484,70 @@ static bool d3d12_gfx_frame(
44824484

44834485
cmd->lpVtbl->DrawInstanced(cmd, 4, 1, 0, 0);
44844486

4487+
#ifdef HAVE_DXGI_HDR
4488+
/* Copy over back buffer to swap chain render targets */
4489+
if ((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE) && use_back_buffer)
4490+
{
4491+
D3D12_RESOURCE_TRANSITION(
4492+
cmd,
4493+
d3d12->chain.renderTargets[d3d12->chain.frame_index],
4494+
D3D12_RESOURCE_STATE_PRESENT,
4495+
D3D12_RESOURCE_STATE_RENDER_TARGET);
4496+
4497+
D3D12_RESOURCE_TRANSITION(
4498+
cmd,
4499+
d3d12->chain.back_buffer.handle,
4500+
D3D12_RESOURCE_STATE_RENDER_TARGET,
4501+
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
4502+
cmd->lpVtbl->SetPipelineState(cmd, d3d12->pipes[VIDEO_SHADER_STOCK_HDR]);
4503+
4504+
cmd->lpVtbl->OMSetRenderTargets(
4505+
cmd, 1, &d3d12->chain.desc_handles[d3d12->chain.frame_index],
4506+
FALSE, NULL);
4507+
cmd->lpVtbl->ClearRenderTargetView(
4508+
cmd, d3d12->chain.desc_handles[d3d12->chain.frame_index],
4509+
d3d12->chain.clearcolor, 0, NULL);
4510+
4511+
cmd->lpVtbl->RSSetViewports(cmd, 1, &d3d12->chain.viewport);
4512+
cmd->lpVtbl->RSSetScissorRects(cmd, 1, &d3d12->chain.scissorRect);
4513+
4514+
cmd->lpVtbl->SetGraphicsRootDescriptorTable(cmd, ROOT_ID_TEXTURE_T,
4515+
d3d12->chain.back_buffer.gpu_descriptor[0]);
4516+
cmd->lpVtbl->SetGraphicsRootDescriptorTable(cmd, ROOT_ID_SAMPLER_T,
4517+
d3d12->samplers[RARCH_FILTER_UNSPEC][RARCH_WRAP_DEFAULT]);
4518+
4519+
{
4520+
const float prev_iscanlines = d3d12->hdr.ubo_values.scanlines;
4521+
const float prev_inverse_tonemap = d3d12->hdr.ubo_values.inverse_tonemap;
4522+
const float prev_hdr10 = d3d12->hdr.ubo_values.hdr10;
4523+
4524+
d3d12->hdr.ubo_values.scanlines = 0.0f;
4525+
d3d12->hdr.ubo_values.inverse_tonemap = 1.0f;
4526+
d3d12->hdr.ubo_values.hdr10 = 1.0f;
4527+
4528+
{
4529+
dxgi_hdr_uniform_t* mapped_ubo;
4530+
D3D12_RANGE read_range;
4531+
read_range.Begin = 0;
4532+
read_range.End = 0;
4533+
D3D12Map(d3d12->hdr.ubo_post, 0, &read_range, (void**)&mapped_ubo);
4534+
*mapped_ubo = d3d12->hdr.ubo_values;
4535+
D3D12Unmap(d3d12->hdr.ubo_post, 0, NULL);
4536+
}
4537+
4538+
cmd->lpVtbl->SetGraphicsRootConstantBufferView(
4539+
cmd, ROOT_ID_UBO,
4540+
d3d12->hdr.ubo_post_view.BufferLocation);
4541+
4542+
d3d12->hdr.ubo_values.scanlines = prev_iscanlines;
4543+
d3d12->hdr.ubo_values.inverse_tonemap = prev_inverse_tonemap;
4544+
d3d12->hdr.ubo_values.hdr10 = prev_hdr10;
4545+
}
4546+
4547+
cmd->lpVtbl->DrawInstanced(cmd, 4, 1, 0, 0);
4548+
}
4549+
#endif
4550+
44854551
cmd->lpVtbl->SetPipelineState(cmd, d3d12->pipes[VIDEO_SHADER_STOCK_BLEND]);
44864552
cmd->lpVtbl->SetGraphicsRootSignature(cmd, d3d12->desc.rootSignature);
44874553

gfx/drivers/vulkan.c

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4763,6 +4763,16 @@ static bool vulkan_frame(void *data, const void *frame,
47634763
if (!filter_chain && vk->filter_chain_default)
47644764
filter_chain = vk->filter_chain_default;
47654765

4766+
#ifdef VULKAN_HDR_SWAPCHAIN
4767+
struct video_shader* shader_preset = vulkan_filter_chain_get_preset(
4768+
filter_chain);
4769+
VkFormat back_buffer_format = (shader_preset && shader_preset->passes)
4770+
? vulkan_filter_chain_get_pass_rt_format(filter_chain, shader_preset->passes - 1)
4771+
: vk->context->swapchain_format;
4772+
bool use_main_buffer = vulkan_is_hdr10_format(back_buffer_format) &&
4773+
(filter_chain && !vulkan_filter_chain_emits_hdr10(filter_chain)); /* this is used when presets use scale_type in their last pass */
4774+
#endif /* VULKAN_HDR_SWAPCHAIN */
4775+
47664776
/* Bookkeeping on start of frame. */
47674777
struct vk_per_frame *chain = &vk->swapchain[frame_index];
47684778
struct vk_image *backbuffer = &vk->backbuffers[swapchain_index];
@@ -5053,6 +5063,11 @@ static bool vulkan_frame(void *data, const void *frame,
50535063
}
50545064
#endif
50555065

5066+
#ifdef VULKAN_HDR_SWAPCHAIN
5067+
if (use_main_buffer)
5068+
backbuffer = &vk->main_buffer;
5069+
#endif /* VULKAN_HDR_SWAPCHAIN */
5070+
50565071
/* Render to backbuffer. */
50575072
if ( (backbuffer->image != VK_NULL_HANDLE)
50585073
&& (vk->context->flags & VK_CTX_FLAG_HAS_ACQUIRED_SWAPCHAIN))
@@ -5081,10 +5096,42 @@ static bool vulkan_frame(void *data, const void *frame,
50815096
&vk->vk_vp, vk->mvp.data);
50825097

50835098
#ifdef VULKAN_HDR_SWAPCHAIN
5099+
bool end_pass = true;
5100+
bool end_main_pass = true;
5101+
5102+
/* Copy over back buffer to swap chain render targets */
5103+
if ((vk->context->flags & VK_CTX_FLAG_HDR_ENABLE) &&
5104+
use_main_buffer)
5105+
{
5106+
if(end_pass)
5107+
{
5108+
vkCmdEndRenderPass(vk->cmd);
5109+
end_pass = false;
5110+
}
5111+
5112+
backbuffer = &vk->backbuffers[swapchain_index];
5113+
/* Prepare source buffer for reading */
5114+
VULKAN_IMAGE_LAYOUT_TRANSITION(vk->cmd, vk->main_buffer.image,
5115+
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
5116+
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT,
5117+
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
5118+
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
5119+
5120+
vulkan_run_hdr_pipeline(vk->pipelines.hdr, vk->render_pass, &vk->main_buffer, backbuffer, vk, &vk->hdr.ubo);
5121+
5122+
VULKAN_IMAGE_LAYOUT_TRANSITION(vk->cmd, vk->main_buffer.image,
5123+
VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5124+
0, VK_ACCESS_TRANSFER_WRITE_BIT,
5125+
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
5126+
VK_PIPELINE_STAGE_TRANSFER_BIT);
5127+
5128+
end_main_pass = false;
5129+
}
5130+
50845131
if ((vk->context->flags & VK_CTX_FLAG_HDR_ENABLE) &&
50855132
(vk->flags & VK_FLAG_MENU_ENABLE))
50865133
{
5087-
vkCmdEndRenderPass(vk->cmd);
5134+
if(end_pass) vkCmdEndRenderPass(vk->cmd);
50885135

50895136
backbuffer = &vk->main_buffer;
50905137

@@ -5160,7 +5207,7 @@ static bool vulkan_frame(void *data, const void *frame,
51605207
#endif
51615208

51625209
/* End the render pass. We're done rendering to backbuffer now. */
5163-
vkCmdEndRenderPass(vk->cmd);
5210+
if(end_main_pass) vkCmdEndRenderPass(vk->cmd);
51645211

51655212
#ifdef VULKAN_HDR_SWAPCHAIN
51665213
/* Copy over back buffer to swap chain render targets */

0 commit comments

Comments
 (0)