[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