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
81 changes: 50 additions & 31 deletions gfx/drivers/d3d11.c
Original file line number Diff line number Diff line change
Expand Up @@ -1630,7 +1630,7 @@ static void d3d11_set_hdr_paper_white_nits(void* data, float paper_white_nits)
{
for (unsigned i = 0; i < d3d11->shader_preset->passes; i++)
{
d3d11->pass[i].paper_white_nits = paper_white_nits;
d3d11->pass[i].paper_white_nits = paper_white_nits;
}
}
}
Expand Down Expand Up @@ -3305,7 +3305,6 @@ 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];
#endif

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


#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->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)
&& !use_back_buffer)
if (d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE)
{
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);

if( d3d11->hdr.ubo_values.source_size.width != width || d3d11->hdr.ubo_values.source_size.height != height ||
d3d11->hdr.ubo_values.output_size.width != d3d11->frame.output_size.x || d3d11->hdr.ubo_values.output_size.height != d3d11->frame.output_size.y)
{
d3d11->hdr.ubo_values.source_size.width = width;
d3d11->hdr.ubo_values.source_size.height = height;

d3d11->hdr.ubo_values.output_size.width = d3d11->frame.output_size.x;
d3d11->hdr.ubo_values.output_size.height = d3d11->frame.output_size.y;

settings_t* settings = config_get_ptr();
d3d11->hdr.ubo_values.scanlines = settings->bools.video_hdr_scanlines ? 1.0f : 0.0f;

D3D11_MAPPED_SUBRESOURCE mapped_ubo;

d3d11->context->lpVtbl->Map(
d3d11->context, (D3D11Resource)d3d11->hdr.ubo, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mapped_ubo);
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;
Expand Down Expand Up @@ -3837,6 +3822,19 @@ static bool d3d11_gfx_frame(

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

#ifdef HAVE_DXGI_HDR
if((d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE) &&
(d3d11->flags & D3D11_ST_FLAG_MENU_ENABLE))
{
context->lpVtbl->OMSetRenderTargets(context, 1,
&d3d11->back_buffer.rt_view, NULL);

float clear_colour[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
context->lpVtbl->ClearRenderTargetView(context,
d3d11->back_buffer.rt_view, clear_colour);
}
#endif

context->lpVtbl->RSSetState(context, d3d11->scissor_enabled);
d3d11->context->lpVtbl->RSSetScissorRects(d3d11->context, 1, &d3d11->scissor);
context->lpVtbl->OMSetBlendState(context, d3d11->blend_enable,
Expand Down Expand Up @@ -3973,12 +3971,11 @@ static bool d3d11_gfx_frame(

#ifdef HAVE_DXGI_HDR
/* Copy over back buffer to swap chain render targets */
if ( (d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE)
&& use_back_buffer)
if((d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE) &&
(d3d11->flags & D3D11_ST_FLAG_MENU_ENABLE))
{
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);

Expand All @@ -3989,15 +3986,39 @@ static bool d3d11_gfx_frame(
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->PSSetSamplers(
context, 0, 1,
&d3d11->samplers[RARCH_FILTER_UNSPEC][RARCH_WRAP_DEFAULT]);
context->lpVtbl->PSSetConstantBuffers(
context, 0, 1, &d3d11->hdr.ubo);
{
UINT stride = sizeof(d3d11_vertex_t);
UINT offset = 0;
Expand All @@ -4006,7 +4027,7 @@ static bool d3d11_gfx_frame(
}

context->lpVtbl->RSSetState(context, d3d11->scissor_disabled);
d3d11->context->lpVtbl->OMSetBlendState(d3d11->context, d3d11->blend_disable,
d3d11->context->lpVtbl->OMSetBlendState(d3d11->context, d3d11->blend_enable,
NULL, D3D11_DEFAULT_SAMPLE_MASK);
context->lpVtbl->IASetPrimitiveTopology(context,
D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
Expand All @@ -4016,8 +4037,6 @@ static bool d3d11_gfx_frame(
context->lpVtbl->PSSetShaderResources(
context, 0, 1, nullSRV);
context->lpVtbl->RSSetState(context, d3d11->scissor_enabled);
d3d11->context->lpVtbl->OMSetBlendState(d3d11->context, d3d11->blend_enable,
NULL, D3D11_DEFAULT_SAMPLE_MASK);
context->lpVtbl->IASetPrimitiveTopology(context,
D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
}
Expand Down
Loading
Loading