Move the vertex decoder cache into DrawEngineCommon

This commit is contained in:
Henrik Rydgard 2015-04-08 21:35:00 +02:00
parent 56a596d099
commit ed8a3eaf6d
6 changed files with 38 additions and 54 deletions

View file

@ -25,7 +25,30 @@
#include <algorithm>
DrawEngineCommon::~DrawEngineCommon() { }
#define QUAD_INDICES_MAX 65536
DrawEngineCommon::DrawEngineCommon() : dec_(nullptr) {
quadIndices_ = new u16[6 * QUAD_INDICES_MAX];
decJitCache_ = new VertexDecoderJitCache();
}
DrawEngineCommon::~DrawEngineCommon() {
delete[] quadIndices_;
delete decJitCache_;
for (auto iter = decoderMap_.begin(); iter != decoderMap_.end(); iter++) {
delete iter->second;
}
}
VertexDecoder *DrawEngineCommon::GetVertexDecoder(u32 vtype) {
auto iter = decoderMap_.find(vtype);
if (iter != decoderMap_.end())
return iter->second;
VertexDecoder *dec = new VertexDecoder();
dec->SetVertexType(vtype, decOptions_, decJitCache_);
decoderMap_[vtype] = dec;
return dec;
}
struct Plane {
float x, y, z, w;

View file

@ -18,10 +18,12 @@
#pragma once
#include <vector>
#include <unordered_map>
#include "Common/CommonTypes.h"
#include "GPU/Common/GPUDebugInterface.h"
#include "GPU/Common/VertexDecoderCommon.h"
class VertexDecoder;
@ -34,6 +36,7 @@ enum {
class DrawEngineCommon {
public:
DrawEngineCommon();
virtual ~DrawEngineCommon();
bool TestBoundingBox(void* control_points, int vertexCount, u32 vertType);
@ -46,8 +49,19 @@ public:
static u32 NormalizeVertices(u8 *outPtr, u8 *bufPtr, const u8 *inPtr, VertexDecoder *dec, int lowerBound, int upperBound, u32 vertType);
protected:
VertexDecoder *GetVertexDecoder(u32 vtype);
// Vertex collector buffers
u8 *decoded;
u16 *decIndex;
u8 *splineBuffer;
// Cached vertex decoders
std::unordered_map<u32, VertexDecoder *> decoderMap_;
VertexDecoder *dec_;
VertexDecoderJitCache *decJitCache_;
VertexDecoderOptions decOptions_;
// Fixed index buffer for easy quad generation from spline/bezier
u16 *quadIndices_;
};

View file

@ -74,8 +74,6 @@ enum {
TRANSFORMED_VERTEX_BUFFER_SIZE = VERTEX_BUFFER_MAX * sizeof(TransformedVertex)
};
#define QUAD_INDICES_MAX 65536
#define VERTEXCACHE_DECIMATION_INTERVAL 17
enum { VAI_KILL_AGE = 120, VAI_UNRELIABLE_KILL_AGE = 240, VAI_UNRELIABLE_KILL_MAX = 4 };
@ -83,7 +81,6 @@ enum { VAI_KILL_AGE = 120, VAI_UNRELIABLE_KILL_AGE = 240, VAI_UNRELIABLE_KILL_MA
TransformDrawEngineDX9::TransformDrawEngineDX9()
: decodedVerts_(0),
prevPrim_(GE_PRIM_INVALID),
dec_(0),
lastVType_(-1),
shaderManager_(0),
textureCache_(0),
@ -110,15 +107,11 @@ TransformDrawEngineDX9::TransformDrawEngineDX9()
transformed = (TransformedVertex *)AllocateMemoryPages(TRANSFORMED_VERTEX_BUFFER_SIZE);
transformedExpanded = (TransformedVertex *)AllocateMemoryPages(3 * TRANSFORMED_VERTEX_BUFFER_SIZE);
quadIndices_ = new u16[6 * QUAD_INDICES_MAX];
if (g_Config.bPrescaleUV) {
uvScale = new UVScale[MAX_DEFERRED_DRAW_CALLS];
}
indexGen.Setup(decIndex);
decJitCache_ = new VertexDecoderJitCache();
InitDeviceObjects();
}
@ -129,19 +122,12 @@ TransformDrawEngineDX9::~TransformDrawEngineDX9() {
FreeMemoryPages(splineBuffer, SPLINE_BUFFER_SIZE);
FreeMemoryPages(transformed, TRANSFORMED_VERTEX_BUFFER_SIZE);
FreeMemoryPages(transformedExpanded, 3 * TRANSFORMED_VERTEX_BUFFER_SIZE);
delete[] quadIndices_;
delete decJitCache_;
for (auto decl = vertexDeclMap_.begin(); decl != vertexDeclMap_.end(); ++decl) {
if (decl->second) {
decl->second->Release();
}
}
for (auto iter = decoderMap_.begin(); iter != decoderMap_.end(); iter++) {
delete iter->second;
}
delete [] uvScale;
}

View file

@ -221,10 +221,6 @@ private:
int decodedVerts_;
GEPrimitiveType prevPrim_;
// Cached vertex decoders
std::unordered_map<u32, VertexDecoder *> decoderMap_;
VertexDecoder *dec_;
VertexDecoderJitCache *decJitCache_;
u32 lastVType_;
TransformedVertex *transformed;
@ -232,9 +228,6 @@ private:
std::unordered_map<u32, VertexArrayInfoDX9 *> vai_;
std::unordered_map<u32, IDirect3DVertexDeclaration9 *> vertexDeclMap_;
// Fixed index buffer for easy quad generation from spline/bezier
u16 *quadIndices_;
// Other
ShaderManagerDX9 *shaderManager_;
@ -254,7 +247,6 @@ private:
UVScale *uvScale;
bool fboTexBound_;
VertexDecoderOptions decOptions_;
};
} // namespace

