[Piglit] [PATCH 4/4] arb_bindless_texture: fix setting bound/bindless uniforms

Samuel Pitoiset samuel.pitoiset at gmail.com
Fri May 19 12:52:51 UTC 2017


The initial arb_bindless_texture-uniform wasn't totally correct
after getting a confirmation from Jeff Bolz (NVIDIA).

The spec allows setting a bindless sampler uniform with either
glUniformi1*() or glUniformHandle*(), while a bound sampler
uniform can only be set using glUniform1*().

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
 tests/spec/arb_bindless_texture/uniform.c | 157 +++++++++++++++++++++++++++---
 1 file changed, 141 insertions(+), 16 deletions(-)

diff --git a/tests/spec/arb_bindless_texture/uniform.c b/tests/spec/arb_bindless_texture/uniform.c
index c4c06df05..3d7b0ad7c 100644
--- a/tests/spec/arb_bindless_texture/uniform.c
+++ b/tests/spec/arb_bindless_texture/uniform.c
@@ -61,6 +61,18 @@ static const char *fs_explicit_bound_sampler =
 	"	color = texture(tex, vec2(0, 0));\n"
 	"}\n";
 
+static const char *fs_explicit_bindless_sampler =
+	"#version 330\n"
+	"#extension GL_ARB_bindless_texture: require\n"
+	"\n"
+	"layout (bindless_sampler) uniform sampler2D tex;\n"
+	"out vec4 color;\n"
+	"\n"
+	"void main()\n"
+	"{\n"
+	"	color = texture(tex, vec2(0, 0));\n"
+	"}\n";
+
 static const char *fs_implicit_bound_sampler =
 	"#version 330\n"
 	"#extension GL_ARB_bindless_texture: require\n"
@@ -86,6 +98,19 @@ static const char *fs_explicit_bound_image =
 	"	imageStore(img, ivec2(0, 0), color);\n"
 	"}\n";
 
+static const char *fs_explicit_bindless_image =
+	"#version 330\n"
+	"#extension GL_ARB_bindless_texture: require\n"
+	"#extension GL_ARB_shader_image_load_store: enable\n"
+	"\n"
+	"layout (bindless_image) writeonly uniform image2D img;\n"
+	"out vec4 color;\n"
+	"\n"
+	"void main()\n"
+	"{\n"
+	"	imageStore(img, ivec2(0, 0), color);\n"
+	"}\n";
+
 static const char *fs_implicit_bound_image =
 	"#version 330\n"
 	"#extension GL_ARB_bindless_texture: require\n"
@@ -134,7 +159,7 @@ check_UniformHandleui64_with_explicit_bound_sampler(void *data)
 }
 
 static enum piglit_result
-check_UniformHandleui64_with_implicit_bound_sampler(void *data)
+check_Uniform_with_explicit_bindless_sampler(void *data)
 {
 	GLuint vs, fs, prog;
 	GLuint64 handle = 0;
@@ -142,7 +167,7 @@ check_UniformHandleui64_with_implicit_bound_sampler(void *data)
 
 	vs = piglit_compile_shader_text(GL_VERTEX_SHADER, passthrough_vs_src);
 	fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER,
-					fs_implicit_bound_sampler);
+					fs_explicit_bindless_sampler);
 	prog = piglit_link_simple_program(vs, fs);
 	glUseProgram(prog);
 
@@ -152,10 +177,12 @@ check_UniformHandleui64_with_implicit_bound_sampler(void *data)
 
 	/* The ARB_bindless_texture spec says:
 	 *
-	 * "When used as uniforms in the default block, the value of sampler
-	 *  variables may be specified with either Uniform1i{v} or
-	 *  UniformHandleui64{v}ARB."
+	 * "These modifiers control whether default-block uniforms of the
+	 *  corresponding types may have their values set via both
+	 *  UniformHandle* and Uniform1i (bindless_sampler and bindless_image)
+	 *  or only via Uniform1i (bound_sampler and bound_image)."
 	 */
+	glUniform1i(loc, 5);
 	glUniformHandleui64ARB(loc, handle);
 	glProgramUniformHandleui64vARB(prog, loc, 1, &handle);
 	if (!piglit_check_gl_error(GL_NO_ERROR))
@@ -165,6 +192,48 @@ check_UniformHandleui64_with_implicit_bound_sampler(void *data)
 }
 
 static enum piglit_result
+check_Uniform_with_implicit_bound_sampler(void *data)
+{
+	GLuint vs, fs, prog;
+	GLuint64 handle = 0;
+	GLint loc;
+
+	vs = piglit_compile_shader_text(GL_VERTEX_SHADER, passthrough_vs_src);
+	fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER,
+					fs_implicit_bound_sampler);
+	prog = piglit_link_simple_program(vs, fs);
+	glUseProgram(prog);
+
+	loc = glGetUniformLocation(prog, "tex");
+	if (loc == -1)
+		return PIGLIT_FAIL;
+
+	/* The ARB_bindless_texture spec says:
+	 *
+	 * "These modifiers control whether default-block uniforms of the
+	 *  corresponding types may have their values set via both
+	 *  UniformHandle* and Uniform1i (bindless_sampler and bindless_image)
+	 *  or only via Uniform1i (bound_sampler and bound_image)."
+	 *
+	 * "In the absence of these qualifiers, sampler and image uniforms are
+	 *  considered "bound"."
+	 */
+	glUniform1i(loc, 5);
+	if (!piglit_check_gl_error(GL_NO_ERROR))
+		return PIGLIT_FAIL;
+
+	glUniformHandleui64ARB(loc, handle);
+	if (!piglit_check_gl_error(GL_INVALID_OPERATION))
+		return PIGLIT_FAIL;
+
+	glProgramUniformHandleui64vARB(prog, loc, 1, &handle);
+	if (!piglit_check_gl_error(GL_INVALID_OPERATION))
+		return PIGLIT_FAIL;
+
+	return PIGLIT_PASS;
+}
+
+static enum piglit_result
 check_UniformHandleui64_with_explicit_bound_image(void *data)
 {
 	GLuint vs, fs, prog;
@@ -199,7 +268,7 @@ check_UniformHandleui64_with_explicit_bound_image(void *data)
 }
 
 static enum piglit_result
