[intel] Merge intel_buffer_objects to shared.
authorEric Anholt <eric@anholt.net>
Sat, 15 Dec 2007 20:47:23 +0000 (12:47 -0800)
committerEric Anholt <eric@anholt.net>
Sat, 15 Dec 2007 20:47:23 +0000 (12:47 -0800)
965 gains fixed TTM typing of the buffer object buffers and unused PBO
functions, and 915 gains buffer size == 0 fixes from 965.

src/mesa/drivers/dri/i965/brw_draw.c
src/mesa/drivers/dri/i965/brw_draw_upload.c
src/mesa/drivers/dri/i965/intel_buffer_objects.c [changed from file to symlink]
src/mesa/drivers/dri/i965/intel_buffer_objects.h [deleted file]
src/mesa/drivers/dri/intel/intel_buffer_objects.c
src/mesa/drivers/dri/intel/intel_regions.c

index b2c6aa7dbac485862b9d60596f95c594d62f072a..eeba8e0a17689388e6fd46d24a007a73b458d143 100644 (file)
@@ -476,7 +476,9 @@ void brw_draw_init( struct brw_context *brw )
         struct intel_buffer_object *intel_bo =
            intel_buffer_object(brw->vb.upload.vbo[i]);
 
-        dri_bo_fake_disable_backing_store(intel_bufferobj_buffer(intel_bo),
+        dri_bo_fake_disable_backing_store(intel_bufferobj_buffer(&brw->intel,
+                                                                 intel_bo,
+                                                                 INTEL_READ),
                                           NULL, NULL);
       }
    }
index 539a6ecc5a62b3c2c2e03ee295cbab42fc0a3c9e..7c7bcb1b9cfb1fa2a48db25a2cd9945c468239bd 100644 (file)
@@ -68,9 +68,11 @@ struct brw_array_state {
 };
 
 
