mirror of https://github.com/xemu-project/xemu.git
nv2a: Block renderer finalization on display present
This commit is contained in:
parent
25afb8603d
commit
792ed56d58
|
@ -24,6 +24,7 @@
|
||||||
void nv2a_init(PCIBus *bus, int devfn, MemoryRegion *ram);
|
void nv2a_init(PCIBus *bus, int devfn, MemoryRegion *ram);
|
||||||
void nv2a_context_init(void);
|
void nv2a_context_init(void);
|
||||||
int nv2a_get_framebuffer_surface(void);
|
int nv2a_get_framebuffer_surface(void);
|
||||||
|
void nv2a_release_framebuffer_surface(void);
|
||||||
void nv2a_set_surface_scale_factor(unsigned int scale);
|
void nv2a_set_surface_scale_factor(unsigned int scale);
|
||||||
unsigned int nv2a_get_surface_scale_factor(void);
|
unsigned int nv2a_get_surface_scale_factor(void);
|
||||||
const uint8_t *nv2a_get_dac_palette(void);
|
const uint8_t *nv2a_get_dac_palette(void);
|
||||||
|
|
|
@ -39,8 +39,6 @@ void pgraph_gl_set_surface_scale_factor(NV2AState *d, unsigned int scale)
|
||||||
|
|
||||||
g_config.display.quality.surface_scale = scale < 1 ? 1 : scale;
|
g_config.display.quality.surface_scale = scale < 1 ? 1 : scale;
|
||||||
|
|
||||||
qemu_mutex_unlock_iothread();
|
|
||||||
|
|
||||||
qemu_mutex_lock(&d->pfifo.lock);
|
qemu_mutex_lock(&d->pfifo.lock);
|
||||||
qatomic_set(&d->pfifo.halt, true);
|
qatomic_set(&d->pfifo.halt, true);
|
||||||
qemu_mutex_unlock(&d->pfifo.lock);
|
qemu_mutex_unlock(&d->pfifo.lock);
|
||||||
|
@ -67,8 +65,6 @@ void pgraph_gl_set_surface_scale_factor(NV2AState *d, unsigned int scale)
|
||||||
qatomic_set(&d->pfifo.halt, false);
|
qatomic_set(&d->pfifo.halt, false);
|
||||||
pfifo_kick(d);
|
pfifo_kick(d);
|
||||||
qemu_mutex_unlock(&d->pfifo.lock);
|
qemu_mutex_unlock(&d->pfifo.lock);
|
||||||
|
|
||||||
qemu_mutex_lock_iothread();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int pgraph_gl_get_surface_scale_factor(NV2AState *d)
|
unsigned int pgraph_gl_get_surface_scale_factor(NV2AState *d)
|
||||||
|
|
|
@ -222,6 +222,7 @@ void pgraph_init(NV2AState *d)
|
||||||
qemu_mutex_init(&pg->renderer_lock);
|
qemu_mutex_init(&pg->renderer_lock);
|
||||||
qemu_event_init(&pg->sync_complete, false);
|
qemu_event_init(&pg->sync_complete, false);
|
||||||
qemu_event_init(&pg->flush_complete, false);
|
qemu_event_init(&pg->flush_complete, false);
|
||||||
|
qemu_cond_init(&pg->framebuffer_released);
|
||||||
|
|
||||||
pg->frame_time = 0;
|
pg->frame_time = 0;
|
||||||
pg->draw_time = 0;
|
pg->draw_time = 0;
|
||||||
|
@ -352,26 +353,41 @@ void pgraph_destroy(PGRAPHState *pg)
|
||||||
int nv2a_get_framebuffer_surface(void)
|
int nv2a_get_framebuffer_surface(void)
|
||||||
{
|
{
|
||||||
NV2AState *d = g_nv2a;
|
NV2AState *d = g_nv2a;
|
||||||
|
PGRAPHState *pg = &d->pgraph;
|
||||||
int s = 0;
|
int s = 0;
|
||||||
|
|
||||||
qemu_mutex_lock(&d->pgraph.renderer_lock);
|
qemu_mutex_lock(&pg->renderer_lock);
|
||||||
if (d->pgraph.renderer->ops.get_framebuffer_surface) {
|
assert(!pg->framebuffer_in_use);
|
||||||
s = d->pgraph.renderer->ops.get_framebuffer_surface(d);
|
pg->framebuffer_in_use = true;
|
||||||
|
if (pg->renderer->ops.get_framebuffer_surface) {
|
||||||
|
s = pg->renderer->ops.get_framebuffer_surface(d);
|
||||||
}
|
}
|
||||||
qemu_mutex_unlock(&d->pgraph.renderer_lock);
|
qemu_mutex_unlock(&pg->renderer_lock);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nv2a_release_framebuffer_surface(void)
|
||||||
|
{
|
||||||
|
NV2AState *d = g_nv2a;
|
||||||
|
PGRAPHState *pg = &d->pgraph;
|
||||||
|
qemu_mutex_lock(&pg->renderer_lock);
|
||||||
|
pg->framebuffer_in_use = false;
|
||||||
|
qemu_cond_broadcast(&pg->framebuffer_released);
|
||||||
|
qemu_mutex_unlock(&pg->renderer_lock);
|
||||||
|
}
|
||||||
|
|
||||||
void nv2a_set_surface_scale_factor(unsigned int scale)
|
void nv2a_set_surface_scale_factor(unsigned int scale)
|
||||||
{
|
{
|
||||||
NV2AState *d = g_nv2a;
|
NV2AState *d = g_nv2a;
|
||||||
|
|
||||||
|
qemu_mutex_unlock_iothread();
|
||||||
qemu_mutex_lock(&d->pgraph.renderer_lock);
|
qemu_mutex_lock(&d->pgraph.renderer_lock);
|
||||||
if (d->pgraph.renderer->ops.set_surface_scale_factor) {
|
if (d->pgraph.renderer->ops.set_surface_scale_factor) {
|
||||||
d->pgraph.renderer->ops.set_surface_scale_factor(d, scale);
|
d->pgraph.renderer->ops.set_surface_scale_factor(d, scale);
|
||||||
}
|
}
|
||||||
qemu_mutex_unlock(&d->pgraph.renderer_lock);
|
qemu_mutex_unlock(&d->pgraph.renderer_lock);
|
||||||
|
qemu_mutex_lock_iothread();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int nv2a_get_surface_scale_factor(void)
|
unsigned int nv2a_get_surface_scale_factor(void)
|
||||||
|
@ -379,11 +395,13 @@ unsigned int nv2a_get_surface_scale_factor(void)
|
||||||
NV2AState *d = g_nv2a;
|
NV2AState *d = g_nv2a;
|
||||||
int s = 1;
|
int s = 1;
|
||||||
|
|
||||||
|
qemu_mutex_unlock_iothread();
|
||||||
qemu_mutex_lock(&d->pgraph.renderer_lock);
|
qemu_mutex_lock(&d->pgraph.renderer_lock);
|
||||||
if (d->pgraph.renderer->ops.get_surface_scale_factor) {
|
if (d->pgraph.renderer->ops.get_surface_scale_factor) {
|
||||||
s = d->pgraph.renderer->ops.get_surface_scale_factor(d);
|
s = d->pgraph.renderer->ops.get_surface_scale_factor(d);
|
||||||
}
|
}
|
||||||
qemu_mutex_unlock(&d->pgraph.renderer_lock);
|
qemu_mutex_unlock(&d->pgraph.renderer_lock);
|
||||||
|
qemu_mutex_lock_iothread();
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
@ -2958,6 +2976,9 @@ void pgraph_process_pending(NV2AState *d)
|
||||||
|
|
||||||
qemu_mutex_unlock(&d->pfifo.lock);
|
qemu_mutex_unlock(&d->pfifo.lock);
|
||||||
qemu_mutex_lock(&d->pgraph.lock);
|
qemu_mutex_lock(&d->pgraph.lock);
|
||||||
|
while (pg->framebuffer_in_use) {
|
||||||
|
qemu_cond_wait(&d->pgraph.framebuffer_released, &d->pgraph.renderer_lock);
|
||||||
|
}
|
||||||
|
|
||||||
if (pg->renderer->ops.finalize) {
|
if (pg->renderer->ops.finalize) {
|
||||||
pg->renderer->ops.finalize(d);
|
pg->renderer->ops.finalize(d);
|
||||||
|
|
|
@ -235,6 +235,9 @@ typedef struct PGRAPHState {
|
||||||
bool sync_pending;
|
bool sync_pending;
|
||||||
QemuEvent sync_complete;
|
QemuEvent sync_complete;
|
||||||
|
|
||||||
|
bool framebuffer_in_use;
|
||||||
|
QemuCond framebuffer_released;
|
||||||
|
|
||||||
unsigned int surface_scale_factor;
|
unsigned int surface_scale_factor;
|
||||||
uint8_t *scale_buf;
|
uint8_t *scale_buf;
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,6 @@ void pgraph_vk_set_surface_scale_factor(NV2AState *d, unsigned int scale)
|
||||||
{
|
{
|
||||||
g_config.display.quality.surface_scale = scale < 1 ? 1 : scale;
|
g_config.display.quality.surface_scale = scale < 1 ? 1 : scale;
|
||||||
|
|
||||||
qemu_mutex_unlock_iothread();
|
|
||||||
|
|
||||||
qemu_mutex_lock(&d->pfifo.lock);
|
qemu_mutex_lock(&d->pfifo.lock);
|
||||||
qatomic_set(&d->pfifo.halt, true);
|
qatomic_set(&d->pfifo.halt, true);
|
||||||
qemu_mutex_unlock(&d->pfifo.lock);
|
qemu_mutex_unlock(&d->pfifo.lock);
|
||||||
|
@ -65,8 +63,6 @@ void pgraph_vk_set_surface_scale_factor(NV2AState *d, unsigned int scale)
|
||||||
qatomic_set(&d->pfifo.halt, false);
|
qatomic_set(&d->pfifo.halt, false);
|
||||||
pfifo_kick(d);
|
pfifo_kick(d);
|
||||||
qemu_mutex_unlock(&d->pfifo.lock);
|
qemu_mutex_unlock(&d->pfifo.lock);
|
||||||
|
|
||||||
qemu_mutex_lock_iothread();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int pgraph_vk_get_surface_scale_factor(NV2AState *d)
|
unsigned int pgraph_vk_get_surface_scale_factor(NV2AState *d)
|
||||||
|
|
|
@ -1209,6 +1209,7 @@ void sdl2_gl_refresh(DisplayChangeListener *dcl)
|
||||||
qemu_mutex_unlock_main_loop();
|
qemu_mutex_unlock_main_loop();
|
||||||
|
|
||||||
glFinish();
|
glFinish();
|
||||||
|
nv2a_release_framebuffer_surface();
|
||||||
SDL_GL_SwapWindow(scon->real_window);
|
SDL_GL_SwapWindow(scon->real_window);
|
||||||
|
|
||||||
/* VGA update (see note above) + vblank */
|
/* VGA update (see note above) + vblank */
|
||||||
|
|
Loading…
Reference in New Issue