From aaaa4db881cb5e6ad7e909ce6f5aa612a1b4da2e Mon Sep 17 00:00:00 2001 From: starfrost013 Date: Sun, 18 May 2025 16:45:24 +0100 Subject: [PATCH] Fix various minor bugs; correctly use bpixel for rendering instead of svga->bpp. remove incorrect DBA check --- CMakePresets.json | 3 +- doc/nvidia_notes/NV128.xlsx | Bin 9708 -> 0 bytes src/include/86box/nv/render/vid_nv3_render.h | 2 +- src/qt/qt_gpudebug_vram.ui | 29 ++++++--- src/video/nv/nv3/nv3_core.c | 2 +- src/video/nv/nv3/render/nv3_render_blit.c | 13 ++-- src/video/nv/nv3/render/nv3_render_core.c | 59 ++++++++----------- src/video/nv/nv3/subsystems/nv3_pfb.c | 2 +- 8 files changed, 54 insertions(+), 56 deletions(-) delete mode 100644 doc/nvidia_notes/NV128.xlsx diff --git a/CMakePresets.json b/CMakePresets.json index b2ed64e97..30feab8ab 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -36,8 +36,7 @@ "name": "debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", - "NV_LOG": "ON", - "NV_LOG_ULTRA": "ON" + "NV_LOG": "ON" }, "inherits": "base" }, diff --git a/doc/nvidia_notes/NV128.xlsx b/doc/nvidia_notes/NV128.xlsx deleted file mode 100644 index fbf57c5eb136926abfc26b411f6aec0ae899a3fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9708 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Р3ChhSMhqF;CFdN*o>A3dOs_ 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 Tw+jHg0PlX_pshy!^V|OeRTkK? diff --git a/src/include/86box/nv/render/vid_nv3_render.h b/src/include/86box/nv/render/vid_nv3_render.h index f4850b8f7..c3e6182e5 100644 --- a/src/include/86box/nv/render/vid_nv3_render.h +++ b/src/include/86box/nv/render/vid_nv3_render.h @@ -18,7 +18,7 @@ #pragma once /* Core */ -void nv3_render_current_bpp(svga_t *svga, nv3_coord_16_t position, nv3_coord_16_t size, nv3_grobj_t grobj, bool run_render_check, bool use_destination_buffer); +void nv3_render_current_bpp(svga_t *svga, nv3_coord_16_t position, nv3_coord_16_t size, nv3_grobj_t grobj, bool use_destination_buffer); void nv3_render_current_bpp_dfb_8(uint32_t address); void nv3_render_current_bpp_dfb_16(uint32_t address); void nv3_render_current_bpp_dfb_32(uint32_t address); diff --git a/src/qt/qt_gpudebug_vram.ui b/src/qt/qt_gpudebug_vram.ui index be2bd4a20..12c64e3b4 100644 --- a/src/qt/qt_gpudebug_vram.ui +++ b/src/qt/qt_gpudebug_vram.ui @@ -32,13 +32,28 @@ VRAM Viewer - - - - VRAM Viewer - - + + + + VRAM + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop + + + + + + + TextLabel + + + Qt::AlignmentFlag::AlignBottom|Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft + + - + + + diff --git a/src/video/nv/nv3/nv3_core.c b/src/video/nv/nv3/nv3_core.c index d08768e3c..824d96405 100644 --- a/src/video/nv/nv3/nv3_core.c +++ b/src/video/nv/nv3/nv3_core.c @@ -963,7 +963,7 @@ void nv3_draw_cursor(svga_t* svga, int32_t drawline) nv3_grobj_t dummy = {0}; // need to clean it up /* do we need to update here? */ - nv3_render_current_bpp(&nv3->nvbase.svga, start_position, size, dummy, false, false); + nv3_render_current_bpp(&nv3->nvbase.svga, start_position, size, dummy, false); } // MMIO 0x110000->0x111FFF is mapped to a mirror of the VBIOS. diff --git a/src/video/nv/nv3/render/nv3_render_blit.c b/src/video/nv/nv3/render/nv3_render_blit.c index b7a45f9a8..da139b496 100644 --- a/src/video/nv/nv3/render/nv3_render_blit.c +++ b/src/video/nv/nv3/render/nv3_render_blit.c @@ -57,7 +57,7 @@ void nv3_render_blit_image(uint32_t color, nv3_grobj_t grobj) /* the reverse order is due to the endianness */ switch (nv3->nvbase.svga.bpp) { - // 4pixels packed into one color + // 4 pixels packed into one color in 8bpp case 8: //pixel3 @@ -82,7 +82,7 @@ void nv3_render_blit_image(uint32_t color, nv3_grobj_t grobj) nv3_class_011_check_line_bounds(); break; - //2pixels packed into one color + // 2 pixels packed into one color in 15/16bpp case 15: case 16: pixel1 = (color) & 0xFFFF; @@ -98,8 +98,7 @@ void nv3_render_blit_image(uint32_t color, nv3_grobj_t grobj) break; // just one pixel in 32bpp case 32: - pixel0 = color; - if (nv3->pgraph.image_current_position.x < clip_x) nv3_render_write_pixel(nv3->pgraph.image_current_position, pixel0, grobj); + if (nv3->pgraph.image_current_position.x < clip_x) nv3_render_write_pixel(nv3->pgraph.image_current_position, color, grobj); nv3->pgraph.image_current_position.x++; nv3_class_011_check_line_bounds(); @@ -183,8 +182,7 @@ void nv3_render_blit_screen2screen(nv3_grobj_t grobj) We also need to update all of the areas of the screen that moved. */ - nv3_coord_16_t blit_position = {0}; - nv3_coord_16_t blit_size = {0}; + nv3_coord_16_t blit_position = {0}, blit_size = {0}; /* Change the smallest area of the screen that moved */ @@ -223,7 +221,6 @@ void nv3_render_blit_screen2screen(nv3_grobj_t grobj) /* If the BUFFER_ADDRESS of the last buffer is not the DBA, we don't *actually* want to draw this, so let's not Apply stupid hack */ - - nv3_render_current_bpp(&nv3->nvbase.svga, blit_position, blit_size, grobj, false, true); + nv3_render_current_bpp(&nv3->nvbase.svga, blit_position, blit_size, grobj, true); } \ No newline at end of file diff --git a/src/video/nv/nv3/render/nv3_render_core.c b/src/video/nv/nv3/render/nv3_render_core.c index 42392a9ce..3491c8df3 100644 --- a/src/video/nv/nv3/render/nv3_render_core.c +++ b/src/video/nv/nv3/render/nv3_render_core.c @@ -81,10 +81,10 @@ nv3_color_expanded_t nv3_render_expand_color(uint32_t color, nv3_grobj_t grobj) break; case nv3_pgraph_pixel_format_r10g10b10: - color_final.a = (color << 31) & 0x01; - color_final.r = (color << 30) & 0x3FF; - color_final.g = (color << 20) & 0x1FF; - color_final.b = (color << 10); + color_final.a = (color >> 31) & 0x01; + color_final.r = (color >> 30) & 0x3FF; + color_final.g = (color >> 20) & 0x1FF; + color_final.b = (color >> 10); break; case nv3_pgraph_pixel_format_y8: @@ -138,7 +138,7 @@ uint32_t nv3_render_downconvert_color(nv3_grobj_t grobj, nv3_color_expanded_t co break; case nv3_pgraph_pixel_format_r10g10b10: /* sometimes alpha isn't used but we should incorporate it anyway */ - if (color.a > 0x00) packed_color | (1 << 31); + if (color.a > 0x00) packed_color |= (1 << 31); packed_color |= (color.r << 30); packed_color |= (color.g << 20); @@ -187,7 +187,7 @@ bool nv3_render_chroma_test(uint32_t color, nv3_grobj_t grobj) uint32_t nv3_render_to_chroma(nv3_color_expanded_t expanded) { // convert the alpha to 1 bit. then return packed rgb10 - return !!expanded.a | (expanded.r << 30) | (expanded.b << 20) | (expanded.a << 10); + return !!expanded.a | (expanded.r << 30) | (expanded.b << 20) | (expanded.b << 10); } /* Get a colour for a palette index. (The colours are 24 bit RGB888 with a 0xFF alpha added for some purposes.) */ @@ -360,6 +360,14 @@ void nv3_render_write_pixel(nv3_coord_16_t position, uint32_t color, nv3_grobj_t bool alpha_enabled = (grobj.grobj_0 >> NV3_PGRAPH_CONTEXT_SWITCH_ALPHA) & 0x01; + uint32_t dst_buffer = 0; // 5 = just use the source buffer + + if ((grobj.grobj_0 >> NV3_PGRAPH_CONTEXT_SWITCH_DST_BUFFER0_ENABLED) & 0x01) dst_buffer = 0; + if ((grobj.grobj_0 >> NV3_PGRAPH_CONTEXT_SWITCH_DST_BUFFER1_ENABLED) & 0x01) dst_buffer = 1; + if ((grobj.grobj_0 >> NV3_PGRAPH_CONTEXT_SWITCH_DST_BUFFER2_ENABLED) & 0x01) dst_buffer = 2; + if ((grobj.grobj_0 >> NV3_PGRAPH_CONTEXT_SWITCH_DST_BUFFER3_ENABLED) & 0x01) dst_buffer = 3; + + uint32_t framebuffer_bpp = nv3->nvbase.svga.bpp; // maybe y16 too?z int32_t clip_end_x = nv3->pgraph.clip_start.x + nv3->pgraph.clip_size.x; @@ -426,12 +434,14 @@ void nv3_render_write_pixel(nv3_coord_16_t position, uint32_t color, nv3_grobj_t It seems we can skip the downconversion step *for now*, since (framebuffer bits per pixel) == (object bits per pixel) I'm not sure how games will react. But it depends on how the D3D drivers operate, we may need ro convert texture formats to the current bpp internally. - TODO: MOVE TO BPIXEL DEPTH or GROBJ0 to determine this, once we figure out how to get the bpixel depth. + We use the pixel format of the destination buffer to achieve this (thanks frostbite2000) */ - switch (framebuffer_bpp) + uint32_t destination_format = (nv3->pgraph.bpixel[dst_buffer]) & 0x03; + + switch (destination_format) { - case 8: + case bpixel_fmt_8bit: rop_src = color & 0xFF; rop_dst = nv3->nvbase.svga.vram[pixel_addr_vram]; nv3->nvbase.svga.vram[pixel_addr_vram] = video_rop_gdi_ternary(nv3->pgraph.rop, rop_src, rop_dst, rop_pattern) & 0xFF; @@ -439,8 +449,7 @@ void nv3_render_write_pixel(nv3_coord_16_t position, uint32_t color, nv3_grobj_t nv3->nvbase.svga.changedvram[pixel_addr_vram >> 12] = changeframecount; break; - case 15: - case 16: + case bpixel_fmt_16bit: { uint16_t* vram_16 = (uint16_t*)(nv3->nvbase.svga.vram); pixel_addr_vram >>= 1; @@ -471,7 +480,7 @@ void nv3_render_write_pixel(nv3_coord_16_t position, uint32_t color, nv3_grobj_t break; } - case 32: + case bpixel_fmt_32bit: { uint32_t* vram_32 = (uint32_t*)(nv3->nvbase.svga.vram); pixel_addr_vram >>= 2; @@ -489,7 +498,7 @@ void nv3_render_write_pixel(nv3_coord_16_t position, uint32_t color, nv3_grobj_t /* Go write the pixel */ nv3_coord_16_t size = {0}; size.x = size.y = 1; - nv3_render_current_bpp(&nv3->nvbase.svga, position, size, grobj, true, false); + nv3_render_current_bpp(&nv3->nvbase.svga, position, size, grobj, false); } /* Ensure the correct monitor size */ @@ -602,35 +611,13 @@ void nv3_render_current_bpp_dfb_32(uint32_t address) /* Blit to the monitor from GPU, current bpp */ -void nv3_render_current_bpp(svga_t *svga, nv3_coord_16_t pos, nv3_coord_16_t size, nv3_grobj_t grobj, bool run_render_check, bool use_destination_buffer) +void nv3_render_current_bpp(svga_t *svga, nv3_coord_16_t pos, nv3_coord_16_t size, nv3_grobj_t grobj, bool use_destination_buffer) { /* Ensure that we are in the correct mode. Modified SVGA core code */ nv3_render_ensure_screen_size(); /* Don't try and draw stuff that is past the buffer, but, leave it in Video RAM, so it can be used for s2sb's etc */ - /* Not needed for s2sb*/ - if (run_render_check) - { - /* Figure out the Display Buffer Address from the CRTCs */ - uint32_t dba = ((nv3->nvbase.svga.crtc[NV3_CRTC_REGISTER_RPC0] & 0x1F) << 16) - + (nv3->nvbase.svga.crtc[NV3_CRTC_REGISTER_STARTADDR_HIGH] << 8) - + nv3->nvbase.svga.crtc[NV3_CRTC_REGISTER_STARTADDR_LOW]; - - /* Check our destination(?) buffer */ - uint32_t dst_buffer = 0; // 5 = just use the source buffer - - if ((grobj.grobj_0 >> NV3_PGRAPH_CONTEXT_SWITCH_DST_BUFFER0_ENABLED) & 0x01) dst_buffer = 0; - if ((grobj.grobj_0 >> NV3_PGRAPH_CONTEXT_SWITCH_DST_BUFFER1_ENABLED) & 0x01) dst_buffer = 1; - if ((grobj.grobj_0 >> NV3_PGRAPH_CONTEXT_SWITCH_DST_BUFFER2_ENABLED) & 0x01) dst_buffer = 2; - if ((grobj.grobj_0 >> NV3_PGRAPH_CONTEXT_SWITCH_DST_BUFFER3_ENABLED) & 0x01) dst_buffer = 3; - - /* If the BUFFER_ADDRESS of the last buffer is not the DBA, we don't *actually* want to draw this, so let's not */ - if (nv3->pgraph.boffset[dst_buffer] != dba) - return; - } - - switch (nv3->nvbase.svga.bpp) { case 4: diff --git a/src/video/nv/nv3/subsystems/nv3_pfb.c b/src/video/nv/nv3/subsystems/nv3_pfb.c index 3e6cd4271..7360a2c9a 100644 --- a/src/video/nv/nv3/subsystems/nv3_pfb.c +++ b/src/video/nv/nv3/subsystems/nv3_pfb.c @@ -39,7 +39,7 @@ nv_register_t pfb_registers[] = { { NV3_PFB_GREEN_0, "PFB Green / Power Saving", NULL, NULL,}, { NV3_PFB_CONFIG_0, "PFB Framebuffer Config 0", nv3_pfb_config0_read, nv3_pfb_config0_write }, { NV3_PFB_CONFIG_1, "PFB Framebuffer Config 1", NULL, NULL }, - { NV3_PFB_RTL, "PFB RTL (Part of memory timings?)", NULL, NULL }, + { NV3_PFB_RTL, "PFB RTL (Part of memory timings)", NULL, NULL }, { NV_REG_LIST_END, NULL, NULL, NULL}, // sentinel value };