mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-04-22 02:40:57 +00:00
Improve OpenGL backend performance slightly
This commit is contained in:
parent
078f2e9e82
commit
e621453858
3 changed files with 26 additions and 38 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -28,7 +28,8 @@ enum class UniformType
|
|||
UVec2,
|
||||
UVec3,
|
||||
UVec4,
|
||||
Mat4
|
||||
Mat4,
|
||||
NumUniformTypes
|
||||
};
|
||||
|
||||
class UniformFieldDesc
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue