Module: Mesa
Branch: i965g-restart
Commit: a09b3d50975e68c13c0421d770f3865ad2a1257c
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=a09b3d50975e68c13c0421d770f3865ad2a1257c

Author: Keith Whitwell <kei...@vmware.com>
Date:   Wed Nov  4 15:10:34 2009 +0000

i965g: add missing buffer functions

---

 src/gallium/drivers/i965/Makefile             |    1 +
 src/gallium/drivers/i965/brw_screen.c         |    2 +-
 src/gallium/drivers/i965/brw_screen.h         |   12 ++-
 src/gallium/drivers/i965/brw_screen_buffers.c |  142 +++++++++++++++++++++++++
 src/gallium/drivers/i965/brw_winsys.h         |    4 +
 src/gallium/winsys/drm/i965/xlib/xlib_i965.c  |    4 +
 6 files changed, 162 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/i965/Makefile 
b/src/gallium/drivers/i965/Makefile
index 94b52bf..38b7a30 100644
--- a/src/gallium/drivers/i965/Makefile
+++ b/src/gallium/drivers/i965/Makefile
@@ -58,6 +58,7 @@ C_SOURCES = \
        brw_wm_state.c \
        brw_wm_surface_state.c \
        brw_screen.c \
+       brw_screen_buffers.c \
        brw_screen_tex_layout.c \
        brw_screen_texture.c \
        brw_screen_surface.c \
diff --git a/src/gallium/drivers/i965/brw_screen.c 
b/src/gallium/drivers/i965/brw_screen.c
index a02e6ac..7991f4a 100644
--- a/src/gallium/drivers/i965/brw_screen.c
+++ b/src/gallium/drivers/i965/brw_screen.c
@@ -347,7 +347,7 @@ brw_create_screen(struct brw_winsys_screen *sws, uint 
pci_id)
 
    brw_screen_tex_init(bscreen);
    brw_screen_tex_surface_init(bscreen);
-   brw_screen_init_buffer_functions(bscreen);
+   brw_screen_buffer_init(bscreen);
 
    return &bscreen->base;
 }
diff --git a/src/gallium/drivers/i965/brw_screen.h 
b/src/gallium/drivers/i965/brw_screen.h
index 11b480b..dda516e 100644
--- a/src/gallium/drivers/i965/brw_screen.h
+++ b/src/gallium/drivers/i965/brw_screen.h
@@ -60,9 +60,16 @@ struct brw_transfer
 struct brw_buffer
 {
    struct pipe_buffer base;
+
+   /* One of either bo or user_buffer will be non-null, depending on
+    * whether this is a hardware or user buffer.
+    */
    struct brw_winsys_buffer *bo;
+   void *user_buffer;
+
+   /* Mapped pointer??
+    */
    void *ptr;
-   boolean is_user_buffer;
 };
 
 #define BRW_TILING_NONE  0
@@ -151,7 +158,7 @@ brw_texture(struct pipe_texture *texture)
 static INLINE boolean
 brw_buffer_is_user_buffer( const struct pipe_buffer *buf )
 {
-   return ((const struct brw_buffer *)buf)->is_user_buffer;
+   return ((const struct brw_buffer *)buf)->user_buffer != NULL;
 }
 
 struct brw_winsys_buffer *
