rts[i].first_layer = surf->u.tex.first_layer;
rts[i].last_layer = surf->u.tex.last_layer;
rts[i].image = &prsrc->image;
+ rts[i].nr_samples = surf->nr_samples ? : MAX2(surf->texture->nr_samples, 1);
memcpy(rts[i].swizzle, id_swz, sizeof(rts[i].swizzle));
fb->rts[i].state = &prsrc->state;
fb->rts[i].view = &rts[i];
zs->first_layer = surf->u.tex.first_layer;
zs->last_layer = surf->u.tex.last_layer;
zs->image = &prsrc->image;
+ zs->nr_samples = surf->nr_samples ? : MAX2(surf->texture->nr_samples, 1);
memcpy(zs->swizzle, id_swz, sizeof(zs->swizzle));
fb->zs.view.zs = zs;
fb->zs.state.zs = &prsrc->state;
s->first_layer = surf->u.tex.first_layer;
s->last_layer = surf->u.tex.last_layer;
s->image = &prsrc->separate_stencil->image;
+ s->nr_samples = surf->nr_samples ? : MAX2(surf->texture->nr_samples, 1);
memcpy(s->swizzle, id_swz, sizeof(s->swizzle));
fb->zs.view.s = s;
fb->zs.state.s = &prsrc->separate_stencil->state;
}
}
+static enum mali_msaa
+mali_sampling_mode(const struct pan_image_view *view)
+{
+ if (view->image->layout.nr_samples > 1) {
+ assert(view->nr_samples == view->image->layout.nr_samples);
+ assert(view->image->layout.slices[0].surface_stride != 0);
+ return MALI_MSAA_LAYERED;
+ }
+
+ if (view->nr_samples > view->image->layout.nr_samples) {
+ assert(view->image->layout.nr_samples == 1);
+ return MALI_MSAA_AVERAGE;
+ }
+
+ assert(view->nr_samples == view->image->layout.nr_samples);
+ assert(view->nr_samples == 1);
+
+ return MALI_MSAA_SINGLE;
+}
+
static void
pan_prepare_s(const struct panfrost_device *dev,
const struct pan_fb_info *fb,
return;
unsigned level = s->first_level;
- unsigned nr_samples = s->image->layout.nr_samples;
if (dev->arch < 7)
- ext->s_msaa = nr_samples > 1 ? MALI_MSAA_LAYERED : MALI_MSAA_SINGLE;
+ ext->s_msaa = mali_sampling_mode(s);
else
- ext->s_msaa_v7 = nr_samples > 1 ? MALI_MSAA_LAYERED : MALI_MSAA_SINGLE;
+ ext->s_msaa_v7 = mali_sampling_mode(s);
struct pan_surface surf;
pan_iview_get_surface(s, 0, 0, 0, &surf);
ext->s_writeback_base = surf.data;
ext->s_writeback_row_stride = s->image->layout.slices[level].row_stride;
ext->s_writeback_surface_stride =
- (nr_samples > 1) ?
+ (s->image->layout.nr_samples > 1) ?
s->image->layout.slices[level].surface_stride : 0;
if (dev->arch >= 7)
return;
unsigned level = zs->first_level;
- unsigned nr_samples = zs->image->layout.nr_samples;
if (dev->arch < 7)
- ext->zs_msaa = nr_samples > 1 ? MALI_MSAA_LAYERED : MALI_MSAA_SINGLE;
+ ext->zs_msaa = mali_sampling_mode(zs);
else
- ext->zs_msaa_v7 = nr_samples > 1 ? MALI_MSAA_LAYERED : MALI_MSAA_SINGLE;
+ ext->zs_msaa_v7 = mali_sampling_mode(zs);
struct pan_surface surf;
pan_iview_get_surface(zs, 0, 0, 0, &surf);
ext->zs_writeback_row_stride =
zs->image->layout.slices[level].row_stride;
ext->zs_writeback_surface_stride =
- (nr_samples > 1) ?
+ (zs->image->layout.nr_samples > 1) ?
zs->image->layout.slices[level].surface_stride : 0;
}
continue;
total_size += pan_bytes_per_pixel_tib(rt->format) *
- rt->image->layout.nr_samples * (*tile_size);
+ rt->nr_samples * (*tile_size);
}
/* We have a 4KB budget, let's reduce the tile size until it fits. */
/* Only set layer_stride for layered MSAA rendering */
- unsigned nr_samples = rt->image->layout.nr_samples;
unsigned layer_stride =
- (nr_samples > 1) ? rt->image->layout.slices[level].surface_stride : 0;
+ (rt->image->layout.nr_samples > 1) ?
+ rt->image->layout.slices[level].surface_stride : 0;
- if (layer_stride)
- cfg->writeback_msaa = MALI_MSAA_LAYERED;
- else if (rt->image->layout.nr_samples > 1)
- cfg->writeback_msaa = MALI_MSAA_AVERAGE;
- else
- cfg->writeback_msaa = MALI_MSAA_SINGLE;
+ cfg->writeback_msaa = mali_sampling_mode(rt);
pan_rt_init_format(dev, rt, cfg);
cfg.sample_count = fb->nr_samples;
/* XXX: different behaviour from MFBD and probably wrong... */
- cfg.msaa = (fb->nr_samples > 1) ?
- MALI_MSAA_MULTIPLE : MALI_MSAA_SINGLE;
+ cfg.msaa = mali_sampling_mode(fb->rts[0].view);
}
pan_emit_sfbd_tiler(dev, fb, tiler_ctx, fbd);
pan_section_pack(fbd, SINGLE_TARGET_FRAMEBUFFER, PADDING_2, padding);