Improve OpenGL backend performance slightly

This commit is contained in:
Magnus Norddahl 2019-12-22 17:34:44 +01:00
parent 078f2e9e82
commit e621453858
3 changed files with 26 additions and 38 deletions

View file

@ -172,36 +172,26 @@ bool FGLRenderState::ApplyShader()
// Apply uniforms:
UniformInfo* info = mUniformInfo.data();
GLuint* locations = activeShader->UniformLocations.data();
int* lastupdates = activeShader->UniformLastUpdates.data();
int count = (int)mUniformInfo.size();
for (int i = 0; i < count; i++)
{
if (lastupdates[i] != mUniformInfo.data()[i].LastUpdate)
{
const void* data = GetUniformData((UniformName)i);
GLuint location = locations[i];
switch (mUniformInfo[i].Type)
{
default:
case UniformType::Vec4: glUniform4fv(location, 1, (float*)data); break;
case UniformType::Float: glUniform1fv(location, 1, (float*)data); break;
case UniformType::Int: glUniform1iv(location, 1, (int*)data); break;
case UniformType::Mat4: glUniformMatrix4fv(location, 1, GL_FALSE, (float*)data); break;
case UniformType::UInt: glUniform1iv(location, 1, (int*)data); break;
case UniformType::Vec2: glUniform2fv(location, 1, (float*)data); break;
case UniformType::Vec3: glUniform3fv(location, 1, (float*)data); break;
case UniformType::IVec2: glUniform1iv(location, 1, (int*)data); break;
case UniformType::IVec3: glUniform1iv(location, 1, (int*)data); break;
case UniformType::IVec4: glUniform1iv(location, 1, (int*)data); break;
case UniformType::UVec2: glUniform1iv(location, 1, (int*)data); break;
case UniformType::UVec3: glUniform1iv(location, 1, (int*)data); break;
case UniformType::UVec4: glUniform1iv(location, 1, (int*)data); break;
}
lastupdates[i] = mUniformInfo[i].LastUpdate;
}
}
for (int i : mSortedUniformInfo[(int)UniformType::Vec4]) if (lastupdates[i] != info[i].LastUpdate) { glUniform4fv(locations[i], 1, (float*)GetUniformData((UniformName)i)); lastupdates[i] = info[i].LastUpdate; }
for (int i : mSortedUniformInfo[(int)UniformType::Vec2]) if (lastupdates[i] != info[i].LastUpdate) { glUniform2fv(locations[i], 1, (float*)GetUniformData((UniformName)i)); lastupdates[i] = info[i].LastUpdate; }
for (int i : mSortedUniformInfo[(int)UniformType::Float]) if (lastupdates[i] != info[i].LastUpdate) { glUniform1fv(locations[i], 1, (float*)GetUniformData((UniformName)i)); lastupdates[i] = info[i].LastUpdate; }
for (int i : mSortedUniformInfo[(int)UniformType::Int]) if (lastupdates[i] != info[i].LastUpdate) { glUniform1iv(locations[i], 1, (int*)GetUniformData((UniformName)i)); lastupdates[i] = info[i].LastUpdate; }
for (int i : mSortedUniformInfo[(int)UniformType::Mat4]) if (lastupdates[i] != info[i].LastUpdate) { glUniformMatrix4fv(locations[i], 1, GL_FALSE, (float*)GetUniformData((UniformName)i)); lastupdates[i] = info[i].LastUpdate; }
/*
for (int i : mSortedUniformInfo[(int)UniformType::Vec3]) if (lastupdates[i] != info[i].LastUpdate) { glUniform3fv(locations[i], 1, (float*)GetUniformData((UniformName)i)); lastupdates[i] = info[i].LastUpdate; }
for (int i : mSortedUniformInfo[(int)UniformType::IVec2]) if (lastupdates[i] != info[i].LastUpdate) { glUniform4iv(locations[i], 1, (int*)GetUniformData((UniformName)i)); lastupdates[i] = info[i].LastUpdate; }
for (int i : mSortedUniformInfo[(int)UniformType::IVec3]) if (lastupdates[i] != info[i].LastUpdate) { glUniform4iv(locations[i], 1, (int*)GetUniformData((UniformName)i)); lastupdates[i] = info[i].LastUpdate; }
for (int i : mSortedUniformInfo[(int)UniformType::IVec4]) if (lastupdates[i] != info[i].LastUpdate) { glUniform4iv(locations[i], 1, (int*)GetUniformData((UniformName)i)); lastupdates[i] = info[i].LastUpdate; }
for (int i : mSortedUniformInfo[(int)UniformType::UInt]) if (lastupdates[i] != info[i].LastUpdate) { glUniform1iv(locations[i], 1, (int*)GetUniformData((UniformName)i)); lastupdates[i] = info[i].LastUpdate; }
for (int i : mSortedUniformInfo[(int)UniformType::UVec2]) if (lastupdates[i] != info[i].LastUpdate) { glUniform4iv(locations[i], 1, (int*)GetUniformData((UniformName)i)); lastupdates[i] = info[i].LastUpdate; }
for (int i : mSortedUniformInfo[(int)UniformType::UVec3]) if (lastupdates[i] != info[i].LastUpdate) { glUniform4iv(locations[i], 1, (int*)GetUniformData((UniformName)i)); lastupdates[i] = info[i].LastUpdate; }
for (int i : mSortedUniformInfo[(int)UniformType::UVec4]) if (lastupdates[i] != info[i].LastUpdate) { glUniform4iv(locations[i], 1, (int*)GetUniformData((UniformName)i)); lastupdates[i] = info[i].LastUpdate; }
*/
return true;
}

