diff --git a/GPU/Common/DrawEngineCommon.cpp b/GPU/Common/DrawEngineCommon.cpp index bf3f713d67..940a1c3bb9 100644 --- a/GPU/Common/DrawEngineCommon.cpp +++ b/GPU/Common/DrawEngineCommon.cpp @@ -25,7 +25,30 @@ #include -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; diff --git a/GPU/Common/DrawEngineCommon.h b/GPU/Common/DrawEngineCommon.h index b09ef1a62e..dbce8b44a2 100644 --- a/GPU/Common/DrawEngineCommon.h +++ b/GPU/Common/DrawEngineCommon.h @@ -18,10 +18,12 @@ #pragma once #include +#include #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 decoderMap_; + VertexDecoder *dec_; + VertexDecoderJitCache *decJitCache_; + VertexDecoderOptions decOptions_; + + // Fixed index buffer for easy quad generation from spline/bezier + u16 *quadIndices_; }; diff --git a/GPU/Directx9/TransformPipelineDX9.cpp b/GPU/Directx9/TransformPipelineDX9.cpp index 849fce7810..533fcffd9c 100644 --- a/GPU/Directx9/TransformPipelineDX9.cpp +++ b/GPU/Directx9/TransformPipelineDX9.cpp @@ -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; } diff --git a/GPU/Directx9/TransformPipelineDX9.h b/GPU/Directx9/TransformPipelineDX9.h index 37dbdfcd3d..e46b7c1fc0 100644 --- a/GPU/Directx9/TransformPipelineDX9.h +++ b/GPU/Directx9/TransformPipelineDX9.h @@ -221,10 +221,6 @@ private: int decodedVerts_; GEPrimitiveType prevPrim_; - // Cached vertex decoders - std::unordered_map decoderMap_; - VertexDecoder *dec_; - VertexDecoderJitCache *decJitCache_; u32 lastVType_; TransformedVertex *transformed; @@ -232,9 +228,6 @@ private: std::unordered_map vai_; std::unordered_map 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 diff --git a/GPU/GLES/TransformPipeline.cpp b/GPU/GLES/TransformPipeline.cpp index 2c93af3fee..0ccba4ccaf 100644 --- a/GPU/GLES/TransformPipeline.cpp +++ b/GPU/GLES/TransformPipeline.cpp @@ -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); } diff --git a/GPU/GLES/TransformPipeline.h b/GPU/GLES/TransformPipeline.h index 34fcb6bcc6..6175b2f8b7 100644 --- a/GPU/GLES/TransformPipeline.h +++ b/GPU/GLES/TransformPipeline.h @@ -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 decoderMap_; - VertexDecoder *dec_; - VertexDecoderJitCache *decJitCache_; u32 lastVType_; TransformedVertex *transformed; @@ -234,9 +228,6 @@ private: std::unordered_map vai_; - // Fixed index buffer for easy quad generation from spline/bezier - u16 *quadIndices_; - // Vertex buffer objects // Element buffer objects std::vector bufferNameCache_; @@ -259,5 +250,4 @@ private: UVScale *uvScale; bool fboTexBound_; - VertexDecoderOptions decOptions_; };