[Mesa-dev] [PATCH] Test that glShaderSource does not change compile status.

Jamey Sharp jamey at minilop.net
Tue Apr 26 05:04:29 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: Karol Herbst <nouveau at karolherbst.de>
---
 tests/all.py                            |   1 +
 tests/shaders/CMakeLists.gl.txt         |   1 +
 tests/shaders/shadersource-no-compile.c | 107 ++++++++++++++++++++++++++++++++
 3 files changed, 109 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..922f0f3
--- /dev/null
+++ b/tests/shaders/shadersource-no-compile.c
@@ -0,0 +1,107 @@
+/*
+ * 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
+ *
+ * \author Jamey Sharp <jamey at minilop.net>
+ */
+#include "piglit-util-gl.h"
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+	config.supports_gl_compat_version = 10;
+
+	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_ModelViewProjectionMatrix * gl_Vertex; "
+	"gl_FrontColor = vec4(0.0, 1.0, 0.0, 1.0); }";
+
+static const char good_fs_text[] =
+	"void main() { gl_FragColor = gl_Color; }";
+
+/* It is important that this shader *not* use gl_Color.
+ */
+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 };
+	static const float blue[3]  = { 0.0, 0.0, 1.0 };
+	enum piglit_result result = PIGLIT_PASS;
+	GLuint vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_text);
+	GLuint fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, good_fs_text);
+	GLuint prog;
+
+	/* Change the shader source, but don't recompile it before linking. */
+	glShaderSource(fs, 1, (const GLchar *[]) { bad_fs_text }, NULL);
+	prog = piglit_link_simple_program(vs, fs);
+	if (!prog)
+		piglit_report_result(PIGLIT_FAIL);
+
+	glDeleteShader(vs);
+	glDeleteShader(fs);
+
+	glClear(GL_COLOR_BUFFER_BIT);
+	/* good_fs_text uses the color from the vertex shader, which is green.
+	 * bad_fs_text uses a constant red color. Both are distinct from the
+	 * color set here, and from the clear-color. */
+	glColor3fv(blue);
+
+	glUseProgram(prog);
+	piglit_draw_rect(10, 10, 10, 10);
+	if (!piglit_probe_pixel_rgb(15, 15, green))
+		result = PIGLIT_FAIL;
+
+	if (!piglit_automatic)
+		piglit_present_results();
+
+	return result;
+}
+
+void
+piglit_init(int argc, char **argv)
+{
+	piglit_require_gl_version(20);
+
+	glClearColor(0.3, 0.3, 0.3, 0.0);
+
+	piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);
+}
-- 
2.6.2



More information about the mesa-dev mailing list