Merge branch 'llvm-cliptest-viewport'
[mesa.git] / src / mesa / main / bufferobj.c
index 3c48f6cce58a69dedcee826a305ac801473822a0..0a68008a1003fba28671f42a0f83517b54f68d87 100644 (file)
@@ -32,6 +32,7 @@
 
 
 #include "glheader.h"
+#include "enums.h"
 #include "hash.h"
 #include "imports.h"
 #include "image.h"
@@ -46,7 +47,7 @@
 /*#define BOUNDS_CHECK*/
 
 
-#ifdef FEATURE_OES_mapbuffer
+#if FEATURE_OES_mapbuffer
 #define DEFAULT_ACCESS GL_MAP_WRITE_BIT
 #else
 #define DEFAULT_ACCESS (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)
@@ -61,7 +62,7 @@
  *           specified context or \c NULL if \c target is invalid.
  */
 static INLINE struct gl_buffer_object **
-get_buffer_target(GLcontext *ctx, GLenum target)
+get_buffer_target(struct gl_context *ctx, GLenum target)
 {
    switch (target) {
    case GL_ARRAY_BUFFER_ARB:
@@ -73,15 +74,16 @@ get_buffer_target(GLcontext *ctx, GLenum target)
    case GL_PIXEL_UNPACK_BUFFER_EXT:
       return &ctx->Unpack.BufferObj;
    case GL_COPY_READ_BUFFER:
-      if (ctx->Extensions.ARB_copy_buffer) {
-         return &ctx->CopyReadBuffer;
-      }
-      break;
+      return &ctx->CopyReadBuffer;
    case GL_COPY_WRITE_BUFFER:
-      if (ctx->Extensions.ARB_copy_buffer) {
-         return &ctx->CopyWriteBuffer;
+      return &ctx->CopyWriteBuffer;
+#if FEATURE_EXT_transform_feedback
+   case GL_TRANSFORM_FEEDBACK_BUFFER:
+      if (ctx->Extensions.EXT_transform_feedback) {
+         return &ctx->TransformFeedback.CurrentBuffer;
       }
       break;
+#endif
    default:
       return NULL;
    }
@@ -97,7 +99,7 @@ get_buffer_target(GLcontext *ctx, GLenum target)
  *           specified context or \c NULL if \c target is invalid.
  */
 static INLINE struct gl_buffer_object *
-get_buffer(GLcontext *ctx, GLenum target)
+get_buffer(struct gl_context *ctx, GLenum target)
 {
    struct gl_buffer_object **bufObj = get_buffer_target(ctx, target);
    if (bufObj)
@@ -141,7 +143,7 @@ simplified_access_mode(GLbitfield access)
  * \sa glBufferSubDataARB, glGetBufferSubDataARB
  */
 static struct gl_buffer_object *
-buffer_object_subdata_range_good( GLcontext * ctx, GLenum target, 
+buffer_object_subdata_range_good( struct gl_context * ctx, GLenum target, 
                                   GLintptrARB offset, GLsizeiptrARB size,
                                   const char *caller )
 {
@@ -187,7 +189,7 @@ buffer_object_subdata_range_good( GLcontext * ctx, GLenum target,
  * Default callback for the \c dd_function_table::NewBufferObject() hook.
  */
 static struct gl_buffer_object *
-_mesa_new_buffer_object( GLcontext *ctx, GLuint name, GLenum target )
+_mesa_new_buffer_object( struct gl_context *ctx, GLuint name, GLenum target )
 {
    struct gl_buffer_object *obj;
 
@@ -205,7 +207,7 @@ _mesa_new_buffer_object( GLcontext *ctx, GLuint name, GLenum target )
  * Default callback for the \c dd_function_table::DeleteBuffer() hook.
  */
 static void
-_mesa_delete_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj )
+_mesa_delete_buffer_object( struct gl_context *ctx, struct gl_buffer_object *bufObj )
 {
    (void) ctx;
 
@@ -226,7 +228,7 @@ _mesa_delete_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj )
  * Set ptr to bufObj w/ reference counting.
  */
 void
-_mesa_reference_buffer_object(GLcontext *ctx,
+_mesa_reference_buffer_object(struct gl_context *ctx,
                               struct gl_buffer_object **ptr,
                               struct gl_buffer_object *bufObj)
 {
@@ -326,7 +328,7 @@ _mesa_initialize_buffer_object( struct gl_buffer_object *obj,
  * \sa glBufferDataARB, dd_function_table::BufferData.
  */
 static GLboolean
-_mesa_buffer_data( GLcontext *ctx, GLenum target, GLsizeiptrARB size,
+_mesa_buffer_data( struct gl_context *ctx, GLenum target, GLsizeiptrARB size,
                   const GLvoid * data, GLenum usage,
                   struct gl_buffer_object * bufObj )
 {
@@ -370,7 +372,7 @@ _mesa_buffer_data( GLcontext *ctx, GLenum target, GLsizeiptrARB size,
  * \sa glBufferSubDataARB, dd_function_table::BufferSubData.
  */
 static void
-_mesa_buffer_subdata( GLcontext *ctx, GLenum target, GLintptrARB offset,
+_mesa_buffer_subdata( struct gl_context *ctx, GLenum target, GLintptrARB offset,
                      GLsizeiptrARB size, const GLvoid * data,
                      struct gl_buffer_object * bufObj )
 {
@@ -403,7 +405,7 @@ _mesa_buffer_subdata( GLcontext *ctx, GLenum target, GLintptrARB offset,
  * \sa glBufferGetSubDataARB, dd_function_table::GetBufferSubData.
  */
 static void
-_mesa_buffer_get_subdata( GLcontext *ctx, GLenum target, GLintptrARB offset,
+_mesa_buffer_get_subdata( struct gl_context *ctx, GLenum target, GLintptrARB offset,
                          GLsizeiptrARB size, GLvoid * data,
                          struct gl_buffer_object * bufObj )
 {
@@ -430,7 +432,7 @@ _mesa_buffer_get_subdata( GLcontext *ctx, GLenum target, GLintptrARB offset,
  * \sa glMapBufferARB, dd_function_table::MapBuffer
  */
 static void *
-_mesa_buffer_map( GLcontext *ctx, GLenum target, GLenum access,
+_mesa_buffer_map( struct gl_context *ctx, GLenum target, GLenum access,
                  struct gl_buffer_object *bufObj )
 {
    (void) ctx;
@@ -453,7 +455,7 @@ _mesa_buffer_map( GLcontext *ctx, GLenum target, GLenum access,
  * Called via glMapBufferRange().
  */
 static void *
-_mesa_buffer_map_range( GLcontext *ctx, GLenum target, GLintptr offset,
+_mesa_buffer_map_range( struct gl_context *ctx, GLenum target, GLintptr offset,
                         GLsizeiptr length, GLbitfield access,
                         struct gl_buffer_object *bufObj )
 {
@@ -474,7 +476,7 @@ _mesa_buffer_map_range( GLcontext *ctx, GLenum target, GLintptr offset,
  * Called via glFlushMappedBufferRange().
  */
 static void
-_mesa_buffer_flush_mapped_range( GLcontext *ctx, GLenum target, 
+_mesa_buffer_flush_mapped_range( struct gl_context *ctx, GLenum target, 
                                  GLintptr offset, GLsizeiptr length,
                                  struct gl_buffer_object *obj )
 {
@@ -495,7 +497,7 @@ _mesa_buffer_flush_mapped_range( GLcontext *ctx, GLenum target,
  * \sa glUnmapBufferARB, dd_function_table::UnmapBuffer
  */
 static GLboolean
-_mesa_buffer_unmap( GLcontext *ctx, GLenum target,
+_mesa_buffer_unmap( struct gl_context *ctx, GLenum target,
                     struct gl_buffer_object *bufObj )
 {
    (void) ctx;
@@ -514,7 +516,7 @@ _mesa_buffer_unmap( GLcontext *ctx, GLenum target,
  * Called via glCopyBuffserSubData().
  */
 static void
-_mesa_copy_buffer_subdata(GLcontext *ctx,
+_mesa_copy_buffer_subdata(struct gl_context *ctx,
                           struct gl_buffer_object *src,
                           struct gl_buffer_object *dst,
                           GLintptr readOffset, GLintptr writeOffset,
@@ -544,7 +546,7 @@ _mesa_copy_buffer_subdata(GLcontext *ctx,
  * Initialize the state associated with buffer objects
  */
 void
-_mesa_init_buffer_objects( GLcontext *ctx )
+_mesa_init_buffer_objects( struct gl_context *ctx )
 {
    _mesa_reference_buffer_object(ctx, &ctx->Array.ArrayBufferObj,
                                  ctx->Shared->NullBufferObj);
@@ -559,7 +561,7 @@ _mesa_init_buffer_objects( GLcontext *ctx )
 
 
 void
-_mesa_free_buffer_objects( GLcontext *ctx )
+_mesa_free_buffer_objects( struct gl_context *ctx )
 {
    _mesa_reference_buffer_object(ctx, &ctx->Array.ArrayBufferObj, NULL);
    _mesa_reference_buffer_object(ctx, &ctx->Array.ElementArrayBufferObj, NULL);
@@ -574,7 +576,7 @@ _mesa_free_buffer_objects( GLcontext *ctx )
  * Called by glBindBuffer() and other functions.
  */
 static void
-bind_buffer_object(GLcontext *ctx, GLenum target, GLuint buffer)
+bind_buffer_object(struct gl_context *ctx, GLenum target, GLuint buffer)
 {
    struct gl_buffer_object *oldBufObj;
    struct gl_buffer_object *newBufObj = NULL;
@@ -582,7 +584,7 @@ bind_buffer_object(GLcontext *ctx, GLenum target, GLuint buffer)
 
    bindTarget = get_buffer_target(ctx, target);
    if (!bindTarget) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glBindBufferARB(target 0x%x)");
+      _mesa_error(ctx, GL_INVALID_ENUM, "glBindBufferARB(target 0x%x)", target);
       return;
    }
 
@@ -630,7 +632,7 @@ bind_buffer_object(GLcontext *ctx, GLenum target, GLuint buffer)
  * shared state.
  */
 void
-_mesa_update_default_objects_buffer_objects(GLcontext *ctx)
+_mesa_update_default_objects_buffer_objects(struct gl_context *ctx)
 {
    /* Bind the NullBufferObj to remove references to those
     * in the shared context hash table.
@@ -714,7 +716,7 @@ _mesa_validate_pbo_access(GLuint dimensions,
  * \return NULL if error, else pointer to start of data
  */
 const GLvoid *
-_mesa_map_pbo_source(GLcontext *ctx,
+_mesa_map_pbo_source(struct gl_context *ctx,
                      const struct gl_pixelstore_attrib *unpack,
                      const GLvoid *src)
 {
@@ -748,7 +750,7 @@ _mesa_map_pbo_source(GLcontext *ctx,
  * _mesa_unmap_pbo_source().
  */
 const GLvoid *
-_mesa_map_validate_pbo_source(GLcontext *ctx,
+_mesa_map_validate_pbo_source(struct gl_context *ctx,
                               GLuint dimensions,
                               const struct gl_pixelstore_attrib *unpack,
                               GLsizei width, GLsizei height, GLsizei depth,
@@ -784,7 +786,7 @@ _mesa_map_validate_pbo_source(GLcontext *ctx,
  * Counterpart to _mesa_map_pbo_source()
  */
 void
-_mesa_unmap_pbo_source(GLcontext *ctx,
+_mesa_unmap_pbo_source(struct gl_context *ctx,
                        const struct gl_pixelstore_attrib *unpack)
 {
    ASSERT(unpack != &ctx->Pack); /* catch pack/unpack mismatch */
@@ -804,7 +806,7 @@ _mesa_unmap_pbo_source(GLcontext *ctx,
  * \return NULL if error, else pointer to start of data
  */
 void *
-_mesa_map_pbo_dest(GLcontext *ctx,
+_mesa_map_pbo_dest(struct gl_context *ctx,
                    const struct gl_pixelstore_attrib *pack,
                    GLvoid *dest)
 {
@@ -838,7 +840,7 @@ _mesa_map_pbo_dest(GLcontext *ctx,
  * _mesa_unmap_pbo_dest().
  */
 GLvoid *
-_mesa_map_validate_pbo_dest(GLcontext *ctx,
+_mesa_map_validate_pbo_dest(struct gl_context *ctx,
                             GLuint dimensions,
                             const struct gl_pixelstore_attrib *unpack,
                             GLsizei width, GLsizei height, GLsizei depth,
@@ -874,7 +876,7 @@ _mesa_map_validate_pbo_dest(GLcontext *ctx,
  * Counterpart to _mesa_map_pbo_dest()
  */
 void
-_mesa_unmap_pbo_dest(GLcontext *ctx,
+_mesa_unmap_pbo_dest(struct gl_context *ctx,
                      const struct gl_pixelstore_attrib *pack)
 {
    ASSERT(pack != &ctx->Unpack); /* catch pack/unpack mismatch */
@@ -890,7 +892,7 @@ _mesa_unmap_pbo_dest(GLcontext *ctx,
  * Always return NULL for ID 0.
  */
 struct gl_buffer_object *
-_mesa_lookup_bufferobj(GLcontext *ctx, GLuint buffer)
+_mesa_lookup_bufferobj(struct gl_context *ctx, GLuint buffer)
 {
    if (buffer == 0)
       return NULL;
@@ -907,7 +909,7 @@ _mesa_lookup_bufferobj(GLcontext *ctx, GLuint buffer)
  * unbound from all arrays in the current context.
  */
 static void
-unbind(GLcontext *ctx,
+unbind(struct gl_context *ctx,
        struct gl_buffer_object **ptr,
        struct gl_buffer_object *obj)
 {
@@ -1119,20 +1121,20 @@ _mesa_BufferDataARB(GLenum target, GLsizeiptrARB size,
    }
 
    switch (usage) {
-      case GL_STREAM_DRAW_ARB:
-      case GL_STREAM_READ_ARB:
-      case GL_STREAM_COPY_ARB:
-      case GL_STATIC_DRAW_ARB:
-      case GL_STATIC_READ_ARB:
-      case GL_STATIC_COPY_ARB:
-      case GL_DYNAMIC_DRAW_ARB:
-      case GL_DYNAMIC_READ_ARB:
-      case GL_DYNAMIC_COPY_ARB:
-         /* OK */
-         break;
-      default:
-         _mesa_error(ctx, GL_INVALID_ENUM, "glBufferDataARB(usage)");
-         return;
+   case GL_STREAM_DRAW_ARB:
+   case GL_STREAM_READ_ARB:
+   case GL_STREAM_COPY_ARB:
+   case GL_STATIC_DRAW_ARB:
+   case GL_STATIC_READ_ARB:
+   case GL_STATIC_COPY_ARB:
+   case GL_DYNAMIC_DRAW_ARB:
+   case GL_DYNAMIC_READ_ARB:
+   case GL_DYNAMIC_COPY_ARB:
+      /* OK */
+      break;
+   default:
+      _mesa_error(ctx, GL_INVALID_ENUM, "glBufferDataARB(usage)");
+      return;
    }
 
    bufObj = get_buffer(ctx, target);
@@ -1225,18 +1227,18 @@ _mesa_MapBufferARB(GLenum target, GLenum access)
    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, NULL);
 
    switch (access) {
-      case GL_READ_ONLY_ARB:
-         accessFlags = GL_MAP_READ_BIT;
-         break;
-      case GL_WRITE_ONLY_ARB:
-         accessFlags = GL_MAP_WRITE_BIT;
-         break;
-      case GL_READ_WRITE_ARB:
-         accessFlags = GL_MAP_READ_BIT | GL_MAP_WRITE_BIT;
-         break;
-      default:
-         _mesa_error(ctx, GL_INVALID_ENUM, "glMapBufferARB(access)");
-         return NULL;
+   case GL_READ_ONLY_ARB:
+      accessFlags = GL_MAP_READ_BIT;
+      break;
+   case GL_WRITE_ONLY_ARB:
+      accessFlags = GL_MAP_WRITE_BIT;
+      break;
+   case GL_READ_WRITE_ARB:
+      accessFlags = GL_MAP_READ_BIT | GL_MAP_WRITE_BIT;
+      break;
+   default:
+      _mesa_error(ctx, GL_INVALID_ENUM, "glMapBufferARB(access)");
+      return NULL;
    }
 
    bufObj = get_buffer(ctx, target);
@@ -1376,31 +1378,49 @@ _mesa_GetBufferParameterivARB(GLenum target, GLenum pname, GLint *params)
 
    bufObj = get_buffer(ctx, target);
    if (!bufObj) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "GetBufferParameterivARB(target)" );
+      _mesa_error(ctx, GL_INVALID_ENUM, "glGetBufferParameterivARB(target)" );
       return;
    }
    if (!_mesa_is_bufferobj(bufObj)) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "GetBufferParameterivARB" );
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetBufferParameterivARB" );
       return;
    }
 
    switch (pname) {
-      case GL_BUFFER_SIZE_ARB:
-         *params = (GLint) bufObj->Size;
-         break;
-      case GL_BUFFER_USAGE_ARB:
-         *params = bufObj->Usage;
-         break;
-      case GL_BUFFER_ACCESS_ARB:
-         *params = simplified_access_mode(bufObj->AccessFlags);
-         break;
-      case GL_BUFFER_MAPPED_ARB:
-         *params = _mesa_bufferobj_mapped(bufObj);
-         break;
-      default:
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetBufferParameterivARB(pname)");
-         return;
+   case GL_BUFFER_SIZE_ARB:
+      *params = (GLint) bufObj->Size;
+      return;
+   case GL_BUFFER_USAGE_ARB:
+      *params = bufObj->Usage;
+      return;
+   case GL_BUFFER_ACCESS_ARB:
+      *params = simplified_access_mode(bufObj->AccessFlags);
+      return;
+   case GL_BUFFER_MAPPED_ARB:
+      *params = _mesa_bufferobj_mapped(bufObj);
+      return;
+   case GL_BUFFER_ACCESS_FLAGS:
+      if (ctx->VersionMajor < 3)
+         goto invalid_pname;
+      *params = bufObj->AccessFlags;
+      return;
+   case GL_BUFFER_MAP_OFFSET:
+      if (ctx->VersionMajor < 3)
+         goto invalid_pname;
+      *params = (GLint) bufObj->Offset;
+      return;
+   case GL_BUFFER_MAP_LENGTH:
+      if (ctx->VersionMajor < 3)
+         goto invalid_pname;
+      *params = (GLint) bufObj->Length;
+      return;
+   default:
+      ; /* fall-through */
    }
+
+invalid_pname:
+   _mesa_error(ctx, GL_INVALID_ENUM, "glGetBufferParameterivARB(pname=%s)",
+               _mesa_lookup_enum_by_nr(pname));
 }
 
 
@@ -1418,31 +1438,49 @@ _mesa_GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
 
    bufObj = get_buffer(ctx, target);
    if (!bufObj) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "GetBufferParameteri64v(target)" );
+      _mesa_error(ctx, GL_INVALID_ENUM, "glGetBufferParameteri64v(target)" );
       return;
    }
    if (!_mesa_is_bufferobj(bufObj)) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "GetBufferParameteri64v" );
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetBufferParameteri64v" );
       return;
    }
 
    switch (pname) {
-      case GL_BUFFER_SIZE_ARB:
-         *params = bufObj->Size;
-         break;
-      case GL_BUFFER_USAGE_ARB:
-         *params = bufObj->Usage;
-         break;
-      case GL_BUFFER_ACCESS_ARB:
-         *params = simplified_access_mode(bufObj->AccessFlags);
-         break;
-      case GL_BUFFER_MAPPED_ARB:
-         *params = _mesa_bufferobj_mapped(bufObj);
-         break;
-      default:
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetBufferParameteri64v(pname)");
-         return;
+   case GL_BUFFER_SIZE_ARB:
+      *params = bufObj->Size;
+      return;
+   case GL_BUFFER_USAGE_ARB:
+      *params = bufObj->Usage;
+      return;
+   case GL_BUFFER_ACCESS_ARB:
+      *params = simplified_access_mode(bufObj->AccessFlags);
+      return;
+   case GL_BUFFER_ACCESS_FLAGS:
+      if (ctx->VersionMajor < 3)
+         goto invalid_pname;
+      *params = bufObj->AccessFlags;
+      return;
+   case GL_BUFFER_MAPPED_ARB:
+      *params = _mesa_bufferobj_mapped(bufObj);
+      return;
+   case GL_BUFFER_MAP_OFFSET:
+      if (ctx->VersionMajor < 3)
+         goto invalid_pname;
+      *params = bufObj->Offset;
+      return;
+   case GL_BUFFER_MAP_LENGTH:
+      if (ctx->VersionMajor < 3)
+         goto invalid_pname;
+      *params = bufObj->Length;
+      return;
+   default:
+      ; /* fall-through */
    }
+
+invalid_pname:
+   _mesa_error(ctx, GL_INVALID_ENUM, "glGetBufferParameteri64v(pname=%s)",
+               _mesa_lookup_enum_by_nr(pname));
 }
 
 
@@ -1509,27 +1547,27 @@ _mesa_CopyBufferSubData(GLenum readTarget, GLenum writeTarget,
 
    if (readOffset < 0) {
       _mesa_error(ctx, GL_INVALID_VALUE,
-                  "glCopyBuffserSubData(readOffset = %d)", readOffset);
+                  "glCopyBuffserSubData(readOffset = %d)", (int) readOffset);
       return;
    }
 
    if (writeOffset < 0) {
       _mesa_error(ctx, GL_INVALID_VALUE,
-                  "glCopyBuffserSubData(writeOffset = %d)", writeOffset);
+                  "glCopyBuffserSubData(writeOffset = %d)", (int) writeOffset);
       return;
    }
 
    if (readOffset + size > src->Size) {
       _mesa_error(ctx, GL_INVALID_VALUE,
                   "glCopyBuffserSubData(readOffset + size = %d)",
-                  readOffset, size);
+                  (int) (readOffset + size));
       return;
    }
 
    if (writeOffset + size > dst->Size) {
       _mesa_error(ctx, GL_INVALID_VALUE,
                   "glCopyBuffserSubData(writeOffset + size = %d)",
-                  writeOffset, size);
+                  (int) (writeOffset + size));
       return;
    }
 
@@ -1573,13 +1611,13 @@ _mesa_MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length,
 
    if (offset < 0) {
       _mesa_error(ctx, GL_INVALID_VALUE,
-                  "glMapBufferRange(offset = %ld)", offset);
+                  "glMapBufferRange(offset = %ld)", (long)offset);
       return NULL;
    }
 
    if (length < 0) {
       _mesa_error(ctx, GL_INVALID_VALUE,
-                  "glMapBufferRange(length = %ld)", length);
+                  "glMapBufferRange(length = %ld)", (long)length);
       return NULL;
    }
 
@@ -1664,13 +1702,13 @@ _mesa_FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
 
    if (offset < 0) {
       _mesa_error(ctx, GL_INVALID_VALUE,
-                  "glMapBufferRange(offset = %ld)", offset);
+                  "glMapBufferRange(offset = %ld)", (long)offset);
       return;
    }
 
    if (length < 0) {
       _mesa_error(ctx, GL_INVALID_VALUE,
-                  "glMapBufferRange(length = %ld)", length);
+                  "glMapBufferRange(length = %ld)", (long)length);
       return;
    }
 
@@ -1702,8 +1740,8 @@ _mesa_FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
 
    if (offset + length > bufObj->Length) {
       _mesa_error(ctx, GL_INVALID_VALUE,
-             "glMapBufferRange(offset %ld + length %ld > mapped length %ld)",
-             offset, length, bufObj->Length);
+                 "glMapBufferRange(offset %ld + length %ld > mapped length %ld)",
+                 (long)offset, (long)length, (long)bufObj->Length);
       return;
    }
 
@@ -1713,9 +1751,10 @@ _mesa_FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
       ctx->Driver.FlushMappedBufferRange(ctx, target, offset, length, bufObj);
 }
 
+
 #if FEATURE_APPLE_object_purgeable
 static GLenum
-_mesa_BufferObjectPurgeable(GLcontext *ctx, GLuint name, GLenum option)
+_mesa_BufferObjectPurgeable(struct gl_context *ctx, GLuint name, GLenum option)
 {
    struct gl_buffer_object *bufObj;
    GLenum retval;
@@ -1746,8 +1785,9 @@ _mesa_BufferObjectPurgeable(GLcontext *ctx, GLuint name, GLenum option)
    return retval;
 }
 
+
 static GLenum
-_mesa_RenderObjectPurgeable(GLcontext *ctx, GLuint name, GLenum option)
+_mesa_RenderObjectPurgeable(struct gl_context *ctx, GLuint name, GLenum option)
 {
    struct gl_renderbuffer *bufObj;
    GLenum retval;
@@ -1774,8 +1814,9 @@ _mesa_RenderObjectPurgeable(GLcontext *ctx, GLuint name, GLenum option)
    return retval;
 }
 
+
 static GLenum
-_mesa_TextureObjectPurgeable(GLcontext *ctx, GLuint name, GLenum option)
+_mesa_TextureObjectPurgeable(struct gl_context *ctx, GLuint name, GLenum option)
 {
    struct gl_texture_object *bufObj;
    GLenum retval;
@@ -1802,9 +1843,12 @@ _mesa_TextureObjectPurgeable(GLcontext *ctx, GLuint name, GLenum option)
    return retval;
 }
 
+
 GLenum GLAPIENTRY
 _mesa_ObjectPurgeableAPPLE(GLenum objectType, GLuint name, GLenum option)
 {
+   GLenum retval;
+
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
 
@@ -1817,31 +1861,43 @@ _mesa_ObjectPurgeableAPPLE(GLenum objectType, GLuint name, GLenum option)
    switch (option) {
    case GL_VOLATILE_APPLE:
    case GL_RELEASED_APPLE:
+      /* legal */
       break;
-
    default:
       _mesa_error(ctx, GL_INVALID_ENUM,
-                  "glObjectPurgeable(name = 0x%x) invalid option: %d", name, option);
+                  "glObjectPurgeable(name = 0x%x) invalid option: %d",
+                  name, option);
       return 0;
    }
 
    switch (objectType) {
    case GL_TEXTURE:
-      return _mesa_TextureObjectPurgeable (ctx, name, option);
+      retval = _mesa_TextureObjectPurgeable (ctx, name, option);
+      break;
    case GL_RENDERBUFFER_EXT:
-      return _mesa_RenderObjectPurgeable (ctx, name, option);
+      retval = _mesa_RenderObjectPurgeable (ctx, name, option);
+      break;
    case GL_BUFFER_OBJECT_APPLE:
-      return _mesa_BufferObjectPurgeable (ctx, name, option);
-
+      retval = _mesa_BufferObjectPurgeable (ctx, name, option);
+      break;
    default:
       _mesa_error(ctx, GL_INVALID_ENUM,
-                  "glObjectPurgeable(name = 0x%x) invalid type: %d", name, objectType);
+                  "glObjectPurgeable(name = 0x%x) invalid type: %d",
+                  name, objectType);
       return 0;
    }
+
+   /* In strict conformance to the spec, we must only return VOLATILE when
+    * when passed the VOLATILE option. Madness.
+    *
+    * XXX First fix the spec, then fix me.
+    */
+   return option == GL_VOLATILE_APPLE ? GL_VOLATILE_APPLE : retval;
 }
 
+
 static GLenum
-_mesa_BufferObjectUnpurgeable(GLcontext *ctx, GLuint name, GLenum option)
+_mesa_BufferObjectUnpurgeable(struct gl_context *ctx, GLuint name, GLenum option)
 {
    struct gl_buffer_object *bufObj;
    GLenum retval;
@@ -1855,21 +1911,23 @@ _mesa_BufferObjectUnpurgeable(GLcontext *ctx, GLuint name, GLenum option)
 
    if (! bufObj->Purgeable) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glObjectUnpurgeable(name = 0x%x) object is already \"unpurged\"", name);
+                  "glObjectUnpurgeable(name = 0x%x) object is "
+                  " already \"unpurged\"", name);
       return 0;
    }
 
    bufObj->Purgeable = GL_FALSE;
 
-   retval = GL_RETAINED_APPLE;
+   retval = option;
    if (ctx->Driver.BufferObjectUnpurgeable)
       retval = ctx->Driver.BufferObjectUnpurgeable(ctx, bufObj, option);
 
    return retval;
 }
 
+
 static GLenum
-_mesa_RenderObjectUnpurgeable(GLcontext *ctx, GLuint name, GLenum option)
+_mesa_RenderObjectUnpurgeable(struct gl_context *ctx, GLuint name, GLenum option)
 {
    struct gl_renderbuffer *bufObj;
    GLenum retval;
@@ -1883,21 +1941,23 @@ _mesa_RenderObjectUnpurgeable(GLcontext *ctx, GLuint name, GLenum option)
 
    if (! bufObj->Purgeable) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glObjectUnpurgeable(name = 0x%x) object is already \"unpurged\"", name);
+                  "glObjectUnpurgeable(name = 0x%x) object is "
+                  " already \"unpurged\"", name);
       return 0;
    }
 
    bufObj->Purgeable = GL_FALSE;
 
-   retval = GL_RETAINED_APPLE;
+   retval = option;
    if (ctx->Driver.RenderObjectUnpurgeable)
       retval = ctx->Driver.RenderObjectUnpurgeable(ctx, bufObj, option);
 
    return retval;
 }
 
+
 static GLenum
-_mesa_TextureObjectUnpurgeable(GLcontext *ctx, GLuint name, GLenum option)
+_mesa_TextureObjectUnpurgeable(struct gl_context *ctx, GLuint name, GLenum option)
 {
    struct gl_texture_object *bufObj;
    GLenum retval;
@@ -1911,19 +1971,21 @@ _mesa_TextureObjectUnpurgeable(GLcontext *ctx, GLuint name, GLenum option)
 
    if (! bufObj->Purgeable) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glObjectUnpurgeable(name = 0x%x) object is already \"unpurged\"", name);
+                  "glObjectUnpurgeable(name = 0x%x) object is"
+                  " already \"unpurged\"", name);
       return 0;
    }
 
    bufObj->Purgeable = GL_FALSE;
 
-   retval = GL_RETAINED_APPLE;
+   retval = option;
    if (ctx->Driver.TextureObjectUnpurgeable)
       retval = ctx->Driver.TextureObjectUnpurgeable(ctx, bufObj, option);
 
    return retval;
 }
 
+
 GLenum GLAPIENTRY
 _mesa_ObjectUnpurgeableAPPLE(GLenum objectType, GLuint name, GLenum option)
 {
@@ -1939,33 +2001,34 @@ _mesa_ObjectUnpurgeableAPPLE(GLenum objectType, GLuint name, GLenum option)
    switch (option) {
    case GL_RETAINED_APPLE:
    case GL_UNDEFINED_APPLE:
+      /* legal */
       break;
-
    default:
       _mesa_error(ctx, GL_INVALID_ENUM,
-                  "glObjectUnpurgeable(name = 0x%x) invalid option: %d", name, option);
+                  "glObjectUnpurgeable(name = 0x%x) invalid option: %d",
+                  name, option);
       return 0;
    }
 
    switch (objectType) {
    case GL_BUFFER_OBJECT_APPLE:
       return _mesa_BufferObjectUnpurgeable(ctx, name, option);
-
    case GL_TEXTURE:
       return _mesa_TextureObjectUnpurgeable(ctx, name, option);
-
    case GL_RENDERBUFFER_EXT:
       return _mesa_RenderObjectUnpurgeable(ctx, name, option);
-
    default:
       _mesa_error(ctx, GL_INVALID_ENUM,
-                  "glObjectUnpurgeable(name = 0x%x) invalid type: %d", name, objectType);
+                  "glObjectUnpurgeable(name = 0x%x) invalid type: %d",
+                  name, objectType);
       return 0;
    }
 }
 
+
 static void
-_mesa_GetBufferObjectParameterivAPPLE(GLcontext *ctx, GLuint name, GLenum pname, GLint* params)
+_mesa_GetBufferObjectParameterivAPPLE(struct gl_context *ctx, GLuint name,
+                                      GLenum pname, GLint* params)
 {
    struct gl_buffer_object *bufObj;
 
@@ -1980,16 +2043,18 @@ _mesa_GetBufferObjectParameterivAPPLE(GLcontext *ctx, GLuint name, GLenum pname,
    case GL_PURGEABLE_APPLE:
       *params = bufObj->Purgeable;
       break;
-
    default:
       _mesa_error(ctx, GL_INVALID_ENUM,
-                  "glGetObjectParameteriv(name = 0x%x) invalid enum: %d", name, pname);
+                  "glGetObjectParameteriv(name = 0x%x) invalid enum: %d",
+                  name, pname);
       break;
    }
 }
 
+
 static void
-_mesa_GetRenderObjectParameterivAPPLE(GLcontext *ctx, GLuint name, GLenum pname, GLint* params)
+_mesa_GetRenderObjectParameterivAPPLE(struct gl_context *ctx, GLuint name,
+                                      GLenum pname, GLint* params)
 {
    struct gl_renderbuffer *bufObj;
 
@@ -2004,16 +2069,18 @@ _mesa_GetRenderObjectParameterivAPPLE(GLcontext *ctx, GLuint name, GLenum pname,
    case GL_PURGEABLE_APPLE:
       *params = bufObj->Purgeable;
       break;
-
    default:
       _mesa_error(ctx, GL_INVALID_ENUM,
-                  "glGetObjectParameteriv(name = 0x%x) invalid enum: %d", name, pname);
+                  "glGetObjectParameteriv(name = 0x%x) invalid enum: %d",
+                  name, pname);
       break;
    }
 }
 
+
 static void
-_mesa_GetTextureObjectParameterivAPPLE(GLcontext *ctx, GLuint name, GLenum pname, GLint* params)
+_mesa_GetTextureObjectParameterivAPPLE(struct gl_context *ctx, GLuint name,
+                                       GLenum pname, GLint* params)
 {
    struct gl_texture_object *bufObj;
 
@@ -2028,16 +2095,18 @@ _mesa_GetTextureObjectParameterivAPPLE(GLcontext *ctx, GLuint name, GLenum pname
    case GL_PURGEABLE_APPLE:
       *params = bufObj->Purgeable;
       break;
-
    default:
       _mesa_error(ctx, GL_INVALID_ENUM,
-                  "glGetObjectParameteriv(name = 0x%x) invalid enum: %d", name, pname);
+                  "glGetObjectParameteriv(name = 0x%x) invalid enum: %d",
+                  name, pname);
       break;
    }
 }
 
+
 void GLAPIENTRY
-_mesa_GetObjectParameterivAPPLE(GLenum objectType, GLuint name, GLenum pname, GLint* params)
+_mesa_GetObjectParameterivAPPLE(GLenum objectType, GLuint name, GLenum pname,
+                                GLint* params)
 {
    GET_CURRENT_CONTEXT(ctx);
 
@@ -2051,18 +2120,17 @@ _mesa_GetObjectParameterivAPPLE(GLenum objectType, GLuint name, GLenum pname, GL
    case GL_TEXTURE:
       _mesa_GetTextureObjectParameterivAPPLE (ctx, name, pname, params);
       break;
-
    case GL_BUFFER_OBJECT_APPLE:
       _mesa_GetBufferObjectParameterivAPPLE (ctx, name, pname, params);
       break;
-
    case GL_RENDERBUFFER_EXT:
       _mesa_GetRenderObjectParameterivAPPLE (ctx, name, pname, params);
       break;
-
    default:
       _mesa_error(ctx, GL_INVALID_ENUM,
-                  "glGetObjectParameteriv(name = 0x%x) invalid type: %d", name, objectType);
+                  "glGetObjectParameteriv(name = 0x%x) invalid type: %d",
+                  name, objectType);
    }
 }
-#endif
+
+#endif /* FEATURE_APPLE_object_purgeable */