From a5b864c59c9fb2083c60c8757d67d0d47679ef12 Mon Sep 17 00:00:00 2001 From: starfrost013 Date: Thu, 20 Mar 2025 00:01:59 +0000 Subject: [PATCH] pull out the notifier object. --- doc/nvidia_notes/NV128.xlsx | Bin 9550 -> 9615 bytes src/include/86box/nv/vid_nv3.h | 23 +++++- .../nv3_class_017_d3d5_tri_zeta_buffer.c | 30 +++---- src/video/nv/nv3/classes/nv3_class_names.c | 2 +- .../nv/nv3/classes/nv3_class_shared_methods.c | 76 +++++++++++++++++- src/video/nv/nv3/nv3_core_arbiter.c | 3 +- src/video/nv/nv3/subsystems/nv3_pbus_dma.c | 7 +- src/video/nv/nv3/subsystems/nv3_pfb.c | 5 +- src/video/nv/nv3/subsystems/nv3_pgraph.c | 2 +- src/video/nv/nv3/subsystems/nv3_pramin.c | 6 +- 10 files changed, 124 insertions(+), 30 deletions(-) diff --git a/doc/nvidia_notes/NV128.xlsx b/doc/nvidia_notes/NV128.xlsx index 1cb14fdcc0d22153a3862cf106641e349aea72c8..919297d56816e5278deb74887f1c321198297f08 100644 GIT binary patch delta 2823 zcmYjTcQhM{7f$S5T00SYR4FA^6&0lwvu10n-NY)-=#a!}jh2eWY>iT+iWntUY0tZeyvvq~LsO4a7DP|C~7oq0^U5Xf_HHr4F3L&LZoT-B^Ld^VWOH;yEW`+{sSJmk-?KOJ zr@|_f&``5)tT}nG-oi)a=x1p;y&3uh*dmwtzi`Euv%Sa1rRT91#xa$*|u!Jg1 zNm#*d=Mz*A_<^L-WnMSyxv7gU#aWu7IT-PftK)3cmTyZs0PIs{!GRVV8 zCo+5Z1|1#mBFsi}u*hKyLe{}`e)yC+P1U|Uu$lGO-ftV_qGA>^S=#tzR>Oz{Pk%`x z%MAFI6I`0qsM`X2K%<@a{ZpoZ@xs1 zqPOgGZIi9VYdAI;%A;f>CG+k^4Sc;}=BLcvm&fV8iS?lMkrVq|b?JP`#B=i!LLF-5 zVUa$jsOTF<){_jjh?(-;4khj*1fj6n>~-wQV8ZgGMQIpqa3ZbC)ofikwH|7o#n5?S zWdRh5s>xh&#H@OEK00IRKiY}upe;oCH|r)HAP@*)rA0Gz61Hp z^Mu$tm#mn5yJU7FY{leARzBJt8MSxmofSqXgu_niCg{*q!YG{ZMwLS`4$9O}4yyaeTSBvgS(38!jB@M@V<2xrM?&LbmOsPP@C|R41pQY z>!l27!**MC$XNAi_hHPw27+)?=&h886nz_^M8<)%Cv-&&kOpA2Kb0e%1 zpCl@^N8}Ah>Bc7FV+hz&(R+nC@%@j&$!)Nn-@Ohu$m-AQ&dbNUZ7oIFPNs*Bb1sMU zYxovJ>(qgGZ9HRy-l`XO^g=B-f;dHgoitU6M^fr^bcW0vy-xx+z6LZY=aBJk+Iv2T zeE`T94XF(&Ir%zUjMYf^*0%kP-uRPbfU@@-^K0YWZ>~Npoh_q2cptaVX|m|1pRiEv zPds06XTR$QCtvir`Bvm-1Hgo$F6B9zUSBs99?D4C6X1(c1GK52w>b|v*zfbB-G#ft z=NMvt7S+y7cSP74F%@79740>zC{M%|;7|f|I{{hbP3RWfMTR~~>@a;xuA4+TY5g8I zex3&b`LQG!O{$wb{cv3%rNj!B+>47D2m-A>Hscf%cBN@N?@zZ?mi} zYLosXZ;LN`$o>PO{zdcke~+Kw=n&S>7RyK;0j^`5X;1Fr7EAF3F+%}xTZW- zYQB#A+*o}Dnw_Sw=V~{OHlffz)0l*Gl;ZrI{cw&u4#IObQ-op|0wx!wNNJ} z1_6pOt;(I3-VSkRB5_~Wh~xOwZ+O@$R}5X24`%t8+5S@I)X1t0#!h^|r3Pk)n0*7j zDx~$+VK$YIm{*mEtkO1#4MRC7KE>h9#)20I-1moq&MvZWjYLRf^~PT&PZdG1*m<>U zf=a@y7pD!5(>o4MH=^yTnXX>NXbu$mW0RFxYv{<-|Hv%xy2yJTktfcVM8+eiRn2 zDf_oc?M7~@))N;l?JzIuQoSC_zkHtQtgpyxM~zmf-?=^V0zYRD96(ht>0Vu%L5FI4 zc{6V!yN(6x1o9numU|G-eQr$iF+!Ltc}c;Sy_w-4v~X8MaF=gW+@?euEGJh*vuB(5ODxy~fXLHI|`3A;y2;#RB9d|Us5vnXgG#%Fp? zS5)MuE;xGGzbzJw2%1~TG@rgjb$(X$<7WObLwECi=G`hwXoGvZ_2QEA&K+ajKIlu- z-)_JXduGO|Ax%OFh_d*gE|@gOdSdda!95>m#Tm?QoqURqm0G;t=?$}TH#0u?$P z(sWVszU2_nbBHMC4)GPbA5SQE5|e4*U@dMDE}!;WBi?wZqg40gY`5|oDHGKjjRR_G zb{_UMyqCn?6T;;uyRg~i?L)&msqr(ia$kL zGn~8w)wa?^WEm!tZT_IIEL7EsJzH3&(mGXL{@UX`^2Ze#OhRl)ySE&w13 z_;1MZU=4W0vB$E?Oe6f*5q=@8p`0?%78@id1^WLvvH}2t|7`-i!j{P?{=GjeSxy+( Vid~U2WV$GYRgjlqJCON{`aj&>S?T}) delta 2785 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 I need a better email address ;^) - * - * Copyright 2024-2025 Connor Hyde - */ +* 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: Methods for class 0x17 (Direct3D 5.0 accelerated triangle with zeta buffer) +* +* +* +* Authors: Connor Hyde, I need a better email address ;^) +* +* Copyright 2024-2025 Connor Hyde +*/ #include #include diff --git a/src/video/nv/nv3/classes/nv3_class_names.c b/src/video/nv/nv3/classes/nv3_class_names.c index ded63ece2..64e35d9b3 100644 --- a/src/video/nv/nv3/classes/nv3_class_names.c +++ b/src/video/nv/nv3/classes/nv3_class_names.c @@ -64,4 +64,4 @@ const char* nv3_class_names[] = "NV3 INVALID class 0x1D", "NV3 INVALID class 0x1E", "NV3 INVALID class 0x1F", -}; +}; \ 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 663214cec..abeb0571b 100644 --- a/src/video/nv/nv3/classes/nv3_class_shared_methods.c +++ b/src/video/nv/nv3/classes/nv3_class_shared_methods.c @@ -21,6 +21,7 @@ #include #include <86box/86box.h> #include <86box/device.h> +#include <86box/dma.h> #include <86box/mem.h> #include <86box/pci.h> #include <86box/rom.h> @@ -39,7 +40,78 @@ void nv3_generic_method(uint32_t name, uint32_t method_id, nv3_ramin_context_t c } } -void nv3_notify_if_needed(nv3_grobj_t grobj) + +/* Sees if any notification is required after an object method is executed. If so, executes it... */ +void nv3_notify_if_needed(uint32_t name, uint32_t method_id, nv3_ramin_context_t context, nv3_grobj_t grobj) { + if (nv3->pgraph.notify_pending) + { + nv_log("Called nv3_notify_if_needed with nv3->pgraph.notify_pending already set. name=0x%08x, method=0x%04x, grobj=0x%08x 0x%08x 0x%08x 0x%08x\n"); + nv_log("IF THIS IS A DEBUG BUILD, YOU SHOULD SEE A CONTEXT BELOW"); + nv3_debug_ramin_print_context_info(name, context); + nv3_pgraph_interrupt_invalid(NV3_PGRAPH_INTR_1_DOUBLE_NOTIFY); + + // disable + nv3->pgraph.notify_pending = false; + return; + } + + // set up the NvNotification structure + nv3_notification_t notify = {0}; + notify.nanoseconds = nv3->ptimer.time; + notify.status = NV3_NOTIFICATION_STATUS_DONE_OK; // it should be fine to just signal that it's ok -} \ No newline at end of file + // this is completely speculative and i have no idea + notify.info32 = grobj.grobj_0; + + // notify object base=grobj_1 >> 12 + uint32_t notify_obj_base = grobj.grobj_1 >> 12; + + uint32_t notify_obj_info = nv3_ramin_read32(notify_obj_base, nv3); + uint32_t notify_obj_limit = nv3_ramin_read32(notify_obj_base + 0x04, nv3); + uint32_t notify_obj_page = nv3_ramin_read32(notify_obj_base + 0x08, nv3); + + /* extract some important information*/ + uint32_t info_adjust = notify_obj_info & 0xFFF; + bool info_pt_present = (notify_obj_info >> NV3_NOTIFICATION_PT_PRESENT) & 0x01; + uint8_t info_notification_target = (notify_obj_info >> NV3_NOTIFICATION_TARGET) & 0x03; + + /* paging information */ + bool page_is_present = notify_obj_page & 0x01; + bool page_is_readwrite = (notify_obj_page >> NV3_NOTIFICATION_PAGE_ACCESS); + uint32_t frame_value = (notify_obj_page >> NV3_NOTIFICATION_PAGE_FRAME_ADDRESS) & 0xFFFFF; + + // This code is temporary and will probably be moved somewhere else + // Print torns of debug info + #ifdef DEBUG + nv_log("******* WARNING: IF THIS OPERATION FUCKS UP, RANDOM MEMORY WILL BE CORRUPTED, YOUR ENTIRE SYSTEM MAY BE HOSED *******\n"); + + nv_log("Notification Information:\n"); + nv_log("Adjust Value: 0x%08x\n", info_adjust); + (info_pt_present) ? nv_log("Pagetable Present: True\n") : nv_log("Pagetable Present: False\n"); + + switch (info_notification_target) + { + case NV3_NOTIFICATION_TARGET_NVM: + nv_log("Notification Target: VRAM\n"); + break; + case NV3_NOTIFICATION_TARGET_CART: + nv_log("VERY BAD WARNING: Notification detected with Notification Target: Cartridge. THIS SHOULD NEVER HAPPEN!!!!!\n"); + break; + case NV3_NOTIFICATION_TARGET_PCI: + (nv3->nvbase.bus_generation == nv_bus_pci) ? nv_log("Notification Target: PCI Bus\n") : nv_log("Notification Target: PCI Bus (On AGP card???)\n"); + break; + case NV3_NOTIFICATION_TARGET_AGP: + (nv3->nvbase.bus_generation == nv_bus_agp_1x + || nv3->nvbase.bus_generation == nv_bus_agp_2x) ? nv_log("Notification Target: AGP Bus\n") : nv_log("Notification Target: AGP Bus (On PCI card???)\n"); + break; + } + + nv_log("Limit: 0x%08x", notify_obj_limit); + (page_is_present) ? nv_log("Page is present\n") : nv_log("Page is not present\n"); + (page_is_readwrite) ? nv_log("Page is read-write\n") : nv_log("Page is read-only\n"); + nv_log("Pageframe Address: 0x%08x", frame_value); + #endif + + // set up the dma transfer. we need to translate to a physical address. +} diff --git a/src/video/nv/nv3/nv3_core_arbiter.c b/src/video/nv/nv3/nv3_core_arbiter.c index 17cca15df..e5e7ced6b 100644 --- a/src/video/nv/nv3/nv3_core_arbiter.c +++ b/src/video/nv/nv3/nv3_core_arbiter.c @@ -194,5 +194,4 @@ uint32_t nv3_prmcio_read(uint32_t address) { return 0; }; void nv3_prmcio_write(uint32_t address, uint32_t value) {}; uint32_t nv3_vram_read(uint32_t address) { return 0; }; -void nv3_vram_write(uint32_t address, uint32_t value) {}; - +void nv3_vram_write(uint32_t address, uint32_t value) {}; \ No newline at end of file diff --git a/src/video/nv/nv3/subsystems/nv3_pbus_dma.c b/src/video/nv/nv3/subsystems/nv3_pbus_dma.c index d5d17fe2d..4ce686335 100644 --- a/src/video/nv/nv3/subsystems/nv3_pbus_dma.c +++ b/src/video/nv/nv3/subsystems/nv3_pbus_dma.c @@ -28,4 +28,9 @@ #include <86box/nv/vid_nv.h> #include <86box/nv/vid_nv3.h> -/* Nvidia DMA Engine */ \ No newline at end of file +/* Nvidia DMA Engine */ + +void nv3_dma_translate_address() +{ + +} \ No newline at end of file diff --git a/src/video/nv/nv3/subsystems/nv3_pfb.c b/src/video/nv/nv3/subsystems/nv3_pfb.c index 435225bc2..92a643502 100644 --- a/src/video/nv/nv3/subsystems/nv3_pfb.c +++ b/src/video/nv/nv3/subsystems/nv3_pfb.c @@ -168,13 +168,12 @@ void nv3_pfb_config0_write(uint32_t val) uint32_t new_pfb_htotal = (nv3->pfb.config_0 & 0x3F) << 5; // i don't think 16:9 is supported - uint32_t new_pfb_vtotal = new_pfb_htotal * (4.0/3.0); - + uint32_t new_pfb_vtotal = new_pfb_htotal * (4.0/3.0); uint32_t new_bit_depth = (nv3->pfb.config_0 >> 8) & 0x03; + nv_log("Framebuffer Config Change\n"); nv_log("Horizontal Size=%d pixels\n", new_pfb_htotal); nv_log("Vertical Size @ 4:3=%d pixels\n", new_pfb_vtotal); - if (new_bit_depth == NV3_PFB_CONFIG_0_DEPTH_8BPP) nv_log("Bit Depth=8bpp\n"); diff --git a/src/video/nv/nv3/subsystems/nv3_pgraph.c b/src/video/nv/nv3/subsystems/nv3_pgraph.c index 117a88733..5851d9301 100644 --- a/src/video/nv/nv3/subsystems/nv3_pgraph.c +++ b/src/video/nv/nv3/subsystems/nv3_pgraph.c @@ -589,7 +589,7 @@ void nv3_pgraph_arbitrate_method(uint32_t param, uint16_t method, uint8_t channe return; } - nv3_notify_if_needed(grobj); + nv3_notify_if_needed(param, method, context, grobj); } /* Arbitrates graphics object submission to the right object types */ diff --git a/src/video/nv/nv3/subsystems/nv3_pramin.c b/src/video/nv/nv3/subsystems/nv3_pramin.c index 226f4d8ee..f85ae3f8e 100644 --- a/src/video/nv/nv3/subsystems/nv3_pramin.c +++ b/src/video/nv/nv3/subsystems/nv3_pramin.c @@ -498,10 +498,11 @@ bool nv3_ramin_find_object(uint32_t name, uint32_t cache_num, uint8_t channel, u } -#ifndef RELEASE_BUILD + // Prints out some informaiton about the object void nv3_debug_ramin_print_context_info(uint32_t name, nv3_ramin_context_t context) { + #ifndef RELEASE_BUILD nv_log("Found object:\n"); nv_log("Name: 0x%04x\n", name); @@ -511,6 +512,5 @@ void nv3_debug_ramin_print_context_info(uint32_t name, nv3_ramin_context_t conte 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); + #endif } - -#endif \ No newline at end of file