Skip to content

Commit

Permalink
- Add 'stat uniforms' which tracks which uniforms are used the most i…
Browse files Browse the repository at this point in the history
…n a frame
  • Loading branch information
dpjudas committed Feb 10, 2018
1 parent e2cab65 commit a5609ba
Show file tree
Hide file tree
Showing 2 changed files with 161 additions and 30 deletions.
66 changes: 66 additions & 0 deletions src/gl/shaders/gl_shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -609,6 +609,72 @@ static const FEffectShader effectshaders[]=
{ "stencil", "shaders/glsl/main.vp", "shaders/glsl/stencil.fp", NULL, "#define SIMPLE\n#define NO_ALPHATEST\n" },
};

FString FShader::GetUsageStats()
{
std::map<FString, int> uniforms;

for (int subshader = 0; subshader < FIRST_USER_SHADER; subshader++)
{
FShader *all[] =
{
GLRenderer->mShaderManager->Get(subshader, false, NORMAL_PASS),
GLRenderer->mShaderManager->Get(subshader, true, NORMAL_PASS),
GLRenderer->mShaderManager->Get(subshader, false, GBUFFER_PASS),
GLRenderer->mShaderManager->Get(subshader, true, GBUFFER_PASS)
};

for (FShader *shader : all)
{
if (!shader) continue;

uniforms["uDesaturation"] += shader->muDesaturation.ModifiedCount; shader->muDesaturation.ModifiedCount = 0;
uniforms["uFogEnabled"] += shader->muFogEnabled.ModifiedCount; shader->muFogEnabled.ModifiedCount = 0;
uniforms["uPalLightLevels"] += shader->muPalLightLevels.ModifiedCount; shader->muPalLightLevels.ModifiedCount = 0;
uniforms["uGlobVis"] += shader->muGlobVis.ModifiedCount; shader->muGlobVis.ModifiedCount = 0;
uniforms["uTextureMode"] += shader->muTextureMode.ModifiedCount; shader->muTextureMode.ModifiedCount = 0;
uniforms["uCameraPos"] += shader->muCameraPos.ModifiedCount; shader->muCameraPos.ModifiedCount = 0;
uniforms["uLightParms"] += shader->muLightParms.ModifiedCount; shader->muLightParms.ModifiedCount = 0;
uniforms["uClipSplit"] += shader->muClipSplit.ModifiedCount; shader->muClipSplit.ModifiedCount = 0;
uniforms["uFixedColormap"] += shader->muFixedColormap.ModifiedCount; shader->muFixedColormap.ModifiedCount = 0;
uniforms["uColormapStart"] += shader->muColormapStart.ModifiedCount; shader->muColormapStart.ModifiedCount = 0;
uniforms["uColormapRange"] += shader->muColormapRange.ModifiedCount; shader->muColormapRange.ModifiedCount = 0;
uniforms["uLightIndex"] += shader->muLightIndex.ModifiedCount; shader->muLightIndex.ModifiedCount = 0;
uniforms["uFogColor"] += shader->muFogColor.ModifiedCount; shader->muFogColor.ModifiedCount = 0;
uniforms["uDynLightColor"] += shader->muDynLightColor.ModifiedCount; shader->muDynLightColor.ModifiedCount = 0;
uniforms["uObjectColor"] += shader->muObjectColor.ModifiedCount; shader->muObjectColor.ModifiedCount = 0;
uniforms["uObjectColor2"] += shader->muObjectColor2.ModifiedCount; shader->muObjectColor2.ModifiedCount = 0;
uniforms["uGlowBottomColor"] += shader->muGlowBottomColor.ModifiedCount; shader->muGlowBottomColor.ModifiedCount = 0;
uniforms["uGlowTopColor"] += shader->muGlowTopColor.ModifiedCount; shader->muGlowTopColor.ModifiedCount = 0;
uniforms["uGlowBottomPlane"] += shader->muGlowBottomPlane.ModifiedCount; shader->muGlowBottomPlane.ModifiedCount = 0;
uniforms["uGlowTopPlane"] += shader->muGlowTopPlane.ModifiedCount; shader->muGlowTopPlane.ModifiedCount = 0;
uniforms["uSplitBottomPlane"] += shader->muSplitBottomPlane.ModifiedCount; shader->muSplitBottomPlane.ModifiedCount = 0;
uniforms["uSplitTopPlane"] += shader->muSplitTopPlane.ModifiedCount; shader->muSplitTopPlane.ModifiedCount = 0;
uniforms["uClipLine"] += shader->muClipLine.ModifiedCount; shader->muClipLine.ModifiedCount = 0;
uniforms["uInterpolationFactor"] += shader->muInterpolationFactor.ModifiedCount; shader->muInterpolationFactor.ModifiedCount = 0;
uniforms["uClipHeight"] += shader->muClipHeight.ModifiedCount; shader->muClipHeight.ModifiedCount = 0;
uniforms["uClipHeightDirection"] += shader->muClipHeightDirection.ModifiedCount; shader->muClipHeightDirection.ModifiedCount = 0;
uniforms["uAlphaThreshold"] += shader->muAlphaThreshold.ModifiedCount; shader->muAlphaThreshold.ModifiedCount = 0;
uniforms["uViewHeight"] += shader->muViewHeight.ModifiedCount; shader->muViewHeight.ModifiedCount = 0;
uniforms["uSpecularMaterial"] += shader->muSpecularMaterial.ModifiedCount; shader->muSpecularMaterial.ModifiedCount = 0;
uniforms["uTimer"] += shader->muTimer.ModifiedCount; shader->muTimer.ModifiedCount = 0;
}
}

int maxCount = 0;
for (const auto &it : uniforms)
maxCount = MAX(maxCount, it.second);

FString result;
for (const auto &it : uniforms)
result.AppendFormat("%s = %d\n", it.first.GetChars(), it.second * 100 / maxCount);
return result;
}

