summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authoriCatButler <i.am.catbutler@gmail.com>2016-03-26 10:07:46 +0000
committeriCatButler <i.am.catbutler@gmail.com>2016-03-26 10:07:46 +0000
commitb1f5a6ce4d7b9156910078300bfdf4ff0fd8ccf0 (patch)
tree4c58fda9c7fe906b59c482165adcd041c4ab37ac /plugins
parent7767ea4acbae995cd8e6302bdb7c97e89748dfd8 (diff)
downloadpcsxr-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-xplugins/peopsxgl/draw.c5
-rw-r--r--plugins/peopsxgl/pgxp_gpu.c90
-rw-r--r--plugins/peopsxgl/pgxp_gpu.h34
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_