[Piglit] [PATCH piglit v3] Test that glShaderSource does not change compile status.

Jamey Sharp jamey at minilop.net
Sat Apr 30 19:22:05 UTC 2016


OpenGL 4.5 Core Profile section 7.1, in the documentation for
CompileShader, says: "Changing the source code of a shader object with
ShaderSource does not change its compile status or the compiled shader
code." (I haven't checked older versions of the spec.)

This test creates a shader, compiles it, changes its source, and links
it. The spec requires rendering done with this shader to be consistent
with the old source, not the new source, since the shader isn't compiled
again after the source is changed.

According to Karol Herbst, the game "Divinity: Original Sin - Enhanced
Edition" depends on this odd quirk of the spec. See:
https://lists.freedesktop.org/archives/mesa-dev/2016-March/109789.html

This test fails against current Mesa master, but passes with a one-line
patch to src/mesa/main/shaderapi.c. That patch, together with
MESA_GL_VERSION_OVERRIDE=4.2, also allowed "Divinity" to start up
successfully on i965, though rendering bugs remain.

Based on Karol's report, I expect this test should pass on Catalyst, but
I only have Intel hardware to test on.

Signed-off-by: Jamey Sharp <jamey at minilop.net>
Cc: Ian Romanick <idr at freedesktop.org>
Cc: Kenneth Graunke <kenneth at whitecape.org>
---

v3: Simplify the shaders per Ken's suggestions.

I think at this point, this patch has reviewed-by from both Ian and Ken
and I'm happy with it. Could one of you merge it, and the corresponding
Mesa patch? Thanks!

Oh, and as Ian noticed, I forgot to mention that the Mesa patch fixes:
https://bugs.freedesktop.org/show_bug.cgi?id=93551

 tests/all.py                            |  1 +
 tests/shaders/CMakeLists.gl.txt         |  1 +
 tests/shaders/shadersource-no-compile.c | 98 +++++++++++++++++++++++++++++++++
 3 files changed, 100 insertions(+)
 create mode 100644 tests/shaders/shadersource-no-compile.c

diff --git a/tests/all.py b/tests/all.py
index 93d64e6..9f5c019 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -572,6 +572,7 @@ with profile.group_manager(PiglitGLTest, 'shaders') as g:
     g(['glsl-kwin-blur-2'])
     g(['gpu_shader4_attribs'])
     g(['link-unresolved-function'])
+    g(['shadersource-no-compile'])
     g(['sso-simple'])
     g(['sso-uniforms-01'])
     g(['sso-uniforms-02'])
diff --git a/tests/shaders/CMakeLists.gl.txt b/tests/shaders/CMakeLists.gl.txt
index afbcc4b..2db2ded 100644
--- a/tests/shaders/CMakeLists.gl.txt
+++ b/tests/shaders/CMakeLists.gl.txt
@@ -150,6 +150,7 @@ ENDIF (UNIX)
 piglit_add_executable (glsl-kwin-blur-1 glsl-kwin-blur-1.c)
 piglit_add_executable (glsl-kwin-blur-2 glsl-kwin-blur-2.c)
 piglit_add_executable (link-unresolved-function link-unresolved-function.c)
+piglit_add_executable (shadersource-no-compile shadersource-no-compile.c)
 piglit_add_executable (sso-simple sso-simple.c)
 piglit_add_executable (sso-uniforms-01 sso-uniforms-01.c)
 piglit_add_executable (sso-uniforms-02 sso-uniforms-02.c)
diff --git a/tests/shaders/shadersource-no-compile.c b/tests/shaders/shadersource-no-compile.c
new file mode 100644
index 0000000..8a2264f
--- /dev/null
+++ b/tests/shaders/shadersource-no-compile.c
@@ -0,0 +1,98 @@
+/*
+ * Copyright © 2016 Jamey Sharp
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * \file shadersource-no-compile.c
+ * OpenGL 4.5 Core Profile section 7.1, in the documentation for CompileShader,
+ * says: "Changing the source code of a shader object with ShaderSource does not
+ * change its compile status or the compiled shader code."
+ *
+ * This test creates a shader, compiles it, changes its source, and links it.
+ * The spec requires rendering done with this shader to be consistent with the
+ * old source, not the new source, since the shader isn't compiled again after
+ * the source is changed.
+ *
+ * According to Karol Herbst, the game "Divinity: Original Sin - Enhanced
+ * Edition" depends on this odd quirk of the spec. See:
+ * https://lists.freedesktop.org/archives/mesa-dev/2016-March/109789.html
+ */
+#include "piglit-util-gl.h"
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+	config.supports_gl_compat_version = 20;
+
+	config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+static const char vs_text[] =
+	"void main() { gl_Position = gl_Vertex; }";
+
+/* good_fs_text uses a constant green color, while bad_fs_text uses a
+ * constant red color, so that we can tell which version of the fragment
+ * shader got executed. Both are distinct from the clear-color so we can
+ * tell if the shader ran at all.
+ */
+
+static const char good_fs_text[] =
+	"void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }";
+
+static const char bad_fs_text[] =
+	"void main() { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); }";
+
+enum piglit_result
+piglit_display(void)
+{
+	static const float green[3] = { 0.0, 1.0, 0.0 };
+
+	glClear(GL_COLOR_BUFFER_BIT);
+
+	piglit_draw_rect(-1, -1, 2, 2);
+	if (!piglit_probe_pixel_rgb(15, 15, green))
+		return PIGLIT_FAIL;
+
+	return PIGLIT_PASS;
+}
+
+void
+piglit_init(int argc, char **argv)
+{
+	GLuint vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_text);
+	GLuint fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, good_fs_text);
+	const GLchar *bad_fs_texts[] = { bad_fs_text };
+	GLuint prog;
+
+	/* Change the shader source, but don't recompile it before linking. */
+	glShaderSource(fs, 1, bad_fs_texts, NULL);
+	prog = piglit_link_simple_program(vs, fs);
+	if (!prog)
+		piglit_report_result(PIGLIT_FAIL);
+
+	glDeleteShader(vs);
+	glDeleteShader(fs);
+
+	glUseProgram(prog);
+
+	glClearColor(0.3, 0.3, 0.3, 0.0);
+}
-- 
2.6.2



More information about the Piglit mailing list