if (image->shader_access & PIPE_IMAGE_ACCESS_WRITE) {
flags |= PAN_BO_ACCESS_WRITE;
unsigned level = is_buffer ? 0 : image->u.tex.level;
- rsrc->state.slices[level].data_valid = true;
+ BITSET_SET(rsrc->state.data_valid, level);
}
panfrost_batch_add_bo(batch, rsrc->image.data.bo, flags);
panfrost_initialize_surface(struct panfrost_batch *batch,
struct pipe_surface *surf)
{
- if (!surf)
- return;
-
- unsigned level = surf->u.tex.level;
- struct panfrost_resource *rsrc = pan_resource(surf->texture);
-
- rsrc->state.slices[level].data_valid = true;
+ if (surf) {
+ struct panfrost_resource *rsrc = pan_resource(surf->texture);
+ BITSET_SET(rsrc->state.data_valid, surf->u.tex.level);
+ }
}
void
if (!(batch->clear & mask) &&
((batch->read & mask) ||
((batch->draws & mask) &&
- prsrc->state.slices[fb->rts[i].view->first_level].data_valid)))
+ BITSET_TEST(prsrc->state.data_valid, fb->rts[i].view->first_level))))
fb->rts[i].preload = true;
}
if (!fb->zs.clear.z &&
((batch->read & PIPE_CLEAR_DEPTH) ||
((batch->draws & PIPE_CLEAR_DEPTH) &&
- z_state->slices[z_view->first_level].data_valid)))
+ BITSET_TEST(z_state->data_valid, z_view->first_level))))
fb->zs.preload.z = true;
if (!fb->zs.clear.s &&
((batch->read & PIPE_CLEAR_STENCIL) ||
((batch->draws & PIPE_CLEAR_STENCIL) &&
- s_state->slices[s_view->first_level].data_valid)))
+ BITSET_TEST(s_state->data_valid, s_view->first_level))))
fb->zs.preload.s = true;
/* Preserve both component if we have a combined ZS view and
* one component needs to be preserved.
*/
if (s_view == z_view && fb->zs.discard.z != fb->zs.discard.s) {
- bool valid = z_state->slices[z_view->first_level].data_valid;
+ bool valid = BITSET_TEST(z_state->data_valid, z_view->first_level);
fb->zs.discard.z = false;
fb->zs.discard.s = false;
rsc->modifier_constant = true;
- rsc->state.slices[0].data_valid = true;
+ BITSET_SET(rsc->state.data_valid, 0);
panfrost_resource_set_damage_region(pscreen, &rsc->base, 0, NULL);
if (dev->ro) {
* from a pending batch XXX */
panfrost_flush_batches_accessing_bo(ctx, rsrc->image.data.bo, true);
- if ((usage & PIPE_MAP_READ) && rsrc->state.slices[level].data_valid) {
+ if ((usage & PIPE_MAP_READ) && BITSET_TEST(rsrc->state.data_valid, level)) {
pan_blit_to_staging(pctx, transfer);
panfrost_flush_batches_accessing_bo(ctx, staging->image.data.bo, true);
panfrost_bo_wait(staging->image.data.bo, INT64_MAX, false);
transfer->map = ralloc_size(transfer, transfer->base.layer_stride * box->depth);
assert(box->depth == 1);
- if ((usage & PIPE_MAP_READ) && rsrc->state.slices[level].data_valid) {
+ if ((usage & PIPE_MAP_READ) && BITSET_TEST(rsrc->state.data_valid, level)) {
panfrost_load_tiled_image(
transfer->map,
bo->ptr.cpu + rsrc->image.layout.slices[level].offset,
* initialized (maybe), so be conservative */
if (usage & PIPE_MAP_WRITE) {
- rsrc->state.slices[level].data_valid = true;
+ BITSET_SET(rsrc->state.data_valid, level);
panfrost_minmax_cache_invalidate(rsrc->index_cache, &transfer->base);
}
};
for (int i = 0; i <= rsrc->base.last_level; i++) {
- if (rsrc->state.slices[i].data_valid) {
+ if (BITSET_TEST(rsrc->state.data_valid, i)) {
blit.dst.level = blit.src.level = i;
panfrost_blit(&ctx->base, &blit);
}
struct panfrost_bo *bo = prsrc->image.data.bo;
if (transfer->usage & PIPE_MAP_WRITE) {
- prsrc->state.slices[transfer->level].data_valid = true;
+ BITSET_SET(prsrc->state.data_valid, transfer->level);
if (prsrc->image.layout.modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED) {
assert(transfer->box.depth == 1);
transfer->box.x + box->x,
transfer->box.x + box->x + box->width);
} else {
- unsigned level = transfer->level;
- rsc->state.slices[level].data_valid = true;
+ BITSET_SET(rsc->state.data_valid, transfer->level);
}
}
assert(rsrc->image.data.bo);
for (unsigned l = base_level + 1; l <= last_level; ++l)
- rsrc->state.slices[l].data_valid = false;
+ BITSET_CLEAR(rsrc->state.data_valid, l);
/* Beyond that, we just delegate the hard stuff. */