diff options
Diffstat (limited to 'src/gallium/drivers')
| -rw-r--r-- | src/gallium/drivers/i965/Makefile | 1 | ||||
| -rw-r--r-- | src/gallium/drivers/i965/brw_screen.c | 2 | ||||
| -rw-r--r-- | src/gallium/drivers/i965/brw_screen.h | 12 | ||||
| -rw-r--r-- | src/gallium/drivers/i965/brw_screen_buffers.c | 142 | ||||
| -rw-r--r-- | src/gallium/drivers/i965/brw_winsys.h | 4 | 
5 files changed, 158 insertions, 3 deletions
| diff --git a/src/gallium/drivers/i965/Makefile b/src/gallium/drivers/i965/Makefile index 94b52bf0ec..38b7a30944 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 a02e6acc39..7991f4ae52 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 11b480b1ac..dda516ee68 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 0000000000..0bf885ce8c --- /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 9338923da3..b2ba3e86f9 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 */  }; | 
