(D3D12) Use flags instead of boolean variables

This commit is contained in:
LibretroAdmin 2022-11-03 01:30:50 +01:00
parent 3b300f395b
commit bba1fdca30
4 changed files with 160 additions and 113 deletions

View File

@ -135,6 +135,25 @@ typedef struct ALIGN(16)
float time; float time;
} d3d12_uniform_t; } d3d12_uniform_t;
enum d3d12_video_flags
{
D3D12_ST_FLAG_RESIZE_CHAIN = (1 << 0),
D3D12_ST_FLAG_KEEP_ASPECT = (1 << 1),
D3D12_ST_FLAG_RESIZE_VIEWPORT = (1 << 2),
D3D12_ST_FLAG_RESIZE_RTS = (1 << 3),
D3D12_ST_FLAG_INIT_HISTORY = (1 << 4),
D3D12_ST_FLAG_OVERLAYS_ENABLE = (1 << 5),
D3D12_ST_FLAG_OVERLAYS_FULLSCREEN = (1 << 6),
D3D12_ST_FLAG_SPRITES_ENABLE = (1 << 7),
D3D12_ST_FLAG_MENU_ENABLE = (1 << 8),
D3D12_ST_FLAG_MENU_FULLSCREEN = (1 << 9),
D3D12_ST_FLAG_HDR_SUPPORT = (1 << 10),
D3D12_ST_FLAG_HDR_ENABLE = (1 << 11),
D3D12_ST_FLAG_VSYNC = (1 << 12),
D3D12_ST_FLAG_WAITABLE_SWAPCHAINS = (1 << 13),
D3D12_ST_FLAG_WAIT_FOR_VBLANK = (1 << 14)
};
typedef struct typedef struct
{ {
unsigned cur_mon_id; unsigned cur_mon_id;
@ -182,9 +201,6 @@ typedef struct
D3D12_RECT scissorRect; D3D12_RECT scissorRect;
float clearcolor[4]; float clearcolor[4];
int frame_index; int frame_index;
bool vsync;
bool waitable_swapchains;
bool wait_for_vblank;
unsigned swap_interval; unsigned swap_interval;
#ifdef HAVE_DXGI_HDR #ifdef HAVE_DXGI_HDR
enum dxgi_swapchain_bit_depth bit_depth; enum dxgi_swapchain_bit_depth bit_depth;
@ -216,8 +232,6 @@ typedef struct
float min_output_nits; float min_output_nits;
float max_cll; float max_cll;
float max_fall; float max_fall;
bool support;
bool enable;
} hdr; } hdr;
#endif #endif
@ -228,8 +242,6 @@ typedef struct
d3d12_texture_t texture; d3d12_texture_t texture;
float alpha; float alpha;
bool enabled;
bool fullscreen;
} menu; } menu;
struct struct
@ -242,7 +254,6 @@ typedef struct
D3D12_VERTEX_BUFFER_VIEW vbo_view; D3D12_VERTEX_BUFFER_VIEW vbo_view;
int offset; int offset;
int capacity; int capacity;
bool enabled;
} sprites; } sprites;
#ifdef HAVE_OVERLAY #ifdef HAVE_OVERLAY
@ -251,8 +262,6 @@ typedef struct
D3D12Resource vbo; D3D12Resource vbo;
D3D12_VERTEX_BUFFER_VIEW vbo_view; D3D12_VERTEX_BUFFER_VIEW vbo_view;
d3d12_texture_t* textures; d3d12_texture_t* textures;
bool enabled;
bool fullscreen;
int count; int count;
} overlays; } overlays;
#endif #endif
@ -286,17 +295,13 @@ typedef struct
D3D12_GPU_DESCRIPTOR_HANDLE samplers[RARCH_FILTER_MAX][RARCH_WRAP_MAX]; D3D12_GPU_DESCRIPTOR_HANDLE samplers[RARCH_FILTER_MAX][RARCH_WRAP_MAX];
math_matrix_4x4 mvp, mvp_no_rot; math_matrix_4x4 mvp, mvp_no_rot;
struct video_viewport vp; struct video_viewport vp;
bool resize_chain;
bool keep_aspect;
bool resize_viewport;
bool resize_render_targets;
bool init_history;
D3D12Resource menu_pipeline_vbo; D3D12Resource menu_pipeline_vbo;
D3D12_VERTEX_BUFFER_VIEW menu_pipeline_vbo_view; D3D12_VERTEX_BUFFER_VIEW menu_pipeline_vbo_view;
#ifdef DEBUG #ifdef DEBUG
D3D12Debug debugController; D3D12Debug debugController;
#endif #endif
uint16_t flags;
} d3d12_video_t; } d3d12_video_t;
typedef enum typedef enum

View File