ADD_STAT(uniforms)
{
return FShader::GetUsageStats();
}

FShaderManager::FShaderManager()
{
if (!gl.legacyMode)
Expand Down
125 changes: 95 additions & 30 deletions src/gl/shaders/gl_shader.h
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,40 @@ class FBufferedUniformSampler
}
};

template<typename T>
class FUsageUniform
{
public:
void Init(GLuint hShader, const GLchar *name)
{
buffer.Init(hShader, name);
}

template<typename P1>
void Set(P1 p1) { lastbuffer = buffer; buffer.Set(p1); TrackChanges(); }

template<typename P1, typename P2>
void Set(P1 p1, P2 p2) { lastbuffer = buffer; buffer.Set(p1 ,p2); TrackChanges(); }

template<typename P1, typename P2, typename P3>
void Set(P1 p1, P2 p2, P3 p3) { lastbuffer = buffer; buffer.Set(p1, p2, p3); TrackChanges(); }

template<typename P1, typename P2, typename P3, typename P4>
void Set(P1 p1, P2 p2, P3 p3, P4 p4) { lastbuffer = buffer; buffer.Set(p1, p2, p3, p4); TrackChanges(); }

int ModifiedCount = 0;

private:
void TrackChanges()
{
if (memcmp(&buffer, &lastbuffer, sizeof(T)) != 0)
ModifiedCount++;
}

T buffer;
T lastbuffer;
};


