Mesa (master): mesa: clean-up display list mem allocation, fix NULL handling

Brian Paul brianp at kemper.freedesktop.org
Wed Oct 7 22:57:20 UTC 2009


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

Author: Brian Paul <brianp at vmware.com>
Date:   Wed Oct  7 16:21:34 2009 -0600

mesa: clean-up display list mem allocation, fix NULL handling

The -1 term in alloc_instruction() foiled later NULL pointer checks.

---

 src/mesa/main/dlist.c |   47 ++++++++++++++++++++++++++++++++++-------------
 1 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c
index f76323d..c1890bc 100644
--- a/src/mesa/main/dlist.c
+++ b/src/mesa/main/dlist.c
@@ -789,14 +789,13 @@ unpack_image(GLcontext *ctx, GLuint dimensions,
 
 
 /**
- * Allocate space for a display list instruction.
+ * Allocate space for a display list instruction (opcode + payload space).
  * \param opcode  the instruction opcode (OPCODE_* value)
- * \param bytes   instruction size in bytes, not counting opcode.
- * \return pointer to the usable data area (not including the internal
- *         opcode).
+ * \param bytes   instruction payload size (not counting opcode)
+ * \return pointer to allocated memory (the opcode space)
  */
-void *
-_mesa_dlist_alloc(GLcontext *ctx, GLuint opcode, GLuint bytes)
+static Node *
+dlist_alloc(GLcontext *ctx, OpCode opcode, GLuint bytes)
 {
    const GLuint numNodes = 1 + (bytes + sizeof(Node) - 1) / sizeof(Node);
    Node *n;
@@ -830,9 +829,30 @@ _mesa_dlist_alloc(GLcontext *ctx, GLuint opcode, GLuint bytes)
    n = ctx->ListState.CurrentBlock + ctx->ListState.CurrentPos;
    ctx->ListState.CurrentPos += numNodes;
 
-   n[0].opcode = (OpCode) opcode;
+   n[0].opcode = opcode;
 
-   return (void *) (n + 1);     /* return ptr to node following opcode */
+   return n;
+}
+
+
+
+/**
+ * Allocate space for a display list instruction.  Used by callers outside
+ * this file for things like VBO vertex data.
+ *
+ * \param opcode  the instruction opcode (OPCODE_* value)
+ * \param bytes   instruction size in bytes, not counting opcode.
+ * \return pointer to the usable data area (not including the internal
+ *         opcode).
+ */
+void *
+_mesa_dlist_alloc(GLcontext *ctx, GLuint opcode, GLuint bytes)
+{
+   Node *n = dlist_alloc(ctx, (OpCode) opcode, bytes);
+   if (n)
+      return n + 1;  /* return pointer to payload area, after opcode */
+   else
+      return NULL;
 }
 
 
@@ -866,18 +886,19 @@ _mesa_dlist_alloc_opcode(GLcontext *ctx,
 }
 
 
-
 /**
- * Allocate display list instruction.  Returns Node ptr to where the opcode
- * is stored.  The first function parameter would go in node[1].
+ * Allocate space for a display list instruction.  The space is basically
+ * an array of Nodes where node[0] holds the opcode, node[1] is the first
+ * function parameter, node[2] is the second parameter, etc.
+ *
  * \param opcode  one of OPCODE_x
  * \param nparams  number of function parameters
+ * \return  pointer to start of instruction space
  */
 static INLINE Node *
 alloc_instruction(GLcontext *ctx, OpCode opcode, GLuint nparams)
 {
-   return (Node *)
-      _mesa_dlist_alloc(ctx, opcode, nparams * sizeof(Node)) - 1;
+   return dlist_alloc(ctx, opcode, nparams * sizeof(Node));
 }
 
 




More information about the mesa-commit mailing list