From 60a5a592f9fe6a3572b509578897d03ca4172c71 Mon Sep 17 00:00:00 2001 From: "XTra.KrazzY" Date: Tue, 26 Aug 2008 23:11:15 +0000 Subject: [PATCH] A little housekeeping on Vertex Shader in DX9. Pending more work but my shader code is still too buggy to commit. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@330 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Plugins/Plugin_VideoDX9/Src/Render.cpp | 1 + .../Plugin_VideoDX9/Src/ShaderManager.cpp | 19 +++--- .../Plugin_VideoDX9/Src/ShaderManager.h | 2 +- .../Plugin_VideoDX9/Src/TransformEngine.cpp | 10 ++-- .../Plugin_VideoDX9/Src/VertexLoader.cpp | 16 ++--- .../Plugin_VideoDX9/Src/VertexLoader.h | 60 ++++++++++--------- .../Plugin_VideoDX9/Src/VertexShader.cpp | 35 +---------- .../Plugin_VideoDX9/Src/VertexShader.h | 5 +- 8 files changed, 62 insertions(+), 86 deletions(-) diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp index 97d326eadd..cd6d548f49 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp @@ -227,6 +227,7 @@ void Renderer::SwapBuffers(void) //clean out old stuff from caches frameCount++; PShaderCache::Cleanup(); + VShaderCache::Cleanup(); TextureCache::Cleanup(); //DListCache::Cleanup(); diff --git a/Source/Plugins/Plugin_VideoDX9/Src/ShaderManager.cpp b/Source/Plugins/Plugin_VideoDX9/Src/ShaderManager.cpp index 9b28e8ce0c..3f8517d8e2 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/ShaderManager.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/ShaderManager.cpp @@ -2,6 +2,7 @@ #include "Utils.h" #include "Globals.h" #include "ShaderManager.h" +#include "VertexLoader.h" #include "BPMemory.h" #include "XFMemory.h" @@ -40,7 +41,6 @@ VShaderCache::VSCache VShaderCache::vshaders; void PShaderCache::Init() { - } @@ -49,7 +49,7 @@ void PShaderCache::Shutdown() PSCache::iterator iter = pshaders.begin(); for (;iter!=pshaders.end();iter++) iter->second.Destroy(); - pshaders.clear(); + pshaders.clear(); } @@ -79,7 +79,7 @@ void PShaderCache::SetShader() } const char *code = GeneratePixelShader(); - LPDIRECT3DPIXELSHADER9 shader = D3D::CompilePShader(code, strlen(code)); + LPDIRECT3DPIXELSHADER9 shader = D3D::CompilePShader(code, int(strlen(code))); if (shader) { //Make an entry in the table @@ -135,8 +135,13 @@ void VShaderCache::Shutdown() void VShaderCache::SetShader() { + if (D3D::GetShaderVersion() < 2) + return; // we are screwed + static LPDIRECT3DVERTEXSHADER9 lastShader = 0; - xformhash currentHash = GetCurrentXForm(); + DVSTARTPROFILE(); + + tevhash currentHash = GetCurrentTEV(); VSCache::iterator iter; iter = vshaders.find(currentHash); @@ -153,8 +158,8 @@ void VShaderCache::SetShader() return; } - LPDIRECT3DVERTEXSHADER9 shader = GenerateVertexShader(); - + const char *code = GenerateVertexShader(); + LPDIRECT3DVERTEXSHADER9 shader = D3D::CompileVShader(code, int(strlen(code))); if (shader) { //Make an entry in the table @@ -180,5 +185,5 @@ void VShaderCache::Cleanup() iter = vshaders.erase(iter); } } - SETSTAT(stats.numPixelShadersAlive, (int)vshaders.size()); + SETSTAT(stats.numVertexShadersAlive, (int)vshaders.size()); } diff --git a/Source/Plugins/Plugin_VideoDX9/Src/ShaderManager.h b/Source/Plugins/Plugin_VideoDX9/Src/ShaderManager.h index dd53640526..56df43cd88 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/ShaderManager.h +++ b/Source/Plugins/Plugin_VideoDX9/Src/ShaderManager.h @@ -64,7 +64,7 @@ class VShaderCache } }; - typedef std::map VSCache; + typedef std::map VSCache; static VSCache vshaders; diff --git a/Source/Plugins/Plugin_VideoDX9/Src/TransformEngine.cpp b/Source/Plugins/Plugin_VideoDX9/Src/TransformEngine.cpp index cf7be9422c..ee8cc62249 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/TransformEngine.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/TransformEngine.cpp @@ -126,7 +126,7 @@ void CTransformEngine::TransformVertices(int _numVertices, const DecodedVArray * Vec3 OrigPos = varray->GetPos(i); - if (varray->GetComponents() & VB_HAS_POSMTXIDX) + if (varray->GetComponents() & VertexLoader::VB_HAS_POSMTXIDX) { int index = varray->GetPosMtxInd(i); SetPosNormalMatrix( @@ -136,7 +136,7 @@ void CTransformEngine::TransformVertices(int _numVertices, const DecodedVArray * for (int j = 0; j < 8; j++) { - if (varray->GetComponents() & (VB_HAS_TEXMTXIDX0<GetComponents() & (VertexLoader::VB_HAS_TEXMTXIDX0<GetTexMtxInd(j, i); @@ -151,7 +151,7 @@ void CTransformEngine::TransformVertices(int _numVertices, const DecodedVArray * Vec3 TempNormal; Vec3 OrigNormal; - if (varray->GetComponents() & VB_HAS_NRM0) + if (varray->GetComponents() & VertexLoader::VB_HAS_NRM0) { OrigNormal = varray->GetNormal(0, i); VtxMulMtx33(TempNormal, OrigNormal, m_pNormalMatrix); @@ -180,7 +180,7 @@ void CTransformEngine::TransformVertices(int _numVertices, const DecodedVArray * RGBAFloat material; RGBAFloat lightSum(0,0,0,0); - bool hasColorJ = (varray->GetComponents() & (VB_HAS_COL0 << j)) != 0; + bool hasColorJ = (varray->GetComponents() & (VertexLoader::VB_HAS_COL0 << j)) != 0; //get basic material color from appropriate sources (this would compile nicely!:) if (xfregs.colChans[j].color.matsource == GX_SRC_REG) @@ -295,7 +295,7 @@ void CTransformEngine::TransformVertices(int _numVertices, const DecodedVArray * default: { int c = xfregs.texcoords[n].texmtxinfo.sourcerow - XF_SRCTEX0_INROW; - bool hasTCC = (varray->GetComponents() & (VB_HAS_UV0 << c)) != 0; + bool hasTCC = (varray->GetComponents() & (VertexLoader::VB_HAS_UV0 << c)) != 0; if (c >= 0 && c <= 7 && hasTCC) { const DecUV &uv = varray->GetUV(c, i); diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader.cpp b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader.cpp index 8faef5e046..fded121078 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader.cpp @@ -27,22 +27,22 @@ DecodedVArray *varray; int ComputeVertexSize(u32 comp) { int size = 0; - if (comp & VB_HAS_POSMTXIDX) + if (comp & VertexLoader::VB_HAS_POSMTXIDX) size += 4; - if (comp & (VB_HAS_TEXMTXIDX0 | VB_HAS_TEXMTXIDX1 | VB_HAS_TEXMTXIDX2 | VB_HAS_TEXMTXIDX3)) + if (comp & (VertexLoader::VB_HAS_TEXMTXIDX0 | VertexLoader::VB_HAS_TEXMTXIDX1 | VertexLoader::VB_HAS_TEXMTXIDX2 | VertexLoader::VB_HAS_TEXMTXIDX3)) size += 4; - if (comp & (VB_HAS_TEXMTXIDX4 | VB_HAS_TEXMTXIDX5 | VB_HAS_TEXMTXIDX6 | VB_HAS_TEXMTXIDX7)) + if (comp & (VertexLoader::VB_HAS_TEXMTXIDX4 | VertexLoader::VB_HAS_TEXMTXIDX5 | VertexLoader::VB_HAS_TEXMTXIDX6 | VertexLoader::VB_HAS_TEXMTXIDX7)) size += 4; - if (comp & VB_HAS_NRM0) + if (comp & VertexLoader::VB_HAS_NRM0) size += 4; - if (comp & (VB_HAS_NRM1 | VB_HAS_NRM2)) //combine into single check for speed + if (comp & (VertexLoader::VB_HAS_NRM1 | VertexLoader::VB_HAS_NRM2)) //combine into single check for speed size += 8; - if (comp & VB_HAS_COL0) + if (comp & VertexLoader::VB_HAS_COL0) size += 4; - if (comp & VB_HAS_COL1) + if (comp & VertexLoader::VB_HAS_COL1) size += 4; for (int i = 0; i < 8; i++) - if (comp & (VB_HAS_UV0 << i)) + if (comp & (VertexLoader::VB_HAS_UV0 << i)) size += 8; return size; } diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader.h b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader.h index fcd7c9a165..cf8f6dbd59 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader.h +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexLoader.h @@ -24,34 +24,6 @@ The decision will be how granular to be with the number of shaders and lighting */ -enum { - VB_HAS_POSMTXIDX =(1<<1), - VB_HAS_TEXMTXIDX0=(1<<2), - VB_HAS_TEXMTXIDX1=(1<<3), - VB_HAS_TEXMTXIDX2=(1<<4), - VB_HAS_TEXMTXIDX3=(1<<5), - VB_HAS_TEXMTXIDX4=(1<<6), - VB_HAS_TEXMTXIDX5=(1<<7), - VB_HAS_TEXMTXIDX6=(1<<8), - VB_HAS_TEXMTXIDX7=(1<<9), - //VB_HAS_POS=0, // Implied, it always has pos! don't bother testing - VB_HAS_NRM0=(1<<10), - VB_HAS_NRM1=(1<<11), - VB_HAS_NRM2=(1<<12), - - VB_HAS_COL0=(1<<13), - VB_HAS_COL1=(1<<14), - - VB_HAS_UV0=(1<<15), - VB_HAS_UV1=(1<<16), - VB_HAS_UV2=(1<<17), - VB_HAS_UV3=(1<<18), - VB_HAS_UV4=(1<<19), - VB_HAS_UV5=(1<<20), - VB_HAS_UV6=(1<<21), - VB_HAS_UV7=(1<<22), -}; - int ComputeVertexSize(u32 components); #include "CPStructs.h" @@ -70,6 +42,38 @@ public: NRM_THREE = 3 }; + enum { + VB_HAS_POSMTXIDX =(1<<1), + VB_HAS_TEXMTXIDX0=(1<<2), + VB_HAS_TEXMTXIDX1=(1<<3), + VB_HAS_TEXMTXIDX2=(1<<4), + VB_HAS_TEXMTXIDX3=(1<<5), + VB_HAS_TEXMTXIDX4=(1<<6), + VB_HAS_TEXMTXIDX5=(1<<7), + VB_HAS_TEXMTXIDX6=(1<<8), + VB_HAS_TEXMTXIDX7=(1<<9), + VB_HAS_TEXMTXIDXALL=(0xff<<2), + //VB_HAS_POS=0, // Implied, it always has pos! don't bother testing + VB_HAS_NRM0=(1<<10), + VB_HAS_NRM1=(1<<11), + VB_HAS_NRM2=(1<<12), + VB_HAS_NRMALL=(7<<10), + + VB_HAS_COL0=(1<<13), + VB_HAS_COL1=(1<<14), + + VB_HAS_UV0=(1<<15), + VB_HAS_UV1=(1<<16), + VB_HAS_UV2=(1<<17), + VB_HAS_UV3=(1<<18), + VB_HAS_UV4=(1<<19), + VB_HAS_UV5=(1<<20), + VB_HAS_UV6=(1<<21), + VB_HAS_UV7=(1<<22), + VB_HAS_UVALL=(0xff<<15), + VB_HAS_UVTEXMTXSHIFT=13, + }; + private: TPipelineFunction m_PipelineStates[32]; int m_numPipelineStates; diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexShader.cpp b/Source/Plugins/Plugin_VideoDX9/Src/VertexShader.cpp index fc0c67c9e7..73ce660221 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/VertexShader.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexShader.cpp @@ -3,43 +3,12 @@ #include "VertexShader.h" #include "BPStructs.h" - - - - -//I hope we don't get too many hash collisions :p -//all these magic numbers are primes, it should help a bit -xformhash GetCurrentXForm() -{ - //return 0; - xformhash hash = bpmem.genMode.numtexgens*8*17; -/* - for (int i=0; i