glapi: Move to src/mapi/.
[mesa.git] / src / mesa / main / bufferobj.c
index 3c48f6cce58a69dedcee826a305ac801473822a0..235cafcf1ed15579700d8047fe8f4beaaba99fdf 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)
@@ -82,6 +83,13 @@ get_buffer_target(GLcontext *ctx, GLenum target)
          return &ctx->CopyWriteBuffer;
       }
       break;
+#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;
    }
@@ -1119,20 +1127,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 +1233,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 +1384,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 +1444,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));
 }
 
 
@@ -1713,6 +1757,7 @@ _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)
@@ -1746,6 +1791,7 @@ _mesa_BufferObjectPurgeable(GLcontext *ctx, GLuint name, GLenum option)
    return retval;
 }
 
+
 static GLenum
 _mesa_RenderObjectPurgeable(GLcontext *ctx, GLuint name, GLenum option)
 {
@@ -1774,6 +1820,7 @@ _mesa_RenderObjectPurgeable(GLcontext *ctx, GLuint name, GLenum option)
    return retval;
 }
 
+
 static GLenum
 _mesa_TextureObjectPurgeable(GLcontext *ctx, GLuint name, GLenum option)
 {
@@ -1802,9 +1849,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,29 +1867,41 @@ _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)
 {
@@ -1855,7 +1917,8 @@ _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;
    }
 
@@ -1868,6 +1931,7 @@ _mesa_BufferObjectUnpurgeable(GLcontext *ctx, GLuint name, GLenum option)
    return retval;
 }
 
+
 static GLenum
 _mesa_RenderObjectUnpurgeable(GLcontext *ctx, GLuint name, GLenum option)
 {
@@ -1883,7 +1947,8 @@ _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;
    }
 
@@ -1893,9 +1958,10 @@ _mesa_RenderObjectUnpurgeable(GLcontext *ctx, GLuint name, GLenum option)
    if (ctx->Driver.RenderObjectUnpurgeable)
       retval = ctx->Driver.RenderObjectUnpurgeable(ctx, bufObj, option);
 
-   return retval;
+   return option;
 }
 
+
 static GLenum
 _mesa_TextureObjectUnpurgeable(GLcontext *ctx, GLuint name, GLenum option)
 {
@@ -1911,7 +1977,8 @@ _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;
    }
 
@@ -1924,6 +1991,7 @@ _mesa_TextureObjectUnpurgeable(GLcontext *ctx, GLuint name, GLenum option)
    return retval;
 }
 
+
 GLenum GLAPIENTRY
 _mesa_ObjectUnpurgeableAPPLE(GLenum objectType, GLuint name, GLenum option)
 {
@@ -1939,33 +2007,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(GLcontext *ctx, GLuint name,
+                                      GLenum pname, GLint* params)
 {
    struct gl_buffer_object *bufObj;
 
@@ -1980,16 +2049,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(GLcontext *ctx, GLuint name,
+                                      GLenum pname, GLint* params)
 {
    struct gl_renderbuffer *bufObj;
 
@@ -2004,16 +2075,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(GLcontext *ctx, GLuint name,
+                                       GLenum pname, GLint* params)
 {
    struct gl_texture_object *bufObj;
 
@@ -2028,16 +2101,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 +2126,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 */