- size is the number of bytes to fill, and must be either a multiple of 4,
or VK_WHOLE_SIZE to fill the range from offset to the end of the buffer
*/
- util_range_add(&res->base.b, &res->valid_buffer_range, offset, offset + size);
zink_resource_buffer_transfer_dst_barrier(ctx, res, offset, size);
VkCommandBuffer cmdbuf = zink_get_cmdbuf(ctx, NULL, res);
zink_batch_reference_resource_rw(&ctx->batch, res, true);
region.size = size;
struct zink_batch *batch = &ctx->batch;
- util_range_add(&dst->base.b, &dst->valid_buffer_range, dst_offset, dst_offset + size);
zink_screen(ctx->base.screen)->buffer_barrier(ctx, src, VK_ACCESS_TRANSFER_READ_BIT, 0);
zink_resource_buffer_transfer_dst_barrier(ctx, dst, dst_offset, size);
VkCommandBuffer cmdbuf = zink_get_cmdbuf(ctx, src, dst);
needs_present_readback = zink_kopper_acquire_readback(ctx, img);
zink_screen(ctx->base.screen)->image_barrier(ctx, img, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, 0, 0);
zink_resource_buffer_transfer_dst_barrier(ctx, buf, dstx, src_box->width);
- util_range_add(&dst->base.b, &dst->valid_buffer_range, dstx, dstx + src_box->width);
}
VkBufferImageCopy region = {0};
if (res->base.b.flags & PIPE_RESOURCE_FLAG_SPARSE)
return false;
- if (res->valid_buffer_range.start > res->valid_buffer_range.end)
+ struct pipe_box box = {0, 0, 0, res->base.b.width0, 0, 0};
+ if (res->valid_buffer_range.start > res->valid_buffer_range.end &&
+ !zink_resource_copy_box_intersects(res, 0, &box))
return false;
if (res->so_valid)
* in which case it can be mapped unsynchronized. */
if (!(usage & (PIPE_MAP_UNSYNCHRONIZED | TC_TRANSFER_MAP_NO_INFER_UNSYNCHRONIZED)) &&
usage & PIPE_MAP_WRITE && !res->base.is_shared &&
- !util_ranges_intersect(&res->valid_buffer_range, box->x, box->x + box->width)) {
+ !util_ranges_intersect(&res->valid_buffer_range, box->x, box->x + box->width) &&
+ !zink_resource_copy_box_intersects(res, 0, box)) {
usage |= PIPE_MAP_UNSYNCHRONIZED;
}
if (!res->obj->copies_valid)
return;
unsigned max_level = res->base.b.target == PIPE_BUFFER ? 1 : (res->base.b.last_level + 1);
+ if (res->base.b.target == PIPE_BUFFER) {
+ /* flush transfer regions back to valid range on reset */
+ struct pipe_box *b = res->obj->copies[0].data;
+ unsigned num_boxes = util_dynarray_num_elements(&res->obj->copies[0], struct pipe_box);
+ for (unsigned i = 0; i < num_boxes; i++)
+ util_range_add(&res->base.b, &res->valid_buffer_range, b->x, b->x + b->width);
+ }
for (unsigned i = 0; i < max_level; i++)
util_dynarray_clear(&res->obj->copies[i]);
res->obj->copies_valid = false;