View file

@ -28,7 +28,8 @@ enum class UniformType
UVec2,
UVec3,
UVec4,
Mat4
Mat4,
NumUniformTypes
};
class UniformFieldDesc

View file

@ -201,11 +201,6 @@ enum class UniformName
uSplitTopPlane,
uSplitBottomPlane,
uObjectBlendMode,
uObjectDesaturationFactor,
uObjectColorizeFactor,
uObjectInvertColor,
uTextureMode,
uAlphaThreshold,
uClipSplit,
@ -266,11 +261,6 @@ protected:
DeclareUniform(UniformName::uSplitTopPlane, "uSplitTopPlane", UniformType::Vec4);
DeclareUniform(UniformName::uSplitBottomPlane, "uSplitBottomPlane", UniformType::Vec4);
DeclareUniform(UniformName::uObjectBlendMode, "uObjectBlendMode", UniformType::Float);
DeclareUniform(UniformName::uObjectInvertColor, "uObjectInvertColor", UniformType::Float);
DeclareUniform(UniformName::uObjectDesaturationFactor, "uObjectDesaturationFactor", UniformType::Float);
DeclareUniform(UniformName::uObjectColorizeFactor, "uObjectColorizeFactor", UniformType::Float);
DeclareUniform(UniformName::uTextureMode, "uTextureMode", UniformType::Int, UniformFamily::PushConstant);
DeclareUniform(UniformName::uAlphaThreshold, "uAlphaThreshold", UniformType::Float, UniformFamily::PushConstant);
DeclareUniform(UniformName::uClipSplit, "uClipSplit", UniformType::Vec2, UniformFamily::PushConstant);
@ -289,6 +279,10 @@ protected:
DeclareUniform(UniformName::uPadding1, "uPadding1", UniformType::Int, UniformFamily::PushConstant);
DeclareUniform(UniformName::uPadding2, "uPadding2", UniformType::Int, UniformFamily::PushConstant);
DeclareUniform(UniformName::uPadding3, "uPadding3", UniformType::Int, UniformFamily::PushConstant);
int i = 0;
for (const auto& info : mUniformInfo)
mSortedUniformInfo[(int)info.Type].push_back(i++);
}
void DeclareUniform(UniformName nameIndex, const char* glslname, UniformType type, UniformFamily family = UniformFamily::Normal)
@ -384,6 +378,9 @@ protected:
std::vector<UniformInfo> mUniformInfo;
std::vector<uint8_t> mUniformData[(int)UniformFamily::NumFamilies];
// For the OpenGL backend so that it doesn't have to do a switch between the uniform types
std::vector<int> mSortedUniformInfo[(int)UniformType::NumUniformTypes];
uint8_t mFogEnabled;
uint8_t mTextureEnabled:1;
uint8_t mGlowEnabled : 1;