From 18277c1bf949d73e1f6468bea855f3e64d6c6df6 Mon Sep 17 00:00:00 2001 From: starfrost013 Date: Thu, 13 Mar 2025 13:01:29 +0000 Subject: [PATCH] Move some defines around and add the rendering files. Add some basic things as to what we have to do next (These won't bein the final thing) --- doc/nvidia_notes/NV128.xlsx | Bin 0 -> 9325 bytes .../86box/nv/classes/vid_nv3_classes.h | 12 +++++ src/include/86box/nv/vid_nv3.h | 10 ---- src/video/CMakeLists.txt | 2 + src/video/nv/nv3/render/nv3_render.h | 19 +++++++ src/video/nv/nv3/render/nv3_render_core.c | 32 +++++++++++ src/video/nv/nv3/subsystems/nv3_pgraph.c | 50 +++++++++--------- 7 files changed, 90 insertions(+), 35 deletions(-) create mode 100644 doc/nvidia_notes/NV128.xlsx create mode 100644 src/video/nv/nv3/render/nv3_render.h create mode 100644 src/video/nv/nv3/render/nv3_render_core.c diff --git a/doc/nvidia_notes/NV128.xlsx b/doc/nvidia_notes/NV128.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e293a97ebdeea621058b4c580a4a72be07c06e12 GIT binary patch literal 9325 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 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 632f99342..c33927090 100644 --- a/src/include/86box/nv/classes/vid_nv3_classes.h +++ b/src/include/86box/nv/classes/vid_nv3_classes.h @@ -68,6 +68,18 @@ typedef enum nv3_pgraph_class_e nv3_pgraph_class1c_image_in_memory = 0x1c, } nv3_pgraph_class; +/* + OBJECT METHODS +*/ + +// Global stuff +#define NV3_ROOT_HI_IM_OBJECT_MCOBJECTYFACE 0x0 // I'm going insane at 00:48 14/02/2025 +#define NV3_SET_NOTIFY_CONTEXT_FOR_DMA 0x100 // Set object ctx for dma...see nv3_dma_context_t structure +#define NV3_SET_NOTIFY 0x104 + +#define NV3_IMAGE_IN_MEMORY_IN_MEMORY_DMA_CTX_TYPE 0x304 +#define NV3_W95TXT_COLORA 0x3FC // It's the colour of the text. This is used to submit a dummy object so the notifier can be used to sync in Win2000 DDraw6 drivers. + /* Class context switch method */ typedef struct nv3_class_ctx_switch_method_s { diff --git a/src/include/86box/nv/vid_nv3.h b/src/include/86box/nv/vid_nv3.h index 3c696bf92..6a316e928 100644 --- a/src/include/86box/nv/vid_nv3.h +++ b/src/include/86box/nv/vid_nv3.h @@ -627,16 +627,6 @@ extern const device_config_t nv3_config[]; #define NV3_PGRAPH_CLASS1C_MEM2IMAGE_START 0x5C0000 // class 55, 56, 62, 63? #define NV3_PGRAPH_CLASS1C_MEM2IMAGE_END 0x5C1FFF -/* - OBJECT METHODS -*/ - -// Global stuff -#define NV3_ROOT_HI_IM_OBJECT_MCOBJECTYFACE 0x0 // I'm going insane at 00:48 14/02/2025 -#define NV3_SET_NOTIFY_CONTEXT_FOR_DMA 0x100 // Set object ctx for dma...see nv3_dma_context_t structure -#define NV3_SET_NOTIFY 0x104 - -#define NV3_W95TXT_COLORA 0x3FC // It's the colour of the text. This is used to submit a dummy object so the notifier can be used to sync in Win2000 DDraw6 drivers. #define NV3_PGRAPH_REGISTER_END 0x401FFF // end of pgraph registers #define NV3_PGRAPH_REAL_END 0x5C1FFF diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index db6b8de2d..03d2b504a 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -124,6 +124,8 @@ add_library(vid OBJECT nv/nv3/classes/nv3_class_017_d3d5_tri_zeta_buffer.c nv/nv3/classes/nv3_class_018_point_zeta_buffer.c nv/nv3/classes/nv3_class_01c_image_in_memory.c + + nv/nv3/render/nv3_render_core.c ) diff --git a/src/video/nv/nv3/render/nv3_render.h b/src/video/nv/nv3/render/nv3_render.h new file mode 100644 index 000000000..98131680d --- /dev/null +++ b/src/video/nv/nv3/render/nv3_render.h @@ -0,0 +1,19 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * NV3 headers for rendering + * + * + * + * Authors: Connor Hyde, I need a better email address ;^) + * + * Copyright 2024-2025 Connor Hyde + */ + + #pragma once + diff --git a/src/video/nv/nv3/render/nv3_render_core.c b/src/video/nv/nv3/render/nv3_render_core.c new file mode 100644 index 000000000..a26d7ef15 --- /dev/null +++ b/src/video/nv/nv3/render/nv3_render_core.c @@ -0,0 +1,32 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * NV3 Core rendering code (Software version) + * + * + * + * Authors: Connor Hyde, I need a better email address ;^) + * + * Copyright 2024-2025 Connor Hyde + */ + + #include + #include + #include + #include + #include <86box/86box.h> + #include <86box/device.h> + #include <86box/mem.h> + #include <86box/pci.h> + #include <86box/rom.h> + #include <86box/video.h> + #include <86box/nv/vid_nv.h> + #include <86box/nv/vid_nv3.h> + #include <86box/nv/classes/vid_nv3_classes.h> + + \ No newline at end of file diff --git a/src/video/nv/nv3/subsystems/nv3_pgraph.c b/src/video/nv/nv3/subsystems/nv3_pgraph.c index 3cae7b872..35e5c8e0d 100644 --- a/src/video/nv/nv3/subsystems/nv3_pgraph.c +++ b/src/video/nv/nv3/subsystems/nv3_pgraph.c @@ -469,7 +469,7 @@ void nv3_pgraph_vblank_start(svga_t* svga) } /* Sends off method execution to the right class */ -void nv3_pgraph_arbitrate_method(uint32_t name, uint16_t method, uint8_t channel, uint8_t subchannel, uint8_t class_id, nv3_ramin_context_t context) +void nv3_pgraph_arbitrate_method(uint32_t param, uint16_t method, uint8_t channel, uint8_t subchannel, uint8_t class_id, nv3_ramin_context_t context) { /* Obtain the grobj information from the context in ramin */ nv3_grobj_t grobj = {0}; @@ -482,78 +482,78 @@ void nv3_pgraph_arbitrate_method(uint32_t name, uint16_t method, uint8_t channel grobj.grobj_2 = nv3_ramin_read32(real_ramin_base + 8, nv3); grobj.grobj_3 = nv3_ramin_read32(real_ramin_base + 12, nv3); - nv_log("**** About to execute method **** obj name=0x%08x, method=0x%04x, channel=%d.%d, class=%s, grobj=0x%08x 0x%08x 0x%08x 0x%08x\n", - name, method, channel, subchannel, nv3_class_names[class_id], grobj.grobj_0, grobj.grobj_1, grobj.grobj_2, grobj.grobj_3); + nv_log("**** About to execute method **** method=0x%04x param=0x%08x, channel=%d.%d, class=%s, grobj=0x%08x 0x%08x 0x%08x 0x%08x\n", + method, param, channel, subchannel, nv3_class_names[class_id], grobj.grobj_0, grobj.grobj_1, grobj.grobj_2, grobj.grobj_3); // By this point, we already ANDed the class ID to 0x1F. // Send the grobj, the context, the method and the name off to actually be acted upon. switch (class_id) { case nv3_pgraph_class01_beta_factor: - nv3_class_001_method(name, method, context, grobj); + nv3_class_001_method(param, method, context, grobj); break; case nv3_pgraph_class02_rop: - nv3_class_002_method(name, method, context, grobj); + nv3_class_002_method(param, method, context, grobj); break; case nv3_pgraph_class03_chroma_key: - nv3_class_003_method(name, method, context, grobj); + nv3_class_003_method(param, method, context, grobj); break; case nv3_pgraph_class04_plane_mask: - nv3_class_004_method(name, method, context, grobj); + nv3_class_004_method(param, method, context, grobj); break; case nv3_pgraph_class05_clipping_rectangle: - nv3_class_005_method(name, method, context, grobj); + nv3_class_005_method(param, method, context, grobj); break; case nv3_pgraph_class06_pattern: - nv3_class_006_method(name, method, context, grobj); + nv3_class_006_method(param, method, context, grobj); break; case nv3_pgraph_class07_rectangle: - nv3_class_007_method(name, method, context, grobj); + nv3_class_007_method(param, method, context, grobj); break; case nv3_pgraph_class08_point: - nv3_class_008_method(name, method, context, grobj); + nv3_class_008_method(param, method, context, grobj); break; case nv3_pgraph_class09_line: - nv3_class_009_method(name, method, context, grobj); + nv3_class_009_method(param, method, context, grobj); break; case nv3_pgraph_class0a_lin: - nv3_class_00a_method(name, method, context, grobj); + nv3_class_00a_method(param, method, context, grobj); break; case nv3_pgraph_class0b_triangle: - nv3_class_00b_method(name, method, context, grobj); + nv3_class_00b_method(param, method, context, grobj); break; case nv3_pgraph_class0c_w95txt: - nv3_class_00c_method(name, method, context, grobj); + nv3_class_00c_method(param, method, context, grobj); break; case nv3_pgraph_class0d_m2mf: - nv3_class_00d_method(name, method, context, grobj); + nv3_class_00d_method(param, method, context, grobj); break; case nv3_pgraph_class0e_scaled_image_from_memory: - nv3_class_00e_method(name, method, context, grobj); + nv3_class_00e_method(param, method, context, grobj); break; case nv3_pgraph_class10_blit: - nv3_class_010_method(name, method, context, grobj); + nv3_class_010_method(param, method, context, grobj); break; case nv3_pgraph_class11_image: - nv3_class_011_method(name, method, context, grobj); + nv3_class_011_method(param, method, context, grobj); break; case nv3_pgraph_class12_bitmap: - nv3_class_012_method(name, method, context, grobj); + nv3_class_012_method(param, method, context, grobj); break; case nv3_pgraph_class14_transfer2memory: - nv3_class_014_method(name, method, context, grobj); + nv3_class_014_method(param, method, context, grobj); break; case nv3_pgraph_class15_stretched_image_from_cpu: - nv3_class_015_method(name, method, context, grobj); + nv3_class_015_method(param, method, context, grobj); break; case nv3_pgraph_class17_d3d5tri_zeta_buffer: - nv3_class_017_method(name, method, context, grobj); + nv3_class_017_method(param, method, context, grobj); break; case nv3_pgraph_class18_point_zeta_buffer: - nv3_class_018_method(name, method, context, grobj); + nv3_class_018_method(param, method, context, grobj); break; case nv3_pgraph_class1c_image_in_memory: - nv3_class_01c_method(name, method, context, grobj); + nv3_class_01c_method(param, method, context, grobj); break; default: fatal("NV3 (nv3_pgraph_arbitrate_method): Attempted to execute method on invalid, or unimplemented, class ID %s", nv3_class_names[class_id]);