@ -258,7 +258,10 @@ static void d3d12_overlay_enable(void* data, bool state)
if (!d3d12) if (!d3d12)
return; return;
d3d12->overlays.enabled = state; if (state)
d3d12->flags |= D3D12_ST_FLAG_OVERLAYS_ENABLE;
else
d3d12->flags &= ~D3D12_ST_FLAG_OVERLAYS_ENABLE;
win32_show_cursor(d3d12, state); win32_show_cursor(d3d12, state);
} }
@ -266,10 +269,13 @@ static void d3d12_overlay_full_screen(void* data, bool enable)
{ {
d3d12_video_t* d3d12 = (d3d12_video_t*)data; d3d12_video_t* d3d12 = (d3d12_video_t*)data;
if (!d3d12) if (d3d12)
return; {
if (enable)
d3d12->overlays.fullscreen = enable; d3d12->flags |= D3D12_ST_FLAG_OVERLAYS_FULLSCREEN;
else
d3d12->flags &= ~D3D12_ST_FLAG_OVERLAYS_FULLSCREEN;
}
} }
static void d3d12_get_overlay_interface(void* data, const video_overlay_interface_t** iface) static void d3d12_get_overlay_interface(void* data, const video_overlay_interface_t** iface)
@ -286,7 +292,7 @@ static void d3d12_render_overlay(d3d12_video_t *d3d12)
{ {
unsigned i; unsigned i;
if (d3d12->overlays.fullscreen) if (d3d12->flags & D3D12_ST_FLAG_OVERLAYS_FULLSCREEN)
{ {
D3D12RSSetViewports(d3d12->queue.cmd, 1, D3D12RSSetViewports(d3d12->queue.cmd, 1,
&d3d12->chain.viewport); &d3d12->chain.viewport);
@ -342,7 +348,7 @@ static void d3d12_set_hdr_max_nits(void* data, float max_nits)
dxgi_set_hdr_metadata( dxgi_set_hdr_metadata(
d3d12->chain.handle, d3d12->chain.handle,
d3d12->hdr.support, d3d12->flags & D3D12_ST_FLAG_HDR_SUPPORT,
d3d12->chain.bit_depth, d3d12->chain.bit_depth,
d3d12->chain.color_space, d3d12->chain.color_space,
d3d12->hdr.max_output_nits, d3d12->hdr.max_output_nits,
@ -476,7 +482,8 @@ static void d3d12_gfx_set_rotation(void* data, unsigned rotation)
static void d3d12_update_viewport(d3d12_video_t *d3d12, bool force_full) static void d3d12_update_viewport(d3d12_video_t *d3d12, bool force_full)
{ {
video_driver_update_viewport(&d3d12->vp, force_full, d3d12->keep_aspect); video_driver_update_viewport(&d3d12->vp, force_full,
d3d12->flags & D3D12_ST_FLAG_KEEP_ASPECT);
d3d12->frame.viewport.TopLeftX = d3d12->vp.x; d3d12->frame.viewport.TopLeftX = d3d12->vp.x;
d3d12->frame.viewport.TopLeftY = d3d12->vp.y; d3d12->frame.viewport.TopLeftY = d3d12->vp.y;
@ -493,14 +500,14 @@ static void d3d12_update_viewport(d3d12_video_t *d3d12, bool force_full)
if (d3d12->shader_preset && (d3d12->frame.output_size.x != d3d12->vp.width || if (d3d12->shader_preset && (d3d12->frame.output_size.x != d3d12->vp.width ||
d3d12->frame.output_size.y != d3d12->vp.height)) d3d12->frame.output_size.y != d3d12->vp.height))
d3d12->resize_render_targets = true; d3d12->flags |= D3D12_ST_FLAG_RESIZE_RTS;
d3d12->frame.output_size.x = d3d12->vp.width; d3d12->frame.output_size.x = d3d12->vp.width;
d3d12->frame.output_size.y = d3d12->vp.height; d3d12->frame.output_size.y = d3d12->vp.height;
d3d12->frame.output_size.z = 1.0f / d3d12->vp.width; d3d12->frame.output_size.z = 1.0f / d3d12->vp.width;
d3d12->frame.output_size.w = 1.0f / d3d12->vp.height; d3d12->frame.output_size.w = 1.0f / d3d12->vp.height;
d3d12->resize_viewport = false; d3d12->flags &= ~D3D12_ST_FLAG_RESIZE_VIEWPORT;
} }
static void d3d12_free_shader_preset(d3d12_video_t* d3d12) static void d3d12_free_shader_preset(d3d12_video_t* d3d12)
@ -549,8 +556,8 @@ static void d3d12_free_shader_preset(d3d12_video_t* d3d12)
free(d3d12->shader_preset); free(d3d12->shader_preset);
d3d12->shader_preset = NULL; d3d12->shader_preset = NULL;
d3d12->init_history = false; d3d12->flags &= ~(D3D12_ST_FLAG_INIT_HISTORY
d3d12->resize_render_targets = false; | D3D12_ST_FLAG_RESIZE_RTS);
} }
static void d3d12_init_pipeline( static void d3d12_init_pipeline(
@ -758,21 +765,21 @@ static bool d3d12_gfx_set_shader(void* data, enum rarch_shader_type type, const
} }
#ifdef HAVE_DXGI_HDR #ifdef HAVE_DXGI_HDR
if (d3d12->hdr.enable) if (d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE)
{ {
if (d3d12->shader_preset && d3d12->shader_preset->passes && (d3d12->pass[d3d12->shader_preset->passes - 1].semantics.format == SLANG_FORMAT_A2B10G10R10_UNORM_PACK32)) if (d3d12->shader_preset && d3d12->shader_preset->passes && (d3d12->pass[d3d12->shader_preset->passes - 1].semantics.format == SLANG_FORMAT_A2B10G10R10_UNORM_PACK32))
{ {
/* If the last shader pass uses a RGB10A2 back buffer and hdr has been enabled assume we want to skip the inverse tonemapper and hdr10 conversion */ /* If the last shader pass uses a RGB10A2 back buffer and hdr has been enabled assume we want to skip the inverse tonemapper and hdr10 conversion */
d3d12_set_hdr_inverse_tonemap(d3d12, false); d3d12_set_hdr_inverse_tonemap(d3d12, false);
d3d12_set_hdr10(d3d12, false); d3d12_set_hdr10(d3d12, false);
d3d12->resize_chain = true; d3d12->flags |= D3D12_ST_FLAG_RESIZE_CHAIN;
} }
else if (d3d12->shader_preset && d3d12->shader_preset->passes && (d3d12->pass[d3d12->shader_preset->passes - 1].semantics.format == SLANG_FORMAT_R16G16B16A16_SFLOAT)) else if (d3d12->shader_preset && d3d12->shader_preset->passes && (d3d12->pass[d3d12->shader_preset->passes - 1].semantics.format == SLANG_FORMAT_R16G16B16A16_SFLOAT))
{ {
/* If the last shader pass uses a RGBA16 back buffer and hdr has been enabled assume we want to skip the inverse tonemapper */ /* If the last shader pass uses a RGBA16 back buffer and hdr has been enabled assume we want to skip the inverse tonemapper */
d3d12_set_hdr_inverse_tonemap(d3d12, false); d3d12_set_hdr_inverse_tonemap(d3d12, false);
d3d12_set_hdr10(d3d12, true); d3d12_set_hdr10(d3d12, true);
d3d12->resize_chain = true; d3d12->flags |= D3D12_ST_FLAG_RESIZE_CHAIN;
} }
else else
{ {
@ -808,9 +815,8 @@ static bool d3d12_gfx_set_shader(void* data, enum rarch_shader_type type, const
image_texture_free(&image); image_texture_free(&image);
} }
d3d12->resize_render_targets = true; d3d12->flags |= (D3D12_ST_FLAG_INIT_HISTORY
d3d12->init_history = true; | D3D12_ST_FLAG_RESIZE_RTS);
return true; return true;
error: error:
@ -1225,13 +1231,16 @@ static bool d3d12_init_swapchain(d3d12_video_t* d3d12,
d3d12->chain.formats[DXGI_SWAPCHAIN_BIT_DEPTH_10] = DXGI_FORMAT_R10G10B10A2_UNORM; d3d12->chain.formats[DXGI_SWAPCHAIN_BIT_DEPTH_10] = DXGI_FORMAT_R10G10B10A2_UNORM;
d3d12->chain.formats[DXGI_SWAPCHAIN_BIT_DEPTH_16] = DXGI_FORMAT_R16G16B16A16_UNORM; d3d12->chain.formats[DXGI_SWAPCHAIN_BIT_DEPTH_16] = DXGI_FORMAT_R16G16B16A16_UNORM;
if (!(d3d12->hdr.support = if (dxgi_check_display_hdr_support(d3d12->factory, hwnd))
dxgi_check_display_hdr_support(d3d12->factory, hwnd))) d3d12->flags |= D3D12_ST_FLAG_HDR_SUPPORT;
d3d12->hdr.enable = false; else
d3d12->flags &= ~D3D12_ST_FLAG_HDR_SUPPORT;
d3d12->chain.bit_depth = d3d12->hdr.enable if (!(d3d12->flags & D3D12_ST_FLAG_HDR_SUPPORT))
? DXGI_SWAPCHAIN_BIT_DEPTH_10 d3d12->flags &= ~D3D12_ST_FLAG_HDR_ENABLE;
: DXGI_SWAPCHAIN_BIT_DEPTH_8;
d3d12->chain.bit_depth = (d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE)
? DXGI_SWAPCHAIN_BIT_DEPTH_10 : DXGI_SWAPCHAIN_BIT_DEPTH_8;
#endif #endif
desc.BufferCount = countof(d3d12->chain.renderTargets); desc.BufferCount = countof(d3d12->chain.renderTargets);
@ -1268,7 +1277,7 @@ static bool d3d12_init_swapchain(d3d12_video_t* d3d12,
#endif #endif
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING; desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING;
if (d3d12->chain.waitable_swapchains) if (d3d12->flags & D3D12_ST_FLAG_WAITABLE_SWAPCHAINS)
desc.Flags |= DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT; desc.Flags |= DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT;
#ifdef __WINRT__ #ifdef __WINRT__
@ -1282,8 +1291,8 @@ static bool d3d12_init_swapchain(d3d12_video_t* d3d12,
return false; return false;
} }
if (d3d12->chain.waitable_swapchains && if ( (d3d12->flags & D3D12_ST_FLAG_WAITABLE_SWAPCHAINS)
(d3d12->chain.frameLatencyWaitableObject = DXGIGetFrameLatencyWaitableObject(d3d12->chain.handle))) && (d3d12->chain.frameLatencyWaitableObject = DXGIGetFrameLatencyWaitableObject(d3d12->chain.handle)))
{ {
settings_t* settings = config_get_ptr(); settings_t* settings = config_get_ptr();
UINT max_latency = settings->uints.video_max_frame_latency; UINT max_latency = settings->uints.video_max_frame_latency;
@ -1291,11 +1300,11 @@ static bool d3d12_init_swapchain(d3d12_video_t* d3d12,
if (max_latency == 0) if (max_latency == 0)
{ {
d3d12->chain.wait_for_vblank = true; d3d12->flags |= D3D12_ST_FLAG_WAIT_FOR_VBLANK;
max_latency = 1; max_latency = 1;
} }
else else
d3d12->chain.wait_for_vblank = false; d3d12->flags &= ~D3D12_ST_FLAG_WAIT_FOR_VBLANK;
DXGISetMaximumFrameLatency(d3d12->chain.handle, max_latency); DXGISetMaximumFrameLatency(d3d12->chain.handle, max_latency);
DXGIGetMaximumFrameLatency(d3d12->chain.handle, &cur_latency); DXGIGetMaximumFrameLatency(d3d12->chain.handle, &cur_latency);
@ -1312,7 +1321,7 @@ static bool d3d12_init_swapchain(d3d12_video_t* d3d12,
initialize ST.2084 support to match initialize ST.2084 support to match
the display's support. */ the display's support. */
color_space = color_space =
d3d12->hdr.enable (d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE)
? DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 ? DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020
: DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; : DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
@ -1320,7 +1329,7 @@ static bool d3d12_init_swapchain(d3d12_video_t* d3d12,
&d3d12->chain.color_space, color_space); &d3d12->chain.color_space, color_space);
dxgi_set_hdr_metadata( dxgi_set_hdr_metadata(
d3d12->chain.handle, d3d12->chain.handle,
d3d12->hdr.support, d3d12->flags & D3D12_ST_FLAG_HDR_SUPPORT,
d3d12->chain.bit_depth, d3d12->chain.bit_depth,
d3d12->chain.color_space, d3d12->chain.color_space,
d3d12->hdr.max_output_nits, d3d12->hdr.max_output_nits,
@ -1778,14 +1787,20 @@ static void *d3d12_gfx_init(const video_info_t* video,
} }
#ifdef HAVE_DXGI_HDR #ifdef HAVE_DXGI_HDR
d3d12->hdr.enable = settings->bools.video_hdr_enable; if (settings->bools.video_hdr_enable)
d3d12->flags |= D3D12_ST_FLAG_HDR_ENABLE;
else
d3d12->flags &= ~D3D12_ST_FLAG_HDR_ENABLE;
d3d12->hdr.max_output_nits = settings->floats.video_hdr_max_nits; d3d12->hdr.max_output_nits = settings->floats.video_hdr_max_nits;
d3d12->hdr.min_output_nits = 0.001f; d3d12->hdr.min_output_nits = 0.001f;
d3d12->hdr.max_cll = 0.0f; d3d12->hdr.max_cll = 0.0f;
d3d12->hdr.max_fall = 0.0f; d3d12->hdr.max_fall = 0.0f;
#endif #endif
d3d12->chain.waitable_swapchains = settings->bools.video_waitable_swapchains; if (settings->bools.video_waitable_swapchains)
d3d12->flags |= D3D12_ST_FLAG_WAITABLE_SWAPCHAINS;
else
d3d12->flags &= ~D3D12_ST_FLAG_WAITABLE_SWAPCHAINS;
d3d_input_driver(settings->arrays.input_driver, settings->arrays.input_joypad_driver, input, input_data); d3d_input_driver(settings->arrays.input_driver, settings->arrays.input_joypad_driver, input, input_data);
@ -1869,10 +1884,16 @@ static void *d3d12_gfx_init(const video_info_t* video,
video_driver_set_size(d3d12->vp.full_width, d3d12->vp.full_height); video_driver_set_size(d3d12->vp.full_width, d3d12->vp.full_height);
d3d12->chain.viewport.Width = d3d12->vp.full_width; d3d12->chain.viewport.Width = d3d12->vp.full_width;
d3d12->chain.viewport.Height = d3d12->vp.full_height; d3d12->chain.viewport.Height = d3d12->vp.full_height;
d3d12->resize_viewport = true; d3d12->flags |= D3D12_ST_FLAG_RESIZE_VIEWPORT;
d3d12->keep_aspect = video->force_aspect; if (video->force_aspect)
d3d12->chain.vsync = video->vsync; d3d12->flags |= D3D12_ST_FLAG_KEEP_ASPECT;
d3d12->format = video->rgb32 ? DXGI_FORMAT_B8G8R8X8_UNORM : DXGI_FORMAT_B5G6R5_UNORM; else
d3d12->flags &= ~D3D12_ST_FLAG_KEEP_ASPECT;
if (video->vsync)
d3d12->flags |= D3D12_ST_FLAG_VSYNC;
else
d3d12->flags &= ~D3D12_ST_FLAG_VSYNC;
d3d12->format = (video->rgb32) ? DXGI_FORMAT_B8G8R8X8_UNORM : DXGI_FORMAT_B5G6R5_UNORM;
d3d12->frame.texture[0].desc.Format = d3d12->format; d3d12->frame.texture[0].desc.Format = d3d12->format;
d3d12->frame.texture[0].desc.Width = 4; d3d12->frame.texture[0].desc.Width = 4;
d3d12->frame.texture[0].desc.Height = 4; d3d12->frame.texture[0].desc.Height = 4;
@ -1923,8 +1944,9 @@ static void d3d12_init_history(d3d12_video_t* d3d12, unsigned width, unsigned he
d3d12_init_texture(d3d12->device, &d3d12->frame.texture[i]); d3d12_init_texture(d3d12->device, &d3d12->frame.texture[i]);
/* TODO/FIXME: clear texture ? */ /* TODO/FIXME: clear texture ? */
} }
d3d12->init_history = false; d3d12->flags &= ~D3D12_ST_FLAG_INIT_HISTORY;
} }
static void d3d12_init_render_targets(d3d12_video_t* d3d12, unsigned width, unsigned height) static void d3d12_init_render_targets(d3d12_video_t* d3d12, unsigned width, unsigned height)
{ {
unsigned i; unsigned i;
@ -2024,7 +2046,7 @@ static void d3d12_init_render_targets(d3d12_video_t* d3d12, unsigned width, unsi
d3d12->pass[i].sampler = d3d12->samplers[pass->filter][pass->wrap]; d3d12->pass[i].sampler = d3d12->samplers[pass->filter][pass->wrap];
} }
d3d12->resize_render_targets = false; d3d12->flags &= ~D3D12_ST_FLAG_RESIZE_RTS;
} }
static bool d3d12_gfx_frame( static bool d3d12_gfx_frame(
@ -2040,8 +2062,8 @@ static bool d3d12_gfx_frame(
unsigned i; unsigned i;
d3d12_texture_t* texture = NULL; d3d12_texture_t* texture = NULL;
d3d12_video_t* d3d12 = (d3d12_video_t*)data; d3d12_video_t* d3d12 = (d3d12_video_t*)data;
bool vsync = d3d12->chain.vsync; bool vsync = d3d12->flags & D3D12_ST_FLAG_VSYNC;
bool wait_for_vblank = d3d12->chain.wait_for_vblank; bool wait_for_vblank = d3d12->flags & D3D12_ST_FLAG_WAIT_FOR_VBLANK;
unsigned sync_interval = (vsync) ? d3d12->chain.swap_interval : 0; unsigned sync_interval = (vsync) ? d3d12->chain.swap_interval : 0;
unsigned present_flags = (vsync) ? 0 : DXGI_PRESENT_ALLOW_TEARING; unsigned present_flags = (vsync) ? 0 : DXGI_PRESENT_ALLOW_TEARING;
const char *stat_text = video_info->stat_text; const char *stat_text = video_info->stat_text;
@ -2056,6 +2078,7 @@ static bool d3d12_gfx_frame(
bool widgets_active = video_info->widgets_active; bool widgets_active = video_info->widgets_active;
#endif #endif
#ifdef HAVE_DXGI_HDR #ifdef HAVE_DXGI_HDR
bool d3d12_hdr_enable = false;
bool video_hdr_enable = video_info->hdr_enable; 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) : DXGI_FORMAT_R8G8B8A8_UNORM; 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) : DXGI_FORMAT_R8G8B8A8_UNORM;
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];
@ -2064,20 +2087,24 @@ static bool d3d12_gfx_frame(
d3d12_gfx_sync(d3d12); d3d12_gfx_sync(d3d12);
#ifdef HAVE_DXGI_HDR #ifdef HAVE_DXGI_HDR
if (d3d12->resize_chain || (d3d12->hdr.enable != video_hdr_enable)) d3d12_hdr_enable = d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE;
if ((d3d12->flags & D3D12_ST_FLAG_RESIZE_CHAIN) || (d3d12_hdr_enable != video_hdr_enable))
#else #else
if (d3d12->resize_chain) if (d3d12->flags & D3D12_ST_FLAG_RESIZE_CHAIN)
#endif #endif
{ {
#ifdef HAVE_DXGI_HDR #ifdef HAVE_DXGI_HDR
d3d12->hdr.enable = video_hdr_enable; if (video_hdr_enable)
d3d12->flags |= D3D12_ST_FLAG_HDR_ENABLE;
else
d3d12->flags &= ~D3D12_ST_FLAG_HDR_ENABLE;
#endif #endif
for (i = 0; i < countof(d3d12->chain.renderTargets); i++) for (i = 0; i < countof(d3d12->chain.renderTargets); i++)
Release(d3d12->chain.renderTargets[i]); Release(d3d12->chain.renderTargets[i]);
#ifdef HAVE_DXGI_HDR #ifdef HAVE_DXGI_HDR
if (d3d12->hdr.enable) if (d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE)
{ {
d3d12_release_texture(&d3d12->chain.back_buffer); d3d12_release_texture(&d3d12->chain.back_buffer);
d3d12->chain.back_buffer.handle = NULL; d3d12->chain.back_buffer.handle = NULL;
@ -2110,8 +2137,8 @@ static bool d3d12_gfx_frame(
d3d12->chain.viewport.Height = video_height; d3d12->chain.viewport.Height = video_height;
d3d12->chain.scissorRect.right = video_width; d3d12->chain.scissorRect.right = video_width;
d3d12->chain.scissorRect.bottom = video_height; d3d12->chain.scissorRect.bottom = video_height;
d3d12->resize_chain = false; d3d12->flags &= ~D3D12_ST_FLAG_RESIZE_CHAIN;
d3d12->resize_viewport = true; d3d12->flags |= D3D12_ST_FLAG_RESIZE_VIEWPORT;
d3d12->ubo_values.OutputSize.width = d3d12->chain.viewport.Width; d3d12->ubo_values.OutputSize.width = d3d12->chain.viewport.Width;
d3d12->ubo_values.OutputSize.height = d3d12->chain.viewport.Height; d3d12->ubo_values.OutputSize.height = d3d12->chain.viewport.Height;
@ -2120,16 +2147,22 @@ static bool d3d12_gfx_frame(
#ifdef HAVE_DXGI_HDR #ifdef HAVE_DXGI_HDR
#ifdef __WINRT__ #ifdef __WINRT__
if (!(d3d12->hdr.support = if (dxgi_check_display_hdr_support(d3d12->factory, uwp_get_corewindow()))
dxgi_check_display_hdr_support(d3d12->factory, uwp_get_corewindow()))) d3d12->flags |= D3D12_ST_FLAG_HDR_SUPPORT;
d3d12->hdr.enable = false; else
d3d12->flags &= ~(D3D12_ST_FLAG_HDR_SUPPORT
| D3D12_ST_FLAG_HDR_ENABLE
);
#else #else
if (!(d3d12->hdr.support = if (dxgi_check_display_hdr_support(d3d12->factory, main_window.hwnd))
dxgi_check_display_hdr_support(d3d12->factory, main_window.hwnd))) d3d12->flags |= D3D12_ST_FLAG_HDR_SUPPORT;
d3d12->hdr.enable = false; else
d3d12->flags &= ~(D3D12_ST_FLAG_HDR_SUPPORT
| D3D12_ST_FLAG_HDR_ENABLE
);
#endif #endif
if(d3d12->hdr.enable) if (d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE)
{ {
memset(&d3d12->chain.back_buffer, memset(&d3d12->chain.back_buffer,
0, sizeof(d3d12->chain.back_buffer)); 0, sizeof(d3d12->chain.back_buffer));
@ -2163,7 +2196,7 @@ static bool d3d12_gfx_frame(
dxgi_set_hdr_metadata( dxgi_set_hdr_metadata(
d3d12->chain.handle, d3d12->chain.handle,
d3d12->hdr.support, d3d12->flags & D3D12_ST_FLAG_HDR_SUPPORT,
d3d12->chain.bit_depth, d3d12->chain.bit_depth,
d3d12->chain.color_space, d3d12->chain.color_space,
d3d12->hdr.max_output_nits, d3d12->hdr.max_output_nits,
@ -2172,7 +2205,7 @@ static bool d3d12_gfx_frame(
d3d12->hdr.max_fall); d3d12->hdr.max_fall);
#endif #endif
} }
else if (d3d12->chain.waitable_swapchains) else if (d3d12->flags & D3D12_ST_FLAG_WAITABLE_SWAPCHAINS)
{ {
WaitForSingleObjectEx( WaitForSingleObjectEx(
d3d12->chain.frameLatencyWaitableObject, d3d12->chain.frameLatencyWaitableObject,
@ -2212,11 +2245,11 @@ static bool d3d12_gfx_frame(
d3d12_upload_texture(d3d12->queue.cmd, &d3d12->luts[i], d3d12_upload_texture(d3d12->queue.cmd, &d3d12->luts[i],
d3d12); d3d12);
if (d3d12->frame.texture[0].desc.Width != width || if ( (d3d12->frame.texture[0].desc.Width != width)
d3d12->frame.texture[0].desc.Height != height) || (d3d12->frame.texture[0].desc.Height != height))
d3d12->resize_render_targets = true; d3d12->flags |= D3D12_ST_FLAG_RESIZE_RTS;
if (d3d12->resize_render_targets) if (d3d12->flags & D3D12_ST_FLAG_RESIZE_RTS)
{ {
/* Release all render targets first /* Release all render targets first
to avoid memory fragmentation */ to avoid memory fragmentation */
@ -2231,7 +2264,7 @@ static bool d3d12_gfx_frame(
if (d3d12->shader_preset->history_size) if (d3d12->shader_preset->history_size)
{ {
if (d3d12->init_history) if (d3d12->flags & D3D12_ST_FLAG_INIT_HISTORY)
d3d12_init_history(d3d12, width, height); d3d12_init_history(d3d12, width, height);
else else
{ {
@ -2259,7 +2292,7 @@ static bool d3d12_gfx_frame(
d3d12_init_texture(d3d12->device, &d3d12->frame.texture[0]); d3d12_init_texture(d3d12->device, &d3d12->frame.texture[0]);
} }
if (d3d12->resize_render_targets) if (d3d12->flags & D3D12_ST_FLAG_RESIZE_RTS)
d3d12_init_render_targets(d3d12, width, height); d3d12_init_render_targets(d3d12, width, height);
d3d12_update_texture(width, height, pitch, d3d12->format, d3d12_update_texture(width, height, pitch, d3d12->format,
@ -2473,7 +2506,7 @@ static bool d3d12_gfx_frame(
d3d12->chain.handle); d3d12->chain.handle);
#ifdef HAVE_DXGI_HDR #ifdef HAVE_DXGI_HDR
if(d3d12->hdr.enable && use_back_buffer) if ((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE) && use_back_buffer)
{ {
d3d12_resource_transition( d3d12_resource_transition(
d3d12->queue.cmd, d3d12->chain.back_buffer.handle, d3d12->queue.cmd, d3d12->chain.back_buffer.handle,
@ -2521,7 +2554,8 @@ static bool d3d12_gfx_frame(
d3d12->pipes[VIDEO_SHADER_STOCK_BLEND]); d3d12->pipes[VIDEO_SHADER_STOCK_BLEND]);
D3D12SetGraphicsRootSignature(d3d12->queue.cmd, d3d12->desc.rootSignature); D3D12SetGraphicsRootSignature(d3d12->queue.cmd, d3d12->desc.rootSignature);
if (d3d12->menu.enabled && d3d12->menu.texture.handle) if ( (d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE)
&& d3d12->menu.texture.handle)
{ {
if (d3d12->menu.texture.dirty) if (d3d12->menu.texture.dirty)
d3d12_upload_texture(d3d12->queue.cmd, &d3d12->menu.texture, d3d12_upload_texture(d3d12->queue.cmd, &d3d12->menu.texture,
@ -2530,7 +2564,7 @@ static bool d3d12_gfx_frame(
D3D12SetGraphicsRootConstantBufferView( D3D12SetGraphicsRootConstantBufferView(
d3d12->queue.cmd, ROOT_ID_UBO, d3d12->ubo_view.BufferLocation); d3d12->queue.cmd, ROOT_ID_UBO, d3d12->ubo_view.BufferLocation);
if (d3d12->menu.fullscreen) if (d3d12->flags & D3D12_ST_FLAG_MENU_FULLSCREEN)
{ {
D3D12RSSetViewports(d3d12->queue.cmd, 1, &d3d12->chain.viewport); D3D12RSSetViewports(d3d12->queue.cmd, 1, &d3d12->chain.viewport);
D3D12RSSetScissorRects(d3d12->queue.cmd, 1, &d3d12->chain.scissorRect); D3D12RSSetScissorRects(d3d12->queue.cmd, 1, &d3d12->chain.scissorRect);
@ -2546,16 +2580,16 @@ static bool d3d12_gfx_frame(
D3D12IASetPrimitiveTopology(d3d12->queue.cmd, D3D12IASetPrimitiveTopology(d3d12->queue.cmd,
D3D_PRIMITIVE_TOPOLOGY_POINTLIST); D3D_PRIMITIVE_TOPOLOGY_POINTLIST);
d3d12->sprites.enabled = true; d3d12->flags |= D3D12_ST_FLAG_SPRITES_ENABLE;
#ifdef HAVE_OVERLAY #ifdef HAVE_OVERLAY
if (d3d12->overlays.enabled && overlay_behind_menu) if ((d3d12->flags & D3D12_ST_FLAG_OVERLAYS_ENABLE) && overlay_behind_menu)
d3d12_render_overlay(d3d12); d3d12_render_overlay(d3d12);
#endif #endif
#ifdef HAVE_MENU #ifdef HAVE_MENU
#ifndef HAVE_GFX_WIDGETS #ifndef HAVE_GFX_WIDGETS
if (d3d12->menu.enabled) if (d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE)
#endif #endif
{ {
D3D12RSSetViewports(d3d12->queue.cmd, 1, D3D12RSSetViewports(d3d12->queue.cmd, 1,
@ -2568,7 +2602,7 @@ static bool d3d12_gfx_frame(
#endif #endif
#ifdef HAVE_MENU #ifdef HAVE_MENU
if (d3d12->menu.enabled) if (d3d12->flags & D3D12_ST_FLAG_MENU_ENABLE)
menu_driver_frame(menu_is_alive, video_info); menu_driver_frame(menu_is_alive, video_info);
else else
#endif #endif
@ -2589,7 +2623,7 @@ static bool d3d12_gfx_frame(
} }
} }
#ifdef HAVE_OVERLAY #ifdef HAVE_OVERLAY
if (d3d12->overlays.enabled && !overlay_behind_menu) if ((d3d12->flags & D3D12_ST_FLAG_OVERLAYS_ENABLE) && !overlay_behind_menu)
d3d12_render_overlay(d3d12); d3d12_render_overlay(d3d12);
#endif #endif
@ -2611,11 +2645,11 @@ static bool d3d12_gfx_frame(
font_driver_render_msg(d3d12, msg, NULL, NULL); font_driver_render_msg(d3d12, msg, NULL, NULL);
} }
d3d12->sprites.enabled = false; d3d12->flags &= ~D3D12_ST_FLAG_SPRITES_ENABLE;
#ifdef HAVE_DXGI_HDR #ifdef HAVE_DXGI_HDR
/* Copy over back buffer to swap chain render targets */ /* Copy over back buffer to swap chain render targets */
if (d3d12->hdr.enable && use_back_buffer) if ((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE) && use_back_buffer)
{ {
d3d12_resource_transition( d3d12_resource_transition(
d3d12->queue.cmd, d3d12->queue.cmd,
@ -2693,24 +2727,33 @@ static void d3d12_gfx_set_nonblock_state(void* data, bool toggle,
unsigned swap_interval) unsigned swap_interval)
{ {
d3d12_video_t* d3d12 = (d3d12_video_t*)data; d3d12_video_t* d3d12 = (d3d12_video_t*)data;
d3d12->chain.vsync = !toggle; if (toggle)
d3d12->flags &= ~D3D12_ST_FLAG_VSYNC;
else
d3d12->flags |= D3D12_ST_FLAG_VSYNC;
d3d12->chain.swap_interval = swap_interval; d3d12->chain.swap_interval = swap_interval;
} }
static bool d3d12_gfx_alive(void* data) static bool d3d12_gfx_alive(void* data)
{ {
bool quit; bool quit;
bool resize_chain = false;
d3d12_video_t* d3d12 = (d3d12_video_t*)data; d3d12_video_t* d3d12 = (d3d12_video_t*)data;
win32_check_window(NULL, win32_check_window(NULL,
&quit, &quit,
&d3d12->resize_chain, &resize_chain,
&d3d12->vp.full_width, &d3d12->vp.full_width,
&d3d12->vp.full_height); &d3d12->vp.full_height);
if ( d3d12->resize_chain if (resize_chain)
&& d3d12->vp.full_width != 0 d3d12->flags |= D3D12_ST_FLAG_RESIZE_CHAIN;
&& d3d12->vp.full_height != 0) else
d3d12->flags &= ~D3D12_ST_FLAG_RESIZE_CHAIN;
if ( (d3d12->flags & D3D12_ST_FLAG_RESIZE_CHAIN)
&& (d3d12->vp.full_width != 0)
&& (d3d12->vp.full_height != 0))
video_driver_set_size(d3d12->vp.full_width, d3d12->vp.full_height); video_driver_set_size(d3d12->vp.full_width, d3d12->vp.full_height);
return !quit; return !quit;
@ -2784,35 +2827,36 @@ static void d3d12_set_menu_texture_frame(
} }
static void d3d12_set_menu_texture_enable(void* data, static void d3d12_set_menu_texture_enable(void* data,
bool state, bool full_screen) bool state, bool fullscreen)
{ {
d3d12_video_t* d3d12 = (d3d12_video_t*)data; d3d12_video_t* d3d12 = (d3d12_video_t*)data;
if (!d3d12) if (!d3d12)
return; return;
d3d12->menu.enabled = state; if (state)
d3d12->menu.fullscreen = full_screen; d3d12->flags |= D3D12_ST_FLAG_MENU_ENABLE;
else
d3d12->flags &= ~D3D12_ST_FLAG_MENU_ENABLE;
if (fullscreen)
d3d12->flags |= D3D12_ST_FLAG_MENU_FULLSCREEN;
else
d3d12->flags &= ~D3D12_ST_FLAG_MENU_FULLSCREEN;
} }
static void d3d12_gfx_set_aspect_ratio( static void d3d12_gfx_set_aspect_ratio(
void* data, unsigned aspect_ratio_idx) void* data, unsigned aspect_ratio_idx)
{ {
d3d12_video_t* d3d12 = (d3d12_video_t*)data; d3d12_video_t* d3d12 = (d3d12_video_t*)data;
if (d3d12)
if (!d3d12) d3d12->flags |= D3D12_ST_FLAG_KEEP_ASPECT | D3D12_ST_FLAG_RESIZE_VIEWPORT;
return;
d3d12->keep_aspect = true;
d3d12->resize_viewport = true;
} }
static void d3d12_gfx_apply_state_changes(void* data) static void d3d12_gfx_apply_state_changes(void* data)
{ {
d3d12_video_t* d3d12 = (d3d12_video_t*)data; d3d12_video_t* d3d12 = (d3d12_video_t*)data;
if (d3d12) if (d3d12)
d3d12->resize_viewport = true; d3d12->flags |= D3D12_ST_FLAG_RESIZE_VIEWPORT;
} }
static void d3d12_gfx_set_osd_msg( static void d3d12_gfx_set_osd_msg(
@ -2822,10 +2866,7 @@ static void d3d12_gfx_set_osd_msg(
void* font) void* font)
{ {
d3d12_video_t* d3d12 = (d3d12_video_t*)data; d3d12_video_t* d3d12 = (d3d12_video_t*)data;
if (d3d12 && (d3d12->flags & D3D12_ST_FLAG_SPRITES_ENABLE))
if (!d3d12 || !d3d12->sprites.enabled)
return;
font_driver_render_msg(d3d12, msg, font_driver_render_msg(d3d12, msg,
(const struct font_params*)params, font); (const struct font_params*)params, font);
} }

View File

@ -70,7 +70,8 @@ static void gfx_display_d3d12_draw(gfx_display_ctx_draw_t *draw,
if (draw->coords->vertex && draw->coords->tex_coord && draw->coords->color) if (draw->coords->vertex && draw->coords->tex_coord && draw->coords->color)
vertex_count = draw->coords->vertices; vertex_count = draw->coords->vertices;
if (!d3d12->sprites.enabled || vertex_count > d3d12->sprites.capacity) if ( (!(d3d12->flags & D3D12_ST_FLAG_SPRITES_ENABLE))
|| (vertex_count > d3d12->sprites.capacity))
return; return;
if (d3d12->sprites.offset + vertex_count > d3d12->sprites.capacity) if (d3d12->sprites.offset + vertex_count > d3d12->sprites.capacity)

View File

@ -249,7 +249,7 @@ static void d3d12_font_render_message(
if (!msg || !*msg) if (!msg || !*msg)
return; return;
if (!d3d12 || !d3d12->sprites.enabled) if (!d3d12 || (!(d3d12->flags & D3D12_ST_FLAG_SPRITES_ENABLE)))
return; return;
/* If font line metrics are not supported just draw as usual */ /* If font line metrics are not supported just draw as usual */