View file

@ -106,8 +106,6 @@ enum {
TRANSFORMED_VERTEX_BUFFER_SIZE = VERTEX_BUFFER_MAX * sizeof(TransformedVertex)
};
#define QUAD_INDICES_MAX 65536
#define VERTEXCACHE_DECIMATION_INTERVAL 17
#define VERTEXCACHE_NAME_CACHE_SIZE 64
#define VERTEXCACHE_NAME_CACHE_FULL_SIZE 80
@ -118,7 +116,6 @@ enum { VAI_KILL_AGE = 120, VAI_UNRELIABLE_KILL_AGE = 240, VAI_UNRELIABLE_KILL_MA
TransformDrawEngine::TransformDrawEngine()
: decodedVerts_(0),
prevPrim_(GE_PRIM_INVALID),
dec_(0),
lastVType_(-1),
shaderManager_(0),
textureCache_(0),
@ -141,13 +138,10 @@ TransformDrawEngine::TransformDrawEngine()
transformed = (TransformedVertex *)AllocateMemoryPages(TRANSFORMED_VERTEX_BUFFER_SIZE);
transformedExpanded = (TransformedVertex *)AllocateMemoryPages(3 * TRANSFORMED_VERTEX_BUFFER_SIZE);
quadIndices_ = new u16[6 * QUAD_INDICES_MAX];
if (g_Config.bPrescaleUV) {
uvScale = new UVScale[MAX_DEFERRED_DRAW_CALLS];
}
indexGen.Setup(decIndex);
decJitCache_ = new VertexDecoderJitCache();
InitDeviceObjects();
register_gl_resource_holder(this);
@ -160,13 +154,8 @@ TransformDrawEngine::~TransformDrawEngine() {
FreeMemoryPages(splineBuffer, SPLINE_BUFFER_SIZE);
FreeMemoryPages(transformed, TRANSFORMED_VERTEX_BUFFER_SIZE);
FreeMemoryPages(transformedExpanded, 3 * TRANSFORMED_VERTEX_BUFFER_SIZE);
delete [] quadIndices_;
unregister_gl_resource_holder(this);
delete decJitCache_;
for (auto iter = decoderMap_.begin(); iter != decoderMap_.end(); iter++) {
delete iter->second;
}
delete [] uvScale;
}
@ -241,16 +230,6 @@ static void SetupDecFmtForDraw(LinkedShader *program, const DecVtxFormat &decFmt
VertexAttribSetup(ATTR_POSITION, decFmt.posfmt, decFmt.stride, vertexData + decFmt.posoff);
}
VertexDecoder *TransformDrawEngine::GetVertexDecoder(u32 vtype) {
auto iter = decoderMap_.find(vtype);
if (iter != decoderMap_.end())
return iter->second;
VertexDecoder *dec = new VertexDecoder();
dec->SetVertexType(vtype, decOptions_, decJitCache_);
decoderMap_[vtype] = dec;
return dec;
}
void TransformDrawEngine::SetupVertexDecoder(u32 vertType) {
SetupVertexDecoderInternal(vertType);
}

View file

@ -203,8 +203,6 @@ private:
ReliableHashType ComputeHash(); // Reads deferred vertex data.
void MarkUnreliable(VertexArrayInfo *vai);
VertexDecoder *GetVertexDecoder(u32 vtype);
// Defer all vertex decoding to a Flush, so that we can hash and cache the
// generated buffers without having to redecode them every time.
struct DeferredDrawCall {
@ -223,10 +221,6 @@ private:
int decodedVerts_;
GEPrimitiveType prevPrim_;
// Cached vertex decoders
std::unordered_map<u32, VertexDecoder *> decoderMap_;
VertexDecoder *dec_;
VertexDecoderJitCache *decJitCache_;
u32 lastVType_;
TransformedVertex *transformed;
@ -234,9 +228,6 @@ private:
std::unordered_map<u32, VertexArrayInfo *> vai_;
// Fixed index buffer for easy quad generation from spline/bezier
u16 *quadIndices_;
// Vertex buffer objects
// Element buffer objects
std::vector<GLuint> bufferNameCache_;
@ -259,5 +250,4 @@ private:
UVScale *uvScale;
bool fboTexBound_;
VertexDecoderOptions decOptions_;
};