[v2,31/37] shader_runner: add command for glFog

Submitted by Dylan Baker on Sept. 6, 2016, 7:21 p.m.

Details

Message ID 14cebbdf4c55561744f6dc96f87f0ca4cc91f721.1473189647.git-series.dylan@pnwbakers.com
State New
Headers show
Series "Port Glean Frag-prog tests to shader_runner" ( rev: 1 ) in Piglit

Not browsing as part of any series.

Commit Message

Dylan Baker Sept. 6, 2016, 7:21 p.m.
I've added this with the intention of using it to ease porting the
numerous fog tests from glean to the piglit framework, many of which can
easily be ported to shader_runner, except for the need for glFog setup.

Signed-off-by: Dylan Baker <dylanx.c.baker@intel.com>
---
 tests/shaders/shader_runner.c | 74 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 74 insertions(+), 0 deletions(-)

Patch hide | download patch | download mbox

diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
index 8e29346..ba193c6 100644
--- a/tests/shaders/shader_runner.c
+++ b/tests/shaders/shader_runner.c
@@ -2592,6 +2592,78 @@  decode_drawing_mode(const char *mode_str)
 }
 
 static void
+handle_fog(const char *line)
+{
+	static const struct string_to_enum fog_pname[] = {
+		{ "mode",          GL_FOG_MODE                  },
+		{ "density",       GL_FOG_DENSITY               },
+		{ "start",         GL_FOG_START                 },
+		{ "end",           GL_FOG_END                   },
+		{ "index",         GL_FOG_INDEX                 },
+		{ "color",         GL_FOG_COLOR                 },
+		{ "coord_src",     GL_FOG_COORD_SRC             },
+		{ "frag_depth",    GL_FRAGMENT_DEPTH_EXT        },
+		{ NULL, 0 }
+	};
+	static const struct string_to_enum modes[] = {
+		{ "linear", GL_LINEAR },
+		{ "exp",    GL_EXP },
+		{ "exp2",   GL_EXP2 },
+		{ NULL, 0 }
+	};
+#ifdef PIGLIT_USE_OPENGL
+	static const struct string_to_enum coord_src[] = {
+		{ "fog_coord", GL_FOG_COORD },
+		{ "frag_depth", GL_FRAGMENT_DEPTH },
+		{ NULL, 0 }
+	};
+#endif
+	float v[4];
+	GLenum target, e;
+
+	// call glFogCoord
+	if (string_match("coord ", line)) {
+		line += strlen("coord ");
+		get_floats(line, v, 1);
+		glFogCoordf(v[0]);
+		return;
+	}
+
+	target = lookup_enum_string(fog_pname, &line, "glFog pname");
+	switch (target) {
+	case GL_FOG_MODE:
+		e = lookup_enum_string(modes, &line,
+				       "glFog(GL_FOG_MODE, param)");
+		glFogi(target, e);
+		break;
+	case GL_FOG_COORD_SRC:
+#ifdef PIGLIT_USE_OPENGL
+		e = lookup_enum_string(coord_src, &line,
+				       "glFog(GL_FOG_CCORD_SRC, param)");
+		glFogi(target, e);
+		break;
+#else
+		printf("glFog for GLES doesn't support coord_src\n");
+		piglit_report_result(PIGLIT_FAIL);
+#endif
+	case GL_FOG_COLOR:
+		sscanf(line, "( %f , %f , %f , %f )",
+		       &v[0], &v[1], &v[2], &v[3]);
+		glFogfv(target, v);
+		break;
+	case GL_FOG_DENSITY:
+	case GL_FOG_START:
+	case GL_FOG_END:
+	case GL_FOG_INDEX:
+		get_floats(line, v, 1);
+		glFogf(target, v[0]);
+		break;
+	default:
+		assert(0);
+	}
+}
+
+static void
 handle_texparameter(const char *line)
 {
 	static const struct string_to_enum texture_target[] = {
@@ -3370,6 +3442,8 @@  piglit_display(void)
 			active_uniform(line + strlen("active uniform "));
 		} else if (string_match("verify program_interface_query ", line)) {
 			active_program_interface(line + strlen("verify program_interface_query "));
+		} else if (string_match("fog ", line)) {
+			handle_fog(line + strlen("fog "));
 		} else if ((line[0] != '\n') && (line[0] != '\0')
 			   && (line[0] != '#')) {
 			printf("unknown command \"%s\"\n", line);