[Scummvm-git-logs] scummvm master -> f96b71100cd7049f1911bbac69cae2ba2475719b
lephilousophe
noreply at scummvm.org
Sat Oct 8 21:41:03 UTC 2022
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
f96b71100c OPENGL: Implement parameters as uniforms
Commit: f96b71100cd7049f1911bbac69cae2ba2475719b
https://github.com/scummvm/scummvm/commit/f96b71100cd7049f1911bbac69cae2ba2475719b
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2022-10-08T23:40:27+02:00
Commit Message:
OPENGL: Implement parameters as uniforms
This avoids bugs in some shaders where parameter names are reused in the
shader code.
Changed paths:
backends/graphics/opengl/pipelines/libretro.cpp
diff --git a/backends/graphics/opengl/pipelines/libretro.cpp b/backends/graphics/opengl/pipelines/libretro.cpp
index 195feaf05f3..ddb992ad09a 100644
--- a/backends/graphics/opengl/pipelines/libretro.cpp
+++ b/backends/graphics/opengl/pipelines/libretro.cpp
@@ -218,6 +218,29 @@ bool LibRetroPipeline::loadTextures() {
return true;
}
+typedef Common::HashMap<Common::String, float, Common::CaseSensitiveString_Hash, Common::CaseSensitiveString_EqualTo> UniformsMap;
+
+static void stripShaderParameters(char *source, UniformsMap &uniforms) {
+ char uniformId[64], desc[64];
+ float initial, minimum, maximum, step;
+
+ char *s = strstr(source, "#pragma parameter");
+
+ while (s) {
+ int ret;
+ if ((ret = sscanf(s, "#pragma parameter %63s \"%63[^\"]\" %f %f %f %f",
+ uniformId, desc, &initial, &minimum, &maximum, &step)) >= 5) {
+ uniforms[uniformId] = initial;
+ }
+
+ // strip parameter to avoid syntax errors in GLSL parser
+ while (*s != '\0' && *s != '\n') {
+ *s++ = ' ';
+ }
+ s = strstr(s, "#pragma parameter");
+ }
+}
+
bool LibRetroPipeline::loadPasses() {
for (LibRetro::ShaderPreset::PassArray::const_iterator
i = _shaderPreset->passes.begin(), end = _shaderPreset->passes.end();
@@ -263,19 +286,22 @@ bool LibRetroPipeline::loadPasses() {
shaderFileVersion, shaderFileVersionExtra);
}
+ UniformsMap uniformParams;
+ stripShaderParameters(shaderFileStart, uniformParams);
+
// TODO: Handle alias defines
Shader *shader = new Shader;
const char *const vertexSources[] = {
version,
- "#define VERTEX\n", // "#define PARAMETER_UNIFORM\n",
+ "#define VERTEX\n#define PARAMETER_UNIFORM\n",
// TODO: alias defines
shaderFileStart,
};
const char *const fragmentSources[] = {
version,
- "#define FRAGMENT\n", // "#define PARAMETER_UNIFORM\n",
+ "#define FRAGMENT\n#define PARAMETER_UNIFORM\n",
// TODO: alias defines
shaderFileStart,
};
@@ -294,6 +320,10 @@ bool LibRetroPipeline::loadPasses() {
// Input texture is always bound at sampler 0.
shader->setUniform("Texture", 0);
+ for(UniformsMap::iterator it = uniformParams.begin(); it != uniformParams.end(); it++) {
+ shader->setUniform1f(it->_key, it->_value);
+ }
+
TextureTarget *target = nullptr;
// TODO: float and sRGB FBO handling.
target = new TextureTarget();
More information about the Scummvm-git-logs
mailing list