mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-14 00:09:24 +01:00
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
This commit is contained in:
parent
59974dfb5b
commit
60a5a592f9
@ -227,6 +227,7 @@ void Renderer::SwapBuffers(void)
|
|||||||
//clean out old stuff from caches
|
//clean out old stuff from caches
|
||||||
frameCount++;
|
frameCount++;
|
||||||
PShaderCache::Cleanup();
|
PShaderCache::Cleanup();
|
||||||
|
VShaderCache::Cleanup();
|
||||||
TextureCache::Cleanup();
|
TextureCache::Cleanup();
|
||||||
//DListCache::Cleanup();
|
//DListCache::Cleanup();
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
#include "ShaderManager.h"
|
#include "ShaderManager.h"
|
||||||
|
#include "VertexLoader.h"
|
||||||
#include "BPMemory.h"
|
#include "BPMemory.h"
|
||||||
#include "XFMemory.h"
|
#include "XFMemory.h"
|
||||||
|
|
||||||
@ -40,7 +41,6 @@ VShaderCache::VSCache VShaderCache::vshaders;
|
|||||||
void PShaderCache::Init()
|
void PShaderCache::Init()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ void PShaderCache::SetShader()
|
|||||||
}
|
}
|
||||||
|
|
||||||
const char *code = GeneratePixelShader();
|
const char *code = GeneratePixelShader();
|
||||||
LPDIRECT3DPIXELSHADER9 shader = D3D::CompilePShader(code, strlen(code));
|
LPDIRECT3DPIXELSHADER9 shader = D3D::CompilePShader(code, int(strlen(code)));
|
||||||
if (shader)
|
if (shader)
|
||||||
{
|
{
|
||||||
//Make an entry in the table
|
//Make an entry in the table
|
||||||
@ -135,8 +135,13 @@ void VShaderCache::Shutdown()
|
|||||||
|
|
||||||
void VShaderCache::SetShader()
|
void VShaderCache::SetShader()
|
||||||
{
|
{
|
||||||
|
if (D3D::GetShaderVersion() < 2)
|
||||||
|
return; // we are screwed
|
||||||
|
|
||||||
static LPDIRECT3DVERTEXSHADER9 lastShader = 0;
|
static LPDIRECT3DVERTEXSHADER9 lastShader = 0;
|
||||||
xformhash currentHash = GetCurrentXForm();
|
DVSTARTPROFILE();
|
||||||
|
|
||||||
|
tevhash currentHash = GetCurrentTEV();
|
||||||
|
|
||||||
VSCache::iterator iter;
|
VSCache::iterator iter;
|
||||||
iter = vshaders.find(currentHash);
|
iter = vshaders.find(currentHash);
|
||||||
@ -153,8 +158,8 @@ void VShaderCache::SetShader()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LPDIRECT3DVERTEXSHADER9 shader = GenerateVertexShader();
|
const char *code = GenerateVertexShader();
|
||||||
|
LPDIRECT3DVERTEXSHADER9 shader = D3D::CompileVShader(code, int(strlen(code)));
|
||||||
if (shader)
|
if (shader)
|
||||||
{
|
{
|
||||||
//Make an entry in the table
|
//Make an entry in the table
|
||||||
@ -180,5 +185,5 @@ void VShaderCache::Cleanup()
|
|||||||
iter = vshaders.erase(iter);
|
iter = vshaders.erase(iter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SETSTAT(stats.numPixelShadersAlive, (int)vshaders.size());
|
SETSTAT(stats.numVertexShadersAlive, (int)vshaders.size());
|
||||||
}
|
}
|
||||||
|
@ -64,7 +64,7 @@ class VShaderCache
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::map<xformhash,VSCacheEntry> VSCache;
|
typedef std::map<tevhash,VSCacheEntry> VSCache;
|
||||||
|
|
||||||
static VSCache vshaders;
|
static VSCache vshaders;
|
||||||
|
|
||||||
|
@ -126,7 +126,7 @@ void CTransformEngine::TransformVertices(int _numVertices, const DecodedVArray *
|
|||||||
|
|
||||||
Vec3 OrigPos = varray->GetPos(i);
|
Vec3 OrigPos = varray->GetPos(i);
|
||||||
|
|
||||||
if (varray->GetComponents() & VB_HAS_POSMTXIDX)
|
if (varray->GetComponents() & VertexLoader::VB_HAS_POSMTXIDX)
|
||||||
{
|
{
|
||||||
int index = varray->GetPosMtxInd(i);
|
int index = varray->GetPosMtxInd(i);
|
||||||
SetPosNormalMatrix(
|
SetPosNormalMatrix(
|
||||||
@ -136,7 +136,7 @@ void CTransformEngine::TransformVertices(int _numVertices, const DecodedVArray *
|
|||||||
|
|
||||||
for (int j = 0; j < 8; j++)
|
for (int j = 0; j < 8; j++)
|
||||||
{
|
{
|
||||||
if (varray->GetComponents() & (VB_HAS_TEXMTXIDX0<<j))
|
if (varray->GetComponents() & (VertexLoader::VB_HAS_TEXMTXIDX0<<j))
|
||||||
{
|
{
|
||||||
float *flipmem = (float *)xfmem;
|
float *flipmem = (float *)xfmem;
|
||||||
int index = varray->GetTexMtxInd(j, i);
|
int index = varray->GetTexMtxInd(j, i);
|
||||||
@ -151,7 +151,7 @@ void CTransformEngine::TransformVertices(int _numVertices, const DecodedVArray *
|
|||||||
|
|
||||||
Vec3 TempNormal;
|
Vec3 TempNormal;
|
||||||
Vec3 OrigNormal;
|
Vec3 OrigNormal;
|
||||||
if (varray->GetComponents() & VB_HAS_NRM0)
|
if (varray->GetComponents() & VertexLoader::VB_HAS_NRM0)
|
||||||
{
|
{
|
||||||
OrigNormal = varray->GetNormal(0, i);
|
OrigNormal = varray->GetNormal(0, i);
|
||||||
VtxMulMtx33(TempNormal, OrigNormal, m_pNormalMatrix);
|
VtxMulMtx33(TempNormal, OrigNormal, m_pNormalMatrix);
|
||||||
@ -180,7 +180,7 @@ void CTransformEngine::TransformVertices(int _numVertices, const DecodedVArray *
|
|||||||
RGBAFloat material;
|
RGBAFloat material;
|
||||||
RGBAFloat lightSum(0,0,0,0);
|
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!:)
|
//get basic material color from appropriate sources (this would compile nicely!:)
|
||||||
if (xfregs.colChans[j].color.matsource == GX_SRC_REG)
|
if (xfregs.colChans[j].color.matsource == GX_SRC_REG)
|
||||||
@ -295,7 +295,7 @@ void CTransformEngine::TransformVertices(int _numVertices, const DecodedVArray *
|
|||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
int c = xfregs.texcoords[n].texmtxinfo.sourcerow - XF_SRCTEX0_INROW;
|
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)
|
if (c >= 0 && c <= 7 && hasTCC)
|
||||||
{
|
{
|
||||||
const DecUV &uv = varray->GetUV(c, i);
|
const DecUV &uv = varray->GetUV(c, i);
|
||||||
|
@ -27,22 +27,22 @@ DecodedVArray *varray;
|
|||||||
int ComputeVertexSize(u32 comp)
|
int ComputeVertexSize(u32 comp)
|
||||||
{
|
{
|
||||||
int size = 0;
|
int size = 0;
|
||||||
if (comp & VB_HAS_POSMTXIDX)
|
if (comp & VertexLoader::VB_HAS_POSMTXIDX)
|
||||||
size += 4;
|
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;
|
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;
|
size += 4;
|
||||||
if (comp & VB_HAS_NRM0)
|
if (comp & VertexLoader::VB_HAS_NRM0)
|
||||||
size += 4;
|
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;
|
size += 8;
|
||||||
if (comp & VB_HAS_COL0)
|
if (comp & VertexLoader::VB_HAS_COL0)
|
||||||
size += 4;
|
size += 4;
|
||||||
if (comp & VB_HAS_COL1)
|
if (comp & VertexLoader::VB_HAS_COL1)
|
||||||
size += 4;
|
size += 4;
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
if (comp & (VB_HAS_UV0 << i))
|
if (comp & (VertexLoader::VB_HAS_UV0 << i))
|
||||||
size += 8;
|
size += 8;
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
int ComputeVertexSize(u32 components);
|
||||||
|
|
||||||
#include "CPStructs.h"
|
#include "CPStructs.h"
|
||||||
@ -70,6 +42,38 @@ public:
|
|||||||
NRM_THREE = 3
|
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:
|
private:
|
||||||
TPipelineFunction m_PipelineStates[32];
|
TPipelineFunction m_PipelineStates[32];
|
||||||
int m_numPipelineStates;
|
int m_numPipelineStates;
|
||||||
|
@ -3,43 +3,12 @@
|
|||||||
#include "VertexShader.h"
|
#include "VertexShader.h"
|
||||||
#include "BPStructs.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<bpmem.genMode.numtevstages+1; i++)
|
|
||||||
{
|
|
||||||
hash = _rotl(hash,3) ^ (bpmem.combiners[i].colorC.hex*13);
|
|
||||||
hash = _rotl(hash,7) ^ ((bpmem.combiners[i].alphaC.hex&0xFFFFFFFC)*3);
|
|
||||||
}
|
|
||||||
for (int i=0; i<bpmem.genMode.numtevstages/2+1; i++)
|
|
||||||
{
|
|
||||||
hash = _rotl(hash,13) ^ (bpmem.tevorders[i].hex*7);
|
|
||||||
}
|
|
||||||
for (int i=0; i<8; i++)
|
|
||||||
{
|
|
||||||
hash = _rotl(hash,3) ^ bpmem.tevksel[i].swap1;
|
|
||||||
hash = _rotl(hash,3) ^ bpmem.tevksel[i].swap2;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// to hash: bpmem.tevorders[j/2].getTexCoord(j&1);
|
|
||||||
// also texcoords array
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
char text2[65536];
|
char text2[65536];
|
||||||
#define WRITE p+=sprintf
|
#define WRITE p+=sprintf
|
||||||
|
|
||||||
void WriteTexgen(char *&p, int n);
|
void WriteTexgen(char *&p, int n);
|
||||||
|
|
||||||
LPDIRECT3DVERTEXSHADER9 GenerateVertexShader()
|
const char *GenerateVertexShader()
|
||||||
{
|
{
|
||||||
int numColors = 2;
|
int numColors = 2;
|
||||||
int numUV = 8;
|
int numUV = 8;
|
||||||
@ -97,7 +66,7 @@ LPDIRECT3DVERTEXSHADER9 GenerateVertexShader()
|
|||||||
WRITE(p,"\0");
|
WRITE(p,"\0");
|
||||||
|
|
||||||
// MessageBox(0,text2,0,0);
|
// MessageBox(0,text2,0,0);
|
||||||
return D3D::CompileVShader(text2,(int)(p-text2));
|
return text2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,10 +3,7 @@
|
|||||||
|
|
||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
|
|
||||||
typedef u32 xformhash;
|
const char *GenerateVertexShader();
|
||||||
|
|
||||||
xformhash GetCurrentXForm();
|
|
||||||
LPDIRECT3DVERTEXSHADER9 GenerateVertexShader();
|
|
||||||
|
|
||||||
#define PS_CONST_COLORS 0
|
#define PS_CONST_COLORS 0
|
||||||
#define PS_CONST_KCOLORS 4
|
#define PS_CONST_KCOLORS 4
|
||||||
|
Loading…
x
Reference in New Issue
Block a user