Mesa (master): main: Added entry point for glCreateTransformFeedbacks

Martin Peres mperes at kemper.freedesktop.org
Wed Mar 25 08:07:15 UTC 2015


Module: Mesa
Branch: master
Commit: c86cb2da255216524974eb1c92caa1ecb378e32e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c86cb2da255216524974eb1c92caa1ecb378e32e

Author: Martin Peres <martin.peres at linux.intel.com>
Date:   Wed Jan 14 18:17:21 2015 +0200

main: Added entry point for glCreateTransformFeedbacks

v2: Review from Laura Ekstrand
- generate the name of the gl method once
- shorten some lines to stay in the 78 chars limit

v3: Review from Fredrik Höglund <fredrik at kde.org>
- rename gl_mthd_name to func
- set EverBound in _mesa_create_transform_feedbacks in the dsa case

v4:
- rename _mesa_create_transform_feedbacks to create_transform_feedbacks and
  make it static

Reviewed-by: Laura Ekstrand <laura at jlekstrand.net>
Signed-off-by: Martin Peres <martin.peres at linux.intel.com>

---

 src/mapi/glapi/gen/ARB_direct_state_access.xml |    7 +++
 src/mesa/main/tests/dispatch_sanity.cpp        |    1 +
 src/mesa/main/transformfeedback.c              |   67 ++++++++++++++++++------
 src/mesa/main/transformfeedback.h              |    3 ++
 4 files changed, 63 insertions(+), 15 deletions(-)

diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml b/src/mapi/glapi/gen/ARB_direct_state_access.xml
index 641e68f..0c7e880 100644
--- a/src/mapi/glapi/gen/ARB_direct_state_access.xml
+++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml
@@ -7,6 +7,13 @@
    <enum name="QUERY_TARGET"    value="0x82EA"/>
    <enum name="TEXTURE_BINDING" value="0x82EB"/>
 
+   <!-- Transform Feedback object functions -->
+
+  <function name="CreateTransformFeedbacks" offset="assign">
+      <param name="n" type="GLsizei" />
+      <param name="ids" type="GLuint *" />
+   </function>
+
    <!-- Buffer object functions -->
 
    <function name="CreateBuffers" offset="assign">
diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp
index 59ebb21..899a188 100644
--- a/src/mesa/main/tests/dispatch_sanity.cpp
+++ b/src/mesa/main/tests/dispatch_sanity.cpp
@@ -922,6 +922,7 @@ const struct function gl_core_functions_possible[] = {
    { "glClipControl", 45, -1 },
 
    /* GL_ARB_direct_state_access */
+   { "glCreateTransformFeedbacks", 45, -1 },
    { "glCreateBuffers", 45, -1 },
    { "glNamedBufferStorage", 45, -1 },
    { "glNamedBufferData", 45, -1 },
diff --git a/src/mesa/main/transformfeedback.c b/src/mesa/main/transformfeedback.c
index ce678c8..3c19406 100644
--- a/src/mesa/main/transformfeedback.c
+++ b/src/mesa/main/transformfeedback.c
@@ -825,25 +825,24 @@ _mesa_lookup_transform_feedback_object(struct gl_context *ctx, GLuint name)
          _mesa_HashLookup(ctx->TransformFeedback.Objects, name);
 }
 
-
-/**
- * Create new transform feedback objects.   Transform feedback objects
- * encapsulate the state related to transform feedback to allow quickly
- * switching state (and drawing the results, below).
- * Part of GL_ARB_transform_feedback2.
- */
-void GLAPIENTRY
-_mesa_GenTransformFeedbacks(GLsizei n, GLuint *names)
+static void
+create_transform_feedbacks(struct gl_context *ctx, GLsizei n, GLuint *ids,
+                           bool dsa)
 {
    GLuint first;
-   GET_CURRENT_CONTEXT(ctx);
+   const char* func;
+
+   if (dsa)
+      func = "glCreateTransformFeedbacks";
+   else
+      func = "glGenTransformFeedbacks";
 
    if (n < 0) {
-      _mesa_error(ctx, GL_INVALID_VALUE, "glGenTransformFeedbacks(n < 0)");
+      _mesa_error(ctx, GL_INVALID_VALUE, "%s(n < 0)", func);
       return;
    }
 
-   if (!names)
+   if (!ids)
       return;
 
    /* we don't need contiguous IDs, but this might be faster */
@@ -854,18 +853,56 @@ _mesa_GenTransformFeedbacks(GLsizei n, GLuint *names)
          struct gl_transform_feedback_object *obj
             = ctx->Driver.NewTransformFeedback(ctx, first + i);
          if (!obj) {
-            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenTransformFeedbacks");
+            _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", func);
             return;
          }
-         names[i] = first + i;
+         ids[i] = first + i;
          _mesa_HashInsert(ctx->TransformFeedback.Objects, first + i, obj);
+         if (dsa) {
+            /* this is normally done at bind time in the non-dsa case */
+            obj->EverBound = GL_TRUE;
+         }
       }
    }
    else {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenTransformFeedbacks");
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", func);
    }
 }
 
+/**
+ * Create new transform feedback objects.   Transform feedback objects
+ * encapsulate the state related to transform feedback to allow quickly
+ * switching state (and drawing the results, below).
+ * Part of GL_ARB_transform_feedback2.
+ */
+void GLAPIENTRY
+_mesa_GenTransformFeedbacks(GLsizei n, GLuint *names)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   /* GenTransformFeedbacks should just reserve the object names that a
+    * subsequent call to BindTransformFeedback should actively create. For
+    * the sake of simplicity, we reserve the names and create the objects
+    * straight away.
+    */
+
+   create_transform_feedbacks(ctx, n, names, false);
+}
+
+/**
+ * Create new transform feedback objects.   Transform feedback objects
+ * encapsulate the state related to transform feedback to allow quickly
+ * switching state (and drawing the results, below).
+ * Part of GL_ARB_direct_state_access.
+ */
+void GLAPIENTRY
+_mesa_CreateTransformFeedbacks(GLsizei n, GLuint *names)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   create_transform_feedbacks(ctx, n, names, true);
+}
+
 
 /**
  * Is the given ID a transform feedback object?
diff --git a/src/mesa/main/transformfeedback.h b/src/mesa/main/transformfeedback.h
index 87f4080..9de1fef 100644
--- a/src/mesa/main/transformfeedback.h
+++ b/src/mesa/main/transformfeedback.h
@@ -102,6 +102,9 @@ _mesa_lookup_transform_feedback_object(struct gl_context *ctx, GLuint name);
 extern void GLAPIENTRY
 _mesa_GenTransformFeedbacks(GLsizei n, GLuint *names);
 
+extern void GLAPIENTRY
+_mesa_CreateTransformFeedbacks(GLsizei n, GLuint *names);
+
 extern GLboolean GLAPIENTRY
 _mesa_IsTransformFeedback(GLuint name);
 




More information about the mesa-commit mailing list