<div dir="ltr"><div>It's actually not trivial to move this test over to core = 32.  This is because you have to replace piglit_ortho_projection with shaders and piglit_ortho_uniform.  That's not terrible, but you also have to set up a vertex array object to handle the array coordinates, and I'm not sure of the correct way to do that.  So it would take some time.<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Apr 1, 2015 at 5:25 AM, Martin Peres <span dir="ltr"><<a href="mailto:martin.peres@linux.intel.com" target="_blank">martin.peres@linux.intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5"><br>
<br>
On 23/01/15 21:03, Laura Ekstrand wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
---<br>
  tests/all.py                                       |   1 +<br>
  .../spec/arb_direct_state_<u></u>access/CMakeLists.gl.txt |   1 +<br>
  .../arb_direct_state_access/<u></u>namedbufferstorage.c   | 283 +++++++++++++++++++++<br>
  3 files changed, 285 insertions(+)<br>
  create mode 100644 tests/spec/arb_direct_state_<u></u>access/namedbufferstorage.c<br>
<br>
diff --git a/tests/all.py b/tests/all.py<br>
index 32aa60a..7df3787 100644<br>
--- a/tests/all.py<br>
+++ b/tests/all.py<br>
@@ -4421,6 +4421,7 @@ spec['ARB_direct_state_access'<u></u>]['getcompressedtextureimage'] = PiglitGLTest(['ar<br>
  spec['ARB_direct_state_access'<u></u>]['texture-storage-<u></u>multisample'] = PiglitGLTest(['arb_direct_<u></u>state_access-texture-storage-<u></u>multisample'], run_concurrent=True)<br>
  spec['ARB_direct_state_access'<u></u>]['texture-buffer'] = PiglitGLTest(['arb_direct_<u></u>state_access-texture-buffer'], run_concurrent=True)<br>
  spec['ARB_direct_state_access'<u></u>]['texture-buffer-range'] = PiglitGLTest(['arb_direct_<u></u>state_access-texture-buffer-<u></u>range'], run_concurrent=True)<br>
+spec['ARB_direct_state_<u></u>access']['namedbufferstorage-<u></u>persistent'] = PiglitGLTest(['arb_direct_<u></u>state_access-<u></u>namedbufferstorage-persistent'<u></u>], run_concurrent=True)<br>
    profile.tests['hiz'] = hiz<br>
  profile.tests['fast_color_<u></u>clear'] = fast_color_clear<br>
diff --git a/tests/spec/arb_direct_state_<u></u>access/CMakeLists.gl.txt b/tests/spec/arb_direct_state_<u></u>access/CMakeLists.gl.txt<br>
index 26c0099..9228917 100644<br>
--- a/tests/spec/arb_direct_state_<u></u>access/CMakeLists.gl.txt<br>
+++ b/tests/spec/arb_direct_state_<u></u>access/CMakeLists.gl.txt<br>
@@ -9,6 +9,7 @@ link_libraries (<br>
        ${OPENGL_glu_LIBRARY}<br>
  )<br>
  +piglit_add_executable (arb_direct_state_access-<u></u>namedbufferstorage-persistent namedbufferstorage.c)<br>
  piglit_add_executable (arb_direct_state_access-dsa-<u></u>textures dsa-textures.c dsa-utils.c)<br>
  piglit_add_executable (arb_direct_state_access-<u></u>texturesubimage texturesubimage.c)<br>
  piglit_add_executable (arb_direct_state_access-bind-<u></u>texture-unit bind-texture-unit.c)<br>
diff --git a/tests/spec/arb_direct_state_<u></u>access/namedbufferstorage.c b/tests/spec/arb_direct_state_<u></u>access/namedbufferstorage.c<br>
new file mode 100644<br>
index 0000000..2ddfab6<br>
--- /dev/null<br>
+++ b/tests/spec/arb_direct_state_<u></u>access/namedbufferstorage.c<br>
@@ -0,0 +1,283 @@<br>
+/*<br>
+ * Copyright © 2014 Advanced Micro Devices, Inc.<br>
+ * All rights reserved.<br>
+ * Copyright 2015 Intel Corporation<br>
+ *<br>
+ * Permission is hereby granted, free of charge, to any person obtaining a<br>
+ * copy of this software and associated documentation files (the "Software"),<br>
+ * to deal in the Software without restriction, including without limitation<br>
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
+ * and/or sell copies of the Software, and to permit persons to whom the<br>
+ * Software is furnished to do so, subject to the following conditions:<br>
+ *<br>
+ * The above copyright notice and this permission notice (including the next<br>
+ * paragraph) shall be included in all copies or substantial portions of the<br>
+ * Software.<br>
+ *<br>
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER<br>
+ * DEALINGS IN THE SOFTWARE.<br>
+ *<br>
+ * Authors:<br>
+ *    Marek Olšák <<a href="mailto:marek.olsak@amd.com" target="_blank">marek.olsak@amd.com</a>><br>
+ *    Laura Ekstrand <<a href="mailto:laura@jlekstrand.net" target="_blank">laura@jlekstrand.net</a>><br>
+ *<br>
+ * Adapted to test NamedBufferStorage by Laura Ekstrand <<a href="mailto:laura@jlekstrand.net" target="_blank">laura@jlekstrand.net</a>><br>
+ * January 2015<br>
+ */<br>
+<br>
+#include "piglit-util-gl.h"<br>
+<br>
+PIGLIT_GL_TEST_CONFIG_BEGIN<br>
+<br>
+       config.supports_gl_compat_<u></u>version = 10;<br>
</blockquote>
<br></div></div>
You may want to ask for gl_core_version = 32, like you did for your texture tests.<span class=""><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+       config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;<br>
+<br>
+PIGLIT_GL_TEST_CONFIG_END<br>
+<br>
+#define BUF_SIZE (12 * 4 * sizeof(float))<br>
+<br>
+void<br>
+piglit_init(int argc, char **argv)<br>
+{<br>
+       piglit_require_gl_version(15);<br>
+       piglit_require_extension("GL_<u></u>ARB_buffer_storage");<br>
+       piglit_require_extension("GL_<u></u>ARB_map_buffer_range");<br>
</blockquote></span>
This one would not be needed because the extension got introduced in OpenGL 3.0.<br>
<br>
Otherwise, with all the other relevant commits squashed in this one, this is:<br>
<br>
Reviewed-by: Martin Peres <<a href="mailto:martin.peres@linux.intel.com" target="_blank">martin.peres@linux.intel.com</a>><div class="HOEnZb"><div class="h5"><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+       piglit_require_extension("GL_<u></u>ARB_direct_state_access");<br>
+<br>
+       piglit_ortho_projection(<u></u>piglit_width, piglit_height, GL_FALSE);<br>
+}<br>
+<br>
+static bool<br>
+create_mapped_buffer(GLuint *buffer, GLfloat **map, GLboolean coherent,<br>
+                    GLboolean client_storage)<br>
+{<br>
+       glCreateBuffers(1, buffer);<br>
+       glNamedBufferStorage(*buffer, BUF_SIZE, NULL,<br>
+                            GL_MAP_WRITE_BIT |<br>
+                            GL_MAP_PERSISTENT_BIT |<br>
+                            (coherent ? GL_MAP_COHERENT_BIT : 0) |<br>
+                            GL_DYNAMIC_STORAGE_BIT |<br>
+                            (client_storage ? GL_CLIENT_STORAGE_BIT : 0));<br>
+       glBindBuffer(GL_ARRAY_BUFFER, *buffer);<br>
+<br>
+       piglit_check_gl_error(GL_NO_<u></u>ERROR);<br>
+<br>
+       *map = glMapBufferRange(GL_ARRAY_<u></u>BUFFER, 0, BUF_SIZE,<br>
+                               GL_MAP_WRITE_BIT |<br>
+                               GL_MAP_PERSISTENT_BIT |<br>
+                               (coherent ? GL_MAP_COHERENT_BIT : 0));<br>
+<br>
+       piglit_check_gl_error(GL_NO_<u></u>ERROR);<br>
+<br>
+       if (!*map)<br>
+               return false;<br>
+<br>
+       glBindBuffer(GL_ARRAY_BUFFER, 0);<br>
+<br>
+       return true;<br>
+}<br>
+<br>
+static enum piglit_result result = PIGLIT_PASS;<br>
+static float white[4] = {1.0, 1.0, 1.0, 0.0};<br>
+static float black[4] = {0.0, 0.0, 0.0, 0.0};<br>
+#define RECT_WIDTH 20<br>
+#define RECT_HEIGHT 10<br>
+<br>
+/**<br>
+ * Looks like this:<br>
+ * ----------<br>
+ * |    HHHH|<br>
+ * |HHHH    |<br>
+ * |    HHHH|<br>
+ * |HHHH    |<br>
+ * ----------<br>
+ */<br>
+static float array[] = {<br>
+       1 * RECT_WIDTH, 0 * RECT_HEIGHT, 0,<br>
+       1 * RECT_WIDTH, 1 * RECT_HEIGHT, 0,<br>
+       0 * RECT_WIDTH, 0 * RECT_HEIGHT, 0,<br>
+       0 * RECT_WIDTH, 1 * RECT_HEIGHT, 0,<br>
+<br>
+       2 * RECT_WIDTH, 1 * RECT_HEIGHT, 0,<br>
+       2 * RECT_WIDTH, 2 * RECT_HEIGHT, 0,<br>
+       1 * RECT_WIDTH, 1 * RECT_HEIGHT, 0,<br>
+       1 * RECT_WIDTH, 2 * RECT_HEIGHT, 0,<br>
+<br>
+       1 * RECT_WIDTH, 2 * RECT_HEIGHT, 0,<br>
+       1 * RECT_WIDTH, 3 * RECT_HEIGHT, 0,<br>
+       0 * RECT_WIDTH, 2 * RECT_HEIGHT, 0,<br>
+       0 * RECT_WIDTH, 3 * RECT_HEIGHT, 0,<br>
+<br>
+       2 * RECT_WIDTH, 3 * RECT_HEIGHT, 0,<br>
+       2 * RECT_WIDTH, 4 * RECT_HEIGHT, 0,<br>
+       1 * RECT_WIDTH, 3 * RECT_HEIGHT, 0,<br>
+       1 * RECT_WIDTH, 4 * RECT_HEIGHT, 0<br>
+};<br>
+<br>
+static void<br>
+verify_rect(bool *pass, int hpos, int vpos, const float *expected)<br>
+{<br>
+       *pass = piglit_probe_rect_rgb(hpos * RECT_WIDTH, vpos * RECT_HEIGHT,<br>
+                                     RECT_WIDTH, RECT_HEIGHT,<br>
+                                     expected) && *pass;<br>
+}<br>
+<br>
+static void<br>
+draw_subtest(GLboolean coherent, GLboolean client_storage)<br>
+{<br>
+       GLuint buffer;<br>
+       GLfloat *map;<br>
+       bool pass = true;<br>
+<br>
+       if (!create_mapped_buffer(&<u></u>buffer, &map, coherent, client_storage)) {<br>
+               piglit_report_subtest_result(<u></u>PIGLIT_FAIL,<br>
+                       "draw%s%s", coherent ? " coherent" : "",<br>
+                       client_storage ? " client-storage" : "");<br>
+               result = PIGLIT_FAIL;<br>
+               return;<br>
+       }<br>
+<br>
+       glClear(GL_COLOR_BUFFER_BIT);<br>
+       glEnableClientState(GL_VERTEX_<u></u>ARRAY);<br>
+       glBindBuffer(GL_ARRAY_BUFFER, buffer);<br>
+       glVertexPointer(3, GL_FLOAT, 0, 0);<br>
+       glBindBuffer(GL_ARRAY_BUFFER, 0);<br>
+<br>
+       memcpy(map, array, 12 * sizeof(float));<br>
+       if (!coherent)<br>
+               glMemoryBarrier(GL_CLIENT_<u></u>MAPPED_BUFFER_BARRIER_BIT);<br>
+<br>
+       glDrawArrays(GL_TRIANGLE_<u></u>STRIP, 0, 4);<br>
+<br>
+       memcpy(map+12, array+12, 12 * sizeof(float));<br>
+       if (!coherent)<br>
+               glMemoryBarrier(GL_CLIENT_<u></u>MAPPED_BUFFER_BARRIER_BIT);<br>
+<br>
+       glDrawArrays(GL_TRIANGLE_<u></u>STRIP, 4, 4);<br>
+<br>
+       memcpy(map+12*2, array+12*2, 12 * sizeof(float));<br>
+       if (!coherent)<br>
+               glMemoryBarrier(GL_CLIENT_<u></u>MAPPED_BUFFER_BARRIER_BIT);<br>
+<br>
+       glDrawArrays(GL_TRIANGLE_<u></u>STRIP, 8, 4);<br>
+<br>
+       memcpy(map+12*3, array+12*3, 12 * sizeof(float));<br>
+       if (!coherent)<br>
+               glMemoryBarrier(GL_CLIENT_<u></u>MAPPED_BUFFER_BARRIER_BIT);<br>
+<br>
+       glDrawArrays(GL_TRIANGLE_<u></u>STRIP, 12, 4);<br>
+<br>
+       piglit_check_gl_error(0);<br>
+<br>
+       if (!piglit_automatic)<br>
+               piglit_present_results();<br>
+<br>
+       verify_rect(&pass, 0, 0, white);<br>
+       verify_rect(&pass, 1, 1, white);<br>
+       verify_rect(&pass, 0, 2, white);<br>
+       verify_rect(&pass, 1, 3, white);<br>
+<br>
+       verify_rect(&pass, 1, 0, black);<br>
+       verify_rect(&pass, 0, 1, black);<br>
+       verify_rect(&pass, 1, 2, black);<br>
+       verify_rect(&pass, 0, 3, black);<br>
+<br>
+       glDisableClientState(GL_<u></u>VERTEX_ARRAY);<br>
+<br>
+       piglit_report_subtest_result(<u></u>pass ? PIGLIT_PASS : PIGLIT_FAIL,<br>
+               "draw%s%s", coherent ? " coherent" : "",<br>
+               client_storage ? " client-storage" : "");<br>
+<br>
+       if (!pass)<br>
+               result = PIGLIT_FAIL;<br>
+}<br>
+<br>
+static void<br>
+read_subtest(GLboolean coherent, GLboolean client_storage)<br>
+{<br>
+       GLuint buffer;<br>
+       GLfloat *map;<br>
+       bool pass = true;<br>
+<br>
+       int i;<br>
+       GLuint srcbuf;<br>
+<br>
+       if (!create_mapped_buffer(&<u></u>buffer, &map, coherent, client_storage)) {<br>
+               piglit_report_subtest_result(<u></u>PIGLIT_FAIL,<br>
+                       "read%s%s", coherent ? " coherent" : "",<br>
+                       client_storage ? " client-storage" : "");<br>
+               result = PIGLIT_FAIL;<br>
+               return;<br>
+       }<br>
+<br>
+       glClear(GL_COLOR_BUFFER_BIT);<br>
+       glCreateBuffers(1, &srcbuf);<br>
+       glBindBuffer(GL_COPY_READ_<u></u>BUFFER, srcbuf);<br>
+       glBufferData(GL_COPY_READ_<u></u>BUFFER, BUF_SIZE, array, GL_STATIC_DRAW);<br>
+<br>
+       /* Copy some data to the mapped buffer and check if the CPU can see it. */<br>
+       glBindBuffer(GL_COPY_WRITE_<u></u>BUFFER, buffer);<br>
+       glCopyBufferSubData(GL_COPY_<u></u>READ_BUFFER, GL_COPY_WRITE_BUFFER,<br>
+                           0, 0, BUF_SIZE);<br>
+<br>
+       glBindBuffer(GL_COPY_READ_<u></u>BUFFER, 0);<br>
+       glBindBuffer(GL_COPY_WRITE_<u></u>BUFFER, 0);<br>
+       glDeleteBuffers(1, &srcbuf);<br>
+<br>
+       if (!coherent)<br>
+               glMemoryBarrier(GL_CLIENT_<u></u>MAPPED_BUFFER_BARRIER_BIT);<br>
+<br>
+       /* Wait for the GPU to flush */<br>
+       glFinish();<br>
+<br>
+       for (i = 0; i < ARRAY_SIZE(array); i++) {<br>
+               if (map[i] != array[i]) {<br>
+                       printf("Probe [%i] failed. Expected: %f  Observed: %f\n",<br>
+                              i, array[i], map[i]);<br>
+                       pass = false;<br>
+               }<br>
+       }<br>
+<br>
+       piglit_report_subtest_result(<u></u>pass ? PIGLIT_PASS : PIGLIT_FAIL,<br>
+               "read%s%s", coherent ? " coherent" : "",<br>
+               client_storage ? " client-storage" : "");<br>
+<br>
+       if (!pass)<br>
+               result = PIGLIT_FAIL;<br>
+}<br>
+<br>
+enum piglit_result<br>
+piglit_display(void)<br>
+{<br>
+       /* !Coherent draw subtests: require MemoryBarrier */<br>
+       if (piglit_is_extension_<u></u>supported("GL_ARB_shader_<u></u>image_load_store")) {<br>
+               draw_subtest(false, false);<br>
+               draw_subtest(false, true);<br>
+       }<br>
+<br>
+       /* Coherent draw subtests */<br>
+       draw_subtest(true, false);<br>
+       draw_subtest(true, true);<br>
+<br>
+       /* Need copy buffer extension for read tests */<br>
+       if (piglit_is_extension_<u></u>supported("GL_ARB_copy_buffer"<u></u>)) {<br>
+<br>
+               /* !Coherent read subtests: require MemoryBarrier */<br>
+               if (piglit_is_extension_<u></u>supported(<br>
+                      "GL_ARB_shader_image_load_<u></u>store")) {<br>
+                       read_subtest(false, false);<br>
+                       read_subtest(false, true);<br>
+               }<br>
+<br>
+               /* Coherent read subtests */<br>
+               read_subtest(true, false);<br>
+               read_subtest(true, true);<br>
+       }<br>
+<br>
+       return result;<br>
+}<br>
</blockquote>
<br>
</div></div></blockquote></div><br></div>