mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-11-13 09:39:33 +01:00
All drawing is now indexed lists, through IndexGenerator.
This commit is contained in:
1 parent
4eeab83389
commit
2e9daa5f89
6 files changed
+122
-67
No files matched your search
@@ -31,6 +31,7 @@ const u8 indexedPrimitiveType[7] = {
|
||||
void IndexGenerator::Reset() {
|
||||
prim_ = -1;
|
||||
inds_ = 0;
|
||||
count_ = 0;
|
||||
}
|
||||
|
||||
bool IndexGenerator::PrimCompatible(int prim) {
|
||||
@@ -41,8 +42,22 @@ bool IndexGenerator::PrimCompatible(int prim) {
|
||||
|
||||
void IndexGenerator::Start(u16 *inds, int baseIndex, int prim)
|
||||
{
|
||||
count_ = 0;
|
||||
this->inds_ = inds;
|
||||
index_ = baseIndex;
|
||||
prim_ = indexedPrimitiveType[prim];
|
||||
}
|
||||
|
||||
void IndexGenerator::AddPoints(int numVerts)
|
||||
{
|
||||
//if we have no vertices return
|
||||
for (int i = 0; i < numVerts; i++)
|
||||
{
|
||||
*inds_++ = index_ + i;
|
||||
}
|
||||
// ignore overflow verts
|
||||
index_ += numVerts;
|
||||
count_ += numVerts;
|
||||
}
|
||||
|
||||
void IndexGenerator::AddList(int numVerts)
|
||||
@@ -58,6 +73,7 @@ void IndexGenerator::AddList(int numVerts)
|
||||
|
||||
// ignore overflow verts
|
||||
index_ += numVerts;
|
||||
count_ += numTris * 3;
|
||||
}
|
||||
|
||||
void IndexGenerator::AddStrip(int numVerts)
|
||||
@@ -72,6 +88,7 @@ void IndexGenerator::AddStrip(int numVerts)
|
||||
wind = !wind;
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numTris * 3;
|
||||
}
|
||||
|
||||
void IndexGenerator::AddFan(int numVerts)
|
||||
@@ -84,6 +101,27 @@ void IndexGenerator::AddFan(int numVerts)
|
||||
*inds_++ = index_ + i + 2;
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numTris * 3;
|
||||
}
|
||||
|
||||
void IndexGenerator::TranslatePoints(int numVerts, const u8 *inds, int offset)
|
||||
{
|
||||
for (int i = 0; i < numVerts; i++)
|
||||
{
|
||||
*inds_++ = index_ + offset + inds[i];
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numVerts;
|
||||
}
|
||||
|
||||
void IndexGenerator::TranslatePoints(int numVerts, const u16 *inds, int offset)
|
||||
{
|
||||
for (int i = 0; i < numVerts; i++)
|
||||
{
|
||||
*inds_++ = index_ + offset + inds[i];
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numVerts;
|
||||
}
|
||||
|
||||
void IndexGenerator::TranslateList(int numVerts, const u8 *inds, int offset)
|
||||
@@ -96,6 +134,7 @@ void IndexGenerator::TranslateList(int numVerts, const u8 *inds, int offset)
|
||||
*inds_++ = index_ + offset + inds[i*3 + 2];
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numTris * 3;
|
||||
}
|
||||
|
||||
void IndexGenerator::TranslateStrip(int numVerts, const u8 *inds, int offset)
|
||||
@@ -110,6 +149,7 @@ void IndexGenerator::TranslateStrip(int numVerts, const u8 *inds, int offset)
|
||||
wind = !wind;
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numTris * 3;
|
||||
}
|
||||
|
||||
void IndexGenerator::TranslateFan(int numVerts, const u8 *inds, int offset)
|
||||
@@ -123,6 +163,7 @@ void IndexGenerator::TranslateFan(int numVerts, const u8 *inds, int offset)
|
||||
*inds_++ = index_ + offset + inds[i + 2];
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numTris * 3;
|
||||
}
|
||||
|
||||
void IndexGenerator::TranslateList(int numVerts, const u16 *inds, int offset)
|
||||
@@ -135,6 +176,7 @@ void IndexGenerator::TranslateList(int numVerts, const u16 *inds, int offset)
|
||||
*inds_++ = index_ + offset + inds[i*3 + 2];
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numTris * 3;
|
||||
}
|
||||
|
||||
void IndexGenerator::TranslateStrip(int numVerts, const u16 *inds, int offset)
|
||||
@@ -149,6 +191,7 @@ void IndexGenerator::TranslateStrip(int numVerts, const u16 *inds, int offset)
|
||||
wind = !wind;
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numTris * 3;
|
||||
}
|
||||
|
||||
void IndexGenerator::TranslateFan(int numVerts, const u16 *inds, int offset)
|
||||
@@ -162,6 +205,7 @@ void IndexGenerator::TranslateFan(int numVerts, const u16 *inds, int offset)
|
||||
*inds_++ = index_ + offset + inds[i + 2];
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numTris * 3;
|
||||
}
|
||||
|
||||
//Lines
|
||||
@@ -174,6 +218,7 @@ void IndexGenerator::AddLineList(int numVerts)
|
||||
*inds_++ = index_ + i*2+1;
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numLines * 2;
|
||||
}
|
||||
|
||||
void IndexGenerator::AddLineStrip(int numVerts)
|
||||
@@ -185,6 +230,7 @@ void IndexGenerator::AddLineStrip(int numVerts)
|
||||
*inds_++ = index_ + i + 1;
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numLines * 2;
|
||||
}
|
||||
|
||||
void IndexGenerator::TranslateLineList(int numVerts, const u8 *inds, int offset)
|
||||
@@ -196,6 +242,7 @@ void IndexGenerator::TranslateLineList(int numVerts, const u8 *inds, int offset)
|
||||
*inds_++ = index_ + i*2+1;
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numLines * 2;
|
||||
}
|
||||
|
||||
void IndexGenerator::TranslateLineStrip(int numVerts, const u8 *inds, int offset)
|
||||
@@ -207,6 +254,7 @@ void IndexGenerator::TranslateLineStrip(int numVerts, const u8 *inds, int offset
|
||||
*inds_++ = index_ + i + 1;
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numLines * 2;
|
||||
}
|
||||
|
||||
void IndexGenerator::TranslateLineList(int numVerts, const u16 *inds, int offset)
|
||||
@@ -218,6 +266,7 @@ void IndexGenerator::TranslateLineList(int numVerts, const u16 *inds, int offset
|
||||
*inds_++ = index_ + i*2+1;
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numLines * 2;
|
||||
}
|
||||
|
||||
void IndexGenerator::TranslateLineStrip(int numVerts, const u16 *inds, int offset)
|
||||
@@ -229,4 +278,5 @@ void IndexGenerator::TranslateLineStrip(int numVerts, const u16 *inds, int offse
|
||||
*inds_++ = index_ + i + 1;
|
||||
}
|
||||
index_ += numVerts;
|
||||
count_ += numLines * 2;
|
||||
}
|
||||
@@ -28,6 +28,8 @@ public:
|
||||
void Start(u16 *indexptr, int baseIndex, int prim);
|
||||
bool PrimCompatible(int prim);
|
||||
|
||||
// Points (why index these? code simplicity)
|
||||
void AddPoints(int numVerts);
|
||||
// Triangles
|
||||
void AddList(int numVerts);
|
||||
void AddStrip(int numVerts);
|
||||
@@ -36,6 +38,8 @@ public:
|
||||
void AddLineList(int numVerts);
|
||||
void AddLineStrip(int numVerts);
|
||||
|
||||
void TranslatePoints(int numVerts, const u8 *inds, int offset);
|
||||
void TranslatePoints(int numVerts, const u16 *inds, int offset);
|
||||
// Translates already indexed lists
|
||||
void TranslateLineList(int numVerts, const u8 *inds, int offset);
|
||||
void TranslateLineStrip(int numVerts, const u8 *inds, int offset);
|
||||
@@ -49,9 +53,13 @@ public:
|
||||
void TranslateStrip(int numVerts, const u16 *inds, int offset);
|
||||
void TranslateFan(int numVerts, const u16 *inds, int offset);
|
||||
|
||||
int MaxIndex() { return index_; }
|
||||
int VertexCount() { return count_; }
|
||||
|
||||
private:
|
||||
u16 *inds_;
|
||||
int index_;
|
||||
int count_;
|
||||
int prim_;
|
||||
};
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "VertexDecoder.h"
|
||||
#include "ShaderManager.h"
|
||||
#include "DisplayListInterpreter.h"
|
||||
#include "IndexGenerator.h"
|
||||
|
||||
const GLuint glprim[8] = {
|
||||
GL_POINTS,
|
||||
@@ -42,7 +43,9 @@ const GLuint glprim[8] = {
|
||||
};
|
||||
|
||||
u8 decoded[65536 * 32];
|
||||
// uint16_t decIndex[65536]; // Unused
|
||||
uint16_t decIndex[65536]; // Unused
|
||||
|
||||
IndexGenerator indexGen;
|
||||
|
||||
TransformedVertex transformed[65536];
|
||||
TransformedVertex transformedExpanded[65536];
|
||||
@@ -262,7 +265,7 @@ static void DesetupDecFmtForDraw(LinkedShader *program, const DecVtxFormat &decF
|
||||
|
||||
// Actually again, single quads could be drawn more efficiently using GL_TRIANGLE_STRIP, no need to duplicate verts as for
|
||||
// GL_TRIANGLES. Still need to sw transform to compute the extra two corners though.
|
||||
void SoftwareTransformAndDraw(int prim, LinkedShader *program, int forceIndexType, int vertexCount, void *inds, const DecVtxFormat &decVtxFormat, int indexLowerBound, int indexUpperBound, float *customUV)
|
||||
void SoftwareTransformAndDraw(int prim, LinkedShader *program, int vertexCount, void *inds, int indexType, const DecVtxFormat &decVtxFormat, int maxIndex, float *customUV)
|
||||
{
|
||||
/*
|
||||
DEBUG_LOG(G3D, "View matrix:");
|
||||
@@ -289,7 +292,7 @@ void SoftwareTransformAndDraw(int prim, LinkedShader *program, int forceIndexTyp
|
||||
Lighter lighter;
|
||||
|
||||
VertexReader reader(decoded, decVtxFormat);
|
||||
for (int index = indexLowerBound; index <= indexUpperBound; index++)
|
||||
for (int index = 0; index < maxIndex; index++)
|
||||
{
|
||||
reader.Goto(index);
|
||||
|
||||
@@ -483,48 +486,19 @@ void SoftwareTransformAndDraw(int prim, LinkedShader *program, int forceIndexTyp
|
||||
const TransformedVertex *drawBuffer = transformed;
|
||||
int numTrans = 0;
|
||||
|
||||
int indexType = (gstate.vertType & GE_VTYPE_IDX_MASK);
|
||||
if (forceIndexType != -1) {
|
||||
indexType = forceIndexType;
|
||||
}
|
||||
bool drawIndexed = false;
|
||||
GLuint glIndexType = 0;
|
||||
|
||||
if (prim != GE_PRIM_RECTANGLES) {
|
||||
// We can simply draw the unexpanded buffer.
|
||||
numTrans = vertexCount;
|
||||
switch (indexType) {
|
||||
case GE_VTYPE_IDX_8BIT:
|
||||
drawIndexed = true;
|
||||
glIndexType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
case GE_VTYPE_IDX_16BIT:
|
||||
drawIndexed = true;
|
||||
glIndexType = GL_UNSIGNED_SHORT;
|
||||
break;
|
||||
default:
|
||||
drawIndexed = false;
|
||||
break;
|
||||
}
|
||||
drawIndexed = true;
|
||||
} else {
|
||||
numTrans = 0;
|
||||
drawBuffer = transformedExpanded;
|
||||
TransformedVertex *trans = &transformedExpanded[0];
|
||||
TransformedVertex saved;
|
||||
for (int i = 0; i < vertexCount; i++) {
|
||||
int index;
|
||||
if (indexType == GE_VTYPE_IDX_8BIT)
|
||||
{
|
||||
index = ((u8*)inds)[i];
|
||||
}
|
||||
else if (indexType == GE_VTYPE_IDX_16BIT)
|
||||
{
|
||||
index = ((u16*)inds)[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
index = i;
|
||||
}
|
||||
int index = ((u16*)inds)[i];
|
||||
|
||||
TransformedVertex &transVtx = transformed[index];
|
||||
if ((i & 1) == 0)
|
||||
@@ -591,7 +565,7 @@ void SoftwareTransformAndDraw(int prim, LinkedShader *program, int forceIndexTyp
|
||||
if (program->a_color0 != -1) glVertexAttribPointer(program->a_color0, 4, GL_FLOAT, GL_FALSE, vertexSize, ((uint8_t*)drawBuffer) + 5 * 4);
|
||||
if (program->a_color1 != -1) glVertexAttribPointer(program->a_color1, 3, GL_FLOAT, GL_FALSE, vertexSize, ((uint8_t*)drawBuffer) + 9 * 4);
|
||||
if (drawIndexed) {
|
||||
glDrawElements(glprim[prim], numTrans, glIndexType, (GLvoid *)inds);
|
||||
glDrawElements(glprim[prim], numTrans, GL_UNSIGNED_SHORT, (GLvoid *)inds);
|
||||
} else {
|
||||
glDrawArrays(glprim[prim], 0, numTrans);
|
||||
}
|
||||
@@ -603,6 +577,10 @@ void SoftwareTransformAndDraw(int prim, LinkedShader *program, int forceIndexTyp
|
||||
|
||||
void GLES_GPU::TransformAndDrawPrim(void *verts, void *inds, int prim, int vertexCount, float *customUV, int forceIndexType, int *bytesRead)
|
||||
{
|
||||
// For the future
|
||||
if (!indexGen.PrimCompatible(prim))
|
||||
Flush(prim);
|
||||
|
||||
int indexLowerBound, indexUpperBound;
|
||||
// First, decode the verts and apply morphing
|
||||
VertexDecoder dec;
|
||||
@@ -611,6 +589,51 @@ void GLES_GPU::TransformAndDrawPrim(void *verts, void *inds, int prim, int verte
|
||||
if (bytesRead)
|
||||
*bytesRead = vertexCount * dec.VertexSize();
|
||||
|
||||
indexGen.Start(decIndex, 0, prim);
|
||||
|
||||
int indexType = (gstate.vertType & GE_VTYPE_IDX_MASK);
|
||||
if (forceIndexType != -1) indexType = forceIndexType;
|
||||
switch (indexType) {
|
||||
case GE_VTYPE_IDX_NONE:
|
||||
switch (prim) {
|
||||
case GE_PRIM_POINTS: indexGen.AddPoints(vertexCount); break;
|
||||
case GE_PRIM_LINES: indexGen.AddLineList(vertexCount); break;
|
||||
case GE_PRIM_LINE_STRIP: indexGen.AddLineStrip(vertexCount); break;
|
||||
case GE_PRIM_TRIANGLES: indexGen.AddList(vertexCount); break;
|
||||
case GE_PRIM_TRIANGLE_STRIP: indexGen.AddStrip(vertexCount); break;
|
||||
case GE_PRIM_TRIANGLE_FAN: indexGen.AddFan(vertexCount); break;
|
||||
case GE_PRIM_RECTANGLES: indexGen.AddLineList(vertexCount); break; // Same
|
||||
}
|
||||
break;
|
||||
|
||||
case GE_VTYPE_IDX_8BIT:
|
||||
switch (prim) {
|
||||
case GE_PRIM_POINTS: indexGen.TranslatePoints(vertexCount, (const u16 *)inds, -indexLowerBound); break;
|
||||
case GE_PRIM_LINES: indexGen.TranslateLineList(vertexCount, (const u8 *)inds, -indexLowerBound); break;
|
||||
case GE_PRIM_LINE_STRIP: indexGen.TranslateLineStrip(vertexCount, (const u8 *)inds, -indexLowerBound); break;
|
||||
case GE_PRIM_TRIANGLES: indexGen.TranslateList(vertexCount, (const u8 *)inds, -indexLowerBound); break;
|
||||
case GE_PRIM_TRIANGLE_STRIP: indexGen.TranslateStrip(vertexCount, (const u8 *)inds, -indexLowerBound); break;
|
||||
case GE_PRIM_TRIANGLE_FAN: indexGen.TranslateFan(vertexCount, (const u8 *)inds, -indexLowerBound); break;
|
||||
case GE_PRIM_RECTANGLES: indexGen.TranslateLineList(vertexCount, (const u8 *)inds, -indexLowerBound); break; // Same
|
||||
}
|
||||
break;
|
||||
|
||||
case GE_VTYPE_IDX_16BIT:
|
||||
switch (prim) {
|
||||
case GE_PRIM_POINTS: indexGen.TranslatePoints(vertexCount, (const u16 *)inds, -indexLowerBound); break;
|
||||
case GE_PRIM_LINES: indexGen.TranslateLineList(vertexCount, (const u16 *)inds, -indexLowerBound); break;
|
||||
case GE_PRIM_LINE_STRIP: indexGen.TranslateLineStrip(vertexCount, (const u16 *)inds, -indexLowerBound); break;
|
||||
case GE_PRIM_TRIANGLES: indexGen.TranslateList(vertexCount, (const u16 *)inds, -indexLowerBound); break;
|
||||
case GE_PRIM_TRIANGLE_STRIP: indexGen.TranslateStrip(vertexCount, (const u16 *)inds, -indexLowerBound); break;
|
||||
case GE_PRIM_TRIANGLE_FAN: indexGen.TranslateFan(vertexCount, (const u16 *)inds, -indexLowerBound); break;
|
||||
case GE_PRIM_RECTANGLES: indexGen.TranslateLineList(vertexCount, (const u16 *)inds, -indexLowerBound); break; // Same
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
indexType = GE_VTYPE_IDX_16BIT;
|
||||
// From here on out, the index type is ALWAYS 16-bit. Deal with it.
|
||||
|
||||
// And here we should return, having collected the morphed but untransformed vertices.
|
||||
// Note that DecodeVerts should convert strips into indexed lists etc, adding to our
|
||||
// current vertex buffer and index buffer.
|
||||
@@ -622,15 +645,12 @@ void GLES_GPU::TransformAndDrawPrim(void *verts, void *inds, int prim, int verte
|
||||
PrintDecodedVertex(decoded[i], gstate.vertType);
|
||||
}
|
||||
#endif
|
||||
bool useTexCoord = false;
|
||||
|
||||
// Check if anything needs updating
|
||||
if (gstate_c.textureChanged)
|
||||
{
|
||||
if ((gstate.textureMapEnable & 1) && !gstate.isModeClear())
|
||||
{
|
||||
PSPSetTexture();
|
||||
useTexCoord = true;
|
||||
}
|
||||
gstate_c.textureChanged = false;
|
||||
}
|
||||
@@ -647,35 +667,11 @@ void GLES_GPU::TransformAndDrawPrim(void *verts, void *inds, int prim, int verte
|
||||
|
||||
if (CanUseHardwareTransform(prim)) {
|
||||
SetupDecFmtForDraw(program, dec.GetDecVtxFmt(), decoded);
|
||||
bool drawIndexed;
|
||||
GLuint glIndexType;
|
||||
int indexType = (gstate.vertType & GE_VTYPE_IDX_MASK);
|
||||
if (forceIndexType != -1) {
|
||||
indexType = forceIndexType;
|
||||
}
|
||||
int numTrans = vertexCount;
|
||||
switch (indexType) {
|
||||
case GE_VTYPE_IDX_8BIT:
|
||||
drawIndexed = true;
|
||||
glIndexType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
case GE_VTYPE_IDX_16BIT:
|
||||
drawIndexed = true;
|
||||
glIndexType = GL_UNSIGNED_SHORT;
|
||||
break;
|
||||
default:
|
||||
drawIndexed = false;
|
||||
break;
|
||||
}
|
||||
// NOTICE_LOG(G3D,"DrawPrimitive: %i", numTrans);
|
||||
if (drawIndexed) {
|
||||
glDrawElements(glprim[prim], numTrans, glIndexType, (GLvoid *)inds);
|
||||
} else {
|
||||
glDrawArrays(glprim[prim], 0, numTrans);
|
||||
}
|
||||
glDrawElements(glprim[prim], indexGen.VertexCount(), GL_UNSIGNED_SHORT, (GLvoid *)decIndex);
|
||||
DesetupDecFmtForDraw(program, dec.GetDecVtxFmt());
|
||||
} else {
|
||||
SoftwareTransformAndDraw(prim, program, forceIndexType, vertexCount, inds, dec.GetDecVtxFmt(), indexLowerBound, indexUpperBound, customUV);
|
||||
SoftwareTransformAndDraw(prim, program, indexGen.VertexCount(), (void *)decIndex, indexType, dec.GetDecVtxFmt(),
|
||||
indexGen.MaxIndex(), customUV);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -65,4 +65,4 @@ struct Color4
|
||||
}
|
||||
};
|
||||
|
||||
void SoftwareTransformAndDraw(int prim, LinkedShader *program, int forceIndexType, int vertexCount, void *inds, const DecVtxFormat &decVtxFormat, int indexLowerBound, int indexUpperBound, float *customUV);
|
||||
// void SoftwareTransformAndDraw(int prim, LinkedShader *program, int vertexCount, void *inds, int indexType, const DecVtxFormat &decVtxFormat, int maxIndex, float *customUV);
|
||||
@@ -675,7 +675,7 @@ void VertexDecoder::DecodeVerts(u8 *decodedptr, const void *verts, const void *i
|
||||
*indexUpperBound = upperBound;
|
||||
|
||||
// Decode the vertices within the found bounds, once each
|
||||
decoded_ = decodedptr + lowerBound * decFmt.stride;
|
||||
decoded_ = decodedptr; // + lowerBound * decFmt.stride;
|
||||
ptr_ = (const u8*)verts + lowerBound * size;
|
||||
for (int index = lowerBound; index <= upperBound; index++)
|
||||
{
|
||||
|
||||
@@ -86,6 +86,7 @@ public:
|
||||
void SetVertexType(u32 vtype);
|
||||
|
||||
const DecVtxFormat &GetDecVtxFmt() { return decFmt; }
|
||||
|
||||
void DecodeVerts(u8 *decoded, const void *verts, const void *inds, int prim, int count, int *indexLowerBound, int *indexUpperBound) const;
|
||||
bool hasColor() const { return col != 0; }
|
||||
int VertexSize() const { return size; }
|
||||
|
||||
Reference in new issue
Block a user