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.TwoSidedLighting = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_TWOSIDEDLIGHTING);
|
||||||
ffShaderState.Modes.SpecularEnable = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_SPECULARENABLE);
|
ffShaderState.Modes.SpecularEnable = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_SPECULARENABLE);
|
||||||
ffShaderState.Modes.LocalViewer = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_LOCALVIEWER);
|
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 Ambient = toVector(XboxRenderStates.GetXboxRenderState(X_D3DRS_AMBIENT));
|
||||||
D3DXVECTOR4 BackAmbient = toVector(XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKAMBIENT));
|
D3DXVECTOR4 BackAmbient = toVector(XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKAMBIENT));
|
||||||
|
|
||||||
// Material sources
|
// Material sources
|
||||||
ffShaderState.Modes.AmbientMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_AMBIENTMATERIALSOURCE);
|
ffShaderState.Modes.AmbientMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_AMBIENTMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||||
ffShaderState.Modes.DiffuseMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_DIFFUSEMATERIALSOURCE);
|
ffShaderState.Modes.DiffuseMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_DIFFUSEMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||||
ffShaderState.Modes.SpecularMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_SPECULARMATERIALSOURCE);
|
ffShaderState.Modes.SpecularMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_SPECULARMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||||
ffShaderState.Modes.EmissiveMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_EMISSIVEMATERIALSOURCE);
|
ffShaderState.Modes.EmissiveMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_EMISSIVEMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||||
ffShaderState.Modes.BackAmbientMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKAMBIENTMATERIALSOURCE);
|
ffShaderState.Modes.BackAmbientMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKAMBIENTMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||||
ffShaderState.Modes.BackDiffuseMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKDIFFUSEMATERIALSOURCE);
|
ffShaderState.Modes.BackDiffuseMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKDIFFUSEMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||||
ffShaderState.Modes.BackSpecularMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKSPECULARMATERIALSOURCE);
|
ffShaderState.Modes.BackSpecularMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKSPECULARMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||||
ffShaderState.Modes.BackEmissiveMaterialSource = (float)XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKEMISSIVEMATERIALSOURCE);
|
ffShaderState.Modes.BackEmissiveMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKEMISSIVEMATERIALSOURCE) : D3DMCS_MATERIAL);
|
||||||
|
|
||||||
// Point sprites
|
// Point sprites
|
||||||
auto pointSize = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSIZE);
|
auto pointSize = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSIZE);
|
||||||
|
|
|
@ -317,14 +317,13 @@ Material DoMaterial(const uint index, const uint diffuseReg, const uint specular
|
||||||
// Get the material from material state
|
// Get the material from material state
|
||||||
Material material = state.Materials[index];
|
Material material = state.Materials[index];
|
||||||
|
|
||||||
if (state.Modes.ColorVertex)
|
// Note : If X_D3DRS_COLORVERTEX is FALSE, UpdateFixedFunctionVertexShaderState has already changed all MaterialSource's into D3DMCS_MATERIAL
|
||||||
{
|
|
||||||
// https://docs.microsoft.com/en-us/windows/win32/direct3d9/d3dmaterialcolorsource
|
// https://docs.microsoft.com/en-us/windows/win32/direct3d9/d3dmaterialcolorsource
|
||||||
const int D3DMCS_MATERIAL = 0;
|
const int D3DMCS_MATERIAL = 0;
|
||||||
const int D3DMCS_COLOR1 = 1;
|
const int D3DMCS_COLOR1 = 1;
|
||||||
const int D3DMCS_COLOR2 = 2;
|
const int D3DMCS_COLOR2 = 2;
|
||||||
|
|
||||||
// TODO preprocess on the CPU
|
|
||||||
// If COLORVERTEX mode, AND the desired diffuse or specular colour is defined in the vertex declaration
|
// 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
|
// Then use the vertex colour instead of the material
|
||||||
|
|
||||||
|
@ -343,7 +342,6 @@ Material DoMaterial(const uint index, const uint diffuseReg, const uint specular
|
||||||
if (state.Modes.SpecularMaterialSource == D3DMCS_COLOR2) material.Specular = specularVertexColour;
|
if (state.Modes.SpecularMaterialSource == D3DMCS_COLOR2) material.Specular = specularVertexColour;
|
||||||
if (state.Modes.EmissiveMaterialSource == D3DMCS_COLOR2) material.Emissive = specularVertexColour;
|
if (state.Modes.EmissiveMaterialSource == D3DMCS_COLOR2) material.Emissive = specularVertexColour;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return material;
|
return material;
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,7 +97,6 @@ struct Modes {
|
||||||
alignas(16) float SpecularEnable;
|
alignas(16) float SpecularEnable;
|
||||||
alignas(16) float LocalViewer;
|
alignas(16) float LocalViewer;
|
||||||
|
|
||||||
alignas(16) float ColorVertex;
|
|
||||||
alignas(16) float VertexBlend_NrOfMatrices;
|
alignas(16) float VertexBlend_NrOfMatrices;
|
||||||
alignas(16) float VertexBlend_CalcLastWeight; // Could be a bool in higer shader models
|
alignas(16) float VertexBlend_CalcLastWeight; // Could be a bool in higer shader models
|
||||||
alignas(16) float NormalizeNormals;
|
alignas(16) float NormalizeNormals;
|
||||||
|
|
Loading…
Reference in New Issue