Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 74 additions & 3 deletions gfx/drivers/d3d11.c
Original file line number Diff line number Diff line change
Expand Up @@ -3305,6 +3305,7 @@ static bool d3d11_gfx_frame(
bool d3d11_hdr_enable = (d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE) ? true : false;
bool video_hdr_enable = video_info->hdr_enable;
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];
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 */
#endif

if (d3d11->flags & D3D11_ST_FLAG_WAITABLE_SWAPCHAINS)
Expand Down Expand Up @@ -3735,15 +3736,30 @@ static bool d3d11_gfx_frame(
}
}

context->lpVtbl->OMSetRenderTargets(context, 1, &rtv, NULL);
context->lpVtbl->ClearRenderTargetView(context, rtv, d3d11->clearcolor);

#ifdef HAVE_DXGI_HDR
if ((d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE)
&& use_back_buffer)
{
context->lpVtbl->OMSetRenderTargets(context, 1,
&d3d11->back_buffer.rt_view, NULL);
context->lpVtbl->ClearRenderTargetView(context,
d3d11->back_buffer.rt_view, d3d11->clearcolor);
}
else
#endif
{
context->lpVtbl->OMSetRenderTargets(context, 1, &rtv, NULL);
context->lpVtbl->ClearRenderTargetView(context, rtv, d3d11->clearcolor);
}

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

