(D3D12) Undo commit a79dc19b6cb49cf9480fc066d7932cb99c75a190 - allows us to

set RGUI aspect ratio again and internal upscale - going from upscaling
to no upscaling causes a crash though
This commit is contained in:
libretroadmin 2023-05-07 05:41:25 +02:00
parent 5ac380ec39
commit 2304faf7f0

View File

@ -188,11 +188,21 @@ static void d3d12_overlay_set_alpha(void* data, unsigned index, float mod)
D3D12Unmap(d3d12->overlays.vbo, 0, &range);
}
#define D3D12_GFX_SYNC() \
{ \
D3D12Fence fence = d3d12->queue.fence; \
d3d12->queue.handle->lpVtbl->Signal(d3d12->queue.handle, fence, ++d3d12->queue.fenceValue); \
if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue) \
{ \
fence->lpVtbl->SetEventOnCompletion(fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent); \
WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE); \
} \
}
static bool d3d12_overlay_load(void* data, const void* image_data, unsigned num_images)
{
size_t i;
D3D12_RANGE range;
D3D12Fence fence;
d3d12_sprite_t* sprites = NULL;
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
const struct texture_image* images = (const struct texture_image*)image_data;
@ -200,14 +210,8 @@ static bool d3d12_overlay_load(void* data, const void* image_data, unsigned num_
if (!d3d12)
return false;
fence = d3d12->queue.fence;
D3D12_GFX_SYNC();
if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue)
{
fence->lpVtbl->SetEventOnCompletion(
fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent);
WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE);
}
d3d12_free_overlays(d3d12);
d3d12->overlays.count = num_images;
d3d12->overlays.textures = (d3d12_texture_t*)calloc(num_images, sizeof(d3d12_texture_t));
@ -460,21 +464,13 @@ static void d3d12_gfx_set_rotation(void* data, unsigned rotation)
0.0f, 0.0f, 0.0f, 0.0f ,
0.0f, 0.0f, 0.0f, 1.0f }
};
D3D12Fence fence;
D3D12_RANGE read_range;
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
if (!d3d12)
return;
fence = d3d12->queue.fence;
if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue)
{
fence->lpVtbl->SetEventOnCompletion(
fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent);
WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE);
}
D3D12_GFX_SYNC();
d3d12->frame.rotation = rotation;
radians = d3d12->frame.rotation * (M_PI / 2.0f);
@ -630,21 +626,13 @@ static bool d3d12_gfx_set_shader(void* data, enum rarch_shader_type type, const
{
#if defined(HAVE_SLANG) && defined(HAVE_SPIRV_CROSS)
size_t i;
D3D12Fence fence;
d3d12_texture_t* source = NULL;
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
if (!d3d12)
return false;
fence = d3d12->queue.fence;
if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue)
{
fence->lpVtbl->SetEventOnCompletion(
fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent);
WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE);
}
D3D12_GFX_SYNC();
d3d12_free_shader_preset(d3d12);
if (string_is_empty(path))
@ -1151,21 +1139,13 @@ error:
static void d3d12_gfx_free(void* data)
{
D3D12Fence fence;
unsigned i;
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
if (!d3d12)
return;
fence = d3d12->queue.fence;
if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue)
{
fence->lpVtbl->SetEventOnCompletion(
fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent);
WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE);
}
D3D12_GFX_SYNC();
if (d3d12->flags & D3D12_ST_FLAG_WAITABLE_SWAPCHAINS)
CloseHandle(d3d12->chain.frameLatencyWaitableObject);
@ -2210,7 +2190,6 @@ static bool d3d12_gfx_frame(
bool use_back_buffer = back_buffer_format != d3d12->chain.formats[d3d12->chain.bit_depth];
#endif
D3D12GraphicsCommandList cmd = d3d12->queue.cmd;
D3D12Fence fence = d3d12->queue.fence;
if (d3d12->flags & D3D12_ST_FLAG_WAITABLE_SWAPCHAINS)
WaitForSingleObjectEx(
@ -2218,12 +2197,7 @@ static bool d3d12_gfx_frame(
1000,
true);
if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue)
{
fence->lpVtbl->SetEventOnCompletion(
fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent);
WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE);
}
D3D12_GFX_SYNC();
#ifdef HAVE_DXGI_HDR
d3d12_hdr_enable = d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE;
@ -2898,8 +2872,6 @@ static bool d3d12_gfx_frame(
cmd->lpVtbl->Close(cmd);
d3d12->queue.handle->lpVtbl->ExecuteCommandLists(d3d12->queue.handle, 1,
(ID3D12CommandList* const*)&d3d12->queue.cmd);
d3d12->queue.handle->lpVtbl->Signal(d3d12->queue.handle, fence,
++d3d12->queue.fenceValue);
DXGIPresent(d3d12->chain.handle, d3d12->chain.swap_interval, present_flags);
if (vsync && wait_for_vblank)
@ -3129,14 +3101,7 @@ static void d3d12_gfx_unload_texture(void* data,
if (d3d12)
{
D3D12Fence fence = d3d12->queue.fence;
if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue)
{
fence->lpVtbl->SetEventOnCompletion(
fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent);
WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE);
}
D3D12_GFX_SYNC();
}
d3d12_release_texture(texture);