(D3D10) Turn boolean variables into flags

This commit is contained in:
LibretroAdmin 2022-11-02 23:19:41 +01:00
parent 56ad3fa091
commit 7aa8c6bb11
5 changed files with 116 additions and 73 deletions

View File

@ -126,6 +126,21 @@ typedef struct d3d10_shader_t
D3D10InputLayout layout;
} d3d10_shader_t;
enum d3d10_video_flags
{
D3D10_ST_FLAG_VSYNC = (1 << 0),
D3D10_ST_FLAG_RESIZE_CHAIN = (1 << 1),
D3D10_ST_FLAG_KEEP_ASPECT = (1 << 2),
D3D10_ST_FLAG_RESIZE_VIEWPORT = (1 << 3),
D3D10_ST_FLAG_RESIZE_RTS = (1 << 4), /* RT = Render Target */
D3D10_ST_FLAG_INIT_HISTORY = (1 << 5),
D3D10_ST_FLAG_SPRITES_ENABLE = (1 << 6),
D3D10_ST_FLAG_OVERLAYS_ENABLE = (1 << 7),
D3D10_ST_FLAG_OVERLAYS_FULLSCREEN = (1 << 8),
D3D10_ST_FLAG_MENU_ENABLE = (1 << 9),
D3D10_ST_FLAG_MENU_FULLSCREEN = (1 << 10)
};
typedef struct
{
unsigned cur_mon_id;
@ -146,12 +161,6 @@ typedef struct
DXGI_FORMAT format;
float clearcolor[4];
unsigned swap_interval;
bool vsync;
bool resize_chain;
bool keep_aspect;
bool resize_viewport;
bool resize_render_targets;
bool init_history;
d3d10_shader_t shaders[GFX_MAX_SHADERS];
#ifdef __WINRT__
DXGIFactory2 factory;
@ -167,7 +176,6 @@ typedef struct
D3D10Buffer vbo;
int offset;
int capacity;
bool enabled;
} sprites;
#ifdef HAVE_OVERLAY
@ -175,8 +183,6 @@ typedef struct
{
D3D10Buffer vbo;
d3d10_texture_t* textures;
bool enabled;
bool fullscreen;
int count;
} overlays;
#endif
@ -185,8 +191,6 @@ typedef struct
{
d3d10_texture_t texture;
D3D10Buffer vbo;
bool enabled;
bool fullscreen;
} menu;
struct
{
@ -215,6 +219,7 @@ typedef struct
struct string_list *gpu_list;
IDXGIAdapter1 *adapters[D3D10_MAX_GPU_COUNT];
IDXGIAdapter1 *current_adapter;
uint16_t flags;
} d3d10_video_t;
#if !defined(__cplusplus) || defined(CINTERFACE)

View File

