From 684c59e5bc6476823e25be5ba4d015945ff36a26 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sat, 26 Nov 2022 18:09:57 +0000 Subject: [PATCH] optimize data feeding to gradient renderer --- src/config/ConfigManager.cpp | 2 +- src/render/OpenGL.cpp | 17 +++++------------ src/render/shaders/Border.hpp | 2 ++ 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 795cb473..56e51b37 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -382,7 +382,7 @@ void CConfigManager::configSetValueSafe(const std::string& COMMAND, const std::s } try { - data->m_vColors.push_back(configStringToInt(var)); + data->m_vColors.push_back(CColor(configStringToInt(var)) * (1.f / 255.f)); } catch (std::exception& e) { Debug::log(WARN, "Error reading value of %s", COMMAND.c_str()); parseError = "Error setting value <" + VALUE + "> for field <" + COMMAND + ">. " + e.what(); diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 676a49a9..5a4ccca6 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -242,6 +242,7 @@ void CHyprOpenGLImpl::initShaders() { m_RenderData.pCurrentMonData->m_shBORDER1.gradient = glGetUniformLocation(prog, "gradient"); m_RenderData.pCurrentMonData->m_shBORDER1.gradientLength = glGetUniformLocation(prog, "gradientLength"); m_RenderData.pCurrentMonData->m_shBORDER1.angle = glGetUniformLocation(prog, "angle"); + m_RenderData.pCurrentMonData->m_shBORDER1.alpha = glGetUniformLocation(prog, "alpha"); m_RenderData.pCurrentMonData->m_bShadersInitialized = true; @@ -846,19 +847,13 @@ void CHyprOpenGLImpl::renderBorder(wlr_box* box, const CGradientValueData& grad, wlr_matrix_transpose(glMatrix, glMatrix); glUniformMatrix3fv(m_RenderData.pCurrentMonData->m_shBORDER1.proj, 1, GL_FALSE, glMatrix); #endif - - // TODO: make gradients already in 0 ... 1 and just pass vec.data(), alpha in shader - float* gradientValues = (float*)malloc(sizeof(float) * grad.m_vColors.size() * 4); - for (size_t i = 0; i < grad.m_vColors.size(); ++i) { - gradientValues[i * 4] = grad.m_vColors[i].r / 255.f; - gradientValues[i * 4 + 1] = grad.m_vColors[i].g / 255.f; - gradientValues[i * 4 + 2] = grad.m_vColors[i].b / 255.f; - gradientValues[i * 4 + 3] = grad.m_vColors[i].a / 255.f * a; - } - glUniform4fv(m_RenderData.pCurrentMonData->m_shBORDER1.gradient, grad.m_vColors.size(), gradientValues); + static_assert(sizeof(CColor) == 4 * sizeof(float)); // otherwise the line below this will fail + + glUniform4fv(m_RenderData.pCurrentMonData->m_shBORDER1.gradient, grad.m_vColors.size(), (float*)grad.m_vColors.data()); glUniform1i(m_RenderData.pCurrentMonData->m_shBORDER1.gradientLength, grad.m_vColors.size()); glUniform1f(m_RenderData.pCurrentMonData->m_shBORDER1.angle, grad.m_fAngle); + glUniform1f(m_RenderData.pCurrentMonData->m_shBORDER1.alpha, a); wlr_box transformedBox; wlr_box_transform(&transformedBox, box, wlr_output_transform_invert(m_RenderData.pMonitor->transform), @@ -907,8 +902,6 @@ void CHyprOpenGLImpl::renderBorder(wlr_box* box, const CGradientValueData& grad, glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - free(gradientValues); - // fix back box box->x += scaledBorderSize; box->y += scaledBorderSize; diff --git a/src/render/shaders/Border.hpp b/src/render/shaders/Border.hpp index a2d61066..fc48e108 100644 --- a/src/render/shaders/Border.hpp +++ b/src/render/shaders/Border.hpp @@ -17,6 +17,7 @@ uniform int primitiveMultisample; uniform vec4 gradient[10]; uniform int gradientLength; uniform float angle; +uniform float alpha; vec4 getColorForCoord(vec2 normalizedCoord) { if (gradientLength < 2) @@ -36,6 +37,7 @@ void main() { vec2 originalPixCoord = fullSize * v_texcoord; vec4 pixColor = getColorForCoord(v_texcoord); + pixColor[3] *= alpha; bool done = false;