iris: Allocate buffer resources separately
(cleaned up by Ken - make sure a bunch of things were more obviously not using res->surf, do allow checking res->surf.tiling == LINEAR, drop format cpp checks that aren't needed, drop memzone handling for images, assume buffers / non-buffers in a few places...)
This commit is contained in:

committed by
Kenneth Graunke

parent
585c95f8cc
commit
47d4ea1a16
@@ -225,6 +225,44 @@ iris_alloc_resource(struct pipe_screen *pscreen,
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct pipe_resource *
|
||||||
|
iris_resource_create_for_buffer(struct pipe_screen *pscreen,
|
||||||
|
const struct pipe_resource *templ)
|
||||||
|
{
|
||||||
|
struct iris_screen *screen = (struct iris_screen *)pscreen;
|
||||||
|
struct iris_resource *res = iris_alloc_resource(pscreen, templ);
|
||||||
|
|
||||||
|
assert(templ->target == PIPE_BUFFER);
|
||||||
|
assert(templ->height0 <= 1);
|
||||||
|
assert(templ->depth0 <= 1);
|
||||||
|
assert(templ->format == PIPE_FORMAT_NONE ||
|
||||||
|
util_format_get_blocksize(templ->format) == 1);
|
||||||
|
|
||||||
|
res->internal_format = templ->format;
|
||||||
|
res->surf.tiling = ISL_TILING_LINEAR;
|
||||||
|
|
||||||
|
enum iris_memory_zone memzone = IRIS_MEMZONE_OTHER;
|
||||||
|
const char *name = templ->target == PIPE_BUFFER ? "buffer" : "miptree";
|
||||||
|
if (templ->flags & IRIS_RESOURCE_FLAG_SHADER_MEMZONE) {
|
||||||
|
memzone = IRIS_MEMZONE_SHADER;
|
||||||
|
name = "shader kernels";
|
||||||
|
} else if (templ->flags & IRIS_RESOURCE_FLAG_SURFACE_MEMZONE) {
|
||||||
|
memzone = IRIS_MEMZONE_SURFACE;
|
||||||
|
name = "surface state";
|
||||||
|
} else if (templ->flags & IRIS_RESOURCE_FLAG_DYNAMIC_MEMZONE) {
|
||||||
|
memzone = IRIS_MEMZONE_DYNAMIC;
|
||||||
|
name = "dynamic state";
|
||||||
|
}
|
||||||
|
|
||||||
|
res->bo = iris_bo_alloc(screen->bufmgr, name, templ->width0, memzone);
|
||||||
|
if (!res->bo) {
|
||||||
|
iris_resource_destroy(pscreen, &res->base);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &res->base;
|
||||||
|
}
|
||||||
|
|
||||||
static struct pipe_resource *
|
static struct pipe_resource *
|
||||||
iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
|
iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
|
||||||
const struct pipe_resource *templ,
|
const struct pipe_resource *templ,
|
||||||
@@ -316,37 +354,34 @@ iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
|
|||||||
.tiling_flags = tiling_flags);
|
.tiling_flags = tiling_flags);
|
||||||
assert(isl_surf_created_successfully);
|
assert(isl_surf_created_successfully);
|
||||||
|
|
||||||
|
const char *name = "miptree";
|
||||||
|
|
||||||
enum iris_memory_zone memzone = IRIS_MEMZONE_OTHER;
|
enum iris_memory_zone memzone = IRIS_MEMZONE_OTHER;
|
||||||
const char *name = templ->target == PIPE_BUFFER ? "buffer" : "miptree";
|
|
||||||
if (templ->flags & IRIS_RESOURCE_FLAG_SHADER_MEMZONE) {
|
/* These are for u_upload_mgr buffers only */
|
||||||
memzone = IRIS_MEMZONE_SHADER;
|
assert(!(templ->flags & (IRIS_RESOURCE_FLAG_SHADER_MEMZONE |
|
||||||
name = "shader kernels";
|
IRIS_RESOURCE_FLAG_SURFACE_MEMZONE |
|
||||||
} else if (templ->flags & IRIS_RESOURCE_FLAG_SURFACE_MEMZONE) {
|
IRIS_RESOURCE_FLAG_DYNAMIC_MEMZONE)));
|
||||||
memzone = IRIS_MEMZONE_SURFACE;
|
|
||||||
name = "surface state";
|
|
||||||
} else if (templ->flags & IRIS_RESOURCE_FLAG_DYNAMIC_MEMZONE) {
|
|
||||||
memzone = IRIS_MEMZONE_DYNAMIC;
|
|
||||||
name = "dynamic state";
|
|
||||||
}
|
|
||||||
|
|
||||||
res->bo = iris_bo_alloc_tiled(screen->bufmgr, name, res->surf.size_B,
|
res->bo = iris_bo_alloc_tiled(screen->bufmgr, name, res->surf.size_B,
|
||||||
memzone,
|
memzone,
|
||||||
isl_tiling_to_i915_tiling(res->surf.tiling),
|
isl_tiling_to_i915_tiling(res->surf.tiling),
|
||||||
res->surf.row_pitch_B, 0);
|
res->surf.row_pitch_B, 0);
|
||||||
if (!res->bo)
|
if (!res->bo) {
|
||||||
goto fail;
|
|
||||||
|
|
||||||
return &res->base;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
iris_resource_destroy(pscreen, &res->base);
|
iris_resource_destroy(pscreen, &res->base);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &res->base;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pipe_resource *
|
static struct pipe_resource *
|
||||||
iris_resource_create(struct pipe_screen *pscreen,
|
iris_resource_create(struct pipe_screen *pscreen,
|
||||||
const struct pipe_resource *templ)
|
const struct pipe_resource *templ)
|
||||||
{
|
{
|
||||||
|
if (templ->target == PIPE_BUFFER)
|
||||||
|
return iris_resource_create_for_buffer(pscreen, templ);
|
||||||
|
else
|
||||||
return iris_resource_create_with_modifiers(pscreen, templ, NULL, 0);
|
return iris_resource_create_with_modifiers(pscreen, templ, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -370,12 +405,14 @@ iris_resource_from_user_memory(struct pipe_screen *pscreen,
|
|||||||
void *user_memory)
|
void *user_memory)
|
||||||
{
|
{
|
||||||
struct iris_screen *screen = (struct iris_screen *)pscreen;
|
struct iris_screen *screen = (struct iris_screen *)pscreen;
|
||||||
struct gen_device_info *devinfo = &screen->devinfo;
|
|
||||||
struct iris_bufmgr *bufmgr = screen->bufmgr;
|
struct iris_bufmgr *bufmgr = screen->bufmgr;
|
||||||
struct iris_resource *res = iris_alloc_resource(pscreen, templ);
|
struct iris_resource *res = iris_alloc_resource(pscreen, templ);
|
||||||
if (!res)
|
if (!res)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
assert(templ->target == PIPE_BUFFER);
|
||||||
|
|
||||||
|
res->internal_format = templ->format;
|
||||||
res->bo = iris_bo_create_userptr(bufmgr, "user",
|
res->bo = iris_bo_create_userptr(bufmgr, "user",
|
||||||
user_memory, templ->width0,
|
user_memory, templ->width0,
|
||||||
IRIS_MEMZONE_OTHER);
|
IRIS_MEMZONE_OTHER);
|
||||||
@@ -384,30 +421,6 @@ iris_resource_from_user_memory(struct pipe_screen *pscreen,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
res->internal_format = templ->format;
|
|
||||||
|
|
||||||
// XXX: usage...
|
|
||||||
isl_surf_usage_flags_t isl_usage = 0;
|
|
||||||
|
|
||||||
const struct iris_format_info fmt =
|
|
||||||
iris_format_for_usage(devinfo, templ->format, isl_usage);
|
|
||||||
|
|
||||||
isl_surf_init(&screen->isl_dev, &res->surf,
|
|
||||||
.dim = target_to_isl_surf_dim(templ->target),
|
|
||||||
.format = fmt.fmt,
|
|
||||||
.width = templ->width0,
|
|
||||||
.height = templ->height0,
|
|
||||||
.depth = templ->depth0,
|
|
||||||
.levels = templ->last_level + 1,
|
|
||||||
.array_len = templ->array_size,
|
|
||||||
.samples = MAX2(templ->nr_samples, 1),
|
|
||||||
.min_alignment_B = 0,
|
|
||||||
.row_pitch_B = 0,
|
|
||||||
.usage = isl_usage,
|
|
||||||
.tiling_flags = 1 << ISL_TILING_LINEAR);
|
|
||||||
|
|
||||||
assert(res->bo->tiling_mode == isl_tiling_to_i915_tiling(res->surf.tiling));
|
|
||||||
|
|
||||||
return &res->base;
|
return &res->base;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -458,6 +471,9 @@ iris_resource_from_handle(struct pipe_screen *pscreen,
|
|||||||
const struct iris_format_info fmt =
|
const struct iris_format_info fmt =
|
||||||
iris_format_for_usage(devinfo, templ->format, isl_usage);
|
iris_format_for_usage(devinfo, templ->format, isl_usage);
|
||||||
|
|
||||||
|
if (templ->target == PIPE_BUFFER) {
|
||||||
|
res->surf.tiling = ISL_TILING_LINEAR;
|
||||||
|
} else {
|
||||||
isl_surf_init(&screen->isl_dev, &res->surf,
|
isl_surf_init(&screen->isl_dev, &res->surf,
|
||||||
.dim = target_to_isl_surf_dim(templ->target),
|
.dim = target_to_isl_surf_dim(templ->target),
|
||||||
.format = fmt.fmt,
|
.format = fmt.fmt,
|
||||||
@@ -472,7 +488,9 @@ iris_resource_from_handle(struct pipe_screen *pscreen,
|
|||||||
.usage = isl_usage,
|
.usage = isl_usage,
|
||||||
.tiling_flags = 1 << mod_info->tiling);
|
.tiling_flags = 1 << mod_info->tiling);
|
||||||
|
|
||||||
assert(res->bo->tiling_mode == isl_tiling_to_i915_tiling(res->surf.tiling));
|
assert(res->bo->tiling_mode ==
|
||||||
|
isl_tiling_to_i915_tiling(res->surf.tiling));
|
||||||
|
}
|
||||||
|
|
||||||
return &res->base;
|
return &res->base;
|
||||||
|
|
||||||
@@ -490,6 +508,7 @@ iris_resource_get_handle(struct pipe_screen *pscreen,
|
|||||||
{
|
{
|
||||||
struct iris_resource *res = (struct iris_resource *)resource;
|
struct iris_resource *res = (struct iris_resource *)resource;
|
||||||
|
|
||||||
|
/* If this is a buffer, stride should be 0 - no need to special case */
|
||||||
whandle->stride = res->surf.row_pitch_B;
|
whandle->stride = res->surf.row_pitch_B;
|
||||||
whandle->modifier = tiling_to_modifier(res->bo->tiling_mode);
|
whandle->modifier = tiling_to_modifier(res->bo->tiling_mode);
|
||||||
|
|
||||||
|
@@ -47,7 +47,17 @@ struct iris_format_info {
|
|||||||
struct iris_resource {
|
struct iris_resource {
|
||||||
struct pipe_resource base;
|
struct pipe_resource base;
|
||||||
enum pipe_format internal_format;
|
enum pipe_format internal_format;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ISL surface layout information for this resource.
|
||||||
|
*
|
||||||
|
* This is not filled out for PIPE_BUFFER resources, but is guaranteed
|
||||||
|
* to be zeroed. Note that this also guarantees that res->surf.tiling
|
||||||
|
* will be ISL_TILING_LINEAR, so it's safe to check that.
|
||||||
|
*/
|
||||||
struct isl_surf surf;
|
struct isl_surf surf;
|
||||||
|
|
||||||
|
/** Backing storage for the resource */
|
||||||
struct iris_bo *bo;
|
struct iris_bo *bo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user