nv2a: Merge renderer init, init_thread methods

This commit is contained in:
Matt Borgerson 2024-07-26 17:21:01 -07:00 committed by mborgerson
parent 98fa394f84
commit f3b6d50d99
5 changed files with 14 additions and 31 deletions

View File

@ -30,6 +30,8 @@ void pgraph_gl_init_display_renderer(NV2AState *d)
struct PGRAPHState *pg = &d->pgraph;
PGRAPHGLState *r = pg->gl_renderer_state;
glo_set_current(g_nv2a_context_display);
glGenTextures(1, &r->gl_display_buffer);
r->gl_display_buffer_internal_format = 0;
r->gl_display_buffer_width = 0;
@ -100,6 +102,8 @@ void pgraph_gl_init_display_renderer(NV2AState *d)
glGenFramebuffers(1, &r->disp_rndr.fbo);
glGenTextures(1, &r->disp_rndr.pvideo_tex);
assert(glGetError() == GL_NO_ERROR);
glo_set_current(g_nv2a_context_render);
}
void pgraph_gl_finalize_display(PGRAPHState *pg)

View File

@ -27,7 +27,7 @@
GloContext *g_nv2a_context_render;
GloContext *g_nv2a_context_display;
static void nv2a_gl_context_init(void)
static void early_context_init(void)
{
g_nv2a_context_render = glo_context_create();
g_nv2a_context_display = glo_context_create();
@ -56,23 +56,14 @@ static void pgraph_gl_init(NV2AState *d)
pgraph_gl_init_texture_cache(d);
pgraph_gl_init_vertex_cache(d);
pgraph_gl_init_shader_cache(pg);
glo_set_current(g_nv2a_context_display);
pgraph_gl_init_display_renderer(d);
pgraph_gl_update_entire_memory_buffer(d);
glo_set_current(NULL);
pg->uniform_attrs = 0;
pg->swizzle_attrs = 0;
}
static void pgraph_gl_init_thread(NV2AState *d)
{
glo_set_current(g_nv2a_context_render);
}
static void pgraph_gl_finalize(NV2AState *d)
{
PGRAPHState *pg = &d->pgraph;
@ -172,7 +163,7 @@ static void pgraph_gl_pre_shutdown_wait(NV2AState *d)
PGRAPHState *pg = &d->pgraph;
PGRAPHGLState *r = pg->gl_renderer_state;
qemu_event_wait(&r->shader_cache_writeback_complete);
qemu_event_wait(&r->shader_cache_writeback_complete);
}
static PGRAPHRenderer pgraph_gl_renderer = {
@ -180,8 +171,7 @@ static PGRAPHRenderer pgraph_gl_renderer = {
.name = "OpenGL",
.ops = {
.init = pgraph_gl_init,
.early_context_init = nv2a_gl_context_init,
.init_thread = pgraph_gl_init_thread,
.early_context_init = early_context_init,
.finalize = pgraph_gl_finalize,
.clear_report_value = pgraph_gl_clear_report_value,
.clear_surface = pgraph_gl_clear_surface,

View File

@ -240,7 +240,6 @@ void pgraph_init(NV2AState *d)
pgraph_clear_dirty_reg_map(pg);
pg->renderer = renderers[g_config.display.renderer];
pg->renderer->ops.init(d);
}
void pgraph_clear_dirty_reg_map(PGRAPHState *pg)
@ -250,8 +249,8 @@ void pgraph_clear_dirty_reg_map(PGRAPHState *pg)
void pgraph_init_thread(NV2AState *d)
{
if (d->pgraph.renderer->ops.init_thread) {
d->pgraph.renderer->ops.init_thread(d);
if (d->pgraph.renderer->ops.init) {
d->pgraph.renderer->ops.init(d);
}
}
@ -2926,9 +2925,6 @@ void pgraph_process_pending(NV2AState *d)
if (pg->renderer->ops.init) {
pg->renderer->ops.init(d);
}
if (pg->renderer->ops.init_thread) {
pg->renderer->ops.init_thread(d);
}
qemu_mutex_unlock(&d->pgraph.renderer_lock);
qemu_mutex_unlock(&d->pgraph.lock);

View File

@ -101,7 +101,6 @@ typedef struct PGRAPHRenderer {
struct {
void (*early_context_init)(void);
void (*init)(NV2AState *d);
void (*init_thread)(NV2AState *d);
void (*finalize)(NV2AState *d);
void (*clear_report_value)(NV2AState *d);
void (*clear_surface)(NV2AState *d, uint32_t parameter);

View File

@ -33,14 +33,18 @@ static void early_context_init(void)
#endif
}
static void pgraph_vk_init_thread(NV2AState *d)
static void pgraph_vk_init(NV2AState *d)
{
PGRAPHState *pg = &d->pgraph;
pg->vk_renderer_state = (PGRAPHVkState *)g_malloc0(sizeof(PGRAPHVkState));
#if HAVE_EXTERNAL_MEMORY
glo_set_current(g_gl_context);
#endif
pgraph_vk_debug_init();
pgraph_vk_init_instance(pg);
pgraph_vk_init_command_buffers(pg);
pgraph_vk_init_buffers(d);
@ -192,22 +196,12 @@ static int pgraph_vk_get_framebuffer_surface(NV2AState *d)
#endif
}
static void pgraph_vk_init(NV2AState *d)
{
PGRAPHState *pg = &d->pgraph;
pg->vk_renderer_state = (PGRAPHVkState *)g_malloc0(sizeof(PGRAPHVkState));
pgraph_vk_debug_init();
}
static PGRAPHRenderer pgraph_vk_renderer = {
.type = CONFIG_DISPLAY_RENDERER_VULKAN,
.name = "Vulkan",
.ops = {
.init = pgraph_vk_init,
.early_context_init = early_context_init,
.init_thread = pgraph_vk_init_thread,
.finalize = pgraph_vk_finalize,
.clear_report_value = pgraph_vk_clear_report_value,
.clear_surface = pgraph_vk_clear_surface,