iris: Fix texture buffer / image buffer sizes.
Also fix image buffers with offsets.
This commit is contained in:
@@ -39,6 +39,7 @@ struct iris_context;
|
|||||||
struct blorp_batch;
|
struct blorp_batch;
|
||||||
struct blorp_params;
|
struct blorp_params;
|
||||||
|
|
||||||
|
#define IRIS_MAX_TEXTURE_BUFFER_SIZE (1 << 27)
|
||||||
#define IRIS_MAX_TEXTURE_SAMPLERS 32
|
#define IRIS_MAX_TEXTURE_SAMPLERS 32
|
||||||
/* IRIS_MAX_ABOS and IRIS_MAX_SSBOS must be the same. */
|
/* IRIS_MAX_ABOS and IRIS_MAX_SSBOS must be the same. */
|
||||||
#define IRIS_MAX_ABOS 16
|
#define IRIS_MAX_ABOS 16
|
||||||
|
@@ -211,7 +211,7 @@ iris_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
|
case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
|
||||||
return true; // XXX: ?????
|
return true; // XXX: ?????
|
||||||
case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
|
case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
|
||||||
return 1 << 27; /* 128MB */
|
return IRIS_MAX_TEXTURE_BUFFER_SIZE;
|
||||||
case PIPE_CAP_MAX_VIEWPORTS:
|
case PIPE_CAP_MAX_VIEWPORTS:
|
||||||
return 16;
|
return 16;
|
||||||
case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
|
case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
|
||||||
|
@@ -1397,6 +1397,44 @@ fmt_swizzle(const struct iris_format_info *fmt, enum pipe_swizzle swz)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fill_buffer_surface_state(struct isl_device *isl_dev,
|
||||||
|
struct iris_bo *bo,
|
||||||
|
void *map,
|
||||||
|
enum isl_format format,
|
||||||
|
unsigned offset,
|
||||||
|
unsigned size)
|
||||||
|
{
|
||||||
|
const struct isl_format_layout *fmtl = isl_format_get_layout(format);
|
||||||
|
const unsigned cpp = fmtl->bpb / 8;
|
||||||
|
|
||||||
|
/* The ARB_texture_buffer_specification says:
|
||||||
|
*
|
||||||
|
* "The number of texels in the buffer texture's texel array is given by
|
||||||
|
*
|
||||||
|
* floor(<buffer_size> / (<components> * sizeof(<base_type>)),
|
||||||
|
*
|
||||||
|
* where <buffer_size> is the size of the buffer object, in basic
|
||||||
|
* machine units and <components> and <base_type> are the element count
|
||||||
|
* and base data type for elements, as specified in Table X.1. The
|
||||||
|
* number of texels in the texel array is then clamped to the
|
||||||
|
* implementation-dependent limit MAX_TEXTURE_BUFFER_SIZE_ARB."
|
||||||
|
*
|
||||||
|
* We need to clamp the size in bytes to MAX_TEXTURE_BUFFER_SIZE * stride,
|
||||||
|
* so that when ISL divides by stride to obtain the number of texels, that
|
||||||
|
* texel count is clamped to MAX_TEXTURE_BUFFER_SIZE.
|
||||||
|
*/
|
||||||
|
unsigned final_size =
|
||||||
|
MIN3(size, bo->size - offset, IRIS_MAX_TEXTURE_BUFFER_SIZE * cpp);
|
||||||
|
|
||||||
|
isl_buffer_fill_state(isl_dev, map,
|
||||||
|
.address = bo->gtt_offset + offset,
|
||||||
|
.size_B = final_size,
|
||||||
|
.format = format,
|
||||||
|
.stride_B = cpp,
|
||||||
|
.mocs = MOCS_WB);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The pipe->create_sampler_view() driver hook.
|
* The pipe->create_sampler_view() driver hook.
|
||||||
*/
|
*/
|
||||||
@@ -1473,19 +1511,9 @@ iris_create_sampler_view(struct pipe_context *ctx,
|
|||||||
// .aux_surf =
|
// .aux_surf =
|
||||||
// .clear_color = clear_color,
|
// .clear_color = clear_color,
|
||||||
} else {
|
} else {
|
||||||
// XXX: what to do about isv->view? other drivers don't use it for bufs
|
fill_buffer_surface_state(&screen->isl_dev, isv->res->bo, map,
|
||||||
const struct isl_format_layout *fmtl =
|
isv->view.format, tmpl->u.buf.offset,
|
||||||
isl_format_get_layout(isv->view.format);
|
tmpl->u.buf.size);
|
||||||
const unsigned cpp = fmtl->bpb / 8;
|
|
||||||
|
|
||||||
isl_buffer_fill_state(&screen->isl_dev, map,
|
|
||||||
.address = isv->res->bo->gtt_offset +
|
|
||||||
tmpl->u.buf.offset,
|
|
||||||
// XXX: buffer_texture_range_size from i965?
|
|
||||||
.size_B = tmpl->u.buf.size,
|
|
||||||
.format = isv->view.format,
|
|
||||||
.stride_B = cpp,
|
|
||||||
.mocs = MOCS_WB);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return &isv->base;
|
return &isv->base;
|
||||||
@@ -1651,18 +1679,9 @@ iris_set_shader_images(struct pipe_context *ctx,
|
|||||||
// .aux_surf =
|
// .aux_surf =
|
||||||
// .clear_color = clear_color,
|
// .clear_color = clear_color,
|
||||||
} else {
|
} else {
|
||||||
// XXX: what to do about view? other drivers don't use it for bufs
|
fill_buffer_surface_state(&screen->isl_dev, res->bo, map,
|
||||||
const struct isl_format_layout *fmtl =
|
isl_format, img->u.buf.offset,
|
||||||
isl_format_get_layout(isl_format);
|
img->u.buf.size);
|
||||||
const unsigned cpp = fmtl->bpb / 8;
|
|
||||||
|
|
||||||
isl_buffer_fill_state(&screen->isl_dev, map,
|
|
||||||
.address = res->bo->gtt_offset,
|
|
||||||
// XXX: buffer_texture_range_size from i965?
|
|
||||||
.size_B = res->base.width0,
|
|
||||||
.format = isl_format,
|
|
||||||
.stride_B = cpp,
|
|
||||||
.mocs = MOCS_WB);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pipe_resource_reference(&shs->image[start_slot + i].res, NULL);
|
pipe_resource_reference(&shs->image[start_slot + i].res, NULL);
|
||||||
|
Reference in New Issue
Block a user