From 5cb65d1791e06236879ae574eb9f31ae29ccd18d Mon Sep 17 00:00:00 2001 From: Matt Borgerson Date: Mon, 6 Jan 2025 04:08:41 -0700 Subject: [PATCH] nv2a: Migrate nv2a_get_offsets to new _get_params model --- hw/xbox/nv2a/nv2a.c | 29 +++++++++-------------------- hw/xbox/nv2a/pgraph/gl/display.c | 24 +++++++++++++++--------- hw/xbox/nv2a/pgraph/vk/display.c | 16 +++++++++------- hw/xbox/nv2a/pgraph/vk/renderer.c | 10 ++++++---- 4 files changed, 39 insertions(+), 40 deletions(-) diff --git a/hw/xbox/nv2a/nv2a.c b/hw/xbox/nv2a/nv2a.c index fd1bcbaba6..b6c9c63c29 100644 --- a/hw/xbox/nv2a/nv2a.c +++ b/hw/xbox/nv2a/nv2a.c @@ -149,27 +149,16 @@ static int nv2a_get_bpp(VGACommonState *s) return bpp; } -static void nv2a_get_offsets(VGACommonState *s, - uint32_t *pline_offset, - uint32_t *pstart_addr, - uint32_t *pline_compare) +static void nv2a_get_params(VGACommonState *s, VGADisplayParams *params) { NV2AState *d = container_of(s, NV2AState, vga); - uint32_t start_addr, line_offset, line_compare; - - line_offset = s->cr[0x13] - | ((s->cr[0x19] & 0xe0) << 3) - | ((s->cr[0x25] & 0x20) << 6); - line_offset <<= 3; - *pline_offset = line_offset; - - start_addr = d->pcrtc.start / 4; - *pstart_addr = start_addr; - - line_compare = s->cr[VGA_CRTC_LINE_COMPARE] | - ((s->cr[VGA_CRTC_OVERFLOW] & 0x10) << 4) | - ((s->cr[VGA_CRTC_MAX_SCAN] & 0x40) << 3); - *pline_compare = line_compare; + params->line_offset = (s->cr[0x13] | ((s->cr[0x19] & 0xe0) << 3) | + ((s->cr[0x25] & 0x20) << 6)) + << 3; + params->start_addr = d->pcrtc.start / 4; + params->line_compare = s->cr[VGA_CRTC_LINE_COMPARE] | + ((s->cr[VGA_CRTC_OVERFLOW] & 0x10) << 4) | + ((s->cr[VGA_CRTC_MAX_SCAN] & 0x40) << 3); } const uint8_t *nv2a_get_dac_palette(void) @@ -235,7 +224,7 @@ static void nv2a_init_vga(NV2AState *d) vga_common_init(vga, OBJECT(d), &error_fatal); vga->get_bpp = nv2a_get_bpp; - vga->get_offsets = nv2a_get_offsets; + vga->get_params = nv2a_get_params; // vga->overlay_draw_line = nv2a_overlay_draw_line; d->hw_ops = *vga->hw_ops; diff --git a/hw/xbox/nv2a/pgraph/gl/display.c b/hw/xbox/nv2a/pgraph/gl/display.c index a978c54ab0..f088eaee60 100644 --- a/hw/xbox/nv2a/pgraph/gl/display.c +++ b/hw/xbox/nv2a/pgraph/gl/display.c @@ -19,6 +19,8 @@ * License along with this library; if not, see . */ +#include "qemu/osdep.h" +#include "hw/display/vga_int.h" #include "hw/xbox/nv2a/nv2a_int.h" #include "hw/xbox/nv2a/pgraph/util.h" #include "renderer.h" @@ -284,10 +286,10 @@ static void render_display(NV2AState *d, SurfaceBinding *surface) PGRAPHGLState *r = pg->gl_renderer_state; unsigned int width, height; - uint32_t pline_offset, pstart_addr, pline_compare; + VGADisplayParams vga_display_params; d->vga.get_resolution(&d->vga, (int*)&width, (int*)&height); - d->vga.get_offsets(&d->vga, &pline_offset, &pstart_addr, &pline_compare); - int line_offset = pline_offset ? surface->pitch / pline_offset : 1; + d->vga.get_params(&d->vga, &vga_display_params); + int line_offset = vga_display_params.line_offset ? surface->pitch / vga_display_params.line_offset : 1; /* Adjust viewport height for interlaced mode, used only in 1080i */ if (d->vga.cr[NV_PRMCIO_INTERLACE_MODE] != NV_PRMCIO_INTERLACE_MODE_DISABLED) { @@ -376,9 +378,10 @@ static void gl_fence(void) void pgraph_gl_sync(NV2AState *d) { - uint32_t pline_offset, pstart_addr, pline_compare; - d->vga.get_offsets(&d->vga, &pline_offset, &pstart_addr, &pline_compare); - SurfaceBinding *surface = pgraph_gl_surface_get_within(d, d->pcrtc.start + pline_offset); + VGADisplayParams vga_display_params; + d->vga.get_params(&d->vga, &vga_display_params); + + SurfaceBinding *surface = pgraph_gl_surface_get_within(d, d->pcrtc.start + vga_display_params.line_offset); if (surface == NULL) { qemu_event_set(&d->pgraph.sync_complete); return; @@ -411,9 +414,12 @@ int pgraph_gl_get_framebuffer_surface(NV2AState *d) qemu_mutex_lock(&d->pfifo.lock); // FIXME: Possible race condition with pgraph, consider lock - uint32_t pline_offset, pstart_addr, pline_compare; - d->vga.get_offsets(&d->vga, &pline_offset, &pstart_addr, &pline_compare); - SurfaceBinding *surface = pgraph_gl_surface_get_within(d, d->pcrtc.start + pline_offset); + + VGADisplayParams vga_display_params; + d->vga.get_params(&d->vga, &vga_display_params); + + SurfaceBinding *surface = pgraph_gl_surface_get_within( + d, d->pcrtc.start + vga_display_params.line_offset); if (surface == NULL || !surface->color) { qemu_mutex_unlock(&d->pfifo.lock); return 0; diff --git a/hw/xbox/nv2a/pgraph/vk/display.c b/hw/xbox/nv2a/pgraph/vk/display.c index 4298214898..91ccf44329 100644 --- a/hw/xbox/nv2a/pgraph/vk/display.c +++ b/hw/xbox/nv2a/pgraph/vk/display.c @@ -870,9 +870,11 @@ static void update_uniforms(PGRAPHState *pg, SurfaceBinding *surface) int display_size_loc = uniform_index(l, "display_size"); // FIXME: Cache uniform2f(l, display_size_loc, r->display.width, r->display.height); - uint32_t pline_offset, pstart_addr, pline_compare; - d->vga.get_offsets(&d->vga, &pline_offset, &pstart_addr, &pline_compare); - int line_offset = pline_offset ? surface->pitch / pline_offset : 1; + VGADisplayParams vga_display_params; + d->vga.get_params(&d->vga, &vga_display_params); + int line_offset = vga_display_params.line_offset ? + surface->pitch / vga_display_params.line_offset : + 1; int line_offset_loc = uniform_index(l, "line_offset"); uniform1f(l, line_offset_loc, line_offset); @@ -1065,11 +1067,11 @@ void pgraph_vk_render_display(PGRAPHState *pg) NV2AState *d = container_of(pg, NV2AState, pgraph); PGRAPHVkState *r = pg->vk_renderer_state; - uint32_t pline_offset, pstart_addr, pline_compare; - d->vga.get_offsets(&d->vga, &pline_offset, &pstart_addr, &pline_compare); + VGADisplayParams vga_display_params; + d->vga.get_params(&d->vga, &vga_display_params); - SurfaceBinding *surface = - pgraph_vk_surface_get_within(d, d->pcrtc.start + pline_offset); + SurfaceBinding *surface = pgraph_vk_surface_get_within( + d, d->pcrtc.start + vga_display_params.line_offset); if (surface == NULL || !surface->color) { return; } diff --git a/hw/xbox/nv2a/pgraph/vk/renderer.c b/hw/xbox/nv2a/pgraph/vk/renderer.c index 272b5f6ae5..92204cd393 100644 --- a/hw/xbox/nv2a/pgraph/vk/renderer.c +++ b/hw/xbox/nv2a/pgraph/vk/renderer.c @@ -173,10 +173,12 @@ static int pgraph_vk_get_framebuffer_surface(NV2AState *d) PGRAPHVkState *r = pg->vk_renderer_state; qemu_mutex_lock(&d->pfifo.lock); - // FIXME: Possible race condition with pgraph, consider lock - uint32_t pline_offset, pstart_addr, pline_compare; - d->vga.get_offsets(&d->vga, &pline_offset, &pstart_addr, &pline_compare); - SurfaceBinding *surface = pgraph_vk_surface_get_within(d, d->pcrtc.start + pline_offset); + + VGADisplayParams vga_display_params; + d->vga.get_params(&d->vga, &vga_display_params); + + SurfaceBinding *surface = pgraph_vk_surface_get_within( + d, d->pcrtc.start + vga_display_params.line_offset); if (surface == NULL || !surface->color) { qemu_mutex_unlock(&d->pfifo.lock); return 0;