[Piglit] [PATCH] arb_bindless_texture: add a test which sets mixed texture units/handles
Samuel Pitoiset
samuel.pitoiset at gmail.com
Tue Jul 25 19:31:02 UTC 2017
This test currently fails to return the correct 64-bit handle value
with Mesa. This is because it ends up by performing the slower
convert-and-copy process instead of just memcpy'ing the value.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
tests/spec/arb_bindless_texture/uniform.c | 89 +++++++++++++++++++++++++++++++
1 file changed, 89 insertions(+)
diff --git a/tests/spec/arb_bindless_texture/uniform.c b/tests/spec/arb_bindless_texture/uniform.c
index 393b1dab5..aa3e0ec81 100644
--- a/tests/spec/arb_bindless_texture/uniform.c
+++ b/tests/spec/arb_bindless_texture/uniform.c
@@ -27,6 +27,8 @@
* glUniformHandleui*64ARB(), glGetActiveUniform(), etc.
*/
+#include <inttypes.h>
+
#include "common.h"
static struct piglit_gl_test_config *piglit_config;
@@ -355,6 +357,87 @@ check_Uniform_with_implicit_bound_image(void *data)
return PIGLIT_PASS;
}
+static bool
+check_uniform_int(GLuint prog, int loc, int expect)
+{
+ int v = 0xdeadcafe;
+
+ glGetUniformiv(prog, loc, &v);
+ if (v != expect) {
+ fprintf(stderr, "Invalid value for uniform %d\n"
+ " Expected: %d\n"
+ " Observed: %d\n",
+ loc, expect, v);
+ return false;
+ }
+ return piglit_check_gl_error(GL_NO_ERROR);
+}
+
+static bool
+check_uniform_handle(GLuint prog, int loc, GLuint64 expect)
+{
+ GLuint64 v = 0xdeadcafedeadcafe;
+
+ glGetUniformui64vARB(prog, loc, &v);
+ if (v != expect) {
+ fprintf(stderr, "Invalid value for uniform %d\n"
+ " Expected: %"PRIx64"\n"
+ " Observed: %"PRIx64"\n",
+ loc, expect, v);
+ return false;
+ }
+ return piglit_check_gl_error(GL_NO_ERROR);
+}
+
+static enum piglit_result
+check_Uniform_with_texture_units_and_handles(void *data)
+{
+ const char *fs_src =
+ "#version 330\n"
+ "#extension GL_ARB_bindless_texture: require\n"
+ "\n"
+ "layout (bindless_sampler) uniform sampler2D texs[5];\n"
+ "uniform int i;\n"
+ "out vec4 color;\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " color = texture(texs[i], vec2(0, 0));\n"
+ "}\n";
+ int units[5] = { 4, 7, 8, 1, 5 };
+ GLuint64 handle = 0x1004002010040020;
+ GLuint vs, fs, prog;
+ bool pass = true;
+ GLint loc;
+
+ vs = piglit_compile_shader_text(GL_VERTEX_SHADER, passthrough_vs_src);
+ fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fs_src);
+ prog = piglit_link_simple_program(vs, fs);
+ glUseProgram(prog);
+
+ loc = glGetUniformLocation(prog, "texs");
+ if (loc == -1)
+ return PIGLIT_FAIL;
+
+ /* Check setting an array of texture units. */
+ glUniform1iv(loc, 5, units);
+
+ for (int i = 0; i < 5; i++) {
+ pass &= check_uniform_int(prog, loc + i, units[i]);
+ }
+
+ /* Check setting a texture handle. */
+ glUniformHandleui64ARB(loc, handle);
+ pass &= check_uniform_handle(prog, loc, handle);
+
+ /* Make sure setting the handle didn't overwrite other values. */
+ for (int i = 1; i < 5; i++) {
+ pass &= check_uniform_int(prog, loc + i, units[i]);
+ }
+
+ return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
+
static enum piglit_result
use_glGetActiveUniform_with_sampler(void *data)
{
@@ -464,6 +547,12 @@ static const struct piglit_subtest subtests[] = {
NULL
},
{
+ "Check glUniform*() with mixed texture units/handles",
+ "check_Uniform_with_texture_units_and_handles",
+ check_Uniform_with_texture_units_and_handles,
+ NULL
+ },
+ {
"Use glGetActiveUniform with a sampler type",
"use_glGetActiveUniform_with_sampler",
use_glGetActiveUniform_with_sampler,
--
2.13.3
More information about the Piglit
mailing list