diff --git a/src/rendering/gl/renderer/gl_renderstate.cpp b/src/rendering/gl/renderer/gl_renderstate.cpp index 4fe2d56033..6e6bb863ca 100644 --- a/src/rendering/gl/renderer/gl_renderstate.cpp +++ b/src/rendering/gl/renderer/gl_renderstate.cpp @@ -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; } diff --git a/src/rendering/hwrenderer/data/shaderuniforms.h b/src/rendering/hwrenderer/data/shaderuniforms.h index 2543b52b1f..5a3ecb9d33 100644 --- a/src/rendering/hwrenderer/data/shaderuniforms.h +++ b/src/rendering/hwrenderer/data/shaderuniforms.h @@ -28,7 +28,8 @@ enum class UniformType UVec2, UVec3, UVec4, - Mat4 + Mat4, + NumUniformTypes }; class UniformFieldDesc diff --git a/src/rendering/hwrenderer/scene/hw_renderstate.h b/src/rendering/hwrenderer/scene/hw_renderstate.h index 783296704e..a0db7301d8 100644 --- a/src/rendering/hwrenderer/scene/hw_renderstate.h +++ b/src/rendering/hwrenderer/scene/hw_renderstate.h @@ -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 mUniformInfo; std::vector mUniformData[(int)UniformFamily::NumFamilies]; + // For the OpenGL backend so that it doesn't have to do a switch between the uniform types + std::vector mSortedUniformInfo[(int)UniformType::NumUniformTypes]; + uint8_t mFogEnabled; uint8_t mTextureEnabled:1; uint8_t mGlowEnabled : 1;