diff options
| -rw-r--r-- | src/gallium/drivers/i915/i915_winsys.h | 14 | ||||
| -rw-r--r-- | src/gallium/winsys/i915/drm/i915_drm_buffer.c | 68 | ||||
| -rw-r--r-- | src/gallium/winsys/i915/sw/i915_sw_buffer.c | 31 | ||||
| -rw-r--r-- | src/gallium/winsys/i915/sw/i915_sw_winsys.h | 3 | 
4 files changed, 102 insertions, 14 deletions
| diff --git a/src/gallium/drivers/i915/i915_winsys.h b/src/gallium/drivers/i915/i915_winsys.h index 3d5627045b..59b7220e59 100644 --- a/src/gallium/drivers/i915/i915_winsys.h +++ b/src/gallium/drivers/i915/i915_winsys.h @@ -134,6 +134,20 @@ struct i915_winsys {                         enum i915_winsys_buffer_type type);     /** +    * Create a tiled buffer. +    * +    * *stride, height are in bytes. The winsys tries to allocate the buffer with +    * the tiling mode provide in *tiling. If tiling is no possible, *tiling will +    * be set to I915_TILE_NONE. The calculated stride (incorporateing hw/kernel +    * requirements) is always returned in *stride. +    */ +   struct i915_winsys_buffer * +      (*buffer_create_tiled)(struct i915_winsys *iws, +                             unsigned *stride, unsigned height, +                             enum i915_winsys_buffer_tile *tiling, +                             enum i915_winsys_buffer_type type); + +   /**      * Creates a buffer from a handle.      * Used to implement pipe_screen::resource_from_handle.      * Also provides the stride information needed for the diff --git a/src/gallium/winsys/i915/drm/i915_drm_buffer.c b/src/gallium/winsys/i915/drm/i915_drm_buffer.c index ab1e12529e..537bd737c5 100644 --- a/src/gallium/winsys/i915/drm/i915_drm_buffer.c +++ b/src/gallium/winsys/i915/drm/i915_drm_buffer.c @@ -5,6 +5,24 @@  #include "i915_drm.h" +static char *i915_drm_type_to_name(enum i915_winsys_buffer_type type) +{ +   char *name; + +   if (type == I915_NEW_TEXTURE) { +      name = "gallium3d_texture"; +   } else if (type == I915_NEW_VERTEX) { +      name = "gallium3d_vertex"; +   } else if (type == I915_NEW_SCANOUT) { +      name = "gallium3d_scanout"; +   } else { +      assert(0); +      name = "gallium3d_unknown"; +   } + +   return name; +} +  static struct i915_winsys_buffer *  i915_drm_buffer_create(struct i915_winsys *iws,                          unsigned size, @@ -12,7 +30,6 @@ i915_drm_buffer_create(struct i915_winsys *iws,  {     struct i915_drm_buffer *buf = CALLOC_STRUCT(i915_drm_buffer);     struct i915_drm_winsys *idws = i915_drm_winsys(iws); -   char *name;     if (!buf)        return NULL; @@ -21,22 +38,48 @@ i915_drm_buffer_create(struct i915_winsys *iws,     buf->flinked = FALSE;     buf->flink = 0; -   if (type == I915_NEW_TEXTURE) { -      name = "gallium3d_texture"; -   } else if (type == I915_NEW_VERTEX) { -      name = "gallium3d_vertex"; -   } else if (type == I915_NEW_SCANOUT) { -      name = "gallium3d_scanout"; -   } else { -      assert(0); -      name = "gallium3d_unknown"; -   } +   buf->bo = drm_intel_bo_alloc(idws->gem_manager, +                                i915_drm_type_to_name(type), size, 0); + +   if (!buf->bo) +      goto err; + +   return (struct i915_winsys_buffer *)buf; + +err: +   assert(0); +   FREE(buf); +   return NULL; +} + +static struct i915_winsys_buffer * +i915_drm_buffer_create_tiled(struct i915_winsys *iws, +                             unsigned *stride, unsigned height,  +                             enum i915_winsys_buffer_tile *tiling, +                             enum i915_winsys_buffer_type type) +{ +   struct i915_drm_buffer *buf = CALLOC_STRUCT(i915_drm_buffer); +   struct i915_drm_winsys *idws = i915_drm_winsys(iws); +   unsigned long pitch = 0; +   uint32_t tiling_mode = *tiling; + +   if (!buf) +      return NULL; + +   buf->magic = 0xDEAD1337; +   buf->flinked = FALSE; +   buf->flink = 0; -   buf->bo = drm_intel_bo_alloc(idws->gem_manager, name, size, 0); +   buf->bo = drm_intel_bo_alloc_tiled(idws->gem_manager, +                                      i915_drm_type_to_name(type), +		   		      *stride, height, 1, +                                      &tiling_mode, &pitch, 0);     if (!buf->bo)        goto err; +   *stride = pitch; +   *tiling = tiling_mode;     return (struct i915_winsys_buffer *)buf;  err: @@ -190,6 +233,7 @@ void  i915_drm_winsys_init_buffer_functions(struct i915_drm_winsys *idws)  {     idws->base.buffer_create = i915_drm_buffer_create; +   idws->base.buffer_create_tiled = i915_drm_buffer_create_tiled;     idws->base.buffer_from_handle = i915_drm_buffer_from_handle;     idws->base.buffer_get_handle = i915_drm_buffer_get_handle;     idws->base.buffer_set_fence_reg = i915_drm_buffer_set_fence_reg; diff --git a/src/gallium/winsys/i915/sw/i915_sw_buffer.c b/src/gallium/winsys/i915/sw/i915_sw_buffer.c index 321ef90d26..44466d1c66 100644 --- a/src/gallium/winsys/i915/sw/i915_sw_buffer.c +++ b/src/gallium/winsys/i915/sw/i915_sw_buffer.c @@ -27,6 +27,34 @@ err:     return NULL;  } +static struct i915_winsys_buffer * +i915_sw_buffer_create_tiled(struct i915_winsys *iws, +                      unsigned *stride, unsigned height,  +                      enum i915_winsys_buffer_tile *tiling, +                      enum i915_winsys_buffer_type type) +{ +   struct i915_sw_buffer *buf = CALLOC_STRUCT(i915_sw_buffer); + +   if (!buf) +      return NULL; + +   buf->magic = 0xDEAD1337; +   buf->type = type; +   buf->ptr = CALLOC(*stride * height, 1); +   buf->tiling = *tiling; +   buf->stride = *stride; + +   if (!buf->ptr) +      goto err; + +   return (struct i915_winsys_buffer *)buf; + +err: +   assert(0); +   FREE(buf); +   return NULL; +} +  static int  i915_sw_buffer_set_fence_reg(struct i915_winsys *iws,                                 struct i915_winsys_buffer *buffer, @@ -39,7 +67,7 @@ i915_sw_buffer_set_fence_reg(struct i915_winsys *iws,        assert(buf->map_count == 0);     } -   buf->tile = tile; +   buf->tiling = tile;     return 0;  } @@ -95,6 +123,7 @@ void  i915_sw_winsys_init_buffer_functions(struct i915_sw_winsys *isws)  {     isws->base.buffer_create = i915_sw_buffer_create; +   isws->base.buffer_create_tiled = i915_sw_buffer_create_tiled;     isws->base.buffer_set_fence_reg = i915_sw_buffer_set_fence_reg;     isws->base.buffer_map = i915_sw_buffer_map;     isws->base.buffer_unmap = i915_sw_buffer_unmap; diff --git a/src/gallium/winsys/i915/sw/i915_sw_winsys.h b/src/gallium/winsys/i915/sw/i915_sw_winsys.h index cd2eebd179..3af2548419 100644 --- a/src/gallium/winsys/i915/sw/i915_sw_winsys.h +++ b/src/gallium/winsys/i915/sw/i915_sw_winsys.h @@ -43,7 +43,8 @@ struct i915_sw_buffer {     void *ptr;     unsigned map_count;     enum i915_winsys_buffer_type type; -   enum i915_winsys_buffer_tile tile; +   enum i915_winsys_buffer_tile tiling; +   unsigned stride;  };  static INLINE struct i915_sw_buffer * | 
