From 34f0e5550bbf0520c97eb7376a2bb7a13ca71e6b Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 11 Jul 2015 14:45:38 +0200 Subject: [PATCH] upload PS2 texture over PATH2 --- tests/ps2/gs.cpp | 5 ++- tests/ps2/gs.h | 2 +- tests/ps2/main.cpp | 97 ++++++++++++++++++++++++++++++---------------- tests/ps2/vu.dsm | 8 +++- 4 files changed, 75 insertions(+), 37 deletions(-) diff --git a/tests/ps2/gs.cpp b/tests/ps2/gs.cpp index 0de7754..9bdbe40 100755 --- a/tests/ps2/gs.cpp +++ b/tests/ps2/gs.cpp @@ -174,12 +174,13 @@ gsPollVsynch(void) } void -gsFlip(void) +gsFlip(int synch) { struct GsState *g = gsCurState; g->activeFb = (g->activeFb+1) & 1; g->visibleFb = (g->visibleFb+1) & 1; - gsPollVsynch(); + if(synch) + gsPollVsynch(); gsSelectActiveFb(g->activeFb); gsSelectVisibleFb(g->visibleFb); } diff --git a/tests/ps2/gs.h b/tests/ps2/gs.h index bde4685..3733723 100755 --- a/tests/ps2/gs.h +++ b/tests/ps2/gs.h @@ -47,7 +47,7 @@ void gsInit(void); void gsUpdateContext(void); void gsSelectVisibleFb(int n); void gsSelectActiveFb(int n); -void gsFlip(void); +void gsFlip(int synch); void gsClear(void); void gsNormalizedToScreen(float *v1, uint32 *v2); diff --git a/tests/ps2/main.cpp b/tests/ps2/main.cpp index 540ba1f..c2e2307 100755 --- a/tests/ps2/main.cpp +++ b/tests/ps2/main.cpp @@ -27,43 +27,51 @@ extern float vuMatcolor[]; extern float vuSurfProps[]; extern uint32 vuGeometry[]; extern uint32 mpgCall[]; +extern uint32 textureCall[]; extern uint32 geometryCall[]; extern uint32 defaultPipe[]; extern uint32 skinPipe[]; rw::Clump *clump; -GIF_DECLARE_PACKET(gifDmaBuf2, 256) +uint64 __attribute__((aligned (16))) rasterPacket[16]; -uint32 +void uploadRaster(rw::Raster *ras) { GsState *g = gsCurState; + uint64 *dp; + uint32 *wp; uint32 destAddr = g->currentMemPtr; uint32 size = ras->width*ras->height*4; g->currentMemPtr += size; - GIF_BEGIN_PACKET(gifDmaBuf2); - GIF_TAG(gifDmaBuf2, 4, 1, 0, 0, 0, 1, 0x0e); - GIF_DATA_AD(gifDmaBuf2, GS_BITBLTBUF, - MAKE_GS_BITBLTBUF(0, 0, 0, - destAddr/4/64, ras->width/64, PSMCT32)); - GIF_DATA_AD(gifDmaBuf2, GS_TRXPOS, - MAKE_GS_TRXPOS(0, 0, 0, 0, 0)); - GIF_DATA_AD(gifDmaBuf2, GS_TRXREG, - MAKE_GS_TRXREG(ras->width, ras->height)); - GIF_DATA_AD(gifDmaBuf2, GS_TRXDIR, 0); - GIF_SEND_PACKET(gifDmaBuf2); + // set up transfer + wp = (uint32*)rasterPacket; + *wp++ = 0x10000000 | 6; // DMAcnt; 6 qw + *wp++ = 0; + *wp++ = 0; + *wp++ = 0x50000000 | 6; // DIRECT; 6 qw + dp = (uint64*)wp; + *dp++ = MAKE_GIF_TAG(4, 1, 0, 0, 0, 1); + *dp++ = 0x0e; + *dp++ = MAKE_GS_BITBLTBUF(0,0,0,destAddr/4/64, ras->width/64, PSMCT32); + *dp++ = GS_BITBLTBUF; + *dp++ = MAKE_GS_TRXPOS(0, 0, 0, 0, 0); + *dp++ = GS_TRXPOS; + *dp++ = MAKE_GS_TRXREG(ras->width, ras->height); + *dp++ = GS_TRXREG; + *dp++ = 0; + *dp++ = GS_TRXDIR; + *dp++ = MAKE_GIF_TAG(size/0x10, 1, 0, 0, 2, 0); + *dp++ = 0; - GIF_BEGIN_PACKET(gifDmaBuf2); - GIF_TAG(gifDmaBuf2, size/0x10, 1, 0, 0, 2, 0, 0); - GIF_SEND_PACKET(gifDmaBuf2); - - FlushCache(0); - SET_REG32(D2_QWC, MAKE_DN_QWC(size/0x10)); - SET_REG32(D2_MADR, MAKE_DN_MADR(ras->texels, 0)); - SET_REG32(D2_CHCR, MAKE_DN_CHCR(1, 0, 0, 0, 0, 1)); - DMA_WAIT(D2_CHCR); + // the data + wp = (uint32*)dp; + *wp++ = 0x30000000 | size/0x10; // DMAref + *wp++ = (uint32)ras->texels; + *wp++ = 0; + *wp++ = 0x50000000 | size/0x10; int logw = 0, logh = 0; int s; @@ -72,17 +80,33 @@ uploadRaster(rw::Raster *ras) for(s = 1; s < ras->height; s *= 2) logh++; - GIF_BEGIN_PACKET(gifDmaBuf2); - GIF_TAG(gifDmaBuf2, 3, 1, 0, 0, 0, 1, 0x0e); - GIF_DATA_AD(gifDmaBuf2, GS_TEXFLUSH, 1); - GIF_DATA_AD(gifDmaBuf2, GS_TEX0_1, - MAKE_GS_TEX0(destAddr/4/64, ras->width/64, PSMCT32, - logw, logh, 0, 0, 0, 0, 0, 0, 0)); - GIF_DATA_AD(gifDmaBuf2, GS_TEX1_1, - MAKE_GS_TEX1(0, 0, 1, 1, 0, 0, 0)); - GIF_SEND_PACKET(gifDmaBuf2); + // set texturing registers + *wp++ = 0x60000000 | 4; // DMAret; 4 qw + *wp++ = 0; + *wp++ = 0; + *wp++ = 0x50000000 | 4; // DIRECT; 4 qw + dp = (uint64*)wp; + *dp++ = MAKE_GIF_TAG(3, 1, 0, 0, 0, 1); + *dp++ = 0x0e; + *dp++ = 1; + *dp++ = GS_TEXFLUSH; + *dp++ = MAKE_GS_TEX0(destAddr/4/64, ras->width/64, PSMCT32, + logw, logh, 0, 0, 0, 0, 0, 0, 0); + *dp++ = GS_TEX0_1; + *dp++ = MAKE_GS_TEX1(0, 0, 1, 1, 0, 0, 0); + *dp++ = GS_TEX1_1; +} - return destAddr; +void +dumpRasterPacket(int n) +{ + int i; + uint32 *p = (uint32*)rasterPacket; + for(i = 0; i < n; i++){ + printf("%p %p %p %p\n", p[0], p[1], p[2], p[3]); + p += 4; + } + printf("\n"); } void @@ -119,7 +143,13 @@ drawAtomic(rw::Atomic *atomic) vuMatcolor[2] /= 2.0f; tex = 0x10; uploadRaster(mesh->material->texture->raster); + }else{ + rasterPacket[0] = 0x60000000; + rasterPacket[1] = 0x00000000; + rasterPacket[2] = 0x00000000; + rasterPacket[3] = 0x00000000; } + textureCall[1] = (uint32)rasterPacket; vuGIFtag[0] = MAKE_GIF_TAG(0,1,1,0xC|tex,0,3); vuGIFtag[1] = 0x412; if(rw::skinGlobals.offset && skin){ @@ -151,6 +181,7 @@ draw(void) matTranslate(viewMat, 0.0f, 0.0f, -34.0f); // matTranslate(viewMat, 0.0f, 0.0f, -10.0f); // matTranslate(viewMat, 0.0f, 0.0f, -8.0f); +// matTranslate(viewMat, 0.0f, 0.0f, -4.0f); matRotateX(viewMat, rot); matRotateY(viewMat, rot); matRotateZ(viewMat, rot); @@ -246,7 +277,7 @@ main() for(;;){ draw(); - gsFlip(); + gsFlip(0); } return 0; diff --git a/tests/ps2/vu.dsm b/tests/ps2/vu.dsm index f53d9d5..72c04e2 100644 --- a/tests/ps2/vu.dsm +++ b/tests/ps2/vu.dsm @@ -7,6 +7,7 @@ .global vuMatcolor .global vuSurfProps .global mpgCall +.global textureCall .global geometryCall .align 4 @@ -48,11 +49,16 @@ vuMatcolor: vuSurfProps: .float 1.0, 1.0, 1.0, 1.0 ; .float 160, 160, 160, 0 ; some ambient light - .float 20, 20, 20, 0 ; some ambient light + .float 80, 80, 80, 0 +; .float 20, 20, 20, 0 ; .float 0, 0, 0, 0 .EndUnpack .EndDmaData +textureCall: +DMAcall *, 0 +.EndDmaData + geometryCall: DMAcall *, 0 ;vuGeometry BASE 0