glapi: add plumbing for GL_ARB_draw_indirect and GL_ARB_multi_draw_indirect
authorChris Forbes <chrisf@ijw.co.nz>
Wed, 6 Nov 2013 07:09:46 +0000 (20:09 +1300)
committerChris Forbes <chrisf@ijw.co.nz>
Mon, 25 Nov 2013 09:01:35 +0000 (22:01 +1300)
Based on part of Patch 2 of Christoph Bumiller's ARB_draw_indirect series.

Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mapi/glapi/gen/ARB_draw_indirect.xml [new file with mode: 0644]
src/mapi/glapi/gen/Makefile.am
src/mapi/glapi/gen/gl_API.xml
src/mesa/main/tests/dispatch_sanity.cpp
src/mesa/vbo/vbo_exec_array.c

diff --git a/src/mapi/glapi/gen/ARB_draw_indirect.xml b/src/mapi/glapi/gen/ARB_draw_indirect.xml
new file mode 100644 (file)
index 0000000..7de03cd
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!DOCTYPE OpenGLAPI SYSTEM "gl_API.dtd">
+
+<OpenGLAPI>
+
+<category name="GL_ARB_draw_indirect" number="87">
+
+    <enum name="DRAW_INDIRECT_BUFFER"                   value="0x8F3F"/>
+    <enum name="DRAW_INDIRECT_BUFFER_BINDING"           value="0x8F43"/>
+
+    <function name="DrawArraysIndirect" offset="assign" exec="dynamic">
+        <param name="mode" type="GLenum"/>
+        <param name="indirect" type="const GLvoid *"/>
+    </function>
+
+    <function name="DrawElementsIndirect" offset="assign" exec="dynamic">
+        <param name="mode" type="GLenum"/>
+        <param name="type" type="GLenum"/>
+        <param name="indirect" type="const GLvoid *"/>
+    </function>
+
+</category>
+
+
+<category name="GL_ARB_multi_draw_indirect" number="133">
+
+    <function name="MultiDrawArraysIndirect" offset="assign" exec="dynamic">
+        <param name="mode" type="GLenum"/>
+        <param name="indirect" type="const GLvoid *"/>
+        <param name="primcount" type="GLsizei"/>
+        <param name="stride" type="GLsizei"/>
+    </function>
+
+    <function name="MultiDrawElementsIndirect" offset="assign" exec="dynamic">
+        <param name="mode" type="GLenum"/>
+        <param name="type" type="GLenum"/>
+        <param name="indirect" type="const GLvoid *"/>
+        <param name="primcount" type="GLsizei"/>
+        <param name="stride" type="GLsizei"/>
+    </function>
+
+</category>
+
+
+</OpenGLAPI>
index 476d943dd93d7bccdc535e6c185e002097335f02..7af769acf9674a2b3f9b0207a534e6538a4e6682 100644 (file)
@@ -98,6 +98,7 @@ API_XML = \
        ARB_draw_buffers.xml \
        ARB_draw_buffers_blend.xml \
        ARB_draw_elements_base_vertex.xml \
+       ARB_draw_indirect.xml \
        ARB_draw_instanced.xml \
        ARB_ES2_compatibility.xml \
        ARB_ES3_compatibility.xml \
index a2d914ac46ff01757327f553e65c65e3dc2633f3..5c877aa3f94e428277c22f96eb8b98b52fa3cab4 100644 (file)
 
 <!-- ARB extensions #86...#93 -->
 
+<xi:include href="ARB_draw_indirect.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
+
 <category name="GL_ARB_transform_feedback3" number="94">
   <enum name="MAX_TRANSFORM_FEEDBACK_BUFFERS" value="0x8E70"/>
   <enum name="MAX_VERTEX_STREAMS"             value="0x8E71"/>
 
 <xi:include href="ARB_invalidate_subdata.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
 
-<!-- ARB extensions #133...#138 -->
+<!-- ARB extensions #134...#138 -->
 
 <xi:include href="ARB_texture_buffer_range.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
 
