Fixed Function HLSL : Optimized ColorVertex handling in DoMaterial, by removing it's check froM HLSL, and replace that by CPU replacing all MaterialSource's with D3DMCS_MATERIAL when X_D3DRS_COLORVERTEX is disabled. This shaves off 13 vertex shader instructions.
This commit is contained in:
parent
0245cc6ee8
commit
39e91ffec6
|
@ -6378,20 +6378,20 @@ void UpdateFixedFunctionVertexShaderState()
|
|||
ffShaderState.Modes.TwoSidedLighting = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_TWOSIDEDLIGHTING);
|
||||
ffShaderState.Modes.SpecularEnable = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_SPECULARENABLE);
|
||||
ffShaderState.Modes.LocalViewer = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_LOCALVIEWER);
|
||||
ffShaderState.Modes.ColorVertex = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_COLORVERTEX);
|
||||
bool ColorVertex = XboxRenderStates.GetXboxRenderState(X_D3DRS_COLORVERTEX) != FALSE;
|
||||
|
||||
D3DXVECTOR4 Ambient = toVector(XboxRenderStates.GetXboxRenderState(X_D3DRS_AMBIENT));
|
||||
D3DXVECTOR4 BackAmbient = toVector(XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKAMBIENT));
|
||||
|
||||
// Material sources
|
||||
ffShaderState.Modes.AmbientMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_AMBIENTMATERIALSOURCE);
|
||||
ffShaderState.Modes.DiffuseMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_DIFFUSEMATERIALSOURCE);
|
||||
ffShaderState.Modes.SpecularMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_SPECULARMATERIALSOURCE);
|
||||
ffShaderState.Modes.EmissiveMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_EMISSIVEMATERIALSOURCE);
|
||||
ffShaderState.Modes.BackAmbientMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKAMBIENTMATERIALSOURCE);
|
||||
ffShaderState.Modes.BackDiffuseMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKDIFFUSEMATERIALSOURCE);
|
||||
ffShaderState.Modes.BackSpecularMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKSPECULARMATERIALSOURCE);
|
||||
ffShaderState.Modes.BackEmissiveMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKEMISSIVEMATERIALSOURCE);
|
||||
ffShaderState.Modes.AmbientMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_AMBIENTMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||
ffShaderState.Modes.DiffuseMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_DIFFUSEMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||
ffShaderState.Modes.SpecularMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_SPECULARMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||
ffShaderState.Modes.EmissiveMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_EMISSIVEMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||
ffShaderState.Modes.BackAmbientMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKAMBIENTMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||
ffShaderState.Modes.BackDiffuseMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKDIFFUSEMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||
ffShaderState.Modes.BackSpecularMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKSPECULARMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||
ffShaderState.Modes.BackEmissiveMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKEMISSIVEMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||
|
||||
// Point sprites
|
||||
auto pointSize = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSIZE);
|
||||
|
|
|
@ -317,32 +317,30 @@ Material DoMaterial(const uint index, const uint diffuseReg, const uint specular
|
|||
// Get the material from material state
|
||||
Material material = state.Materials[index];
|
||||
|
||||
if (state.Modes.ColorVertex)
|
||||
{
|
||||
// https://docs.microsoft.com/en-us/windows/win32/direct3d9/d3dmaterialcolorsource
|
||||
const int D3DMCS_MATERIAL = 0;
|
||||
const int D3DMCS_COLOR1 = 1;
|
||||
const int D3DMCS_COLOR2 = 2;
|
||||
// Note : If X_D3DRS_COLORVERTEX is FALSE, UpdateFixedFunctionVertexShaderState has already changed all MaterialSource's into D3DMCS_MATERIAL
|
||||
|
||||
// TODO preprocess on the CPU
|
||||
// If COLORVERTEX mode, AND the desired diffuse or specular colour is defined in the vertex declaration
|
||||
// Then use the vertex colour instead of the material
|
||||
// https://docs.microsoft.com/en-us/windows/win32/direct3d9/d3dmaterialcolorsource
|
||||
const int D3DMCS_MATERIAL = 0;
|
||||
const int D3DMCS_COLOR1 = 1;
|
||||
const int D3DMCS_COLOR2 = 2;
|
||||
|
||||
if (!vRegisterDefaultFlags[diffuseReg]) {
|
||||
float4 diffuseVertexColour = Get(xIn, diffuseReg);
|
||||
if (state.Modes.AmbientMaterialSource == D3DMCS_COLOR1) material.Ambient = diffuseVertexColour;
|
||||
if (state.Modes.DiffuseMaterialSource == D3DMCS_COLOR1) material.Diffuse = diffuseVertexColour;
|
||||
if (state.Modes.SpecularMaterialSource == D3DMCS_COLOR1) material.Specular = diffuseVertexColour;
|
||||
if (state.Modes.EmissiveMaterialSource == D3DMCS_COLOR1) material.Emissive = diffuseVertexColour;
|
||||
}
|
||||
// If COLORVERTEX mode, AND the desired diffuse or specular colour is defined in the vertex declaration
|
||||
// Then use the vertex colour instead of the material
|
||||
|
||||
if (!vRegisterDefaultFlags[specularReg]) {
|
||||
float4 specularVertexColour = Get(xIn, specularReg);
|
||||
if (state.Modes.AmbientMaterialSource == D3DMCS_COLOR2) material.Ambient = specularVertexColour;
|
||||
if (state.Modes.DiffuseMaterialSource == D3DMCS_COLOR2) material.Diffuse = specularVertexColour;
|
||||
if (state.Modes.SpecularMaterialSource == D3DMCS_COLOR2) material.Specular = specularVertexColour;
|
||||
if (state.Modes.EmissiveMaterialSource == D3DMCS_COLOR2) material.Emissive = specularVertexColour;
|
||||
}
|
||||
if (!vRegisterDefaultFlags[diffuseReg]) {
|
||||
float4 diffuseVertexColour = Get(xIn, diffuseReg);
|
||||
if (state.Modes.AmbientMaterialSource == D3DMCS_COLOR1) material.Ambient = diffuseVertexColour;
|
||||
if (state.Modes.DiffuseMaterialSource == D3DMCS_COLOR1) material.Diffuse = diffuseVertexColour;
|
||||
if (state.Modes.SpecularMaterialSource == D3DMCS_COLOR1) material.Specular = diffuseVertexColour;
|
||||
if (state.Modes.EmissiveMaterialSource == D3DMCS_COLOR1) material.Emissive = diffuseVertexColour;
|
||||
}
|
||||
|
||||
if (!vRegisterDefaultFlags[specularReg]) {
|
||||
float4 specularVertexColour = Get(xIn, specularReg);
|
||||
if (state.Modes.AmbientMaterialSource == D3DMCS_COLOR2) material.Ambient = specularVertexColour;
|
||||
if (state.Modes.DiffuseMaterialSource == D3DMCS_COLOR2) material.Diffuse = specularVertexColour;
|
||||
if (state.Modes.SpecularMaterialSource == D3DMCS_COLOR2) material.Specular = specularVertexColour;
|
||||
if (state.Modes.EmissiveMaterialSource == D3DMCS_COLOR2) material.Emissive = specularVertexColour;
|
||||
}
|
||||
|
||||
return material;
|
||||
|
|
|
@ -97,7 +97,6 @@ struct Modes {
|
|||
alignas(16) float SpecularEnable;
|
||||
alignas(16) float LocalViewer;
|
||||
|
||||
alignas(16) float ColorVertex;
|
||||
alignas(16) float VertexBlend_NrOfMatrices;
|
||||
alignas(16) float VertexBlend_CalcLastWeight; // Could be a bool in higer shader models
|
||||
alignas(16) float NormalizeNormals;
|
||||
|
|
Loading…
Reference in New Issue