mirror of
https://github.com/hyprwm/Hyprland.git
synced 2025-10-30 03:41:16 +00:00
renderer: add 1fv and 2fv uniform support (#12080)
This commit is contained in:
parent
f3e13193a6
commit
6607c6440d
@ -166,20 +166,37 @@ void SShader::setUniformMatrix4x2fv(eShaderUniform location, GLsizei count, GLbo
|
|||||||
glUniformMatrix4x2fv(uniformLocations[location], count, transpose, value.data());
|
glUniformMatrix4x2fv(uniformLocations[location], count, transpose, value.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
void SShader::setUniform4fv(eShaderUniform location, GLsizei count, std::vector<float> value) {
|
void SShader::setUniformfv(eShaderUniform location, GLsizei count, const std::vector<float>& value, GLsizei vec_size) {
|
||||||
if (uniformLocations.at(location) == -1)
|
if (uniformLocations.at(location) == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto& cached = uniformStatus.at(location);
|
auto& cached = uniformStatus.at(location);
|
||||||
|
|
||||||
if (cached.index() != 0) {
|
if (cached.index() != 0) {
|
||||||
auto val = std::get<SUniform4Data>(cached);
|
auto val = std::get<SUniformVData>(cached);
|
||||||
if (val.count == count && compareFloat(val.value, value))
|
if (val.count == count && compareFloat(val.value, value))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
cached = SUniform4Data{.count = count, .value = value};
|
cached = SUniformVData{.count = count, .value = value};
|
||||||
glUniform4fv(uniformLocations[location], count, value.data());
|
switch (vec_size) {
|
||||||
|
case 1: glUniform1fv(uniformLocations[location], count, value.data()); break;
|
||||||
|
case 2: glUniform2fv(uniformLocations[location], count, value.data()); break;
|
||||||
|
case 4: glUniform4fv(uniformLocations[location], count, value.data()); break;
|
||||||
|
default: UNREACHABLE();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SShader::setUniform1fv(eShaderUniform location, GLsizei count, const std::vector<float>& value) {
|
||||||
|
setUniformfv(location, count, value, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SShader::setUniform2fv(eShaderUniform location, GLsizei count, const std::vector<float>& value) {
|
||||||
|
setUniformfv(location, count, value, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SShader::setUniform4fv(eShaderUniform location, GLsizei count, const std::vector<float>& value) {
|
||||||
|
setUniformfv(location, count, value, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SShader::destroy() {
|
void SShader::destroy() {
|
||||||
|
|||||||
@ -89,14 +89,14 @@ struct SShader {
|
|||||||
std::array<GLfloat, 8> value = {};
|
std::array<GLfloat, 8> value = {};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SUniform4Data {
|
struct SUniformVData {
|
||||||
GLsizei count = 0;
|
GLsizei count = 0;
|
||||||
std::vector<float> value;
|
std::vector<float> value;
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
std::array<std::variant<std::monostate, GLint, GLfloat, std::array<GLfloat, 2>, std::array<GLfloat, 3>, std::array<GLfloat, 4>, SUniformMatrix3Data, SUniformMatrix4Data,
|
std::array<std::variant<std::monostate, GLint, GLfloat, std::array<GLfloat, 2>, std::array<GLfloat, 3>, std::array<GLfloat, 4>, SUniformMatrix3Data, SUniformMatrix4Data,
|
||||||
SUniform4Data>,
|
SUniformVData>,
|
||||||
SHADER_LAST>
|
SHADER_LAST>
|
||||||
uniformStatus;
|
uniformStatus;
|
||||||
//
|
//
|
||||||
@ -109,6 +109,11 @@ struct SShader {
|
|||||||
void setUniformFloat4(eShaderUniform location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
|
void setUniformFloat4(eShaderUniform location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
|
||||||
void setUniformMatrix3fv(eShaderUniform location, GLsizei count, GLboolean transpose, std::array<GLfloat, 9> value);
|
void setUniformMatrix3fv(eShaderUniform location, GLsizei count, GLboolean transpose, std::array<GLfloat, 9> value);
|
||||||
void setUniformMatrix4x2fv(eShaderUniform location, GLsizei count, GLboolean transpose, std::array<GLfloat, 8> value);
|
void setUniformMatrix4x2fv(eShaderUniform location, GLsizei count, GLboolean transpose, std::array<GLfloat, 8> value);
|
||||||
void setUniform4fv(eShaderUniform location, GLsizei count, std::vector<float> value);
|
void setUniform1fv(eShaderUniform location, GLsizei count, const std::vector<float>& value);
|
||||||
|
void setUniform2fv(eShaderUniform location, GLsizei count, const std::vector<float>& value);
|
||||||
|
void setUniform4fv(eShaderUniform location, GLsizei count, const std::vector<float>& value);
|
||||||
void destroy();
|
void destroy();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setUniformfv(eShaderUniform location, GLsizei count, const std::vector<float>& value, GLsizei vec_size);
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user