diff options
| author | iCatButler <i.am.catbutler@gmail.com> | 2016-03-26 10:07:46 +0000 |
|---|---|---|
| committer | iCatButler <i.am.catbutler@gmail.com> | 2016-03-26 10:07:46 +0000 |
| commit | b1f5a6ce4d7b9156910078300bfdf4ff0fd8ccf0 (patch) | |
| tree | 4c58fda9c7fe906b59c482165adcd041c4ab37ac /plugins | |
| parent | 7767ea4acbae995cd8e6302bdb7c97e89748dfd8 (diff) | |
| download | pcsxr-b1f5a6ce4d7b9156910078300bfdf4ff0fd8ccf0.tar.gz | |
- Move pgxp_gpu source files into correct folder.
- Trace 16 bit reads and writes, invalidate register or memory (fixes UI glitches)
Diffstat (limited to 'plugins')
| -rwxr-xr-x | plugins/peopsxgl/draw.c | 5 | ||||
| -rw-r--r-- | plugins/peopsxgl/pgxp_gpu.c | 90 | ||||
| -rw-r--r-- | plugins/peopsxgl/pgxp_gpu.h | 34 |
3 files changed, 127 insertions, 2 deletions
diff --git a/plugins/peopsxgl/draw.c b/plugins/peopsxgl/draw.c index c3fed1cf..922145f0 100755 --- a/plugins/peopsxgl/draw.c +++ b/plugins/peopsxgl/draw.c @@ -1005,8 +1005,6 @@ BOOL offsetline(unsigned int* addr) else py= 0.0f; } } - - PGXP_GetVertices(addr, vertex); vertex[0].x=(short)((float)x0-px); vertex[3].x=(short)((float)x0+py); @@ -1020,6 +1018,9 @@ BOOL offsetline(unsigned int* addr) vertex[1].y=(short)((float)y1+px); vertex[2].y=(short)((float)y1+py); + + PGXP_GetVertices(addr, vertex); + if(vertex[0].x==vertex[3].x && // ortho rect? done vertex[1].x==vertex[2].x && vertex[0].y==vertex[1].y && diff --git a/plugins/peopsxgl/pgxp_gpu.c b/plugins/peopsxgl/pgxp_gpu.c new file mode 100644 index 00000000..5b64382a --- /dev/null +++ b/plugins/peopsxgl/pgxp_gpu.c @@ -0,0 +1,90 @@ +/***************************************************************************
+* Copyright (C) 2016 by iCatButler *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+* This program is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU General Public License for more details. *
+* *
+* You should have received a copy of the GNU General Public License *
+* along with this program; if not, write to the *
+* Free Software Foundation, Inc., *
+* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
+***************************************************************************/
+
+/**************************************************************************
+* pgxp_gpu.c
+* PGXP - Parallel/Precision Geometry Xform Pipeline
+*
+* Created on: 25 Mar 2016
+* Author: iCatButler
+***************************************************************************/
+
+#include "pgxp_gpu.h"
+#include "stdafx.h"
+#include "externals.h"
+
+#include <math.h>
+
+typedef struct
+{
+ float x;
+ float y;
+ float z;
+ unsigned int valid;
+ unsigned int count;
+} PGXP_vertex;
+
+const unsigned int primStrideTable[] = { 1, 2, 1, 2, 2, 3, 2, 3, 0 };
+const unsigned int primCountTable[] = { 3, 3, 4, 4, 3, 3, 4, 4, 0 };
+
+PGXP_vertex* PGXP_Mem = NULL; // pointer to parallel memory
+unsigned int currentAddr = 0; // address of current DMA
+
+// Set current DMA address and pointer to parallel memory
+void CALLBACK GPUpgxpMemory(unsigned int addr, unsigned char* pVRAM)
+{
+ if (pVRAM)
+ PGXP_Mem = (PGXP_vertex*)(pVRAM);
+ currentAddr = addr;
+}
+
+// Set current DMA address
+void PGXP_SetAddress(unsigned int addr)
+{
+ currentAddr = addr;
+}
+
+// Get parallel vertex values
+int PGXP_GetVertices(unsigned int* addr, void* pOutput)
+{
+ unsigned int primCmd = ((*addr >> 24) & 0xff); // primitive command
+ unsigned int primIdx = (primCmd - 0x20) >> 2; // index to primitive lookup
+ OGLVertex* pVertex = (OGLVertex*)pOutput; // pointer to output vertices
+ unsigned int stride = primStrideTable[primIdx]; // stride between vertices
+ unsigned int count = primCountTable[primIdx]; // number of vertices
+ PGXP_vertex* primStart = NULL; // pointer to first vertex
+
+ if (PGXP_Mem == NULL)
+ return 0;
+
+ // Offset to start of primitive
+ primStart = &PGXP_Mem[currentAddr + 1];
+
+ for (unsigned i = 0; i < count; ++i)
+ {
+ if (primStart[stride * i].valid)
+ {
+ pVertex[i].x = primStart[stride * i].x;
+ pVertex[i].y = primStart[stride * i].y;
+ }
+ }
+
+ return 1;
+}
+
diff --git a/plugins/peopsxgl/pgxp_gpu.h b/plugins/peopsxgl/pgxp_gpu.h new file mode 100644 index 00000000..3c60cd87 --- /dev/null +++ b/plugins/peopsxgl/pgxp_gpu.h @@ -0,0 +1,34 @@ +/***************************************************************************
+* Copyright (C) 2016 by iCatButler *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+* This program is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU General Public License for more details. *
+* *
+* You should have received a copy of the GNU General Public License *
+* along with this program; if not, write to the *
+* Free Software Foundation, Inc., *
+* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
+***************************************************************************/
+
+/**************************************************************************
+* pgxp_gpu.h
+* PGXP - Parallel/Precision Geometry Xform Pipeline
+*
+* Created on: 25 Mar 2016
+* Author: iCatButler
+***************************************************************************/
+
+#ifndef _PGXP_GPU_H_
+#define _PGXP_GPU_H_
+
+void PGXP_SetAddress(unsigned int addr);
+int PGXP_GetVertices(unsigned int* addr, void* pOutput);
+
+#endif // _PGXP_GPU_H_
|