@ -220,7 +220,10 @@ static void d3d10_overlay_enable(void* data, bool state)
if (!d3d10)
return;
d3d10->overlays.enabled = state;
if (state)
d3d10->flags |= D3D10_ST_FLAG_OVERLAYS_ENABLE;
else
d3d10->flags &= ~D3D10_ST_FLAG_OVERLAYS_ENABLE;
win32_show_cursor(d3d10, state);
}
@ -231,7 +234,10 @@ static void d3d10_overlay_full_screen(void* data, bool enable)
if (!d3d10)
return;
d3d10->overlays.fullscreen = enable;
if (enable)
d3d10->flags |= D3D10_ST_FLAG_OVERLAYS_FULLSCREEN;
else
d3d10->flags &= ~D3D10_ST_FLAG_OVERLAYS_FULLSCREEN;
}
static void d3d10_get_overlay_interface(void* data, const video_overlay_interface_t** iface)
@ -248,7 +254,7 @@ static void d3d10_render_overlay(d3d10_video_t *d3d10)
{
unsigned i;
if (d3d10->overlays.fullscreen)
if (d3d10->flags & D3D10_ST_FLAG_OVERLAYS_FULLSCREEN)
d3d10->device->lpVtbl->RSSetViewports(d3d10->device, 1, &d3d10->viewport);
else
d3d10->device->lpVtbl->RSSetViewports(d3d10->device, 1, &d3d10->frame.viewport);
@ -317,7 +323,8 @@ static void d3d10_gfx_set_rotation(void* data, unsigned rotation)
static void d3d10_update_viewport(d3d10_video_t *d3d10, bool force_full)
{
video_driver_update_viewport(&d3d10->vp, force_full, d3d10->keep_aspect);
video_driver_update_viewport(&d3d10->vp, force_full,
d3d10->flags & D3D10_ST_FLAG_KEEP_ASPECT);
d3d10->frame.viewport.TopLeftX = d3d10->vp.x;
d3d10->frame.viewport.TopLeftY = d3d10->vp.y;
@ -328,14 +335,13 @@ static void d3d10_update_viewport(d3d10_video_t *d3d10, bool force_full)
if (d3d10->shader_preset && (d3d10->frame.output_size.x != d3d10->vp.width ||
d3d10->frame.output_size.y != d3d10->vp.height))
d3d10->resize_render_targets = true;
d3d10->flags |= D3D10_ST_FLAG_RESIZE_RTS;
d3d10->frame.output_size.x = d3d10->vp.width;
d3d10->frame.output_size.y = d3d10->vp.height;
d3d10->frame.output_size.z = 1.0f / d3d10->vp.width;
d3d10->frame.output_size.w = 1.0f / d3d10->vp.height;
d3d10->resize_viewport = false;
d3d10->flags &= ~D3D10_ST_FLAG_RESIZE_VIEWPORT;
}
static void d3d10_free_shader_preset(d3d10_video_t* d3d10)
@ -382,8 +388,8 @@ static void d3d10_free_shader_preset(d3d10_video_t* d3d10)
free(d3d10->shader_preset);
d3d10->shader_preset = NULL;
d3d10->init_history = false;
d3d10->resize_render_targets = false;
d3d10->flags &= ~(D3D10_ST_FLAG_INIT_HISTORY
| D3D10_ST_FLAG_RESIZE_RTS);
}
static bool d3d10_gfx_set_shader(void* data, enum rarch_shader_type type, const char* path)
@ -540,8 +546,8 @@ static bool d3d10_gfx_set_shader(void* data, enum rarch_shader_type type, const
image_texture_free(&image);
}
d3d10->resize_render_targets = true;
d3d10->init_history = true;
d3d10->flags |= (D3D10_ST_FLAG_INIT_HISTORY
| D3D10_ST_FLAG_RESIZE_RTS);
return true;
@ -750,9 +756,15 @@ static void *d3d10_gfx_init(const video_info_t* video,
video_driver_set_size(d3d10->vp.full_width, d3d10->vp.full_height);
d3d10->viewport.Width = d3d10->vp.full_width;
d3d10->viewport.Height = d3d10->vp.full_height;
d3d10->resize_viewport = true;
d3d10->keep_aspect = video->force_aspect;
d3d10->vsync = video->vsync;
d3d10->flags |= D3D10_ST_FLAG_RESIZE_VIEWPORT;
if (video->force_aspect)
d3d10->flags |= D3D10_ST_FLAG_KEEP_ASPECT;
else
d3d10->flags &= ~D3D10_ST_FLAG_KEEP_ASPECT;
if (video->vsync)
d3d10->flags |= D3D10_ST_FLAG_VSYNC;
else
d3d10->flags &= ~D3D10_ST_FLAG_VSYNC;
d3d10->format = video->rgb32 ?
DXGI_FORMAT_B8G8R8X8_UNORM : DXGI_FORMAT_B5G6R5_UNORM;
@ -1134,9 +1146,10 @@ error:
return NULL;
}
static void d3d10_init_history(d3d10_video_t* d3d10, unsigned width, unsigned height)
static void d3d10_init_history(d3d10_video_t* d3d10,
unsigned width, unsigned height)
{
unsigned i;
int i;
/* TODO/FIXME: should we init history to max_width/max_height instead ?
* to prevent out of memory errors happening several frames later
@ -1153,7 +1166,7 @@ static void d3d10_init_history(d3d10_video_t* d3d10, unsigned width, unsigned he
d3d10_init_texture(d3d10->device, &d3d10->frame.texture[i]);
/* TODO/FIXME: clear texture ? */
}
d3d10->init_history = false;
d3d10->flags &= ~D3D10_ST_FLAG_INIT_HISTORY;
}
static void d3d10_init_render_targets(d3d10_video_t* d3d10,
@ -1250,7 +1263,7 @@ static void d3d10_init_render_targets(d3d10_video_t* d3d10,
}
}
d3d10->resize_render_targets = false;
d3d10->flags &= ~D3D10_ST_FLAG_RESIZE_RTS;
}
static bool d3d10_gfx_frame(
@ -1280,7 +1293,7 @@ static bool d3d10_gfx_frame(
bool widgets_active = video_info->widgets_active;
#endif
if (d3d10->resize_chain)
if (d3d10->flags & D3D10_ST_FLAG_RESIZE_CHAIN)
{
D3D10Texture2D backBuffer;
@ -1301,8 +1314,8 @@ static bool d3d10_gfx_frame(
d3d10->ubo_values.OutputSize.width = d3d10->viewport.Width;
d3d10->ubo_values.OutputSize.height = d3d10->viewport.Height;
d3d10->resize_chain = false;
d3d10->resize_viewport = true;
d3d10->flags &= ~D3D10_ST_FLAG_RESIZE_CHAIN;
d3d10->flags |= D3D10_ST_FLAG_RESIZE_VIEWPORT;
video_driver_set_size(video_width, video_height);
}
@ -1330,13 +1343,12 @@ static bool d3d10_gfx_frame(
{
if (d3d10->frame.texture[0].desc.Width != width ||
d3d10->frame.texture[0].desc.Height != height)
d3d10->resize_render_targets = true;
d3d10->flags |= D3D10_ST_FLAG_RESIZE_RTS;
if (d3d10->resize_render_targets)
if (d3d10->flags & D3D10_ST_FLAG_RESIZE_RTS)
{
unsigned i;
/* release all render targets first to avoid memory fragmentation */
int i;
/* Release all render targets first to avoid memory fragmentation */
for (i = 0; i < d3d10->shader_preset->passes; i++)
{
d3d10_release_texture(&d3d10->pass[i].rt);
@ -1348,7 +1360,7 @@ static bool d3d10_gfx_frame(
if (d3d10->shader_preset->history_size)
{
if (d3d10->init_history)
if (d3d10->flags & D3D10_ST_FLAG_INIT_HISTORY)
d3d10_init_history(d3d10, width, height);
else
{
@ -1373,7 +1385,7 @@ static bool d3d10_gfx_frame(
d3d10_init_texture(d3d10->device, &d3d10->frame.texture[0]);
}
if (d3d10->resize_render_targets)
if (d3d10->flags & D3D10_ST_FLAG_RESIZE_RTS)
d3d10_init_render_targets(d3d10, width, height);
if (frame != RETRO_HW_FRAME_BUFFER_VALID)
@ -1523,9 +1535,10 @@ static bool d3d10_gfx_frame(
context->lpVtbl->OMSetBlendState(context, d3d10->blend_enable, NULL,
D3D10_DEFAULT_SAMPLE_MASK);
if (d3d10->menu.enabled && d3d10->menu.texture.handle)
if ( (d3d10->flags & D3D10_ST_FLAG_MENU_ENABLE)
&& d3d10->menu.texture.handle)
{
if (d3d10->menu.fullscreen)
if (d3d10->flags & D3D10_ST_FLAG_MENU_FULLSCREEN)
context->lpVtbl->RSSetViewports(context, 1, &d3d10->viewport);
d3d10_set_shader(context, &d3d10->shaders[VIDEO_SHADER_STOCK_BLEND]);
@ -1542,16 +1555,17 @@ static bool d3d10_gfx_frame(
context->lpVtbl->PSSetConstantBuffers(context, 0, 1, (ID3D10Buffer **
const)&d3d10->ubo);
d3d10->sprites.enabled = true;
d3d10->flags |= D3D10_ST_FLAG_SPRITES_ENABLE;
#ifdef HAVE_OVERLAY
if (d3d10->overlays.enabled && overlay_behind_menu)
if ( (d3d10->flags & D3D10_ST_FLAG_OVERLAYS_ENABLE)
&& overlay_behind_menu)
d3d10_render_overlay(d3d10);
#endif
#ifdef HAVE_MENU
#ifndef HAVE_GFX_WIDGETS
if (d3d10->menu.enabled)
if (d3d10->flags & D3D10_ST_FLAG_MENU_ENABLE)
#endif
{
context->lpVtbl->RSSetViewports(context, 1, &d3d10->viewport);
@ -1560,7 +1574,7 @@ static bool d3d10_gfx_frame(
#endif
#ifdef HAVE_MENU
if (d3d10->menu.enabled)
if (d3d10->flags & D3D10_ST_FLAG_MENU_ENABLE)
menu_driver_frame(menu_is_alive, video_info);
else
#endif
@ -1580,7 +1594,8 @@ static bool d3d10_gfx_frame(
}
#ifdef HAVE_OVERLAY
if (d3d10->overlays.enabled && !overlay_behind_menu)
if ( (d3d10->flags & D3D10_ST_FLAG_OVERLAYS_ENABLE)
&& !overlay_behind_menu)
d3d10_render_overlay(d3d10);
#endif
@ -1598,7 +1613,7 @@ static bool d3d10_gfx_frame(
D3D10SetVertexBuffer(d3d10->device, 0, d3d10->sprites.vbo, sizeof(d3d10_sprite_t), 0);
font_driver_render_msg(d3d10, msg, NULL, NULL);
}
d3d10->sprites.enabled = false;
d3d10->flags &= ~D3D10_ST_FLAG_SPRITES_ENABLE;
#ifndef __WINRT__
win32_update_title();
@ -1617,22 +1632,36 @@ static void d3d10_gfx_set_nonblock_state(void* data, bool toggle,
if (!d3d10)
return;
d3d10->vsync = !toggle;
d3d10->swap_interval = (!toggle) ? swap_interval : 0;
if (toggle)
{
d3d10->flags &= ~D3D10_ST_FLAG_VSYNC;
d3d10->swap_interval = 0;
}
else
{
d3d10->flags |= D3D10_ST_FLAG_VSYNC;
d3d10->swap_interval = swap_interval;
}
}
static bool d3d10_gfx_alive(void* data)
{
bool quit;
bool resize_chain = false;
d3d10_video_t* d3d10 = (d3d10_video_t*)data;
win32_check_window(NULL,
&quit, &d3d10->resize_chain, &d3d10->vp.full_width,
&quit, &resize_chain, &d3d10->vp.full_width,
&d3d10->vp.full_height);
if ( d3d10->resize_chain
&& d3d10->vp.full_width != 0
&& d3d10->vp.full_height != 0)
if (resize_chain)
d3d10->flags |= D3D10_ST_FLAG_RESIZE_CHAIN;
else
d3d10->flags &= ~D3D10_ST_FLAG_RESIZE_CHAIN;
if ( (d3d10->flags & D3D10_ST_FLAG_RESIZE_CHAIN)
&& (d3d10->vp.full_width != 0)
&& (d3d10->vp.full_height != 0))
video_driver_set_size(d3d10->vp.full_width, d3d10->vp.full_height);
return !quit;
@ -1685,15 +1714,22 @@ static void d3d10_set_menu_texture_frame(
? RARCH_FILTER_LINEAR
: RARCH_FILTER_NEAREST][RARCH_WRAP_DEFAULT];
}
static void d3d10_set_menu_texture_enable(void* data, bool state, bool full_screen)
static void d3d10_set_menu_texture_enable(
void* data, bool state, bool fullscreen)
{
d3d10_video_t* d3d10 = (d3d10_video_t*)data;
if (!d3d10)
return;
d3d10->menu.enabled = state;
d3d10->menu.fullscreen = full_screen;
if (state)
d3d10->flags |= D3D10_ST_FLAG_MENU_ENABLE;
else
d3d10->flags &= ~D3D10_ST_FLAG_MENU_ENABLE;
if (fullscreen)
d3d10->flags |= D3D10_ST_FLAG_MENU_FULLSCREEN;
else
d3d10->flags &= ~D3D10_ST_FLAG_MENU_FULLSCREEN;
}
static void d3d10_gfx_set_aspect_ratio(void* data, unsigned aspect_ratio_idx)
@ -1703,16 +1739,15 @@ static void d3d10_gfx_set_aspect_ratio(void* data, unsigned aspect_ratio_idx)
if (!d3d10)
return;
d3d10->keep_aspect = true;
d3d10->resize_viewport = true;
d3d10->flags |= D3D10_ST_FLAG_RESIZE_VIEWPORT
| D3D10_ST_FLAG_KEEP_ASPECT;
}
static void d3d10_gfx_apply_state_changes(void* data)
{
d3d10_video_t* d3d10 = (d3d10_video_t*)data;
if (d3d10)
d3d10->resize_viewport = true;
d3d10->flags |= D3D10_ST_FLAG_RESIZE_VIEWPORT;
}
static void d3d10_gfx_set_osd_msg(
@ -1723,7 +1758,7 @@ static void d3d10_gfx_set_osd_msg(
if (d3d10)
{
if (d3d10->sprites.enabled)
if (d3d10->flags & D3D10_ST_FLAG_SPRITES_ENABLE)
font_driver_render_msg(d3d10, msg,
(const struct font_params*)params, font);
}

View File

@ -2306,7 +2306,7 @@ D3D11_ST_FLAG_HAS_ALLOW_TEARING)) ? 0 : DXGI_PRESENT_ALLOW_TEARING;
#ifdef HAVE_MENU
#ifndef HAVE_GFX_WIDGETS
if (d3d11->menu.enabled)
if (d3d11->flags & D3D11_ST_FLAG_MENU_ENABLE)
#endif
{
context->lpVtbl->RSSetViewports(context, 1, &d3d11->viewport);

View File

@ -78,7 +78,8 @@ static void gfx_display_d3d10_draw(gfx_display_ctx_draw_t *draw,
if (draw->coords->vertex && draw->coords->tex_coord && draw->coords->color)
vertex_count = draw->coords->vertices;
if (!d3d10->sprites.enabled || vertex_count > d3d10->sprites.capacity)
if ( (!(d3d10->flags & D3D10_ST_FLAG_SPRITES_ENABLE))
|| (vertex_count > d3d10->sprites.capacity))
return;
if (d3d10->sprites.offset + vertex_count > d3d10->sprites.capacity)
@ -92,7 +93,7 @@ static void gfx_display_d3d10_draw(gfx_display_ctx_draw_t *draw,
D3D10_MAP_WRITE_NO_OVERWRITE, 0,
(void**)&mapped_vbo);
sprite = (d3d10_sprite_t*)mapped_vbo + d3d10->sprites.offset;
sprite = (d3d10_sprite_t*)mapped_vbo + d3d10->sprites.offset;
if (vertex_count == 1)
{
@ -150,7 +151,8 @@ static void gfx_display_d3d10_draw(gfx_display_ctx_draw_t *draw,
sprite++;
}
d3d10_set_shader(d3d10->device, &d3d10->shaders[VIDEO_SHADER_STOCK_BLEND]);
d3d10_set_shader(d3d10->device,
&d3d10->shaders[VIDEO_SHADER_STOCK_BLEND]);
d3d10->device->lpVtbl->IASetPrimitiveTopology(d3d10->device,
D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
}
@ -158,7 +160,8 @@ static void gfx_display_d3d10_draw(gfx_display_ctx_draw_t *draw,
d3d10->sprites.vbo->lpVtbl->Unmap(d3d10->sprites.vbo);
}
d3d10_set_texture_and_sampler(d3d10->device, 0, (d3d10_texture_t*)draw->texture);
d3d10_set_texture_and_sampler(d3d10->device, 0,
(d3d10_texture_t*)draw->texture);
d3d10->device->lpVtbl->Draw(d3d10->device, vertex_count,
d3d10->sprites.offset);
d3d10->sprites.offset += vertex_count;
@ -169,8 +172,6 @@ static void gfx_display_d3d10_draw(gfx_display_ctx_draw_t *draw,
d3d10->device->lpVtbl->IASetPrimitiveTopology(d3d10->device,
D3D10_PRIMITIVE_TOPOLOGY_POINTLIST);
}
return;
}
static void gfx_display_d3d10_draw_pipeline(gfx_display_ctx_draw_t* draw,
@ -206,7 +207,8 @@ static void gfx_display_d3d10_draw_pipeline(gfx_display_ctx_draw_t* draw,
d3d10->device->lpVtbl->CreateBuffer(d3d10->device, &desc,
&vertex_data, &d3d10->menu_pipeline_vbo);
}
D3D10SetVertexBuffer(d3d10->device, 0, d3d10->menu_pipeline_vbo, 2 * sizeof(float), 0);
D3D10SetVertexBuffer(d3d10->device, 0,
d3d10->menu_pipeline_vbo, 2 * sizeof(float), 0);
draw->coords->vertices = ca->coords.vertices;
d3d10->device->lpVtbl->OMSetBlendState(d3d10->device,
d3d10->blend_pipeline,
@ -218,7 +220,8 @@ static void gfx_display_d3d10_draw_pipeline(gfx_display_ctx_draw_t* draw,
case VIDEO_SHADER_MENU_4:
case VIDEO_SHADER_MENU_5:
case VIDEO_SHADER_MENU_6:
D3D10SetVertexBuffer(d3d10->device, 0, d3d10->frame.vbo, sizeof(d3d10_vertex_t), 0);
D3D10SetVertexBuffer(d3d10->device, 0,
d3d10->frame.vbo, sizeof(d3d10_vertex_t), 0);
draw->coords->vertices = 4;
break;
default:

View File

@ -243,12 +243,12 @@ static void d3d10_font_render_message(
if (!msg || !*msg)
return;
if (!d3d10 || !d3d10->sprites.enabled)
if (!d3d10 || (!(d3d10->flags & D3D10_ST_FLAG_SPRITES_ENABLE)))
return;
/* If font line metrics are not supported just draw as usual */
if (!font->font_driver->get_line_metrics ||
!font->font_driver->get_line_metrics(font->font_data, &line_metrics))
if ( !font->font_driver->get_line_metrics
|| !font->font_driver->get_line_metrics(font->font_data, &line_metrics))
{
size_t msg_len = strlen(msg);
if (msg_len <= (unsigned)d3d10->sprites.capacity)