#include "zink_resource.h"
-#include "zink_cmdbuf.h"
+#include "zink_batch.h"
#include "zink_context.h"
#include "zink_screen.h"
case PIPE_TEXTURE_2D_ARRAY:
case PIPE_TEXTURE_CUBE:
case PIPE_TEXTURE_CUBE_ARRAY:
+ case PIPE_TEXTURE_RECT:
ici.imageType = VK_IMAGE_TYPE_2D;
/* cube and 2D array needs some quirks here */
if (templ->target == PIPE_TEXTURE_CUBE)
ici.imageType = VK_IMAGE_TYPE_3D;
break;
- case PIPE_TEXTURE_RECT:
- unreachable("texture rects not supported");
-
case PIPE_BUFFER:
unreachable("PIPE_BUFFER should already be handled");
struct zink_transfer *trans,
bool buf2img)
{
- struct zink_cmdbuf *cmdbuf = zink_start_cmdbuf(ctx);
- if (!cmdbuf)
- return false;
+ struct zink_batch *batch = zink_batch_no_rp(ctx);
if (res->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL &&
res->layout != VK_IMAGE_LAYOUT_GENERAL) {
- zink_resource_barrier(cmdbuf->cmdbuf, res, res->aspect,
+ zink_resource_barrier(batch->cmdbuf, res, res->aspect,
VK_IMAGE_LAYOUT_GENERAL);
res->layout = VK_IMAGE_LAYOUT_GENERAL;
}
copyRegion.bufferOffset = staging_res->offset;
copyRegion.bufferRowLength = 0;
copyRegion.bufferImageHeight = 0;
- copyRegion.imageSubresource.aspectMask = res->aspect;
copyRegion.imageSubresource.mipLevel = trans->base.level;
copyRegion.imageSubresource.layerCount = 1;
if (res->base.array_size > 1) {
copyRegion.imageExtent.width = trans->base.box.width;
copyRegion.imageExtent.height = trans->base.box.height;
- if (buf2img)
- vkCmdCopyBufferToImage(cmdbuf->cmdbuf, staging_res->buffer, res->image, res->layout, 1, ©Region);
- else
- vkCmdCopyImageToBuffer(cmdbuf->cmdbuf, res->image, res->layout, staging_res->buffer, 1, ©Region);
+ zink_batch_reference_resoure(batch, res);
+ zink_batch_reference_resoure(batch, staging_res);
+
+ unsigned aspects = res->aspect;
+ while (aspects) {
+ int aspect = 1 << u_bit_scan(&aspects);
+ copyRegion.imageSubresource.aspectMask = aspect;
+
+ if (buf2img)
+ vkCmdCopyBufferToImage(batch->cmdbuf, staging_res->buffer, res->image, res->layout, 1, ©Region);
+ else
+ vkCmdCopyImageToBuffer(batch->cmdbuf, res->image, res->layout, staging_res->buffer, 1, ©Region);
+ }
- zink_end_cmdbuf(ctx, cmdbuf);
return true;
}
struct pipe_resource templ = *pres;
templ.usage = PIPE_USAGE_STAGING;
templ.target = PIPE_BUFFER;
- templ.bind = 0; // HACK: there's no transfer binding, but usage should tell us enough
+ templ.bind = 0;
templ.width0 = trans->base.layer_stride * box->depth;
templ.height0 = templ.depth0 = 0;
templ.last_level = 0;
zink_transfer_copy_bufimage(ctx, res, staging_res, trans, true);
}
- zink_resource_destroy(pctx->screen, trans->staging_res);
- trans->staging_res = NULL;
+ pipe_resource_reference(&trans->staging_res, NULL);
} else
vkUnmapMemory(screen->dev, res->mem);