Supply buffer usage hints to winsys.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Mon, 5 Nov 2007 18:04:35 +0000 (18:04 +0000)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Tue, 6 Nov 2007 14:49:38 +0000 (14:49 +0000)
Winsys driver needs some hints in order to allocate the appropriate kind of
memory for the buffer.

src/mesa/drivers/dri/intel_winsys/intel_winsys_pipe.c
src/mesa/drivers/x11/xm_winsys.c
src/mesa/pipe/i915simple/i915_prim_vbuf.c
src/mesa/pipe/p_defines.h
src/mesa/pipe/p_winsys.h
src/mesa/pipe/xlib/xm_winsys.c
src/mesa/state_tracker/st_atom_constbuf.c
src/mesa/state_tracker/st_cb_bufferobjects.c
src/mesa/state_tracker/st_cb_rasterpos.c
src/mesa/state_tracker/st_draw.c

index af05a33..cc76a40 100644 (file)
@@ -107,7 +107,8 @@ intel_buffer_reference(struct pipe_winsys *sws,
  */
 static void intel_buffer_data(struct pipe_winsys *sws, 
                              struct pipe_buffer_handle *buf,
-                             unsigned size, const void *data )
+                             unsigned size, const void *data,
+                             unsigned usage )
 {
    struct intel_context *intel = intel_pipe_winsys(sws)->intel;
 
@@ -229,7 +230,8 @@ intel_i915_region_alloc(struct pipe_winsys *winsys,
    winsys->buffer_data( winsys,
                         region->buffer, 
                         pitch * cpp * height, 
-                        NULL );
+                        NULL,
+                        PIPE_BUFFER_USAGE_PIXEL );
 
    return region;
 }
index 3680543..f863cdb 100644 (file)
@@ -140,7 +140,7 @@ xm_buffer_reference(struct pipe_winsys *pws,
 
 static void
 xm_buffer_data(struct pipe_winsys *pws, struct pipe_buffer_handle *buf,
-               unsigned size, const void *data )
+               unsigned size, const void *data, unsigned usage)
 {
    struct xm_buffer *xm_buf = xm_bo(buf);
    assert(!xm_buf->userBuffer);
@@ -265,7 +265,8 @@ xm_region_alloc(struct pipe_winsys *winsys,
    winsys->buffer_data( winsys,
                         region->buffer, 
                         region->pitch * cpp * height, 
-                        NULL );
+                        NULL,
+                        PIPE_BUFFER_USAGE_PIXEL );
    return region;
 }
 
index 3632adc..75ca6d6 100644 (file)
@@ -376,7 +376,9 @@ static void vbuf_flush_elements( struct draw_stage *stage )
    /* FIXME: handle failure */
    if(!vbuf->buf)
       vbuf->buf = winsys->buffer_create(winsys, 64);
-   winsys->buffer_data(winsys, vbuf->buf, VBUF_SIZE, NULL);
+   winsys->buffer_data( winsys, vbuf->buf, 
+                        VBUF_SIZE, NULL, 
+                        PIPE_BUFFER_USAGE_VERTEX );
    vbuf->vertex_map = winsys->buffer_map(winsys, 
                                          vbuf->buf, 
                                          PIPE_BUFFER_FLAG_WRITE );
index ef79716..119ea1b 100644 (file)
 
 
 /**
- * Buffer flags
+ * Buffer access flags
  */
 #define PIPE_BUFFER_FLAG_READ    0x1
 #define PIPE_BUFFER_FLAG_WRITE   0x2
 
