diff --git a/hw/xbox/nv2a/nv2a_regs.h b/hw/xbox/nv2a/nv2a_regs.h index 8e0110f2d1..05de51bbbe 100644 --- a/hw/xbox/nv2a/nv2a_regs.h +++ b/hw/xbox/nv2a/nv2a_regs.h @@ -619,6 +619,10 @@ #define NV_PCRTC_RASTER 0x00000808 +#define NV_PRMCIO_INTERLACE_MODE 0x00000039 +# define NV_PRMCIO_INTERLACE_MODE_DISABLED 0xff + + #define NV_PVIDEO_INTR 0x00000100 # define NV_PVIDEO_INTR_BUFFER_0 (1 << 0) # define NV_PVIDEO_INTR_BUFFER_1 (1 << 4) diff --git a/hw/xbox/nv2a/pgraph.c b/hw/xbox/nv2a/pgraph.c index 94de42a5fb..2c978acd12 100644 --- a/hw/xbox/nv2a/pgraph.c +++ b/hw/xbox/nv2a/pgraph.c @@ -4910,6 +4910,11 @@ static void pgraph_render_display(NV2AState *d, SurfaceBinding *surface) d->vga.get_offsets(&d->vga, &pline_offset, &pstart_addr, &pline_compare); int line_offset = surface->pitch / pline_offset; + /* Adjust viewport height for interlaced mode, used only in 1080i */ + if (d->vga.cr[NV_PRMCIO_INTERLACE_MODE] != NV_PRMCIO_INTERLACE_MODE_DISABLED) { + height *= 2; + } + pgraph_apply_scaling_factor(pg, &width, &height); glBindFramebuffer(GL_FRAMEBUFFER, d->pgraph.disp_rndr.fbo);