-check_UniformHandleui64_with_implicit_bound_image(void *data)
+check_Uniform_with_explicit_bindless_image(void *data)
 {
 	GLuint vs, fs, prog;
 	GLuint64 handle = 0;
@@ -207,7 +276,7 @@ check_UniformHandleui64_with_implicit_bound_image(void *data)
 
 	vs = piglit_compile_shader_text(GL_VERTEX_SHADER, passthrough_vs_src);
 	fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER,
-					fs_implicit_bound_image);
+					fs_explicit_bindless_image);
 	prog = piglit_link_simple_program(vs, fs);
 	glUseProgram(prog);
 
@@ -217,10 +286,12 @@ check_UniformHandleui64_with_implicit_bound_image(void *data)
 
 	/* The ARB_bindless_texture spec says:
 	 *
-	 * "When used as uniforms in the default block, the value of sampler
-	 *  variables may be specified with either Uniform1i{v} or
-	 *  UniformHandleui64{v}ARB."
+	 * "These modifiers control whether default-block uniforms of the
+	 *  corresponding types may have their values set via both
+	 *  UniformHandle* and Uniform1i (bindless_sampler and bindless_image)
+	 *  or only via Uniform1i (bound_sampler and bound_image)."
 	 */
+	glUniform1i(loc, 5);
 	glUniformHandleui64ARB(loc, handle);
 	glProgramUniformHandleui64vARB(prog, loc, 1, &handle);
 	if (!piglit_check_gl_error(GL_NO_ERROR))
@@ -230,6 +301,48 @@ check_UniformHandleui64_with_implicit_bound_image(void *data)
 }
 
 static enum piglit_result
+check_Uniform_with_implicit_bound_image(void *data)
+{
+	GLuint vs, fs, prog;
+	GLuint64 handle = 0;
+	GLint loc;
+
+	vs = piglit_compile_shader_text(GL_VERTEX_SHADER, passthrough_vs_src);
+	fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER,
+					fs_implicit_bound_image);
+	prog = piglit_link_simple_program(vs, fs);
+	glUseProgram(prog);
+
+	loc = glGetUniformLocation(prog, "img");
+	if (loc == -1)
+		return PIGLIT_FAIL;
+
+	/* The ARB_bindless_texture spec says:
+	 *
+	 * "These modifiers control whether default-block uniforms of the
+	 *  corresponding types may have their values set via both
+	 *  UniformHandle* and Uniform1i (bindless_sampler and bindless_image)
+	 *  or only via Uniform1i (bound_sampler and bound_image)."
+	 *
+	 * "In the absence of these qualifiers, sampler and image uniforms are
+	 *  considered "bound"."
+	 */
+	glUniform1i(loc, 5);
+	if (!piglit_check_gl_error(GL_NO_ERROR))
+		return PIGLIT_FAIL;
+
+	glUniformHandleui64ARB(loc, handle);
+	if (!piglit_check_gl_error(GL_INVALID_OPERATION))
+		return PIGLIT_FAIL;
+
+	glProgramUniformHandleui64vARB(prog, loc, 1, &handle);
+	if (!piglit_check_gl_error(GL_INVALID_OPERATION))
+		return PIGLIT_FAIL;
+
+	return PIGLIT_PASS;
+}
+
+static enum piglit_result
 use_glGetActiveUniform_with_sampler(void *data)
 {
 	GLuint vs, fs, prog;
@@ -308,9 +421,15 @@ static const struct piglit_subtest subtests[] = {
 		NULL
 	},
 	{
-		"Check glUniformHandleui64*ARB() with implicit bound_sampler",
-		"check_UniformHandleui64_with_implicit_bound_sampler",
-		check_UniformHandleui64_with_implicit_bound_sampler,
+		"Check glUniform*() with explicit bindless_sampler",
+		"check_Uniform_with_explicit_bindless_sampler",
+		check_Uniform_with_explicit_bindless_sampler,
+		NULL
+	},
+	{
+		"Check glUniform*() with implicit bound_sampler",
+		"check_Uniform_with_implicit_bound_sampler",
+		check_Uniform_with_implicit_bound_sampler,
 		NULL
 	},
 	{
@@ -320,9 +439,15 @@ static const struct piglit_subtest subtests[] = {
 		NULL
 	},
 	{
-		"Check glUniformHandleui64*ARB() with implicit bound_image",
-		"check_UniformHandleui64_with_implicit_bound_image",
-		check_UniformHandleui64_with_implicit_bound_image,
+		"Check glUniform*() with explicit bindless_image",
+		"check_Uniform_with_explicit_bindless_image",
+		check_Uniform_with_explicit_bindless_image,
+		NULL
+	},
+	{
+		"Check glUniform*() with implicit bound_image",
+		"check_Uniform_with_implicit_bound_image",
+		check_Uniform_with_implicit_bound_image,
 		NULL
 	},
 	{
-- 
2.13.0



More information about the Piglit mailing list