mesa: add bool param to _mesa_free_context_data
[mesa.git] / src / mesa / drivers / dri / radeon / radeon_buffer_objects.c
index 69556923b667e6cb6faf1ebc94724e2f3739fc86..71fe9302cf71b99342b7e4814f8cead7ff6efb20 100644 (file)
  *
  */
 
-#include "radeon_buffer_objects.h"
-
-#include "main/imports.h"
 #include "main/mtypes.h"
 #include "main/bufferobj.h"
+#include "util/u_memory.h"
 
 #include "radeon_common.h"
+#include "radeon_buffer_objects.h"
 
 struct radeon_buffer_object *
 get_radeon_buffer_object(struct gl_buffer_object *obj)
@@ -40,13 +39,12 @@ get_radeon_buffer_object(struct gl_buffer_object *obj)
 }
 
 static struct gl_buffer_object *
-radeonNewBufferObject(GLcontext * ctx,
-                      GLuint name,
-                      GLenum target)
+radeonNewBufferObject(struct gl_context * ctx,
+                      GLuint name)
 {
     struct radeon_buffer_object *obj = CALLOC_STRUCT(radeon_buffer_object);
 
-    _mesa_initialize_buffer_object(&obj->Base, name, target);
+    _mesa_initialize_buffer_object(ctx, &obj->Base, name);
 
     obj->bo = NULL;
 
@@ -57,20 +55,23 @@ radeonNewBufferObject(GLcontext * ctx,
  * Called via glDeleteBuffersARB().
  */
 static void
-radeonDeleteBufferObject(GLcontext * ctx,
+radeonDeleteBufferObject(struct gl_context * ctx,
                          struct gl_buffer_object *obj)
 {
     struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj);
+    int i;
 
-    if (obj->Pointer) {
-        radeon_bo_unmap(radeon_obj->bo);
+    for (i = 0; i < MAP_COUNT; i++) {
+       if (obj->Mappings[i].Pointer) {
+           radeon_bo_unmap(radeon_obj->bo);
+       }
     }
 
     if (radeon_obj->bo) {
         radeon_bo_unref(radeon_obj->bo);
     }
 
-    _mesa_free(radeon_obj);
+    _mesa_delete_buffer_object(ctx, obj);
 }
 
 
@@ -78,14 +79,16 @@ radeonDeleteBufferObject(GLcontext * ctx,
  * Allocate space for and store data in a buffer object.  Any data that was
  * previously stored in the buffer object is lost.  If data is NULL,
  * memory will be allocated, but no copy will occur.
- * Called via glBufferDataARB().
+ * Called via ctx->Driver.BufferData().
+ * \return GL_TRUE for success, GL_FALSE if out of memory
  */
-static void
-radeonBufferData(GLcontext * ctx,
+static GLboolean
+radeonBufferData(struct gl_context * ctx,
                  GLenum target,
                  GLsizeiptrARB size,
                  const GLvoid * data,
                  GLenum usage,
+                 GLbitfield storageFlags,
                  struct gl_buffer_object *obj)
 {
     radeonContextPtr radeon = RADEON_CONTEXT(ctx);
@@ -93,6 +96,7 @@ radeonBufferData(GLcontext * ctx,
 
     radeon_obj->Base.Size = size;
     radeon_obj->Base.Usage = usage;
+    radeon_obj->Base.StorageFlags = storageFlags;
 
     if (radeon_obj->bo != NULL) {
         radeon_bo_unref(radeon_obj->bo);
@@ -100,30 +104,25 @@ radeonBufferData(GLcontext * ctx,
     }
 
     if (size != 0) {
-#ifdef RADEON_DEBUG_BO
         radeon_obj->bo = radeon_bo_open(radeon->radeonScreen->bom,
                                         0,
                                         size,
-                                        32,
-                                        RADEON_GEM_DOMAIN_GTT,
-                                        0,
-                                        "Radeon Named object");
-#else
-        radeon_obj->bo = radeon_bo_open(radeon->radeonScreen->bom,
-                                        0,
-                                        size,
-                                        32,
+                                        ctx->Const.MinMapBufferAlignment,
                                         RADEON_GEM_DOMAIN_GTT,
                                         0);
-#endif
+
+        if (!radeon_obj->bo)
+            return GL_FALSE;
+
         if (data != NULL) {
             radeon_bo_map(radeon_obj->bo, GL_TRUE);
 
-            _mesa_memcpy(radeon_obj->bo->ptr, data, size);
+            memcpy(radeon_obj->bo->ptr, data, size);
 
             radeon_bo_unmap(radeon_obj->bo);
         }
     }
+    return GL_TRUE;
 }
 
 /**
@@ -133,18 +132,22 @@ radeonBufferData(GLcontext * ctx,
  * Called via glBufferSubDataARB().
  */
 static void
-radeonBufferSubData(GLcontext * ctx,
-                    GLenum target,
+radeonBufferSubData(struct gl_context * ctx,
                     GLintptrARB offset,
                     GLsizeiptrARB size,
                     const GLvoid * data,
                     struct gl_buffer_object *obj)
 {
+    radeonContextPtr radeon = RADEON_CONTEXT(ctx);
     struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj);
 
+    if (radeon_bo_is_referenced_by_cs(radeon_obj->bo, radeon->cmdbuf.cs)) {
+        radeon_firevertices(radeon);
+    }
+
     radeon_bo_map(radeon_obj->bo, GL_TRUE);
 
-    _mesa_memcpy(radeon_obj->bo->ptr + offset, data, size);
+    memcpy(radeon_obj->bo->ptr + offset, data, size);
 
     radeon_bo_unmap(radeon_obj->bo);
 }
@@ -153,8 +156,7 @@ radeonBufferSubData(GLcontext * ctx,
  * Called via glGetBufferSubDataARB()
  */
 static void
-radeonGetBufferSubData(GLcontext * ctx,
-                       GLenum target,
+radeonGetBufferSubData(struct gl_context * ctx,
                        GLintptrARB offset,
                        GLsizeiptrARB size,
                        GLvoid * data,
@@ -164,34 +166,41 @@ radeonGetBufferSubData(GLcontext * ctx,
 
     radeon_bo_map(radeon_obj->bo, GL_FALSE);
 
-    _mesa_memcpy(data, radeon_obj->bo->ptr + offset, size);
+    memcpy(data, radeon_obj->bo->ptr + offset, size);
 
     radeon_bo_unmap(radeon_obj->bo);
 }
 
 /**
- * Called via glMapBufferARB()
+ * Called via glMapBuffer() and glMapBufferRange()
  */
 static void *
-radeonMapBuffer(GLcontext * ctx,
-                GLenum target,
-                GLenum access,
-                struct gl_buffer_object *obj)
+radeonMapBufferRange(struct gl_context * ctx,
+                    GLintptr offset, GLsizeiptr length,
+                    GLbitfield access, struct gl_buffer_object *obj,
+                     gl_map_buffer_index index)
 {
     struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj);
+    const GLboolean write_only =
+       (access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == GL_MAP_WRITE_BIT;
 
-    if (access == GL_WRITE_ONLY_ARB) {
-        radeonFlush(ctx);
+    if (write_only) {
+        ctx->Driver.Flush(ctx);
     }
 
     if (radeon_obj->bo == NULL) {
-        obj->Pointer = NULL;
+        obj->Mappings[index].Pointer = NULL;
         return NULL;
     }
 
-    radeon_bo_map(radeon_obj->bo, access == GL_WRITE_ONLY_ARB);
+    obj->Mappings[index].Offset = offset;
+    obj->Mappings[index].Length = length;
+    obj->Mappings[index].AccessFlags = access;
 
-    return obj->Pointer = radeon_obj->bo->ptr;
+    radeon_bo_map(radeon_obj->bo, write_only);
+
+    obj->Mappings[index].Pointer = radeon_obj->bo->ptr + offset;
+    return obj->Mappings[index].Pointer;
 }
 
 
@@ -199,17 +208,20 @@ radeonMapBuffer(GLcontext * ctx,
  * Called via glUnmapBufferARB()
  */
 static GLboolean
-radeonUnmapBuffer(GLcontext * ctx,
-                  GLenum target,
-                  struct gl_buffer_object *obj)
+radeonUnmapBuffer(struct gl_context * ctx,
+                  struct gl_buffer_object *obj,
+                  gl_map_buffer_index index)
 {
     struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj);
 
     if (radeon_obj->bo != NULL) {
         radeon_bo_unmap(radeon_obj->bo);
-        obj->Pointer = NULL;
     }
 
+    obj->Mappings[index].Pointer = NULL;
+    obj->Mappings[index].Offset = 0;
+    obj->Mappings[index].Length = 0;
+
     return GL_TRUE;
 }
 
@@ -221,6 +233,6 @@ radeonInitBufferObjectFuncs(struct dd_function_table *functions)
     functions->BufferData = radeonBufferData;
     functions->BufferSubData = radeonBufferSubData;
     functions->GetBufferSubData = radeonGetBufferSubData;
-    functions->MapBuffer = radeonMapBuffer;
+    functions->MapBufferRange = radeonMapBufferRange;
     functions->UnmapBuffer = radeonUnmapBuffer;
 }