broadcom/vc5: Lay out MSAA textures/renderbuffers as UIF scaled by 4.

We just need to multiply width/height by 2 each, and always set them up as
UIF tiling, since that's how the TLB will store them in raw (per-sample)
mode.
This commit is contained in:
Eric Anholt 2017-10-24 18:45:57 -07:00
parent 1d8105a167
commit b1a8b3979c
2 changed files with 37 additions and 14 deletions

View File

@ -367,7 +367,11 @@ vc5_setup_slices(struct vc5_resource *rsc, const char *caller)
uint32_t utile_h = vc5_utile_height(rsc->cpp);
uint32_t uif_block_w = utile_w * 2;
uint32_t uif_block_h = utile_h * 2;
bool uif_top = false;
bool msaa = prsc->nr_samples > 1;
/* MSAA textures/renderbuffers are always laid out as single-level
* UIF.
*/
bool uif_top = prsc->nr_samples > 1;
for (int i = prsc->last_level; i >= 0; i--) {
struct vc5_resource_slice *slice = &rsc->slices[i];
@ -381,13 +385,13 @@ vc5_setup_slices(struct vc5_resource *rsc, const char *caller)
level_height = u_minify(pot_height, i);
}
if (msaa) {
level_width *= 2;
level_height *= 2;
}
if (!rsc->tiled) {
slice->tiling = VC5_TILING_RASTER;
if (prsc->nr_samples > 1) {
/* MSAA (4x) surfaces are stored as raw tile buffer contents. */
level_width = align(level_width, 32);
level_height = align(level_height, 32);
}
} else {
if ((i != 0 || !uif_top) &&
(level_width <= utile_w ||
@ -416,8 +420,7 @@ vc5_setup_slices(struct vc5_resource *rsc, const char *caller)
}
slice->offset = offset;
slice->stride = (level_width * rsc->cpp *
MAX2(prsc->nr_samples, 1));
slice->stride = level_width * rsc->cpp;
slice->size = level_height * slice->stride;
offset += slice->size;
@ -482,10 +485,28 @@ vc5_resource_setup(struct pipe_screen *pscreen,
pipe_reference_init(&prsc->reference, 1);
prsc->screen = pscreen;
if (prsc->nr_samples <= 1)
rsc->cpp = util_format_get_blocksize(tmpl->format);
else
rsc->cpp = sizeof(uint32_t);
if (prsc->nr_samples <= 1) {
rsc->cpp = util_format_get_blocksize(prsc->format);
} else {
assert(vc5_rt_format_supported(prsc->format));
uint32_t output_image_format = vc5_get_rt_format(prsc->format);
uint32_t internal_type;
uint32_t internal_bpp;
vc5_get_internal_type_bpp_for_output_format(output_image_format,
&internal_type,
&internal_bpp);
switch (internal_bpp) {
case INTERNAL_BPP_32:
rsc->cpp = 4;
break;
case INTERNAL_BPP_64:
rsc->cpp = 8;
break;
case INTERNAL_BPP_128:
rsc->cpp = 16;
break;
}
}
assert(rsc->cpp);

View File

@ -562,11 +562,13 @@ vc5_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *prsc,
so->base.reference.count = 1;
so->base.context = pctx;
int msaa_scale = prsc->nr_samples > 1 ? 2 : 1;
struct V3D33_TEXTURE_SHADER_STATE state_unpacked = {
cl_packet_header(TEXTURE_SHADER_STATE),
.image_width = prsc->width0,
.image_height = prsc->height0,
.image_width = prsc->width0 * msaa_scale,
.image_height = prsc->height0 * msaa_scale,
.image_depth = prsc->depth0,
.texture_type = rsc->tex_format,