From: Dave Airlie <[email protected]>

This adds support for 64-bit integer uniforms to
shader_runner infrastructure.

Signed-off-by: Dave Airlie <[email protected]>
---
 tests/shaders/shader_runner.c | 97 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 97 insertions(+)

diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
index 94c7826..1187c64 100644
--- a/tests/shaders/shader_runner.c
+++ b/tests/shaders/shader_runner.c
@@ -185,6 +185,14 @@ static const struct string_to_enum all_types[] = {
        ENUM_STRING(GL_UNSIGNED_INT_VEC2),
        ENUM_STRING(GL_UNSIGNED_INT_VEC3),
        ENUM_STRING(GL_UNSIGNED_INT_VEC4),
+       ENUM_STRING(GL_INT64_ARB),
+       ENUM_STRING(GL_INT64_VEC2_ARB),
+       ENUM_STRING(GL_INT64_VEC3_ARB),
+       ENUM_STRING(GL_INT64_VEC4_ARB),
+       ENUM_STRING(GL_UNSIGNED_INT64_ARB),
+       ENUM_STRING(GL_UNSIGNED_INT64_VEC2_ARB),
+       ENUM_STRING(GL_UNSIGNED_INT64_VEC3_ARB),
+       ENUM_STRING(GL_UNSIGNED_INT64_VEC4_ARB),
        ENUM_STRING(GL_BOOL),
        ENUM_STRING(GL_BOOL_VEC2),
        ENUM_STRING(GL_BOOL_VEC3),
@@ -1411,6 +1419,23 @@ get_uints(const char *line, unsigned *uints, unsigned 
count)
                uints[i] = strtoul(line, (char **) &line, 0);
 }
 
+static void
+get_int64s(const char *line, int64_t *ints, unsigned count)
+{
+       int i;
+
+       for (i = 0; i < count; i++)
+               ints[i] = strtoll(line, (char **) &line, 0);
+}
+
+static void
+get_uint64s(const char *line, uint64_t *ints, unsigned count)
+{
+       int i;
+
+       for (i = 0; i < count; i++)
+               ints[i] = strtoull(line, (char **) &line, 0);
+}
 
 /**
  * Check that the GL implementation supports unsigned uniforms
@@ -1437,6 +1462,18 @@ check_double_support(void)
 }
 
 /**
+ * Check that the GL implementation supports double uniforms
+ * (e.g. through glUniform1d).  If not, terminate the test with a
+ * SKIP.
+ */
+static void
+check_int64_support(void)
+{
+       if (!piglit_is_extension_supported("GL_ARB_gpu_shader_int64"))
+               piglit_report_result(PIGLIT_SKIP);
+}
+
+/**
  * Check that the GL implementation supports shader subroutines
  * If not, terminate the test with a SKIP.
  */
@@ -1463,6 +1500,8 @@ set_ubo_uniform(char *name, const char *type, const char 
*line, int ubo_array_in
        double d[16];
        int ints[16];
        unsigned uints[16];
+       uint64_t uint64s[16];
+       int64_t int64s[16];
        int name_len = strlen(name);
 
        if (!num_uniform_blocks)
@@ -1527,6 +1566,12 @@ set_ubo_uniform(char *name, const char *type, const char 
*line, int ubo_array_in
        if (string_match("float", type)) {
                get_floats(line, f, 1);
                memcpy(data, f, sizeof(float));
+       } else if (string_match("int64_t", type)) {
+               get_int64s(line, int64s, 1);
+               memcpy(data, int64s, sizeof(int64_t));
+       } else if (string_match("uint64_t", type)) {
+               get_uint64s(line, uint64s, 1);
+               memcpy(data, uint64s, sizeof(uint64_t));
        } else if (string_match("int", type)) {
                get_ints(line, ints, 1);
                memcpy(data, ints, sizeof(int));
@@ -1548,6 +1593,14 @@ set_ubo_uniform(char *name, const char *type, const char 
*line, int ubo_array_in
                int elements = type[4] - '0';
                get_uints(line, uints, elements);
                memcpy(data, uints, elements * sizeof(unsigned));
+       } else if (string_match("i64vec", type)) {
+               int elements = type[6] - '0';
+               get_int64s(line, int64s, elements);
+               memcpy(data, int64s, elements * sizeof(int64_t));
+       } else if (string_match("u64vec", type)) {
+               int elements = type[6] - '0';
+               get_uint64s(line, uint64s, elements);
+               memcpy(data, uint64s, elements * sizeof(uint64_t));
        } else if (string_match("dvec", type)) {
                int elements = type[4] - '0';
                get_doubles(line, d, elements);
@@ -1638,6 +1691,8 @@ set_uniform(const char *line, int ubo_array_index)
        double d[16];
        int ints[16];
        unsigned uints[16];
+       int64_t int64s[16];
+       uint64_t uint64s[16];
        GLint loc;
        const char *type;
 
@@ -1667,6 +1722,16 @@ set_uniform(const char *line, int ubo_array_index)
                get_floats(line, f, 1);
                glUniform1fv(loc, 1, f);
                return;
+       } else if (string_match("int64_t", type)) {
+               check_int64_support();
+               get_int64s(line, int64s, 1);
+               glUniform1i64vARB(loc, 1, int64s);
+               return;
+       } else if (string_match("uint64_t", type)) {
+               check_int64_support();
+               get_uint64s(line, uint64s, 1);
+               glUniform1ui64vARB(loc, 1, uint64s);
+               return;
        } else if (string_match("int", type)) {
                get_ints(line, ints, 1);
                glUniform1iv(loc, 1, ints);
@@ -1743,6 +1808,38 @@ set_uniform(const char *line, int ubo_array_index)
                        glUniform4dv(loc, 1, d);
                        return;
                }
+       } else if (string_match("i64vec", type)) {
+               check_int64_support();
+               switch (type[6]) {
+               case '2':
+                       get_int64s(line, int64s, 2);
+                       glUniform2i64vARB(loc, 1, int64s);
+                       return;
+               case '3':
+                       get_int64s(line, int64s, 3);
+                       glUniform3i64vARB(loc, 1, int64s);
+                       return;
+               case '4':
+                       get_int64s(line, int64s, 4);
+                       glUniform4i64vARB(loc, 1, int64s);
+                       return;
+               }
+       } else if (string_match("u64vec", type)) {
+               check_int64_support();
+               switch (type[6]) {
+               case '2':
+                       get_uint64s(line, uint64s, 2);
+                       glUniform2ui64vARB(loc, 1, uint64s);
+                       return;
+               case '3':
+                       get_uint64s(line, uint64s, 3);
+                       glUniform3ui64vARB(loc, 1, uint64s);
+                       return;
+               case '4':
+                       get_uint64s(line, uint64s, 4);
+                       glUniform4ui64vARB(loc, 1, uint64s);
+                       return;
+               }
        } else if (string_match("mat", type) && type[3] != '\0') {
                char cols = type[3];
                char rows = type[4] == 'x' ? type[5] : cols;
-- 
2.5.5

_______________________________________________
Piglit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to