1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-07 03:13:49 +00:00

Fix DKR microcode.

gSPDMATriangles worked incorrect because vertex's s and t can change between triangles.
Need to copy original vertex to an array and modify s and t for copied vertex.
This commit is contained in:
Sergey Lipskiy 2014-10-09 23:36:12 +07:00
parent e4fa0b5717
commit 254f315803
4 changed files with 49 additions and 35 deletions

View File

@ -605,7 +605,7 @@ void OGLRender::_setTexCoordArrays() const
glDisableVertexAttribArray(SC_STSCALED);
}
void OGLRender::_prepareDrawTriangle()
void OGLRender::_prepareDrawTriangle(bool _dma)
{
#ifndef GLES2
if (m_bImageTexture)
@ -624,13 +624,14 @@ void OGLRender::_prepareDrawTriangle()
}
if (updateArrays) {
glVertexAttribPointer(SC_POSITION, 4, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &triangles.vertices[0].x);
glVertexAttribPointer(SC_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &triangles.vertices[0].r);
glVertexAttribPointer(SC_TEXCOORD0, 2, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &triangles.vertices[0].s);
glVertexAttribPointer(SC_STSCALED, 1, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(SPVertex), &triangles.vertices[0].st_scaled);
SPVertex * pVtx = _dma ? triangles.dmaVertices.data() : &triangles.vertices[0];
glVertexAttribPointer(SC_POSITION, 4, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &pVtx->x);
glVertexAttribPointer(SC_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &pVtx->r);
glVertexAttribPointer(SC_TEXCOORD0, 2, GL_FLOAT, GL_FALSE, sizeof(SPVertex), &pVtx->s);
glVertexAttribPointer(SC_STSCALED, 1, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(SPVertex), &pVtx->st_scaled);
if (config.enableHWLighting) {
glEnableVertexAttribArray(SC_NUMLIGHTS);
glVertexAttribPointer(SC_NUMLIGHTS, 1, GL_BYTE, GL_FALSE, sizeof(SPVertex), &triangles.vertices[0].HWLight);
glVertexAttribPointer(SC_NUMLIGHTS, 1, GL_BYTE, GL_FALSE, sizeof(SPVertex), &pVtx->HWLight);
}
_updateCullFace();
@ -648,7 +649,7 @@ void OGLRender::drawLLETriangle(u32 _numVtx)
if (_numVtx == 0)
return;
_prepareDrawTriangle();
_prepareDrawTriangle(false);
glDisable(GL_CULL_FACE);
FrameBufferList & fbList = frameBufferList();
@ -681,11 +682,19 @@ void OGLRender::drawLLETriangle(u32 _numVtx)
#endif
}
void OGLRender::drawDMATriangles(u32 _numVtx)
{
if (_numVtx == 0)
return;
_prepareDrawTriangle(true);
glDrawArrays(GL_TRIANGLES, 0, _numVtx);
}
void OGLRender::drawTriangles()
{
if (triangles.num == 0) return;
_prepareDrawTriangle();
_prepareDrawTriangle(false);
glDrawElements(GL_TRIANGLES, triangles.num, GL_UNSIGNED_BYTE, triangles.elements);
triangles.num = 0;

View File

@ -1,6 +1,7 @@
#ifndef OPENGL_H
#define OPENGL_H
#include <vector>
#ifdef _WINDOWS
#include <windows.h>
#include <GL/gl.h>
@ -35,6 +36,7 @@ public:
void addTriangle(int _v0, int _v1, int _v2);
void drawTriangles();
void drawLLETriangle(u32 _numVtx);
void drawDMATriangles(u32 _numVtx);
void drawLine(int _v0, int _v1, float _width);
void drawRect(int _ulx, int _uly, int _lrx, int _lry, float * _pColor);
void drawTexturedRect(
@ -52,6 +54,8 @@ public:
}
bool isImageTexturesSupported() const {return m_bImageTexture;}
SPVertex & getVertex(u32 _v) {return triangles.vertices[_v];}
void setDMAVerticesSize(u32 _size) { if (triangles.dmaVertices.size() < _size) triangles.dmaVertices.resize(_size); }
SPVertex * getDMAVerticesData() { return triangles.dmaVertices.data(); }
enum RENDER_STATE {
rsNone = 0,
@ -85,7 +89,7 @@ private:
void _updateViewport() const;
void _updateDepthUpdate() const;
void _updateStates() const;
void _prepareDrawTriangle();
void _prepareDrawTriangle(bool _dma);
#ifdef __TRIBUFFER_OPT
void _indexmap_init();
@ -95,6 +99,7 @@ private:
struct {
SPVertex vertices[VERTBUFF_SIZE];
std::vector<SPVertex> dmaVertices;
GLubyte elements[ELEMBUFF_SIZE];
int num;
u32 indexmap[INDEXMAP_SIZE];

50
gSP.cpp
View File

@ -774,8 +774,6 @@ void gSPDMAVertex( u32 a, u32 n, u32 v0 )
u32 v = i;
#ifdef __TRIBUFFER_OPT
v = render.getIndexmapNew(v, 1);
#else
v = i;
#endif
SPVertex & vtx = render.getVertex(v);
vtx.x = *(s16*)&RDRAM[address ^ 2];
@ -793,6 +791,7 @@ void gSPDMAVertex( u32 a, u32 n, u32 v0 )
vtx.b = *(u8*)&RDRAM[(address + 8) ^ 3] * 0.0039215689f;
vtx.a = *(u8*)&RDRAM[(address + 9) ^ 3] * 0.0039215689f;
}
vtx.st_scaled = 0;
gSPProcessVertex(v);
address += 10;
@ -1024,12 +1023,13 @@ void gSPDMATriangles( u32 tris, u32 n ){
}
OGLRender & render = video().getRender();
render.setDMAVerticesSize(n * 3);
#ifdef __TRIBUFFER_OPT
render.indexmapUndo();
#endif
DKRTriangle *triangles = (DKRTriangle*)&RDRAM[address];
SPVertex * pVtx = render.getDMAVerticesData();
for (u32 i = 0; i < n; ++i) {
int mode = 0;
if (!(triangles->flag & 0x40)) {
@ -1038,34 +1038,36 @@ void gSPDMATriangles( u32 tris, u32 n ){
else
mode |= G_CULL_FRONT;
}
if ((gSP.geometryMode&G_CULL_BOTH) != mode) {
render.drawTriangles();
render.drawDMATriangles(pVtx - render.getDMAVerticesData());
pVtx = render.getDMAVerticesData();
gSP.geometryMode &= ~G_CULL_BOTH;
gSP.geometryMode |= mode;
gSP.changed |= CHANGED_GEOMETRYMODE;
}
s32 v0 = triangles->v0;
s32 v1 = triangles->v1;
s32 v2 = triangles->v2;
SPVertex & vtx0 = render.getVertex(v0);
vtx0.s = _FIXED2FLOAT( triangles->s0, 5 );
vtx0.t = _FIXED2FLOAT( triangles->t0, 5 );
SPVertex & vtx1 = render.getVertex(v1);
vtx1.s = _FIXED2FLOAT( triangles->s1, 5 );
vtx1.t = _FIXED2FLOAT( triangles->t1, 5 );
SPVertex & vtx2 = render.getVertex(v2);
vtx2.s = _FIXED2FLOAT( triangles->s2, 5 );
vtx2.t = _FIXED2FLOAT( triangles->t2, 5 );
gSPTriangle(triangles->v0, triangles->v1, triangles->v2);
triangles++;
const s32 v0 = triangles->v0;
const s32 v1 = triangles->v1;
const s32 v2 = triangles->v2;
if (render.isClipped(v0, v1, v2)) {
++triangles;
continue;
}
*pVtx = render.getVertex(v0);
pVtx->s = _FIXED2FLOAT(triangles->s0, 5);
pVtx->t = _FIXED2FLOAT(triangles->t0, 5);
++pVtx;
*pVtx = render.getVertex(v1);
pVtx->s = _FIXED2FLOAT(triangles->s1, 5);
pVtx->t = _FIXED2FLOAT(triangles->t1, 5);
++pVtx;
*pVtx = render.getVertex(v2);
pVtx->s = _FIXED2FLOAT(triangles->s2, 5);
pVtx->t = _FIXED2FLOAT(triangles->t2, 5);
++pVtx;
++triangles;
}
#ifdef __TRIBUFFER_OPT
render.drawTriangles();
#endif
render.drawDMATriangles(pVtx - render.getDMAVerticesData());
}
void gSP1Quadrangle( s32 v0, s32 v1, s32 v2, s32 v3 )

2
gSP.h
View File

@ -77,8 +77,6 @@ struct SPVertex
u32 clip;
};
typedef SPVertex SPTriangle[3];
struct SPLight
{
f32 r, g, b;