From 4d8a9d2892546ebfd7f088f3d73750cceff6e823 Mon Sep 17 00:00:00 2001 From: starfrost013 Date: Wed, 12 Mar 2025 16:35:35 +0000 Subject: [PATCH] Send pgraph writes to the right classes. Implement grobj reading. Fix class execution functions --- .../86box/nv/classes/vid_nv3_classes.h | 73 ++++++++++----- src/include/86box/nv/vid_nv3.h | 3 +- .../nv3/classes/nv3_class_001_beta_factor.c | 2 +- src/video/nv/nv3/classes/nv3_class_002_rop.c | 2 +- .../nv/nv3/classes/nv3_class_003_chroma_key.c | 2 +- .../nv/nv3/classes/nv3_class_004_plane_mask.c | 2 +- .../nv3_class_005_clipping_rectangle.c | 2 +- .../nv/nv3/classes/nv3_class_006_pattern.c | 2 +- .../nv/nv3/classes/nv3_class_007_rectangle.c | 2 +- .../nv/nv3/classes/nv3_class_008_point.c | 2 +- src/video/nv/nv3/classes/nv3_class_009_line.c | 2 +- src/video/nv/nv3/classes/nv3_class_00a_lin.c | 2 +- .../nv/nv3/classes/nv3_class_00b_triangle.c | 2 +- .../classes/nv3_class_00c_win95_gdi_text.c | 2 +- src/video/nv/nv3/classes/nv3_class_00d_m2mf.c | 2 +- .../nv3_class_00e_scaled_image_from_mem.c | 2 +- src/video/nv/nv3/classes/nv3_class_010_blit.c | 2 +- .../nv/nv3/classes/nv3_class_011_image.c | 2 +- .../nv/nv3/classes/nv3_class_012_bitmap.c | 2 +- .../classes/nv3_class_014_transfer2memory.c | 2 +- .../nv3_class_015_stretched_image_from_cpu.c | 2 +- .../nv3_class_017_d3d5_tri_zeta_buffer.c | 2 +- .../classes/nv3_class_018_point_zeta_buffer.c | 2 +- .../classes/nv3_class_01c_image_in_memory.c | 2 +- .../nv/nv3/classes/nv3_class_shared_methods.c | 2 +- src/video/nv/nv3/subsystems/nv3_pfifo.c | 16 ++-- src/video/nv/nv3/subsystems/nv3_pgraph.c | 88 ++++++++++++++++++- src/video/nv/nv3/subsystems/nv3_pramin.c | 2 +- .../nv/nv3/subsystems/nv3_pramin_ramfc.c | 4 +- .../nv/nv3/subsystems/nv3_pramin_ramht.c | 4 +- .../nv/nv3/subsystems/nv3_pramin_ramro.c | 4 +- 31 files changed, 178 insertions(+), 62 deletions(-) diff --git a/src/include/86box/nv/classes/vid_nv3_classes.h b/src/include/86box/nv/classes/vid_nv3_classes.h index 019b04ea4..0a5225226 100644 --- a/src/include/86box/nv/classes/vid_nv3_classes.h +++ b/src/include/86box/nv/classes/vid_nv3_classes.h @@ -41,6 +41,33 @@ // CLass names for debugging extern const char* nv3_class_names[]; +/* Defines valid classes. */ +typedef enum nv3_pgraph_class_e +{ + nv3_pgraph_class01_beta_factor = 0x01, + nv3_pgraph_class02_rop = 0x02, + nv3_pgraph_class03_chroma_key = 0x03, + nv3_pgraph_class04_plane_mask = 0x04, + nv3_pgraph_class05_clipping_rectangle = 0x05, + nv3_pgraph_class06_pattern = 0x06, + nv3_pgraph_class07_rectangle = 0x07, + nv3_pgraph_class08_point = 0x08, + nv3_pgraph_class09_line = 0x09, + nv3_pgraph_class0a_lin = 0x0a, + nv3_pgraph_class0b_triangle = 0x0b, + nv3_pgraph_class0c_w95txt = 0x0c, + nv3_pgraph_class0d_m2mf = 0x0d, + nv3_pgraph_class0e_scaled_image_from_memory = 0x0e, + nv3_pgraph_class10_blit = 0x10, + nv3_pgraph_class11_image = 0x11, + nv3_pgraph_class12_bitmap = 0x12, + nv3_pgraph_class14_transfer2memory = 0x14, + nv3_pgraph_class15_stretched_image_from_cpu = 0x15, + nv3_pgraph_class17_d3d5tri_zeta_buffer = 0x17, + nv3_pgraph_class18_point_zeta_buffer = 0x18, + nv3_pgraph_class1c_image_in_memory = 0x1c, +} nv3_pgraph_class; + /* Class context switch method */ typedef struct nv3_class_ctx_switch_method_s { @@ -1116,29 +1143,29 @@ typedef struct nv3_grobj_s #define NV3_SUBCHANNEL_PIO_ALWAYS_ZERO_END 0x0017 // Class methods -void nv3_generic_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_001_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_002_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_003_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_004_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_005_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_006_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_007_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_008_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_009_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_00a_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_00b_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_00c_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_00d_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_00e_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_010_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_011_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_012_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_014_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_015_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_017_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_018_method(uint32_t method_id, nv3_grobj_t grobj); -void nv3_class_01c_method(uint32_t method_id, nv3_grobj_t grobj); +void nv3_generic_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_001_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_002_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_003_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_004_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_005_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_006_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_007_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_008_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_009_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_00a_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_00b_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_00c_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_00d_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_00e_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_010_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_011_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_012_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_014_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_015_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_017_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_018_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); +void nv3_class_01c_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj); // This area is used for holding universal representations of the U* registers... extern struct nv3_object_class_001 nv3_beta_factor; diff --git a/src/include/86box/nv/vid_nv3.h b/src/include/86box/nv/vid_nv3.h index 852c368b5..07c30a9ac 100644 --- a/src/include/86box/nv/vid_nv3.h +++ b/src/include/86box/nv/vid_nv3.h @@ -1086,6 +1086,7 @@ typedef struct nv3_pgraph_status_s } nv3_pgraph_status_t; + // Graphics Subsystem typedef struct nv3_pgraph_s { @@ -1454,7 +1455,7 @@ void nv3_pgraph_init(); uint32_t nv3_pgraph_read(uint32_t address); void nv3_pgraph_write(uint32_t address, uint32_t value); void nv3_pgraph_vblank_start(svga_t* svga); -void nv3_pgraph_submit(uint8_t name, uint16_t method, uint8_t channel, uint8_t subchannel, uint8_t class_id, uint32_t context); +void nv3_pgraph_submit(uint32_t name, uint16_t method, uint8_t channel, uint8_t subchannel, uint8_t class_id, nv3_ramin_context_t context); // NV3 PFIFO diff --git a/src/video/nv/nv3/classes/nv3_class_001_beta_factor.c b/src/video/nv/nv3/classes/nv3_class_001_beta_factor.c index 7a700bf6e..2dc6a4022 100644 --- a/src/video/nv/nv3/classes/nv3_class_001_beta_factor.c +++ b/src/video/nv/nv3/classes/nv3_class_001_beta_factor.c @@ -31,7 +31,7 @@ struct nv3_object_class_001 beta_factor; -void nv3_class_001_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_001_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_002_rop.c b/src/video/nv/nv3/classes/nv3_class_002_rop.c index ac06ef010..f5a1c343e 100644 --- a/src/video/nv/nv3/classes/nv3_class_002_rop.c +++ b/src/video/nv/nv3/classes/nv3_class_002_rop.c @@ -31,7 +31,7 @@ struct nv3_object_class_002 nv3_rop; -void nv3_class_002_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_002_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_003_chroma_key.c b/src/video/nv/nv3/classes/nv3_class_003_chroma_key.c index 887e2a8bd..8b99fa808 100644 --- a/src/video/nv/nv3/classes/nv3_class_003_chroma_key.c +++ b/src/video/nv/nv3/classes/nv3_class_003_chroma_key.c @@ -31,7 +31,7 @@ struct nv3_object_class_003 nv3_chroma_key; -void nv3_class_003_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_003_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_004_plane_mask.c b/src/video/nv/nv3/classes/nv3_class_004_plane_mask.c index 95e5e70c4..e32eb6333 100644 --- a/src/video/nv/nv3/classes/nv3_class_004_plane_mask.c +++ b/src/video/nv/nv3/classes/nv3_class_004_plane_mask.c @@ -31,7 +31,7 @@ struct nv3_object_class_004 nv3_plane_mask; -void nv3_class_004_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_004_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_005_clipping_rectangle.c b/src/video/nv/nv3/classes/nv3_class_005_clipping_rectangle.c index 76ab1cfec..b5d4a5b80 100644 --- a/src/video/nv/nv3/classes/nv3_class_005_clipping_rectangle.c +++ b/src/video/nv/nv3/classes/nv3_class_005_clipping_rectangle.c @@ -30,7 +30,7 @@ struct nv3_object_class_005 nv3_clipping_rectangle; -void nv3_class_005_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_005_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_006_pattern.c b/src/video/nv/nv3/classes/nv3_class_006_pattern.c index 32561e977..8442bde0d 100644 --- a/src/video/nv/nv3/classes/nv3_class_006_pattern.c +++ b/src/video/nv/nv3/classes/nv3_class_006_pattern.c @@ -31,7 +31,7 @@ struct nv3_object_class_006 nv3_pattern; -void nv3_class_006_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_006_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file 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 2b194960b..9b0908b8d 100644 --- a/src/video/nv/nv3/classes/nv3_class_007_rectangle.c +++ b/src/video/nv/nv3/classes/nv3_class_007_rectangle.c @@ -31,7 +31,7 @@ struct nv3_object_class_007 nv3_rectangle; -void nv3_class_007_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_007_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_008_point.c b/src/video/nv/nv3/classes/nv3_class_008_point.c index eaa12f5c4..4ecfa6d87 100644 --- a/src/video/nv/nv3/classes/nv3_class_008_point.c +++ b/src/video/nv/nv3/classes/nv3_class_008_point.c @@ -31,7 +31,7 @@ struct nv3_object_class_008 nv3_point; -void nv3_class_008_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_008_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_009_line.c b/src/video/nv/nv3/classes/nv3_class_009_line.c index a17cf0f90..c8104cd9c 100644 --- a/src/video/nv/nv3/classes/nv3_class_009_line.c +++ b/src/video/nv/nv3/classes/nv3_class_009_line.c @@ -31,7 +31,7 @@ struct nv3_object_class_009 nv3_line; -void nv3_class_009_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_009_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_00a_lin.c b/src/video/nv/nv3/classes/nv3_class_00a_lin.c index 66d3d949b..8e83c2433 100644 --- a/src/video/nv/nv3/classes/nv3_class_00a_lin.c +++ b/src/video/nv/nv3/classes/nv3_class_00a_lin.c @@ -32,7 +32,7 @@ struct nv3_object_class_00A nv3_lin; -void nv3_class_00a_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_00a_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_00b_triangle.c b/src/video/nv/nv3/classes/nv3_class_00b_triangle.c index f1d41a816..766597af1 100644 --- a/src/video/nv/nv3/classes/nv3_class_00b_triangle.c +++ b/src/video/nv/nv3/classes/nv3_class_00b_triangle.c @@ -31,7 +31,7 @@ struct nv3_object_class_00B nv3_triangle; -void nv3_class_00b_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_00b_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_00c_win95_gdi_text.c b/src/video/nv/nv3/classes/nv3_class_00c_win95_gdi_text.c index d8dbc4513..cceece8b7 100644 --- a/src/video/nv/nv3/classes/nv3_class_00c_win95_gdi_text.c +++ b/src/video/nv/nv3/classes/nv3_class_00c_win95_gdi_text.c @@ -31,7 +31,7 @@ struct nv3_object_class_00C nv3_win95_gdi_text; -void nv3_class_00c_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_00c_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_00d_m2mf.c b/src/video/nv/nv3/classes/nv3_class_00d_m2mf.c index 4f51f187a..6e2569cd9 100644 --- a/src/video/nv/nv3/classes/nv3_class_00d_m2mf.c +++ b/src/video/nv/nv3/classes/nv3_class_00d_m2mf.c @@ -31,7 +31,7 @@ struct nv3_object_class_00D nv3_m2mf; -void nv3_class_00d_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_00d_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_00e_scaled_image_from_mem.c b/src/video/nv/nv3/classes/nv3_class_00e_scaled_image_from_mem.c index 165c1e9d3..e5cbb9634 100644 --- a/src/video/nv/nv3/classes/nv3_class_00e_scaled_image_from_mem.c +++ b/src/video/nv/nv3/classes/nv3_class_00e_scaled_image_from_mem.c @@ -31,7 +31,7 @@ struct nv3_object_class_00E nv3_scaled_image_from_mem; -void nv3_class_00e_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_00e_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_010_blit.c b/src/video/nv/nv3/classes/nv3_class_010_blit.c index f32309343..7c1e9626f 100644 --- a/src/video/nv/nv3/classes/nv3_class_010_blit.c +++ b/src/video/nv/nv3/classes/nv3_class_010_blit.c @@ -31,7 +31,7 @@ struct nv3_object_class_010 nv3_blit; -void nv3_class_010_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_010_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file 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 e42ea8071..d7a2a7987 100644 --- a/src/video/nv/nv3/classes/nv3_class_011_image.c +++ b/src/video/nv/nv3/classes/nv3_class_011_image.c @@ -31,7 +31,7 @@ struct nv3_object_class_011 nv3_image; -void nv3_class_011_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_011_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_012_bitmap.c b/src/video/nv/nv3/classes/nv3_class_012_bitmap.c index a0ff8d537..63a5f8e1d 100644 --- a/src/video/nv/nv3/classes/nv3_class_012_bitmap.c +++ b/src/video/nv/nv3/classes/nv3_class_012_bitmap.c @@ -32,7 +32,7 @@ struct nv3_object_class_012 nv3_bitmap; -void nv3_class_012_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_012_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_014_transfer2memory.c b/src/video/nv/nv3/classes/nv3_class_014_transfer2memory.c index bc4e3f879..197235c75 100644 --- a/src/video/nv/nv3/classes/nv3_class_014_transfer2memory.c +++ b/src/video/nv/nv3/classes/nv3_class_014_transfer2memory.c @@ -32,7 +32,7 @@ struct nv3_object_class_014 nv3_transfer2memory; -void nv3_class_014_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_014_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_015_stretched_image_from_cpu.c b/src/video/nv/nv3/classes/nv3_class_015_stretched_image_from_cpu.c index 1954724d1..1ab61faed 100644 --- a/src/video/nv/nv3/classes/nv3_class_015_stretched_image_from_cpu.c +++ b/src/video/nv/nv3/classes/nv3_class_015_stretched_image_from_cpu.c @@ -31,7 +31,7 @@ struct nv3_object_class_015 nv3_stretched_image_from_cpu; -void nv3_class_015_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_015_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_017_d3d5_tri_zeta_buffer.c b/src/video/nv/nv3/classes/nv3_class_017_d3d5_tri_zeta_buffer.c index 7c669a1e5..2bb2bfd77 100644 --- a/src/video/nv/nv3/classes/nv3_class_017_d3d5_tri_zeta_buffer.c +++ b/src/video/nv/nv3/classes/nv3_class_017_d3d5_tri_zeta_buffer.c @@ -31,7 +31,7 @@ struct nv3_object_class_017 nv3_d3d5_tri; -void nv3_class_017_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_017_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_018_point_zeta_buffer.c b/src/video/nv/nv3/classes/nv3_class_018_point_zeta_buffer.c index bbf29694f..68747c9ce 100644 --- a/src/video/nv/nv3/classes/nv3_class_018_point_zeta_buffer.c +++ b/src/video/nv/nv3/classes/nv3_class_018_point_zeta_buffer.c @@ -31,7 +31,7 @@ struct nv3_object_class_018 nv3_d3d5_point_zeta_buffer; -void nv3_class_018_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_018_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_01c_image_in_memory.c b/src/video/nv/nv3/classes/nv3_class_01c_image_in_memory.c index f40924deb..0efb6c8ce 100644 --- a/src/video/nv/nv3/classes/nv3_class_01c_image_in_memory.c +++ b/src/video/nv/nv3/classes/nv3_class_01c_image_in_memory.c @@ -31,7 +31,7 @@ struct nv3_object_class_01C nv3_image_in_memory; -void nv3_class_01c_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_class_01c_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } \ No newline at end of file diff --git a/src/video/nv/nv3/classes/nv3_class_shared_methods.c b/src/video/nv/nv3/classes/nv3_class_shared_methods.c index 39f7e2b81..eb0469823 100644 --- a/src/video/nv/nv3/classes/nv3_class_shared_methods.c +++ b/src/video/nv/nv3/classes/nv3_class_shared_methods.c @@ -29,7 +29,7 @@ #include <86box/nv/vid_nv3.h> #include <86box/nv/classes/vid_nv3_classes.h> -void nv3_generic_method(uint32_t method_id, nv3_grobj_t grobj) +void nv3_generic_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { } diff --git a/src/video/nv/nv3/subsystems/nv3_pfifo.c b/src/video/nv/nv3/subsystems/nv3_pfifo.c index b219ae535..31630dae2 100644 --- a/src/video/nv/nv3/subsystems/nv3_pfifo.c +++ b/src/video/nv/nv3/subsystems/nv3_pfifo.c @@ -709,9 +709,13 @@ void nv3_pfifo_cache0_pull() nv3->pfifo.cache0_settings.get_address ^= 0x04; #ifndef RELEASE_BUILD - nv_log("***** SUBMITTING GRAPHICS COMMANDS CURRENTLY UNIMPLEMENTED - CACHE0 PULLED ****** Contextual information below\n"); + nv_log("***** DEBUG: CACHE0 PULLED ****** Contextual information below\n"); - nv3_debug_ramin_print_context_info(current_name, *(nv3_ramin_context_t*)¤t_context); + nv3_ramin_context_t context_structure = *(nv3_ramin_context_t*)¤t_context; + + nv3_debug_ramin_print_context_info(current_name, context_structure); + + nv3_pgraph_submit(current_name, current_method, current_channel, current_subchannel, class_id & 0x1F, context_structure); #endif } @@ -876,9 +880,11 @@ void nv3_pfifo_cache1_pull() nv3->pfifo.cache1_settings.get_address = nv3_pfifo_cache1_normal2gray(next_get_address) << 2; #ifndef RELEASE_BUILD - nv_log("***** OBJECT PULLED, SUBMITTING GRAPHICS COMMANDS CURRENTLY UNIMPLEMENTED - ****** Contextual information below\n"); - - nv3_debug_ramin_print_context_info(current_name, *(nv3_ramin_context_t*)¤t_context); + nv3_ramin_context_t context_structure = *(nv3_ramin_context_t*)¤t_context; + + nv3_debug_ramin_print_context_info(current_name, context_structure); + + nv3_pgraph_submit(current_name, current_method, current_channel, current_subchannel, class_id & 0x1F, context_structure); #endif //Todo: finish it diff --git a/src/video/nv/nv3/subsystems/nv3_pgraph.c b/src/video/nv/nv3/subsystems/nv3_pgraph.c index 50089c410..ffbaa7f01 100644 --- a/src/video/nv/nv3/subsystems/nv3_pgraph.c +++ b/src/video/nv/nv3/subsystems/nv3_pgraph.c @@ -468,16 +468,98 @@ void nv3_pgraph_vblank_start(svga_t* svga) nv3_pgraph_interrupt_valid(NV3_PGRAPH_INTR_EN_0_VBLANK); } -void nv3_pgraph_arbitrate_method(uint8_t name, uint16_t method, uint8_t channel, uint8_t subchannel, uint8_t class_id, uint32_t context) +/* 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) { + /* Obtain the grobj information from the context in ramin */ + nv3_grobj_t grobj = {0}; + + grobj.grobj_0 = nv3_ramin_read32(context.ramin_offset, nv3); + grobj.grobj_1 = nv3_ramin_read32(context.ramin_offset + 4, nv3); + grobj.grobj_2 = nv3_ramin_read32(context.ramin_offset + 8, nv3); + grobj.grobj_3 = nv3_ramin_read32(context.ramin_offset + 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", + name, method, 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); + break; + case nv3_pgraph_class02_rop: + nv3_class_002_method(name, method, context, grobj); + break; + case nv3_pgraph_class03_chroma_key: + nv3_class_003_method(name, method, context, grobj); + break; + case nv3_pgraph_class04_plane_mask: + nv3_class_004_method(name, method, context, grobj); + break; + case nv3_pgraph_class05_clipping_rectangle: + nv3_class_005_method(name, method, context, grobj); + break; + case nv3_pgraph_class06_pattern: + nv3_class_006_method(name, method, context, grobj); + break; + case nv3_pgraph_class07_rectangle: + nv3_class_007_method(name, method, context, grobj); + break; + case nv3_pgraph_class08_point: + nv3_class_008_method(name, method, context, grobj); + break; + case nv3_pgraph_class09_line: + nv3_class_009_method(name, method, context, grobj); + break; + case nv3_pgraph_class0a_lin: + nv3_class_00a_method(name, method, context, grobj); + break; + case nv3_pgraph_class0b_triangle: + nv3_class_00b_method(name, method, context, grobj); + break; + case nv3_pgraph_class0c_w95txt: + nv3_class_00c_method(name, method, context, grobj); + break; + case nv3_pgraph_class0d_m2mf: + nv3_class_00d_method(name, method, context, grobj); + break; + case nv3_pgraph_class0e_scaled_image_from_memory: + nv3_class_00e_method(name, method, context, grobj); + break; + case nv3_pgraph_class10_blit: + nv3_class_010_method(name, method, context, grobj); + break; + case nv3_pgraph_class11_image: + nv3_class_011_method(name, method, context, grobj); + break; + case nv3_pgraph_class12_bitmap: + nv3_class_012_method(name, method, context, grobj); + break; + case nv3_pgraph_class14_transfer2memory: + nv3_class_014_method(name, method, context, grobj); + break; + case nv3_pgraph_class15_stretched_image_from_cpu: + nv3_class_015_method(name, method, context, grobj); + break; + case nv3_pgraph_class17_d3d5tri_zeta_buffer: + nv3_class_017_method(name, method, context, grobj); + break; + case nv3_pgraph_class18_point_zeta_buffer: + nv3_class_018_method(name, method, context, grobj); + break; + case nv3_pgraph_class1c_image_in_memory: + nv3_class_01c_method(name, 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]); + return; } } /* Arbitrates graphics object submission to the right object types */ -void nv3_pgraph_submit(uint8_t name, uint16_t method, uint8_t channel, uint8_t subchannel, uint8_t class_id, uint32_t context) +void nv3_pgraph_submit(uint32_t name, uint16_t method, uint8_t channel, uint8_t subchannel, uint8_t class_id, nv3_ramin_context_t context) { // class id can be derived from the context but we debug log it before we get here // Do we need to read grobj here? diff --git a/src/video/nv/nv3/subsystems/nv3_pramin.c b/src/video/nv/nv3/subsystems/nv3_pramin.c index a591f69b1..226f4d8ee 100644 --- a/src/video/nv/nv3/subsystems/nv3_pramin.c +++ b/src/video/nv/nv3/subsystems/nv3_pramin.c @@ -507,7 +507,7 @@ void nv3_debug_ramin_print_context_info(uint32_t name, nv3_ramin_context_t conte nv_log("Context:\n"); nv_log("DMA Channel %d (0-7 valid)\n", context.channel); - nv_log("Class ID: as repreesnted in ramin=%04x, Stupid 5 bit version (the actual id)=0x%04x (%s)\n", context.class_id, + nv_log("Class ID: as represented in ramin=%04x, Stupid 5 bit version (the actual id)=0x%04x (%s)\n", context.class_id, context.class_id & 0x1F, nv3_class_names[context.class_id & 0x1F]); nv_log("Render Engine %d (0=Software, also DMA? 1=Accelerated Renderer)\n", context.is_rendering); nv_log("PRAMIN Offset 0x%08x\n", context.ramin_offset << 4); diff --git a/src/video/nv/nv3/subsystems/nv3_pramin_ramfc.c b/src/video/nv/nv3/subsystems/nv3_pramin_ramfc.c index 9a21c2e4f..fa0d5899c 100644 --- a/src/video/nv/nv3/subsystems/nv3_pramin_ramfc.c +++ b/src/video/nv/nv3/subsystems/nv3_pramin_ramfc.c @@ -30,10 +30,10 @@ uint32_t nv3_ramfc_read(uint32_t address) { - nv_log("RAMFC (Unused DMA channel context) Read (0x%04x), UNIMPLEMENTED - RETURNING 0x00\n", address); + nv_log("RAMFC (Unused DMA channel context) Read (0x%04x)), I DON'T BELIEVE THIS SHOULD EVER HAPPEN - RETURNING 0x00\n", address); } void nv3_ramfc_write(uint32_t address, uint32_t value) { - nv_log("RAMFC (Unused DMA channel context) Write (0x%04x -> 0x%04x), UNIMPLEMENTED\n", value, address); + nv_log("RAMFC (Unused DMA channel context) Write (0x%04x -> 0x%04x)), I DON'T BELIEVE THIS SHOULD EVER HAPPEN\n", value, address); } \ No newline at end of file diff --git a/src/video/nv/nv3/subsystems/nv3_pramin_ramht.c b/src/video/nv/nv3/subsystems/nv3_pramin_ramht.c index e09f80e83..e46b46618 100644 --- a/src/video/nv/nv3/subsystems/nv3_pramin_ramht.c +++ b/src/video/nv/nv3/subsystems/nv3_pramin_ramht.c @@ -47,10 +47,10 @@ uint32_t nv3_ramht_hash(uint32_t name, uint32_t channel) uint32_t nv3_ramht_read(uint32_t address) { - nv_log("RAMHT (Graphics object storage hashtable) Read (0x%04x), UNIMPLEMENTED - RETURNING 0x00\n", address); + nv_log("RAMHT (Graphics object storage hashtable) Read (0x%04x), I DON'T BELIEVE THIS SHOULD EVER HAPPEN - RETURNING 0x00\n", address); } void nv3_ramht_write(uint32_t address, uint32_t value) { - nv_log("RAMHT (Graphics object storage hashtable) Write (0x%04x -> 0x%04x), UNIMPLEMENTED\n", value, address); + nv_log("RAMHT (Graphics object storage hashtable) Write (0x%04x -> 0x%04x), I DON'T BELIEVE THIS SHOULD EVER HAPPEN - UNIMPLEMENTED\n", value, address); } diff --git a/src/video/nv/nv3/subsystems/nv3_pramin_ramro.c b/src/video/nv/nv3/subsystems/nv3_pramin_ramro.c index 2104868c6..d421b28dd 100644 --- a/src/video/nv/nv3/subsystems/nv3_pramin_ramro.c +++ b/src/video/nv/nv3/subsystems/nv3_pramin_ramro.c @@ -30,12 +30,12 @@ uint32_t nv3_ramro_read(uint32_t address) { - nv_log("RAM Runout (invalid dma object submission) Read (0x%04x), UNIMPLEMENTED - RETURNING 0x00\n", address); + nv_log("RAM Runout (invalid dma object submission) Read (0x%04x), I DON'T BELIEVE THIS SHOULD EVER HAPPEN\n", address); } void nv3_ramro_write(uint32_t address, uint32_t value) { - nv_log("RAM Runout WRITE, OH CRAP!!!! (0x%04x -> 0x%04x), UNIMPLEMENTED\n (Todo: Read the entries...)\n", value, address); + nv_log("RAM Runout WRITE, OH CRAP!!!! (0x%04x -> 0x%04x), I DON'T BELIEVE THIS SHOULD EVER HAPPEN\n", value, address); } void nv3_ramro_send()