summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/i915
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2010-11-21 20:34:44 +0100
committerJakob Bornecrantz <wallbraker@gmail.com>2010-12-02 01:34:12 +0100
commit4a666488c4e3067eed984e272149411cc2198c77 (patch)
treef1c82966a868f032dce2db59ed4b3b891a83d771 /src/gallium/winsys/i915
parentc62f5c7e7bc3ed84677805b3800fbcfa93c419ea (diff)
i915g: add winsys function to create tiled buffers
Different kernels have different restrictions for tiled buffers. Hence use the libdrm abstraction to calculate the necessary stride and height alignment requirements. Not yet used. v2: Incorporate review comments from Jakob Bornecrantz Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Jakob Bornecrantz <wallbraker@gmail.com> Signed-off-by: Jakob Bornecrantz <wallbraker@gmail.com>
Diffstat (limited to 'src/gallium/winsys/i915')
-rw-r--r--src/gallium/winsys/i915/drm/i915_drm_buffer.c68
-rw-r--r--src/gallium/winsys/i915/sw/i915_sw_buffer.c31
-rw-r--r--src/gallium/winsys/i915/sw/i915_sw_winsys.h3
3 files changed, 88 insertions, 14 deletions
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 *