mirror of
https://github.com/libretro/RetroArch
synced 2025-03-03 13:14:04 +00:00
(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:
parent
5ac380ec39
commit
2304faf7f0
@ -188,11 +188,21 @@ static void d3d12_overlay_set_alpha(void* data, unsigned index, float mod)
|
|||||||
D3D12Unmap(d3d12->overlays.vbo, 0, &range);
|
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)
|
static bool d3d12_overlay_load(void* data, const void* image_data, unsigned num_images)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
D3D12_RANGE range;
|
D3D12_RANGE range;
|
||||||
D3D12Fence fence;
|
|
||||||
d3d12_sprite_t* sprites = NULL;
|
d3d12_sprite_t* sprites = NULL;
|
||||||
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
|
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
|
||||||
const struct texture_image* images = (const struct texture_image*)image_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)
|
if (!d3d12)
|
||||||
return false;
|
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_free_overlays(d3d12);
|
||||||
d3d12->overlays.count = num_images;
|
d3d12->overlays.count = num_images;
|
||||||
d3d12->overlays.textures = (d3d12_texture_t*)calloc(num_images, sizeof(d3d12_texture_t));
|
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, 0.0f ,
|
||||||
0.0f, 0.0f, 0.0f, 1.0f }
|
0.0f, 0.0f, 0.0f, 1.0f }
|
||||||
};
|
};
|
||||||
D3D12Fence fence;
|
|
||||||
D3D12_RANGE read_range;
|
D3D12_RANGE read_range;
|
||||||
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
|
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
|
||||||
|
|
||||||
if (!d3d12)
|
if (!d3d12)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
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->frame.rotation = rotation;
|
d3d12->frame.rotation = rotation;
|
||||||
|
|
||||||
radians = d3d12->frame.rotation * (M_PI / 2.0f);
|
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)
|
#if defined(HAVE_SLANG) && defined(HAVE_SPIRV_CROSS)
|
||||||
size_t i;
|
size_t i;
|
||||||
D3D12Fence fence;
|
|
||||||
d3d12_texture_t* source = NULL;
|
d3d12_texture_t* source = NULL;
|
||||||
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
|
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
|
||||||
|
|
||||||
if (!d3d12)
|
if (!d3d12)
|
||||||
return false;
|
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_shader_preset(d3d12);
|
d3d12_free_shader_preset(d3d12);
|
||||||
|
|
||||||
if (string_is_empty(path))
|
if (string_is_empty(path))
|
||||||
@ -1151,21 +1139,13 @@ error:
|
|||||||
|
|
||||||
static void d3d12_gfx_free(void* data)
|
static void d3d12_gfx_free(void* data)
|
||||||
{
|
{
|
||||||
D3D12Fence fence;
|
|
||||||
unsigned i;
|
unsigned i;
|
||||||
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
|
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
|
||||||
|
|
||||||
if (!d3d12)
|
if (!d3d12)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (d3d12->flags & D3D12_ST_FLAG_WAITABLE_SWAPCHAINS)
|
if (d3d12->flags & D3D12_ST_FLAG_WAITABLE_SWAPCHAINS)
|
||||||
CloseHandle(d3d12->chain.frameLatencyWaitableObject);
|
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];
|
bool use_back_buffer = back_buffer_format != d3d12->chain.formats[d3d12->chain.bit_depth];
|
||||||
#endif
|
#endif
|
||||||
D3D12GraphicsCommandList cmd = d3d12->queue.cmd;
|
D3D12GraphicsCommandList cmd = d3d12->queue.cmd;
|
||||||
D3D12Fence fence = d3d12->queue.fence;
|
|
||||||
|
|
||||||
if (d3d12->flags & D3D12_ST_FLAG_WAITABLE_SWAPCHAINS)
|
if (d3d12->flags & D3D12_ST_FLAG_WAITABLE_SWAPCHAINS)
|
||||||
WaitForSingleObjectEx(
|
WaitForSingleObjectEx(
|
||||||
@ -2218,12 +2197,7 @@ static bool d3d12_gfx_frame(
|
|||||||
1000,
|
1000,
|
||||||
true);
|
true);
|
||||||
|
|
||||||
if (fence->lpVtbl->GetCompletedValue(fence) < d3d12->queue.fenceValue)
|
D3D12_GFX_SYNC();
|
||||||
{
|
|
||||||
fence->lpVtbl->SetEventOnCompletion(
|
|
||||||
fence, d3d12->queue.fenceValue, d3d12->queue.fenceEvent);
|
|
||||||
WaitForSingleObject(d3d12->queue.fenceEvent, INFINITE);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_DXGI_HDR
|
#ifdef HAVE_DXGI_HDR
|
||||||
d3d12_hdr_enable = d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE;
|
d3d12_hdr_enable = d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE;
|
||||||
@ -2898,8 +2872,6 @@ static bool d3d12_gfx_frame(
|
|||||||
cmd->lpVtbl->Close(cmd);
|
cmd->lpVtbl->Close(cmd);
|
||||||
d3d12->queue.handle->lpVtbl->ExecuteCommandLists(d3d12->queue.handle, 1,
|
d3d12->queue.handle->lpVtbl->ExecuteCommandLists(d3d12->queue.handle, 1,
|
||||||
(ID3D12CommandList* const*)&d3d12->queue.cmd);
|
(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);
|
DXGIPresent(d3d12->chain.handle, d3d12->chain.swap_interval, present_flags);
|
||||||
|
|
||||||
if (vsync && wait_for_vblank)
|
if (vsync && wait_for_vblank)
|
||||||
@ -3129,14 +3101,7 @@ static void d3d12_gfx_unload_texture(void* data,
|
|||||||
|
|
||||||
if (d3d12)
|
if (d3d12)
|
||||||
{
|
{
|
||||||
D3D12Fence 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_release_texture(texture);
|
d3d12_release_texture(texture);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user