zink_batch_reference_resoure(batch, src);
zink_batch_reference_resoure(batch, dst);
- if (src->layout != VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL)
- zink_resource_barrier(batch->cmdbuf, src, src->aspect,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
-
- if (dst->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
- zink_resource_barrier(batch->cmdbuf, dst, dst->aspect,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+ zink_resource_setup_transfer_layouts(batch, src, dst);
VkImageResolve region = {};
zink_batch_reference_resoure(batch, src);
zink_batch_reference_resoure(batch, dst);
- if (src == dst) {
- /* The Vulkan 1.1 specification says the following about valid usage
- * of vkCmdBlitImage:
- *
- * "srcImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
- * VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL"
- *
- * and:
- *
- * "dstImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
- * VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL"
- *
- * Since we cant have the same image in two states at the same time,
- * we're effectively left with VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR or
- * VK_IMAGE_LAYOUT_GENERAL. And since this isn't a present-related
- * operation, VK_IMAGE_LAYOUT_GENERAL seems most appropriate.
- */
- if (src->layout != VK_IMAGE_LAYOUT_GENERAL)
- zink_resource_barrier(batch->cmdbuf, src, src->aspect,
- VK_IMAGE_LAYOUT_GENERAL);
- } else {
- if (src->layout != VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL)
- zink_resource_barrier(batch->cmdbuf, src, src->aspect,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
-
- if (dst->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
- zink_resource_barrier(batch->cmdbuf, dst, dst->aspect,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
- }
+ zink_resource_setup_transfer_layouts(batch, src, dst);
VkImageBlit region = {};
region.srcSubresource.aspectMask = src->aspect;
zink_batch_reference_resoure(batch, src);
zink_batch_reference_resoure(batch, dst);
- if (src->layout != VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) {
- zink_resource_barrier(batch->cmdbuf, src, src->aspect,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
- }
-
- if (dst->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) {
- zink_resource_barrier(batch->cmdbuf, dst, dst->aspect,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
- }
-
+ zink_resource_setup_transfer_layouts(batch, src, dst);
vkCmdCopyImage(batch->cmdbuf, src->image, src->layout,
dst->image, dst->layout,
1, ®ion);
}
void
+zink_resource_setup_transfer_layouts(struct zink_batch *batch, struct zink_resource *src, struct zink_resource *dst)
+{
+ if (src == dst) {
+ /* The Vulkan 1.1 specification says the following about valid usage
+ * of vkCmdBlitImage:
+ *
+ * "srcImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
+ * VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL"
+ *
+ * and:
+ *
+ * "dstImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
+ * VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL"
+ *
+ * Since we cant have the same image in two states at the same time,
+ * we're effectively left with VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR or
+ * VK_IMAGE_LAYOUT_GENERAL. And since this isn't a present-related
+ * operation, VK_IMAGE_LAYOUT_GENERAL seems most appropriate.
+ */
+ if (src->layout != VK_IMAGE_LAYOUT_GENERAL)
+ zink_resource_barrier(batch->cmdbuf, src, src->aspect,
+ VK_IMAGE_LAYOUT_GENERAL);
+ } else {
+ if (src->layout != VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL)
+ zink_resource_barrier(batch->cmdbuf, src, src->aspect,
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+
+ if (dst->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
+ zink_resource_barrier(batch->cmdbuf, dst, dst->aspect,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+ }
+}
+
+void
zink_get_depth_stencil_resources(struct pipe_resource *res,
struct zink_resource **out_z,
struct zink_resource **out_s)
struct pipe_screen;
struct sw_displaytarget;
+struct zink_batch;
#include "util/u_transfer.h"
struct zink_resource **out_z,
struct zink_resource **out_s);
+void
+zink_resource_setup_transfer_layouts(struct zink_batch *batch, struct zink_resource *src, struct zink_resource *dst);
#endif