if (texture)
{
#ifdef HAVE_DXGI_HDR
if (d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE)
if((d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE)
&& !use_back_buffer)
{
d3d11_shader_t *shader = &d3d11->shaders[VIDEO_SHADER_STOCK_HDR];
context->lpVtbl->IASetInputLayout(context, shader->layout);
Expand Down Expand Up @@ -3823,6 +3839,61 @@ static bool d3d11_gfx_frame(
context->lpVtbl->Draw(context, 4, 0);

#ifdef HAVE_DXGI_HDR
/* Copy over back buffer to swap chain render targets */
if ((d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE)
&& use_back_buffer)
{
ID3D11ShaderResourceView* nullSRV[1] = {NULL};
context->lpVtbl->OMSetRenderTargets(context, 1, &rtv, NULL);
context->lpVtbl->ClearRenderTargetView(context, rtv, d3d11->clearcolor);
context->lpVtbl->RSSetViewports(context, 1, &d3d11->viewport);
context->lpVtbl->RSSetScissorRects(context, 1, &d3d11->scissor);

{
d3d11_shader_t *shader = &d3d11->shaders[VIDEO_SHADER_STOCK_HDR];
context->lpVtbl->IASetInputLayout(context, shader->layout);
context->lpVtbl->VSSetShader(context, shader->vs, NULL, 0);
context->lpVtbl->PSSetShader(context, shader->ps, NULL, 0);
context->lpVtbl->GSSetShader(context, shader->gs, NULL, 0);
}

{
const float prev_iscanlines = d3d11->hdr.ubo_values.scanlines;
const float prev_inverse_tonemap = d3d11->hdr.ubo_values.inverse_tonemap;
const float prev_hdr10 = d3d11->hdr.ubo_values.hdr10;

d3d11->hdr.ubo_values.scanlines = 0.0f;
d3d11->hdr.ubo_values.inverse_tonemap = 1.0f;
d3d11->hdr.ubo_values.hdr10 = 1.0f;

D3D11_MAPPED_SUBRESOURCE mapped_ubo;

d3d11->context->lpVtbl->Map(
d3d11->context, (D3D11Resource)d3d11->hdr.ubo, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_ubo);
{
dxgi_hdr_uniform_t *ubo = (dxgi_hdr_uniform_t*)mapped_ubo.pData;
*ubo = d3d11->hdr.ubo_values;
}
d3d11->context->lpVtbl->Unmap(d3d11->context, (D3D11Resource)d3d11->hdr.ubo, 0);

d3d11->hdr.ubo_values.scanlines = prev_iscanlines;
d3d11->hdr.ubo_values.inverse_tonemap = prev_inverse_tonemap;
d3d11->hdr.ubo_values.hdr10 = prev_hdr10;
}

context->lpVtbl->VSSetConstantBuffers(context, 0, 1, &d3d11->hdr.ubo);
context->lpVtbl->PSSetConstantBuffers(context, 0, 1, &d3d11->hdr.ubo);

context->lpVtbl->PSSetShaderResources(
context, 0, 1,
&d3d11->back_buffer.view);

context->lpVtbl->Draw(context, 4, 0);

context->lpVtbl->PSSetShaderResources(
context, 0, 1, nullSRV);
}

if((d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE) &&
(d3d11->flags & D3D11_ST_FLAG_MENU_ENABLE))
{
Expand Down
68 changes: 67 additions & 1 deletion gfx/drivers/d3d12.c
Original file line number Diff line number Diff line change
Expand Up @@ -3832,6 +3832,7 @@ static bool d3d12_gfx_frame(
bool d3d12_hdr_enable = false;
bool video_hdr_enable = video_info->hdr_enable;
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];
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 */
#endif
D3D12GraphicsCommandList cmd = d3d12->queue.cmd;

Expand Down Expand Up @@ -4383,7 +4384,8 @@ static bool d3d12_gfx_frame(
d3d12->desc.rootSignature);

#ifdef HAVE_DXGI_HDR
if (d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE)
if((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE)
&& !use_back_buffer)
{
cmd->lpVtbl->SetPipelineState(cmd, d3d12->pipes[VIDEO_SHADER_STOCK_NOBLEND_HDR]);

Expand Down Expand Up @@ -4482,6 +4484,70 @@ static bool d3d12_gfx_frame(

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

#ifdef HAVE_DXGI_HDR
/* Copy over back buffer to swap chain render targets */
if ((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE) && use_back_buffer)
{
D3D12_RESOURCE_TRANSITION(
cmd,
d3d12->chain.renderTargets[d3d12->chain.frame_index],
D3D12_RESOURCE_STATE_PRESENT,
D3D12_RESOURCE_STATE_RENDER_TARGET);

D3D12_RESOURCE_TRANSITION(
cmd,
d3d12->chain.back_buffer.handle,
D3D12_RESOURCE_STATE_RENDER_TARGET,
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
cmd->lpVtbl->SetPipelineState(cmd, d3d12->pipes[VIDEO_SHADER_STOCK_HDR]);

cmd->lpVtbl->OMSetRenderTargets(
cmd, 1, &d3d12->chain.desc_handles[d3d12->chain.frame_index],
FALSE, NULL);
cmd->lpVtbl->ClearRenderTargetView(
cmd, d3d12->chain.desc_handles[d3d12->chain.frame_index],
d3d12->chain.clearcolor, 0, NULL);

cmd->lpVtbl->RSSetViewports(cmd, 1, &d3d12->chain.viewport);
cmd->lpVtbl->RSSetScissorRects(cmd, 1, &d3d12->chain.scissorRect);

cmd->lpVtbl->SetGraphicsRootDescriptorTable(cmd, ROOT_ID_TEXTURE_T,
d3d12->chain.back_buffer.gpu_descriptor[0]);
cmd->lpVtbl->SetGraphicsRootDescriptorTable(cmd, ROOT_ID_SAMPLER_T,
d3d12->samplers[RARCH_FILTER_UNSPEC][RARCH_WRAP_DEFAULT]);

{
const float prev_iscanlines = d3d12->hdr.ubo_values.scanlines;
const float prev_inverse_tonemap = d3d12->hdr.ubo_values.inverse_tonemap;
const float prev_hdr10 = d3d12->hdr.ubo_values.hdr10;

d3d12->hdr.ubo_values.scanlines = 0.0f;
d3d12->hdr.ubo_values.inverse_tonemap = 1.0f;
d3d12->hdr.ubo_values.hdr10 = 1.0f;

{
dxgi_hdr_uniform_t* mapped_ubo;
D3D12_RANGE read_range;
read_range.Begin = 0;
read_range.End = 0;
D3D12Map(d3d12->hdr.ubo_post, 0, &read_range, (void**)&mapped_ubo);
*mapped_ubo = d3d12->hdr.ubo_values;
D3D12Unmap(d3d12->hdr.ubo_post, 0, NULL);
}

cmd->lpVtbl->SetGraphicsRootConstantBufferView(
cmd, ROOT_ID_UBO,
d3d12->hdr.ubo_post_view.BufferLocation);

d3d12->hdr.ubo_values.scanlines = prev_iscanlines;
d3d12->hdr.ubo_values.inverse_tonemap = prev_inverse_tonemap;
d3d12->hdr.ubo_values.hdr10 = prev_hdr10;
}

cmd->lpVtbl->DrawInstanced(cmd, 4, 1, 0, 0);
}
#endif

cmd->lpVtbl->SetPipelineState(cmd, d3d12->pipes[VIDEO_SHADER_STOCK_BLEND]);
cmd->lpVtbl->SetGraphicsRootSignature(cmd, d3d12->desc.rootSignature);

Expand Down
51 changes: 49 additions & 2 deletions gfx/drivers/vulkan.c
Original file line number Diff line number Diff line change
Expand Up @@ -4763,6 +4763,16 @@ static bool vulkan_frame(void *data, const void *frame,
if (!filter_chain && vk->filter_chain_default)
filter_chain = vk->filter_chain_default;

#ifdef VULKAN_HDR_SWAPCHAIN
struct video_shader* shader_preset = vulkan_filter_chain_get_preset(
filter_chain);
VkFormat back_buffer_format = (shader_preset && shader_preset->passes)
? vulkan_filter_chain_get_pass_rt_format(filter_chain, shader_preset->passes - 1)
: vk->context->swapchain_format;
bool use_main_buffer = vulkan_is_hdr10_format(back_buffer_format) &&
(filter_chain && !vulkan_filter_chain_emits_hdr10(filter_chain)); /* this is used when presets use scale_type in their last pass */
#endif /* VULKAN_HDR_SWAPCHAIN */

/* Bookkeeping on start of frame. */
struct vk_per_frame *chain = &vk->swapchain[frame_index];
struct vk_image *backbuffer = &vk->backbuffers[swapchain_index];
Expand Down Expand Up @@ -5053,6 +5063,11 @@ static bool vulkan_frame(void *data, const void *frame,
}
#endif

#ifdef VULKAN_HDR_SWAPCHAIN
if (use_main_buffer)
backbuffer = &vk->main_buffer;
#endif /* VULKAN_HDR_SWAPCHAIN */

/* Render to backbuffer. */
if ( (backbuffer->image != VK_NULL_HANDLE)
&& (vk->context->flags & VK_CTX_FLAG_HAS_ACQUIRED_SWAPCHAIN))
Expand Down Expand Up @@ -5081,10 +5096,42 @@ static bool vulkan_frame(void *data, const void *frame,
&vk->vk_vp, vk->mvp.data);

#ifdef VULKAN_HDR_SWAPCHAIN
bool end_pass = true;
bool end_main_pass = true;

/* Copy over back buffer to swap chain render targets */
if ((vk->context->flags & VK_CTX_FLAG_HDR_ENABLE) &&
use_main_buffer)
{
if(end_pass)
{
vkCmdEndRenderPass(vk->cmd);
end_pass = false;
}

backbuffer = &vk->backbuffers[swapchain_index];
/* Prepare source buffer for reading */
VULKAN_IMAGE_LAYOUT_TRANSITION(vk->cmd, vk->main_buffer.image,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT,
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);

vulkan_run_hdr_pipeline(vk->pipelines.hdr, vk->render_pass, &vk->main_buffer, backbuffer, vk, &vk->hdr.ubo);

VULKAN_IMAGE_LAYOUT_TRANSITION(vk->cmd, vk->main_buffer.image,
VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
0, VK_ACCESS_TRANSFER_WRITE_BIT,
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT);

end_main_pass = false;
}

if ((vk->context->flags & VK_CTX_FLAG_HDR_ENABLE) &&
(vk->flags & VK_FLAG_MENU_ENABLE))
{
vkCmdEndRenderPass(vk->cmd);
if(end_pass) vkCmdEndRenderPass(vk->cmd);

backbuffer = &vk->main_buffer;

Expand Down Expand Up @@ -5160,7 +5207,7 @@ static bool vulkan_frame(void *data, const void *frame,
#endif

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

#ifdef VULKAN_HDR_SWAPCHAIN
/* Copy over back buffer to swap chain render targets */
Expand Down
Loading