-static dri_bo *array_buffer( const struct gl_client_array *array )
+static dri_bo *array_buffer( struct intel_context *intel,
+                            const struct gl_client_array *array )
 {
-   return intel_bufferobj_buffer(intel_buffer_object(array->BufferObj));
+   return intel_bufferobj_buffer(intel, intel_buffer_object(array->BufferObj),
+                                INTEL_WRITE_PART);
 }
 
 static GLuint double_types[5] = {
@@ -525,7 +527,7 @@ GLboolean brw_upload_vertices( struct brw_context *brw,
       vbp.vb[i].vb0.bits.access_type = BRW_VERTEXBUFFER_ACCESS_VERTEXDATA;
       vbp.vb[i].vb0.bits.vb_index = i;
       vbp.vb[i].offset = (GLuint)input->glarray->Ptr;
-      vbp.vb[i].buffer = array_buffer(input->glarray);
+      vbp.vb[i].buffer = array_buffer(intel, input->glarray);
       vbp.vb[i].max_index = max_index;
    }
 
@@ -608,7 +610,9 @@ void brw_upload_indices( struct brw_context *brw,
     */
    {
       struct brw_indexbuffer ib;
-      dri_bo *buffer = intel_bufferobj_buffer(intel_buffer_object(bufferobj));
+      dri_bo *buffer = intel_bufferobj_buffer(intel,
+                                             intel_buffer_object(bufferobj),
+                                             INTEL_READ);
 
       memset(&ib, 0, sizeof(ib));
    
deleted file mode 100644 (file)
index 56c1666ac699092d65dbe0c5a54afd1a7e9d1d9e..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,222 +0,0 @@
-/**************************************************************************
- * 
- * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * 
- **************************************************************************/
-
-
-#include "imports.h"
-#include "mtypes.h"
-#include "bufferobj.h"
-
-#include "intel_context.h"
-#include "intel_buffer_objects.h"
-#include "dri_bufmgr.h"
-
-/** Allocates a new dri_bo to store the data for the buffer object. */
-static void
-intel_bufferobj_alloc_buffer(struct intel_context *intel,
-                            struct intel_buffer_object *intel_obj)
-{
-   intel_obj->buffer = dri_bo_alloc(intel->bufmgr, "bufferobj",
-                                   intel_obj->Base.Size, 64,
-                                   DRM_BO_FLAG_MEM_TT);
-}
-
-/**
- * There is some duplication between mesa's bufferobjects and our
- * bufmgr buffers.  Both have an integer handle and a hashtable to
- * lookup an opaque structure.  It would be nice if the handles and
- * internal structure where somehow shared.
- */
-static struct gl_buffer_object *intel_bufferobj_alloc( GLcontext *ctx, 
-                                                      GLuint name, 
-                                                      GLenum target )
-{
-   struct intel_buffer_object *obj = CALLOC_STRUCT(intel_buffer_object);
-
-   _mesa_initialize_buffer_object(&obj->Base, name, target);
-
-   return &obj->Base;
-}
-
-
-/**
- * Deallocate/free a vertex/pixel buffer object.
- * Called via glDeleteBuffersARB().
- */
-static void intel_bufferobj_free( GLcontext *ctx, 
-                                 struct gl_buffer_object *obj )
-{ 
-   struct intel_buffer_object *intel_obj = intel_buffer_object(obj);
-
-   assert(intel_obj);
-
-   if (intel_obj->buffer)
-      dri_bo_unreference(intel_obj->buffer);
-
-   _mesa_free(intel_obj);
-}
-
-
-
-/**
- * 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().
- */
-static void intel_bufferobj_data( GLcontext *ctx, 
-                                 GLenum target, 
-                                 GLsizeiptrARB size,
-                                 const GLvoid *data, 
-                                 GLenum usage,
-                                 struct gl_buffer_object *obj )
-{
-   struct intel_context *intel = intel_context(ctx);
-   struct intel_buffer_object *intel_obj = intel_buffer_object(obj);
-
-   /* XXX: do something useful with 'usage' (eg. populate flags
-    * argument below)
-    */
-   assert(intel_obj);
-
-   obj->Size = size;
-   obj->Usage = usage;
-
-   /* While it would seem to make sense to always reallocate the buffer here,
-    * since it should allow us better concurrency between rendering and
-    * map-cpu write-unmap, doing so was a minor (~10%) performance loss
-    * for both classic and TTM mode with openarena.  That may change with
-    * improved buffer manager algorithms.
-    */
-   if (intel_obj->buffer != NULL && intel_obj->buffer->size != size) {
-      dri_bo_unreference(intel_obj->buffer);
-      intel_obj->buffer = NULL;
-   }
-   if (size != 0) {
-      if (intel_obj->buffer == NULL)
-        intel_bufferobj_alloc_buffer(intel, intel_obj);
-
-      if (data != NULL)
-        dri_bo_subdata(intel_obj->buffer, 0, size, data);
-   }
-}
-
-
-/**
- * Replace data in a subrange of buffer object.  If the data range
- * specified by size + offset extends beyond the end of the buffer or
- * if data is NULL, no copy is performed.
- * Called via glBufferSubDataARB().
- */
-static void intel_bufferobj_subdata( GLcontext *ctx, 
-                                    GLenum target, 
-                                    GLintptrARB offset,
-                                    GLsizeiptrARB size, 
-                                    const GLvoid * data,
-                                    struct gl_buffer_object * obj )
-{
-   struct intel_buffer_object *intel_obj = intel_buffer_object(obj);
-
-   assert(intel_obj);
-   dri_bo_subdata(intel_obj->buffer, offset, size, data);
-}
-
-
-/**
- * Called via glGetBufferSubDataARB().
- */
-static void intel_bufferobj_get_subdata( GLcontext *ctx, 
-                                        GLenum target, 
-                                        GLintptrARB offset,
-                                        GLsizeiptrARB size, 
-                                        GLvoid * data,
-                                        struct gl_buffer_object * obj )
-{
-   struct intel_buffer_object *intel_obj = intel_buffer_object(obj);
-
-   assert(intel_obj);
-   dri_bo_get_subdata(intel_obj->buffer, offset, size, data);
-}
-
-
-
-/**
- * Called via glMapBufferARB().
- */
-static void *intel_bufferobj_map( GLcontext *ctx, 
-                                 GLenum target, 
-                                 GLenum access,
-                                 struct gl_buffer_object *obj )
-{
-   struct intel_buffer_object *intel_obj = intel_buffer_object(obj);
-
-   /* XXX: Translate access to flags arg below:
-    */
-   assert(intel_obj);
-   assert(intel_obj->buffer);
-
-   dri_bo_map(intel_obj->buffer, GL_TRUE);
-   obj->Pointer = intel_obj->buffer->virtual;
-   return obj->Pointer;
-}
-
-
-/**
- * Called via glMapBufferARB().
- */
-static GLboolean intel_bufferobj_unmap( GLcontext *ctx,
-                                       GLenum target,
-                                       struct gl_buffer_object *obj )
-{
-   struct intel_buffer_object *intel_obj = intel_buffer_object(obj);
-
-   assert(intel_obj);
-   assert(intel_obj->buffer);
-   assert(obj->Pointer);
-   dri_bo_unmap(intel_obj->buffer);
-   obj->Pointer = NULL;
-   return GL_TRUE;
-}
-
-dri_bo *intel_bufferobj_buffer( const struct intel_buffer_object *intel_obj )
-{
-   assert(intel_obj->Base.Name);
-   assert(intel_obj->buffer);
-   return intel_obj->buffer;
-}  
-
-void intel_bufferobj_init( struct intel_context *intel )
-{
-   GLcontext *ctx = &intel->ctx;
-
-   ctx->Driver.NewBufferObject = intel_bufferobj_alloc;
-   ctx->Driver.DeleteBuffer = intel_bufferobj_free;
-   ctx->Driver.BufferData = intel_bufferobj_data;
-   ctx->Driver.BufferSubData = intel_bufferobj_subdata;
-   ctx->Driver.GetBufferSubData = intel_bufferobj_get_subdata;
-   ctx->Driver.MapBuffer = intel_bufferobj_map;
-   ctx->Driver.UnmapBuffer = intel_bufferobj_unmap;
-}
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..e06dd3c8d3c54014cf16e795a8c3d139b2ebfb59
--- /dev/null
@@ -0,0 +1 @@
+../intel/intel_buffer_objects.c
\ No newline at end of file
diff --git a/src/mesa/drivers/dri/i965/intel_buffer_objects.h b/src/mesa/drivers/dri/i965/intel_buffer_objects.h
deleted file mode 100644 (file)
index f207756..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
- /**************************************************************************
- * 
- * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * 
- **************************************************************************/
-
-#ifndef INTEL_BUFFEROBJ_H
-#define INTEL_BUFFEROBJ_H
-
-#include "mtypes.h"
-
-struct intel_context;
-struct gl_buffer_object;
-
-
-/**
- * Intel vertex/pixel buffer object, derived from Mesa's gl_buffer_object.
- */
-struct intel_buffer_object {
-   struct gl_buffer_object Base;
-   dri_bo *buffer;   /* the low-level buffer manager's buffer handle */
-
-   struct intel_region *region; /* Is there a zero-copy texture
-                                   associated with this (pixel)
-                                   buffer object? */
-};
-
-
-/* Get the bm buffer associated with a GL bufferobject:
- */
-dri_bo *intel_bufferobj_buffer( const struct intel_buffer_object *obj );
-
-/* Hook the bufferobject implementation into mesa: 
- */
-void intel_bufferobj_init( struct intel_context *intel );
-
-
-
-/* Are the obj->Name tests necessary?  Unfortunately yes, mesa
- * allocates a couple of gl_buffer_object structs statically, and
- * the Name == 0 test is the only way to identify them and avoid
- * casting them erroneously to our structs.
- */
-static inline struct intel_buffer_object *
-intel_buffer_object( struct gl_buffer_object *obj )
-{
-   if (obj->Name)
-      return (struct intel_buffer_object *)obj;
-   else
-      return NULL;
-}
-
-#endif
index d93677bde2fe63edb2cb6177b0c86036f3b9126b..89b489e28a3521bd6c7ab3318ad199b5e9ac2f80 100644 (file)
@@ -135,15 +135,23 @@ intel_bufferobj_data(GLcontext * ctx,
    if (intel_obj->region)
       intel_bufferobj_release_region(intel, intel_obj);
 
+   /* While it would seem to make sense to always reallocate the buffer here,
+    * since it should allow us better concurrency between rendering and
+    * map-cpu write-unmap, doing so was a minor (~10%) performance loss
+    * for both classic and TTM mode with openarena.  That may change with
+    * improved buffer manager algorithms.
+    */
    if (intel_obj->buffer != NULL && intel_obj->buffer->size != size) {
       dri_bo_unreference(intel_obj->buffer);
       intel_obj->buffer = NULL;
    }
+   if (size != 0) {
+      if (intel_obj->buffer == NULL)
+        intel_bufferobj_alloc_buffer(intel, intel_obj);
 
-   intel_bufferobj_alloc_buffer(intel, intel_obj);
-
-   if (data != NULL)
-      dri_bo_subdata(intel_obj->buffer, 0, size, data);
+      if (data != NULL)
+        dri_bo_subdata(intel_obj->buffer, 0, size, data);
+   }
 }
 
 
index d66cc641f5368a07f35f7d069a40f9c8e155e650..a5de01a3a844718d308fe6a92a1963c9b0c44a0f 100644 (file)
@@ -178,6 +178,8 @@ intel_region_data(struct intel_context *intel,
                   const void *src, GLuint src_pitch,
                   GLuint srcx, GLuint srcy, GLuint width, GLuint height)
 {
+   GLboolean locked = GL_FALSE;
+
    DBG("%s\n", __FUNCTION__);
 
    if (intel == NULL)
@@ -191,8 +193,10 @@ intel_region_data(struct intel_context *intel,
          intel_region_cow(intel, dst);
    }
 
-
-   LOCK_HARDWARE(intel);
+   if (!intel->locked) {
+      LOCK_HARDWARE(intel);
+      locked = GL_TRUE;
+   }
 
    _mesa_copy_rect(intel_region_map(intel, dst) + dst_offset,
                    dst->cpp,
@@ -201,7 +205,8 @@ intel_region_data(struct intel_context *intel,
 
    intel_region_unmap(intel, dst);
 
-   UNLOCK_HARDWARE(intel);
+   if (locked)
+      UNLOCK_HARDWARE(intel);
 
 }