class FShader
{
Expand All @@ -257,36 +291,66 @@ class FShader
unsigned int hFragProg;
FName mName;

FBufferedUniform1f muDesaturation;
FBufferedUniform1i muFogEnabled;
FBufferedUniform1i muPalLightLevels;
FBufferedUniform1f muGlobVis;
FBufferedUniform1i muTextureMode;
FBufferedUniform4f muCameraPos;
FBufferedUniform4f muLightParms;
FBufferedUniform2f muClipSplit;
FUniform1i muFixedColormap;
FUniform4f muColormapStart;
FUniform4f muColormapRange;
FBufferedUniform1i muLightIndex;
FBufferedUniformPE muFogColor;
FBufferedUniform4f muDynLightColor;
FBufferedUniformPE muObjectColor;
FBufferedUniformPE muObjectColor2;
FUniform4f muGlowBottomColor;
FUniform4f muGlowTopColor;
FUniform4f muGlowBottomPlane;
FUniform4f muGlowTopPlane;
FUniform4f muSplitBottomPlane;
FUniform4f muSplitTopPlane;
FUniform4f muClipLine;
FBufferedUniform1f muInterpolationFactor;
FBufferedUniform1f muClipHeight;
FBufferedUniform1f muClipHeightDirection;
FBufferedUniform1f muAlphaThreshold;
FBufferedUniform1i muViewHeight;
FBufferedUniform2f muSpecularMaterial;
FBufferedUniform1f muTimer;
FUsageUniform<FBufferedUniform4f> muCameraPos;
FUsageUniform<FBufferedUniform1i> muTextureMode;
FUsageUniform<FBufferedUniform1f> muClipHeight;
FUsageUniform<FBufferedUniform1f> muClipHeightDirection;
FUsageUniform<FBufferedUniform2f> muClipSplit;
FUsageUniform<FUniform4f> muClipLine;
FUsageUniform<FBufferedUniform1f> muAlphaThreshold;

// Colors
FUsageUniform<FBufferedUniformPE> muObjectColor;
FUsageUniform<FBufferedUniformPE> muObjectColor2;
FUsageUniform<FBufferedUniform4f> muDynLightColor;
FUsageUniform<FBufferedUniformPE> muFogColor;
FUsageUniform<FBufferedUniform1f> muDesaturation;
FUsageUniform<FBufferedUniform1f> muInterpolationFactor;

// Fixed colormap stuff
FUsageUniform<FUniform1i> muFixedColormap;
FUsageUniform<FUniform4f> muColormapStart;
FUsageUniform<FUniform4f> muColormapRange;

// Glowing walls stuff
FUsageUniform<FUniform4f> muGlowTopPlane;
FUsageUniform<FUniform4f> muGlowTopColor;
FUsageUniform<FUniform4f> muGlowBottomPlane;
FUsageUniform<FUniform4f> muGlowBottomColor;

FUsageUniform<FUniform4f> muSplitTopPlane;
FUsageUniform<FUniform4f> muSplitBottomPlane;

// Lighting + Fog
FUsageUniform<FBufferedUniform4f> muLightParms;
FUsageUniform<FBufferedUniform1i> muFogEnabled;
FUsageUniform<FBufferedUniform1i> muPalLightLevels;
FUsageUniform<FBufferedUniform1f> muGlobVis;

// dynamic lights
FUsageUniform<FBufferedUniform1i> muLightIndex;

// Software fuzz scaling
FUsageUniform<FBufferedUniform1i> muViewHeight;

// Blinn glossiness and specular level
FUsageUniform<FBufferedUniform2f> muSpecularMaterial;

// quad drawer stuff
// muQuadVertices
// muQuadTexCoords
// muQuadMode

// matrices
// mProjectionMatrix
// mViewMatrix
// mModelMatrix
// mNormalViewMatrix
// mNormalModelMatrix
// mTextureMatrix

// Timer data
FUsageUniform<FBufferedUniform1f> muTimer;

int lights_index;
int projectionmatrix_index;
Expand Down Expand Up @@ -328,6 +392,7 @@ class FShader

void ApplyMatrices(VSMatrix *proj, VSMatrix *view, VSMatrix *norm);

static FString GetUsageStats();
};

//==========================================================================
Expand Down

0 comments on commit a5609ba

Please sign in to comment.