From 493020ca51a3012bd5d183febb279384a797c011 Mon Sep 17 00:00:00 2001 From: starfrost013 Date: Sun, 23 Mar 2025 01:24:42 +0000 Subject: [PATCH] NV_IMAGE_FROM_CPU implemented, leading to the mouse cursor being drawn, and the windows start menu --- doc/nvidia_notes/status.xlsx | Bin 0 -> 15227 bytes .../86box/nv/classes/vid_nv3_classes.h | 10 +- src/include/86box/nv/vid_nv3.h | 3 +- .../nv/nv3/classes/nv3_class_007_rectangle.c | 2 +- .../nv/nv3/classes/nv3_class_011_image.c | 99 +++++++++++++++++- 5 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 doc/nvidia_notes/status.xlsx diff --git a/doc/nvidia_notes/status.xlsx b/doc/nvidia_notes/status.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a301eba64e4f3c03a76698c87a828d2365c86b89 GIT binary patch literal 15227 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 Q{|Fhd4x(Qu`_H}q2j$D`YybcN literal 0 HcmV?d00001 diff --git a/src/include/86box/nv/classes/vid_nv3_classes.h b/src/include/86box/nv/classes/vid_nv3_classes.h index 96df80eb1..80e2c1437 100644 --- a/src/include/86box/nv/classes/vid_nv3_classes.h +++ b/src/include/86box/nv/classes/vid_nv3_classes.h @@ -92,7 +92,15 @@ typedef enum nv3_pgraph_class_e #define NV3_RECTANGLE_START 0x0400 #define NV3_RECTANGLE_MAX 16 -#define NV3_RECTNAGLE_END 0x0480 +#define NV3_RECTANGLE_END 0x0480 + +// image_from_cpu +#define NV3_IMAGE_START_POSITION 0x0304 // starting position of image from cpu +#define NV3_IMAGE_SIZE 0x0308 +#define NV3_IMAGE_SIZE_IN 0x030C +#define NV3_IMAGE_COLOR_START 0x0400 +#define NV3_IMAGE_COLOR_MAX 32 +#define NV3_IMAGE_COLOR_END 0x0480 #define NV3_IMAGE_IN_MEMORY_COLOR_FORMAT 0x0300 #define NV3_IMAGE_IN_MEMORY_IN_MEMORY_DMA_CTX_TYPE 0x0304 diff --git a/src/include/86box/nv/vid_nv3.h b/src/include/86box/nv/vid_nv3.h index 640a0c951..29b2f70b9 100644 --- a/src/include/86box/nv/vid_nv3.h +++ b/src/include/86box/nv/vid_nv3.h @@ -14,7 +14,7 @@ * Also check the doc folder for some more notres * * vid_nv3.h: NV3 Architecture Hardware Reference (open-source) - * Last updated: 20 March 2025 (STILL WORKING ON IT!!!) + * Last updated: 22 March 2025 (STILL WORKING ON IT!!!) * * Authors: Connor Hyde * @@ -1227,6 +1227,7 @@ typedef struct nv3_pgraph_s struct nv3_object_class_00E scaled_image_from_memory; struct nv3_object_class_010 blit; struct nv3_object_class_011 image; + nv3_position_16_t image_current_position; /* This is here so we can hold the current state of the image */ struct nv3_object_class_012 bitmap; struct nv3_object_class_014 transfer2memory; struct nv3_object_class_015 stretched_image_from_cpu; diff --git a/src/video/nv/nv3/classes/nv3_class_007_rectangle.c b/src/video/nv/nv3/classes/nv3_class_007_rectangle.c index a92a1f761..8f304fdac 100644 --- a/src/video/nv/nv3/classes/nv3_class_007_rectangle.c +++ b/src/video/nv/nv3/classes/nv3_class_007_rectangle.c @@ -37,7 +37,7 @@ void nv3_class_007_method(uint32_t param, uint32_t method_id, nv3_ramin_context_ break; default: /* Check for any rectangle point or size method. */ - if (method_id >= NV3_RECTANGLE_START && method_id <= NV3_RECTNAGLE_END) + if (method_id >= NV3_RECTANGLE_START && method_id <= NV3_RECTANGLE_END) { uint32_t index = (method_id - NV3_RECTANGLE_START) / 8; diff --git a/src/video/nv/nv3/classes/nv3_class_011_image.c b/src/video/nv/nv3/classes/nv3_class_011_image.c index b40b9025c..9b4446cff 100644 --- a/src/video/nv/nv3/classes/nv3_class_011_image.c +++ b/src/video/nv/nv3/classes/nv3_class_011_image.c @@ -28,13 +28,108 @@ #include <86box/nv/vid_nv.h> #include <86box/nv/vid_nv3.h> +/* Check the line bounds */ +void nv3_class_011_check_line_bounds() +{ + uint32_t relative_x = nv3->pgraph.image_current_position.x - nv3->pgraph.image.point.x; + //uint32_t relative_y = nv3->pgraph.image_current_position.y - nv3->pgraph.image.point.y; + + /* In theory, relative_y should never be exceeded...because it only submits enough pixels to render the image*/ + if (relative_x >= nv3->pgraph.image.size_in.w) + { + nv3->pgraph.image_current_position.y++; + nv3->pgraph.image_current_position.x = nv3->pgraph.image.point.x; + } +} + void nv3_class_011_method(uint32_t param, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { switch (method_id) { + case NV3_IMAGE_START_POSITION: + nv3->pgraph.image.point.x = (param & 0xFFFF); + nv3->pgraph.image.point.y = (param >> 16); + nv_log("Image Point=%d,%d", nv3->pgraph.image.point.x, nv3->pgraph.image.point.y); + break; + /* Seems to allow scaling of the bitblt. */ + case NV3_IMAGE_SIZE: + nv3->pgraph.image.size.w = (param & 0xFFFF); + nv3->pgraph.image.size.h = (param >> 16); + break; + case NV3_IMAGE_SIZE_IN: + nv3->pgraph.image.size_in.w = (param & 0xFFFF); + nv3->pgraph.image.size_in.h = (param >> 16); + nv3->pgraph.image_current_position = nv3->pgraph.image.point; + break; default: - nv_log("%s: Invalid or Unimplemented method 0x%04x", nv3_class_names[context.class_id & 0x1F], method_id); - nv3_pgraph_interrupt_invalid(NV3_PGRAPH_INTR_1_SOFTWARE_METHOD_PENDING); + if (method_id >= NV3_IMAGE_COLOR_START && method_id <= NV3_IMAGE_COLOR_END) + { + // shift left by 2 because it's 4 bits per si\e.. + uint32_t pixel_slot = (method_id - NV3_IMAGE_COLOR_START) >> 2; + uint32_t current_buffer = (nv3->pgraph.context_switch >> NV3_PGRAPH_CONTEXT_SWITCH_SRC_BUFFER) & 0x03; + + /* todo: a lot of stuff */ + + uint32_t pixel0 = 0, pixel1 = 0, pixel2 = 0, pixel3 = 0; + + /* we need to unpack them - IF THIS IS USED SOMEWHERE ELSE, DO SOMETHING ELSE WITH IT */ + /* the reverse order is due to the endianness */ + switch (nv3->nvbase.svga.bpp) + { + // 4pixels packed into one + case 8: + + //pixel3 + pixel3 = param & 0xFF; + nv3_render_pixel(nv3->pgraph.image_current_position, pixel3, grobj); + nv3->pgraph.image_current_position.x++; + nv3_class_011_check_line_bounds(); + + pixel2 = (param >> 8) & 0xFF; + nv3_render_pixel(nv3->pgraph.image_current_position, pixel2, grobj); + nv3->pgraph.image_current_position.x++; + nv3_class_011_check_line_bounds(); + + pixel1 = (param >> 16) & 0xFF; + nv3_render_pixel(nv3->pgraph.image_current_position, pixel1, grobj); + nv3->pgraph.image_current_position.x++; + nv3_class_011_check_line_bounds(); + + pixel0 = (param >> 24) & 0xFF; + nv3_render_pixel(nv3->pgraph.image_current_position, pixel0, grobj); + nv3->pgraph.image_current_position.x++; + nv3_class_011_check_line_bounds(); + + break; + //2pixels packed into 1 + case 16: + pixel1 = (param) & 0xFFFF; + nv3_render_pixel(nv3->pgraph.image_current_position, pixel1, grobj); + nv3->pgraph.image_current_position.x++; + nv3_class_011_check_line_bounds(); + + pixel0 = (param >> 16) & 0xFFFF; + nv3_render_pixel(nv3->pgraph.image_current_position, pixel0, grobj); + nv3->pgraph.image_current_position.x++; + nv3_class_011_check_line_bounds(); + + break; + // just one + case 32: + pixel0 = param; + nv3_render_pixel(nv3->pgraph.image_current_position, pixel0, grobj); + nv3->pgraph.image_current_position.x++; + nv3_class_011_check_line_bounds(); + + break; + } + } + else + { + nv_log("%s: Invalid or Unimplemented method 0x%04x", nv3_class_names[context.class_id & 0x1F], method_id); + nv3_pgraph_interrupt_invalid(NV3_PGRAPH_INTR_1_SOFTWARE_METHOD_PENDING); + + } return; } } \ No newline at end of file