index 922f0acafc2b1cdcccbace6f6a496535f653dba3..e57fb52d394e5b49316dd3281e53fb3b7b78f1e6 100644 (file)
@@ -667,8 +667,8 @@ const struct function gl_core_functions_possible[] = {
    { "glVertexAttribP3uiv", 43, -1 },
    { "glVertexAttribP4ui", 43, -1 },
    { "glVertexAttribP4uiv", 43, -1 },
-// { "glDrawArraysIndirect", 43, -1 },                  // XXX: Add to xml
-// { "glDrawElementsIndirect", 43, -1 },                // XXX: Add to xml
+   { "glDrawArraysIndirect", 43, -1 },
+   { "glDrawElementsIndirect", 43, -1 },
 // { "glUniform1d", 43, -1 },                           // XXX: Add to xml
 // { "glUniform2d", 43, -1 },                           // XXX: Add to xml
 // { "glUniform3d", 43, -1 },                           // XXX: Add to xml
@@ -877,8 +877,8 @@ const struct function gl_core_functions_possible[] = {
    { "glInvalidateBufferData", 43, -1 },
    { "glInvalidateFramebuffer", 43, -1 },
    { "glInvalidateSubFramebuffer", 43, -1 },
-// { "glMultiDrawArraysIndirect", 43, -1 },             // XXX: Add to xml
-// { "glMultiDrawElementsIndirect", 43, -1 },           // XXX: Add to xml
+   { "glMultiDrawArraysIndirect", 43, -1 },
+   { "glMultiDrawElementsIndirect", 43, -1 },
 // { "glGetProgramInterfaceiv", 43, -1 },               // XXX: Add to xml
 // { "glGetProgramResourceIndex", 43, -1 },             // XXX: Add to xml
 // { "glGetProgramResourceName", 43, -1 },              // XXX: Add to xml
index a2c0c7d8f31625375fde2b4e24acdcf3aacf1e77..303e87f779c303c556f08e3f3f9c269aa9fe3410 100644 (file)
@@ -1564,6 +1564,34 @@ vbo_exec_DrawTransformFeedbackStreamInstanced(GLenum mode, GLuint name,
    vbo_draw_transform_feedback(ctx, mode, obj, stream, primcount);
 }
 
+/**
+ * Like [Multi]DrawArrays/Elements, but they take most arguments from
+ * a buffer object.
+ */
+static void GLAPIENTRY
+vbo_exec_DrawArraysIndirect(GLenum mode, const GLvoid *indirect)
+{
+}
+
+static void GLAPIENTRY
+vbo_exec_DrawElementsIndirect(GLenum mode, GLenum type,
+                              const GLvoid *indirect)
+{
+}
+
+static void GLAPIENTRY
+vbo_exec_MultiDrawArraysIndirect(GLenum mode,
+                                 const GLvoid *indirect,
+                                 GLsizei primcount, GLsizei stride)
+{
+}
+
+static void GLAPIENTRY
+vbo_exec_MultiDrawElementsIndirect(GLenum mode, GLenum type,
+                                   const GLvoid *indirect,
+                                   GLsizei primcount, GLsizei stride)
+{
+}
 
 /**
  * Initialize the dispatch table with the VBO functions for drawing.
@@ -1597,6 +1625,13 @@ vbo_initialize_exec_dispatch(const struct gl_context *ctx,
       SET_DrawElementsInstancedBaseVertexBaseInstance(exec, vbo_exec_DrawElementsInstancedBaseVertexBaseInstance);
    }
 
+   if (ctx->API == API_OPENGL_CORE) {
+      SET_DrawArraysIndirect(exec, vbo_exec_DrawArraysIndirect);
+      SET_DrawElementsIndirect(exec, vbo_exec_DrawElementsIndirect);
+      SET_MultiDrawArraysIndirect(exec, vbo_exec_MultiDrawArraysIndirect);
+      SET_MultiDrawElementsIndirect(exec, vbo_exec_MultiDrawElementsIndirect);
+   }
+
    if (_mesa_is_desktop_gl(ctx) || _mesa_is_gles3(ctx)) {
       SET_DrawArraysInstancedARB(exec, vbo_exec_DrawArraysInstanced);
       SET_DrawElementsInstancedARB(exec, vbo_exec_DrawElementsInstanced);