Optimized vertex and pixel shader generation. Medium FPS boost.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@500 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
3cc7e501af
commit
ba4143e82b
|
@ -302,35 +302,33 @@ const char *GeneratePixelShader()
|
|||
int numSamplers = 8;
|
||||
|
||||
char *p = text;
|
||||
WRITE(p,"//Pixel Shader for TEV stages\n");
|
||||
WRITE(p,"//%i TEV stages, %i texgens, %i IND stages, %i COL channels\n",
|
||||
WRITE(p,"//Pixel Shader for TEV stages\n\
|
||||
//%i TEV stages, %i texgens, %i IND stages, %i COL channels\n",
|
||||
bpmem.genMode.numtevstages,bpmem.genMode.numtexgens,bpmem.genMode.numindstages,bpmem.genMode.numcolchans);
|
||||
|
||||
//write kcolor declarations
|
||||
for (int i = 0; i < 4; i++)
|
||||
WRITE(p,"float4 k%i : register(c%i);\n",i,PS_CONST_KCOLORS+i);
|
||||
for (int i = 0; i < 4; i++) {
|
||||
if(i < 3) {
|
||||
WRITE(p,"float4 k%i : register(c%i);\n\
|
||||
float4 color%i : register(c%i);\n",i,PS_CONST_KCOLORS+i, i,PS_CONST_COLORS+i+1);
|
||||
} else {
|
||||
WRITE(p,"float4 k%i : register(c%i);\n",i,PS_CONST_KCOLORS+i);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
WRITE(p,"float4 color%i : register(c%i);\n",i,PS_CONST_COLORS+i+1);
|
||||
WRITE(p,"float constalpha : register(c%i);\n\
|
||||
float2 alphaRef : register(c%i);\n\n\
|
||||
sampler samp[%i] : register(s0);\n\n\
|
||||
float4 main(in float4 colors[2] : COLOR0",PS_CONST_CONSTALPHA,PS_CONST_ALPHAREF,numSamplers);
|
||||
|
||||
WRITE(p,"float constalpha : register(c%i);\n",PS_CONST_CONSTALPHA);
|
||||
WRITE(p,"float2 alphaRef : register(c%i);\n",PS_CONST_ALPHAREF);
|
||||
|
||||
WRITE(p,"\n");
|
||||
|
||||
WRITE(p,"sampler samp[%i] : register(s0);\n",numSamplers);
|
||||
|
||||
WRITE(p,"\n");
|
||||
|
||||
WRITE(p,"float4 main(in float4 colors[2] : COLOR0");
|
||||
if (numTexgen)
|
||||
WRITE(p,", float4 uv[%i] : TEXCOORD0",numTexgen);
|
||||
else
|
||||
WRITE(p,", float4 uv[1] : TEXCOORD0"); //HACK
|
||||
WRITE(p,") : COLOR\n");
|
||||
WRITE(p,"{\n");
|
||||
WRITE(p,"float4 c0=color0,c1=color1,c2=color2,prev=float4(0.0f,0.0f,0.0f,0.0f),textemp,rastemp,konsttemp;\n");
|
||||
WRITE(p,"\n");
|
||||
WRITE(p,") : COLOR\n\
|
||||
{\n\
|
||||
float4 c0=color0,c1=color1,c2=color2,prev=float4(0.0f,0.0f,0.0f,0.0f),textemp,rastemp,konsttemp;\n\
|
||||
\n");
|
||||
|
||||
for (int i = 0; i < numStages; i++)
|
||||
WriteStage(p,i); //build the equation for this stage
|
||||
|
@ -342,8 +340,7 @@ const char *GeneratePixelShader()
|
|||
else
|
||||
WRITE(p," return prev;\n");
|
||||
|
||||
WRITE(p,"}\n");
|
||||
WRITE(p,"\0");
|
||||
WRITE(p,"}\n\0");
|
||||
|
||||
return text;
|
||||
}
|
||||
|
|
|
@ -152,9 +152,15 @@ void VShaderCache::Shutdown()
|
|||
|
||||
void VShaderCache::SetShader()
|
||||
{
|
||||
static LPDIRECT3DVERTEXSHADER9 shader = NULL;
|
||||
if (D3D::GetShaderVersion() < 2)
|
||||
return; // we are screwed
|
||||
|
||||
if(shader) {
|
||||
//D3D::dev->SetVertexShader(shader);
|
||||
return;
|
||||
}
|
||||
|
||||
static LPDIRECT3DVERTEXSHADER9 lastShader = 0;
|
||||
DVSTARTPROFILE();
|
||||
|
||||
|
@ -176,7 +182,7 @@ void VShaderCache::SetShader()
|
|||
}
|
||||
|
||||
const char *code = GenerateVertexShader();
|
||||
LPDIRECT3DVERTEXSHADER9 shader = D3D::CompileVShader(code, int(strlen(code)));
|
||||
shader = D3D::CompileVShader(code, int(strlen(code)));
|
||||
if (shader)
|
||||
{
|
||||
//Make an entry in the table
|
||||
|
@ -185,6 +191,7 @@ void VShaderCache::SetShader()
|
|||
entry.frameCount=frameCount;
|
||||
vshaders[currentHash] = entry;
|
||||
}
|
||||
|
||||
D3D::dev->SetVertexShader(shader);
|
||||
|
||||
INCSTAT(stats.numVertexShadersCreated);
|
||||
|
|
|
@ -20,6 +20,46 @@
|
|||
#include "VertexShader.h"
|
||||
#include "BPStructs.h"
|
||||
|
||||
static const char *genericVS = "// Generic Vertex Shader\
|
||||
\n\
|
||||
struct VS_INPUT {\n\
|
||||
float4 pos : POSITION;\n\
|
||||
float3 normal : NORMAL;\n\
|
||||
float4 colors[2] : COLOR0;\n\
|
||||
float3 uv[8] : TEXCOORD0;\n\
|
||||
};\n\
|
||||
\n\
|
||||
struct VS_OUTPUT {\n\
|
||||
float4 pos : POSITION;\n\
|
||||
float4 colors[2] : COLOR0;\n\
|
||||
//numtexgen\n\
|
||||
float4 uv[5] : TEXCOORD0;\n\
|
||||
};\n\
|
||||
\n\
|
||||
uniform matrix matWorldViewProj : register(c0);\n\
|
||||
\n\
|
||||
VS_OUTPUT main(const VS_INPUT input)\n\
|
||||
{\n\
|
||||
VS_OUTPUT output;\n\
|
||||
\n\
|
||||
output.pos = mul(matWorldViewProj, input.pos);\n\
|
||||
// texgen\n\
|
||||
output.uv[0] = float4(input.uv[0].xy,0,input.uv[0].z);\n\
|
||||
output.uv[1] = float4(input.uv[1].xy,0,input.uv[1].z);\n\
|
||||
output.uv[2] = float4(input.uv[2].xy,0,input.uv[2].z);\n\
|
||||
output.uv[3] = float4(input.uv[3].xy,0,input.uv[3].z);\n\
|
||||
output.uv[4] = float4(input.uv[4].xy,0,input.uv[4].z);\n\
|
||||
\n\
|
||||
for (int i=0; i<2; i++)\n output.colors[i] = input.colors[i];\n\
|
||||
return output;\n\
|
||||
}\0";
|
||||
|
||||
const char *GenerateVertexShader() {
|
||||
return genericVS;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
char text2[65536];
|
||||
#define WRITE p+=sprintf
|
||||
|
||||
|
@ -91,7 +131,7 @@ const char *GenerateVertexShader()
|
|||
/*
|
||||
* xform->vertexshader ideas
|
||||
|
||||
*/
|
||||
*//*
|
||||
|
||||
void WriteTexgen(char *&p, int n)
|
||||
{
|
||||
|
@ -102,4 +142,4 @@ void WriteTexgen(char *&p, int n)
|
|||
void WriteLight(int color, int component)
|
||||
{
|
||||
|
||||
}
|
||||
} */
|
||||
|
|
Loading…
Reference in New Issue