@@ -173,6 +180,7 @@ void brw_update_texture( struct brw_screen *brw_screen,
 void brw_screen_tex_init( struct brw_screen *brw_screen );
 void brw_screen_tex_surface_init( struct brw_screen *brw_screen );
 
+void brw_screen_buffer_init(struct brw_screen *brw_screen);
 
 
 #endif /* BRW_SCREEN_H */
diff --git a/src/gallium/drivers/i965/brw_screen_buffers.c 
b/src/gallium/drivers/i965/brw_screen_buffers.c
new file mode 100644
index 0000000..0bf885c
--- /dev/null
+++ b/src/gallium/drivers/i965/brw_screen_buffers.c
@@ -0,0 +1,142 @@
+
+#include "util/u_memory.h"
+#include "util/u_math.h"
+
+#include "pipe/p_state.h"
+#include "pipe/p_defines.h"
+#include "pipe/p_inlines.h"
+
+#include "brw_screen.h"
+#include "brw_winsys.h"
+
+
+
+static void *
+brw_buffer_map( struct pipe_screen *screen,
+                struct pipe_buffer *buffer,
+                unsigned usage )
+{
+   struct brw_screen *bscreen = brw_screen(screen); 
+   struct brw_winsys_screen *sws = bscreen->sws;
+   struct brw_buffer *buf = brw_buffer( buffer );
+
+   if (buf->user_buffer)
+      return buf->user_buffer;
+
+   return sws->bo_map( buf->bo, 
+                       (usage & PIPE_BUFFER_USAGE_CPU_WRITE) ? TRUE : FALSE );
+}
+
+static void 
+brw_buffer_unmap( struct pipe_screen *screen,
+                   struct pipe_buffer *buffer )
+{
+   struct brw_screen *bscreen = brw_screen(screen); 
+   struct brw_winsys_screen *sws = bscreen->sws;
+   struct brw_buffer *buf = brw_buffer( buffer );
+   
+   if (buf->bo)
+      sws->bo_unmap(buf->bo);
+}
+
+static void
+brw_buffer_destroy( struct pipe_buffer *buffer )
+{
+   struct brw_screen *bscreen = brw_screen( buffer->screen );
+   struct brw_winsys_screen *sws = bscreen->sws;
+   struct brw_buffer *buf = brw_buffer( buffer );
+
+   assert(!p_atomic_read(&buffer->reference.count));
+
+   if (buf->bo)
+      sws->bo_unreference(buf->bo);
+   
+   FREE(buf);
+}
+
+
+static struct pipe_buffer *
+brw_buffer_create(struct pipe_screen *screen,
+                   unsigned alignment,
+                   unsigned usage,
+                   unsigned size)
+{
+   struct brw_screen *bscreen = brw_screen(screen);
+   struct brw_winsys_screen *sws = bscreen->sws;
+   struct brw_buffer *buf;
+   unsigned usage_type;
+   
+   buf = CALLOC_STRUCT(brw_buffer);
+   if (!buf)
+      return NULL;
+      
+   pipe_reference_init(&buf->base.reference, 1);
+   buf->base.screen = screen;
+   buf->base.alignment = alignment;
+   buf->base.usage = usage;
+   buf->base.size = size;
+
+   switch (usage & (PIPE_BUFFER_USAGE_VERTEX |
+                    PIPE_BUFFER_USAGE_INDEX |
+                    PIPE_BUFFER_USAGE_PIXEL |
+                    PIPE_BUFFER_USAGE_CONSTANT))
+   {
+   case PIPE_BUFFER_USAGE_VERTEX:
+   case PIPE_BUFFER_USAGE_INDEX:
+   case (PIPE_BUFFER_USAGE_VERTEX|PIPE_BUFFER_USAGE_INDEX):
+      usage_type = BRW_BUFFER_TYPE_VERTEX;
+      break;
+      
+   case PIPE_BUFFER_USAGE_PIXEL:
+      usage_type = BRW_BUFFER_TYPE_PIXEL;
+      break;
+
+   case PIPE_BUFFER_USAGE_CONSTANT:
+      usage_type = BRW_BUFFER_TYPE_SHADER_CONSTANTS;
+      break;
+
+   default:
+      usage_type = BRW_BUFFER_TYPE_GENERIC;
+      break;
+   }
+   
+   buf->bo = sws->bo_alloc( sws,
+                            usage_type,
+                            size,
+                            alignment );
+      
+   return &buf->base; 
+}
+
+
+static struct pipe_buffer *
+brw_user_buffer_create(struct pipe_screen *screen,
+                       void *ptr,
+                       unsigned bytes)
+{
+   struct brw_buffer *buf;
+   
+   buf = CALLOC_STRUCT(brw_buffer);
+   if (!buf)
+      return NULL;
+      
+   buf->user_buffer = ptr;
+   
+   pipe_reference_init(&buf->base.reference, 1);
+   buf->base.screen = screen;
+   buf->base.alignment = 1;
+   buf->base.usage = 0;
+   buf->base.size = bytes;
+   
+   return &buf->base; 
+}
+
+   
+void brw_screen_buffer_init(struct brw_screen *brw_screen)
+{
+   brw_screen->base.buffer_create = brw_buffer_create;
+   brw_screen->base.user_buffer_create = brw_user_buffer_create;
+   brw_screen->base.buffer_map = brw_buffer_map;
+   brw_screen->base.buffer_unmap = brw_buffer_unmap;
+   brw_screen->base.buffer_destroy = brw_buffer_destroy;
+}
diff --git a/src/gallium/drivers/i965/brw_winsys.h 
b/src/gallium/drivers/i965/brw_winsys.h
index 9338923..b2ba3e8 100644
--- a/src/gallium/drivers/i965/brw_winsys.h
+++ b/src/gallium/drivers/i965/brw_winsys.h
@@ -51,6 +51,8 @@ enum brw_buffer_usage {
    BRW_USAGE_QUERY_RESULT,     /* INSTRUCTION, INSTRUCTION */
    BRW_USAGE_RENDER_TARGET,    /* RENDER,      0 */
    BRW_USAGE_DEPTH_BUFFER,     /* RENDER,      RENDER */
+   BRW_USAGE_BLIT_SOURCE,      /* RENDER,      0 */
+   BRW_USAGE_BLIT_DEST,         /* RENDER,      RENDER */
    BRW_USAGE_SAMPLER,          /* SAMPLER,     0 */
    BRW_USAGE_VERTEX,           /* VERTEX,      0 */
    BRW_USAGE_SCRATCH,          /* 0,           0 */
@@ -71,6 +73,8 @@ enum brw_buffer_type
    BRW_BUFFER_TYPE_SHADER_SCRATCH,
    BRW_BUFFER_TYPE_BATCH,
    BRW_BUFFER_TYPE_STATE_CACHE,
+   BRW_BUFFER_TYPE_PIXEL,       /* image uploads, pbo's, etc */
+   BRW_BUFFER_TYPE_GENERIC,     /* unknown */
    BRW_BUFFER_TYPE_MAX         /* Count of possible values */
 };
 
diff --git a/src/gallium/winsys/drm/i965/xlib/xlib_i965.c 
b/src/gallium/winsys/drm/i965/xlib/xlib_i965.c
index 4d4bc0c..d5c65fa 100644
--- a/src/gallium/winsys/drm/i965/xlib/xlib_i965.c
+++ b/src/gallium/winsys/drm/i965/xlib/xlib_i965.c
@@ -90,6 +90,8 @@ const char *names[BRW_BUFFER_TYPE_MAX] = {
    "wm_scratch",
    "batch",
    "state_cache",
+   "pixel",
+   "generic",
 };
 
 const char *usages[BRW_USAGE_MAX] = {
@@ -97,6 +99,8 @@ const char *usages[BRW_USAGE_MAX] = {
    "query_result",
    "render_target",
    "depth_buffer",
+   "blit_source",
+   "blit_dest",
    "sampler",
    "vertex",
    "scratch"

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to