From: Neil Roberts <nrobe...@igalia.com>

There is now an [elements] section which can contain a list of indices
as well as a draw elements command to draw with it.
---
 tests/shaders/shader_runner.c | 99 +++++++++++++++++++++++++++++++++++
 1 file changed, 99 insertions(+)

diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
index 851d66b04..778229e2a 100644
--- a/tests/shaders/shader_runner.c
+++ b/tests/shaders/shader_runner.c
@@ -185,6 +185,9 @@ static GLuint vao = 0;
 static GLuint draw_fbo, read_fbo;
 static GLint render_width, render_height;
 static GLint read_width, read_height;
+static uint16_t *elements_buffer;
+static size_t num_elements;
+static size_t elements_buffer_size;
 
 static bool use_get_program_binary = false;
 
@@ -313,6 +316,7 @@ enum states {
        compute_shader_spirv,
        compute_shader_specializations,
        vertex_data,
+       elements,
        test,
 };
 
@@ -1395,6 +1399,9 @@ leave_state(enum states state, const char *line, const 
char *script_name)
                vertex_data_end = line;
                break;
 
+       case elements:
+               break;
+
        case test:
                break;
 
@@ -1644,6 +1651,40 @@ process_specialization(enum states state, const char 
*line)
        return PIGLIT_FAIL;
 }
 
+static enum piglit_result
+process_elements(enum states state, const char *line)
+{
+       const char *end = strchrnul(line, '\n');
+
+       while (true) {
+               while (line < end && isspace(*line))
+                       line++;
+               if (line >= end  || *line == '#')
+                       return PIGLIT_PASS;
+
+               if (num_elements >= elements_buffer_size) {
+                       if (elements_buffer_size == 0)
+                               elements_buffer_size = 1;
+                       else
+                               elements_buffer_size *= 2;
+                       elements_buffer = realloc(elements_buffer,
+                                                 elements_buffer_size *
+                                                 sizeof *elements_buffer);
+               }
+
+               unsigned val;
+               if (parse_uints(line, &val, 1, &line) != 1 ||
+                   val > UINT16_MAX) {
+                       fprintf(stderr, "Invalid elements line\n");
+                       return PIGLIT_FAIL;
+               }
+
+               elements_buffer[num_elements++] = val;
+       }
+
+       return PIGLIT_PASS;
+}
+
 static enum piglit_result
 process_test_script(const char *script_name)
 {
@@ -1738,6 +1779,8 @@ process_test_script(const char *script_name)
                        } else if (parse_str(line, "[vertex data]", NULL)) {
                                state = vertex_data;
                                vertex_data_start = NULL;
+                       } else if (parse_str(line, "[elements]", NULL)) {
+                               state = elements;
                        } else if (parse_str(line, "[test]", NULL)) {
                                test_start = strchrnul(line, '\n');
                                test_start_line_num = line_num + 1;
@@ -1802,6 +1845,14 @@ process_test_script(const char *script_name)
                                        vertex_data_start = line;
                                break;
 
+                       case elements: {
+                               enum piglit_result result =
+                                       process_elements(state, line);
+                               if (result != PIGLIT_PASS)
+                                       return result;
+                               break;
+                       }
+
                        case test:
                                break;
                        }
@@ -4467,6 +4518,26 @@ draw_arrays_common(int first, size_t count)
        return result;
 }
 
+static enum piglit_result
+draw_elements_common(int basevertex, int count)
+{
+       enum piglit_result result = program_must_be_in_use();
+       if (basevertex < 0) {
+               printf("draw elements 'basevertex' must be >= 0\n");
+               piglit_report_result(PIGLIT_FAIL);
+       }
+       if (count <= 0) {
+               printf("draw elements 'count' must be > 0\n");
+               piglit_report_result(PIGLIT_FAIL);
+       } else if (count > num_elements) {
+               printf("draw elements cannot draw beyond %lu\n",
+                       (unsigned long) num_elements);
+               piglit_report_result(PIGLIT_FAIL);
+       }
+       bind_vao_if_supported();
+       return result;
+}
+
 static bool
 probe_atomic_counter(unsigned buffer_num, GLint counter_num, const char *op,
                     uint32_t value, bool uses_layout_qualifiers)
@@ -4790,6 +4861,19 @@ piglit_display(void)
                        size_t count = (size_t) y;
                        result = draw_arrays_common(first, count);
                        glDrawArrays(mode, first, count);
+               } else if (sscanf(line, "draw elements %31s %d %d", s, &x, &y) 
== 3) {
+                       GLenum mode = decode_drawing_mode(s);
+                       size_t count = (size_t) x;
+                       int basevertex = y;
+                       result = draw_elements_common(basevertex, count);
+                       if (basevertex > 0) {
+                               glDrawElementsBaseVertex(mode, count,
+                                                        GL_UNSIGNED_SHORT,
+                                                        NULL, basevertex);
+                       } else {
+                               glDrawElements(mode, count,
+                                              GL_UNSIGNED_SHORT, NULL);
+                       }
                } else if (parse_str(line, "disable ", &rest)) {
                        do_enable_disable(rest, false);
                } else if (parse_str(line, "enable ", &rest)) {
@@ -5660,6 +5744,18 @@ piglit_display(void)
        return full_result;
 }
 
+static void
+setup_elements_buffer(void)
+{
+       GLuint buffer_handle;
+       glGenBuffers(1, &buffer_handle);
+       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer_handle);
+       glBufferData(GL_ELEMENT_ARRAY_BUFFER,
+                    num_elements * sizeof elements_buffer[0],
+                    elements_buffer,
+                    GL_STATIC_DRAW);
+}
+
 static enum piglit_result
 init_test(const char *file)
 {
@@ -5686,6 +5782,9 @@ init_test(const char *file)
                num_vbo_rows = setup_vbo_from_text(prog, vertex_data_start,
                                                   vertex_data_end);
                vbo_present = true;
+
+               if (num_elements > 0)
+                       setup_elements_buffer();
        }
        setup_ubos();
        return PIGLIT_PASS;
-- 
2.19.1

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to