if (batch->key.nr_cbufs == 1) {
struct pipe_surface *surf = batch->key.cbufs[0];
struct panfrost_resource *rsrc = pan_resource(surf->texture);
- struct panfrost_bo *bo = rsrc->bo;
if (rsrc->checksummed) {
unsigned level = surf->u.tex.level;
fb.mfbd_flags |= MALI_MFBD_EXTRA;
fbx.flags_lo |= MALI_EXTRA_PRESENT;
fbx.checksum_stride = slice->checksum_stride;
- fbx.checksum = bo->gpu + slice->checksum_offset;
+ if (slice->checksum_bo)
+ fbx.checksum = slice->checksum_bo->gpu;
+ else
+ fbx.checksum = rsrc->bo->gpu + slice->checksum_offset;
}
}
rsc->slices[0].initialized = true;
panfrost_resource_reset_damage(rsc);
+ if (dev->quirks & IS_BIFROST &&
+ templat->bind & PIPE_BIND_RENDER_TARGET) {
+ unsigned size = panfrost_compute_checksum_size(
+ &rsc->slices[0], templat->width0, templat->height0);
+ rsc->slices[0].checksum_bo = pan_bo_create(dev, size, 0);
+ rsc->checksummed = true;
+ }
+
if (dev->ro) {
rsc->scanout =
renderonly_create_gpu_import_for_resource(prsc, dev->ro, NULL);
if (rsrc->bo)
panfrost_bo_unreference(rsrc->bo);
+ if (rsrc->slices[0].checksum_bo)
+ panfrost_bo_unreference(rsrc->slices[0].checksum_bo);
+
util_range_destroy(&rsrc->valid_buffer_range);
ralloc_free(rsrc);
}
* is its offset/stride? */
unsigned checksum_offset;
unsigned checksum_stride;
+ struct panfrost_bo *checksum_bo;
/* Has anything been written to this slice? */
bool initialized;