mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-21 13:20:27 -06:00
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:
@ -302,35 +302,33 @@ const char *GeneratePixelShader()
|
|||||||
int numSamplers = 8;
|
int numSamplers = 8;
|
||||||
|
|
||||||
char *p = text;
|
char *p = text;
|
||||||
WRITE(p,"//Pixel Shader for TEV stages\n");
|
WRITE(p,"//Pixel Shader for TEV stages\n\
|
||||||
WRITE(p,"//%i TEV stages, %i texgens, %i IND stages, %i COL channels\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);
|
bpmem.genMode.numtevstages,bpmem.genMode.numtexgens,bpmem.genMode.numindstages,bpmem.genMode.numcolchans);
|
||||||
|
|
||||||
//write kcolor declarations
|
//write kcolor declarations
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++) {
|
||||||
WRITE(p,"float4 k%i : register(c%i);\n",i,PS_CONST_KCOLORS+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,"float constalpha : register(c%i);\n\
|
||||||
WRITE(p,"float4 color%i : register(c%i);\n",i,PS_CONST_COLORS+i+1);
|
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)
|
if (numTexgen)
|
||||||
WRITE(p,", float4 uv[%i] : TEXCOORD0",numTexgen);
|
WRITE(p,", float4 uv[%i] : TEXCOORD0",numTexgen);
|
||||||
else
|
else
|
||||||
WRITE(p,", float4 uv[1] : TEXCOORD0"); //HACK
|
WRITE(p,", float4 uv[1] : TEXCOORD0"); //HACK
|
||||||
WRITE(p,") : COLOR\n");
|
WRITE(p,") : COLOR\n\
|
||||||
WRITE(p,"{\n");
|
{\n\
|
||||||
WRITE(p,"float4 c0=color0,c1=color1,c2=color2,prev=float4(0.0f,0.0f,0.0f,0.0f),textemp,rastemp,konsttemp;\n");
|
float4 c0=color0,c1=color1,c2=color2,prev=float4(0.0f,0.0f,0.0f,0.0f),textemp,rastemp,konsttemp;\n\
|
||||||
WRITE(p,"\n");
|
\n");
|
||||||
|
|
||||||
for (int i = 0; i < numStages; i++)
|
for (int i = 0; i < numStages; i++)
|
||||||
WriteStage(p,i); //build the equation for this stage
|
WriteStage(p,i); //build the equation for this stage
|
||||||
@ -342,8 +340,7 @@ const char *GeneratePixelShader()
|
|||||||
else
|
else
|
||||||
WRITE(p," return prev;\n");
|
WRITE(p," return prev;\n");
|
||||||
|
|
||||||
WRITE(p,"}\n");
|
WRITE(p,"}\n\0");
|
||||||
WRITE(p,"\0");
|
|
||||||
|
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
@ -152,9 +152,15 @@ void VShaderCache::Shutdown()
|
|||||||
|
|
||||||
void VShaderCache::SetShader()
|
void VShaderCache::SetShader()
|
||||||
{
|
{
|
||||||
|
static LPDIRECT3DVERTEXSHADER9 shader = NULL;
|
||||||
if (D3D::GetShaderVersion() < 2)
|
if (D3D::GetShaderVersion() < 2)
|
||||||
return; // we are screwed
|
return; // we are screwed
|
||||||
|
|
||||||
|
if(shader) {
|
||||||
|
//D3D::dev->SetVertexShader(shader);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
static LPDIRECT3DVERTEXSHADER9 lastShader = 0;
|
static LPDIRECT3DVERTEXSHADER9 lastShader = 0;
|
||||||
DVSTARTPROFILE();
|
DVSTARTPROFILE();
|
||||||
|
|
||||||
@ -176,7 +182,7 @@ void VShaderCache::SetShader()
|
|||||||
}
|
}
|
||||||
|
|
||||||
const char *code = GenerateVertexShader();
|
const char *code = GenerateVertexShader();
|
||||||
LPDIRECT3DVERTEXSHADER9 shader = D3D::CompileVShader(code, int(strlen(code)));
|
shader = D3D::CompileVShader(code, int(strlen(code)));
|
||||||
if (shader)
|
if (shader)
|
||||||
{
|
{
|
||||||
//Make an entry in the table
|
//Make an entry in the table
|
||||||
@ -185,6 +191,7 @@ void VShaderCache::SetShader()
|
|||||||
entry.frameCount=frameCount;
|
entry.frameCount=frameCount;
|
||||||
vshaders[currentHash] = entry;
|
vshaders[currentHash] = entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D::dev->SetVertexShader(shader);
|
D3D::dev->SetVertexShader(shader);
|
||||||
|
|
||||||
INCSTAT(stats.numVertexShadersCreated);
|
INCSTAT(stats.numVertexShadersCreated);
|
||||||
|
@ -20,6 +20,46 @@
|
|||||||
#include "VertexShader.h"
|
#include "VertexShader.h"
|
||||||
#include "BPStructs.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];
|
char text2[65536];
|
||||||
#define WRITE p+=sprintf
|
#define WRITE p+=sprintf
|
||||||
|
|
||||||
@ -91,7 +131,7 @@ const char *GenerateVertexShader()
|
|||||||
/*
|
/*
|
||||||
* xform->vertexshader ideas
|
* xform->vertexshader ideas
|
||||||
|
|
||||||
*/
|
*//*
|
||||||
|
|
||||||
void WriteTexgen(char *&p, int n)
|
void WriteTexgen(char *&p, int n)
|
||||||
{
|
{
|
||||||
@ -102,4 +142,4 @@ void WriteTexgen(char *&p, int n)
|
|||||||
void WriteLight(int color, int component)
|
void WriteLight(int color, int component)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
} */
|
||||||
|
Reference in New Issue
Block a user