-#define PIPE_BUFFER_USE_TEXTURE         0x1
-#define PIPE_BUFFER_USE_VERTEX_BUFFER   0x2
-#define PIPE_BUFFER_USE_INDEX_BUFFER    0x4
-#define PIPE_BUFFER_USE_RENDER_TARGET   0x8
+
+/**
+ * Buffer usage flags
+ */
+#define PIPE_BUFFER_USAGE_PIXEL    0x1
+#define PIPE_BUFFER_USAGE_VERTEX   0x2
+#define PIPE_BUFFER_USAGE_INDEX    0x4
+#define PIPE_BUFFER_USAGE_CONSTANT 0x8
 
 
 /** 
index 2d4432d..298b555 100644 (file)
@@ -116,10 +116,17 @@ struct pipe_winsys
                              struct pipe_buffer_handle **ptr,
                              struct pipe_buffer_handle *buf );
 
-   /** Create the data store of a buffer and optionally initialize it */
+   /** 
+    * Create the data store of a buffer and optionally initialize it.
+    * 
+    * usage is a bitmask of PIPE_BUFFER_USAGE_PIXEL/VERTEX/INDEX/CONSTANT. This
+    * usage argument is only an optimization hint, not a guarantee, therefore 
+    * proper behavior must be observed in all circumstances.
+    */
    void (*buffer_data)(struct pipe_winsys *sws, 
                       struct pipe_buffer_handle *buf,
-                      unsigned size, const void *data );
+                      unsigned size, const void *data,
+                      unsigned usage);
 
    /** Modify some or all of the data contained in a buffer's data store */
    void (*buffer_subdata)(struct pipe_winsys *sws, 
index 5de811a..45ece8e 100644 (file)
@@ -120,7 +120,7 @@ xm_buffer_reference(struct pipe_winsys *pws,
 
 static void
 xm_buffer_data(struct pipe_winsys *pws, struct pipe_buffer_handle *buf,
-               unsigned size, const void *data )
+               unsigned size, const void *data, unsigned usage )
 {
    struct xm_buffer *xm_buf = xm_bo(buf);
    assert(!xm_buf->userBuffer);
@@ -245,7 +245,8 @@ xm_region_alloc(struct pipe_winsys *winsys,
    winsys->buffer_data( winsys,
                         region->buffer, 
                         region->pitch * cpp * height, 
-                        NULL );
+                        NULL,
+                        PIPE_BUFFER_USAGE_PIXEL );
    return region;
 }
 
index 7da7136..446250c 100644 (file)
@@ -80,7 +80,8 @@ void st_upload_constants( struct st_context *st,
       }
 
       /* load Mesa constants into the constant buffer */
-      ws->buffer_data(ws, cbuf->buffer, paramBytes, params->ParameterValues);
+      ws->buffer_data(ws, cbuf->buffer, paramBytes, params->ParameterValues,
+                      PIPE_BUFFER_USAGE_CONSTANT);
 
       cbuf->size = paramBytes;
 
index a593bd7..99e1eb3 100644 (file)
@@ -104,11 +104,29 @@ st_bufferobj_data(GLcontext *ctx,
 {
    struct pipe_context *pipe = st_context(ctx)->pipe;
    struct st_buffer_object *st_obj = st_buffer_object(obj);
+   unsigned buffer_usage;
 
    st_obj->Base.Size = size;
    st_obj->Base.Usage = usage;
+   
+   switch(target) {
+   case GL_PIXEL_PACK_BUFFER_ARB:
+   case GL_PIXEL_UNPACK_BUFFER_ARB:
+      buffer_usage = PIPE_BUFFER_USAGE_PIXEL;
+      break;
+   case GL_ARRAY_BUFFER_ARB:
+      buffer_usage = PIPE_BUFFER_USAGE_VERTEX;
+      break;
+   case GL_ELEMENT_ARRAY_BUFFER_ARB:
+      buffer_usage = PIPE_BUFFER_USAGE_INDEX;
+      break;
+   default:
+      buffer_usage = 0;
+   }
 
-   pipe->winsys->buffer_data( pipe->winsys, st_obj->buffer, size, data );
+   pipe->winsys->buffer_data( pipe->winsys, st_obj->buffer, 
+                              size, data, 
+                              buffer_usage );
 }
 
 
index 40807fc..5b97c1e 100644 (file)
@@ -282,7 +282,9 @@ st_RasterPos(GLcontext *ctx, const GLfloat v[4])
       const unsigned size = sizeof(ctx->Current.Attrib);
       const void *data = ctx->Current.Attrib;
       /* colors, texcoords, etc */
-      pipe->winsys->buffer_data(pipe->winsys, buf, size, data);
+      pipe->winsys->buffer_data(pipe->winsys, buf, 
+                                size, data, 
+                                PIPE_BUFFER_USAGE_VERTEX);
       /* position */
       pipe->winsys->buffer_subdata(pipe->winsys, buf,
                                    0, /* offset */
@@ -301,7 +303,8 @@ st_RasterPos(GLcontext *ctx, const GLfloat v[4])
       fb_buf.start_offset = 0;
       pipe->winsys->buffer_data(pipe->winsys, fb_buf.buffer,
                                 fb_buf.size,
-                                NULL); /* data */
+                                NULL, /* data */
+                                PIPE_BUFFER_USAGE_VERTEX);
       if (pipe->set_feedback_buffer)
          pipe->set_feedback_buffer(pipe, 0, &fb_buf);
    }
index c3f33a4..3e2ed6c 100644 (file)
@@ -289,7 +289,9 @@ st_draw_vertices(GLcontext *ctx, unsigned prim,
 
    /* XXX create one-time */
    vbuf = pipe->winsys->buffer_create(pipe->winsys, 32);
-   pipe->winsys->buffer_data(pipe->winsys, vbuf, vertex_bytes, verts);
+   pipe->winsys->buffer_data(pipe->winsys, vbuf, 
+                             vertex_bytes, verts,
+                             PIPE_BUFFER_USAGE_VERTEX);
 
    /* tell pipe about the vertex buffer */
    vbuffer.buffer = vbuf;