summaryrefslogtreecommitdiffstats
path: root/src/intel/vulkan/anv_image.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/intel/vulkan/anv_image.c')
-rw-r--r--src/intel/vulkan/anv_image.c122
1 files changed, 27 insertions, 95 deletions
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c
index eb20b717937..c5b0f1c343c 100644
--- a/src/intel/vulkan/anv_image.c
+++ b/src/intel/vulkan/anv_image.c
@@ -56,27 +56,31 @@ choose_isl_surf_usage(VkImageUsageFlags vk_usage,
if (vk_usage & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT)
isl_usage |= ISL_SURF_USAGE_CUBE_BIT;
- if (vk_usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
- switch (aspect) {
- default:
- unreachable("bad VkImageAspect");
- case VK_IMAGE_ASPECT_DEPTH_BIT:
- isl_usage &= ~ISL_SURF_USAGE_DISABLE_AUX_BIT;
- isl_usage |= ISL_SURF_USAGE_DEPTH_BIT;
- break;
- case VK_IMAGE_ASPECT_STENCIL_BIT:
- isl_usage |= ISL_SURF_USAGE_STENCIL_BIT;
- break;
- }
+ /* Even if we're only using it for transfer operations, clears to depth and
+ * stencil images happen as depth and stencil so they need the right ISL
+ * usage bits or else things will fall apart.
+ */
+ switch (aspect) {
+ case VK_IMAGE_ASPECT_DEPTH_BIT:
+ isl_usage &= ~ISL_SURF_USAGE_DISABLE_AUX_BIT;
+ isl_usage |= ISL_SURF_USAGE_DEPTH_BIT;
+ break;
+ case VK_IMAGE_ASPECT_STENCIL_BIT:
+ isl_usage |= ISL_SURF_USAGE_STENCIL_BIT;
+ break;
+ case VK_IMAGE_ASPECT_COLOR_BIT:
+ break;
+ default:
+ unreachable("bad VkImageAspect");
}
if (vk_usage & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
- /* Meta implements transfers by sampling from the source image. */
+ /* blorp implements transfers by sampling from the source image. */
isl_usage |= ISL_SURF_USAGE_TEXTURE_BIT;
}
if (vk_usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
- /* Meta implements transfers by rendering into the destination image. */
+ /* blorp implements transfers by rendering into the destination image. */
isl_usage |= ISL_SURF_USAGE_RENDER_TARGET_BIT;
}
@@ -198,47 +202,6 @@ make_surface(const struct anv_device *dev,
return VK_SUCCESS;
}
-/**
- * Parameter @a format is required and overrides VkImageCreateInfo::format.
- */
-static VkImageUsageFlags
-anv_image_get_full_usage(const VkImageCreateInfo *info,
- VkImageAspectFlags aspects)
-{
- VkImageUsageFlags usage = info->usage;
-
- if (info->samples > 1 &&
- (usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)) {
- /* Meta will resolve the image by binding it as a texture. */
- usage |= VK_IMAGE_USAGE_SAMPLED_BIT;
- }
-
- if (usage & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
- /* Meta will transfer from the image by binding it as a texture. */
- usage |= VK_IMAGE_USAGE_SAMPLED_BIT;
- }
-
- if (usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
- /* For non-clear transfer operations, meta will transfer to the image by
- * binding it as a color attachment, even if the image format is not
- * a color format.
- */
- usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
-
- if (aspects & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
- /* vkCmdClearDepthStencilImage() only requires that
- * VK_IMAGE_USAGE_TRANSFER_SRC_BIT be set. In particular, it does
- * not require VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT. Meta
- * clears the image, though, by binding it as a depthstencil
- * attachment.
- */
- usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
- }
- }
-
- return usage;
-}
-
VkResult
anv_image_create(VkDevice _device,
const struct anv_image_create_info *create_info,
@@ -272,7 +235,7 @@ anv_image_create(VkDevice _device,
image->levels = pCreateInfo->mipLevels;
image->array_size = pCreateInfo->arrayLayers;
image->samples = pCreateInfo->samples;
- image->usage = anv_image_get_full_usage(pCreateInfo, image->aspects);
+ image->usage = pCreateInfo->usage;
image->tiling = pCreateInfo->tiling;
uint32_t b;
@@ -446,8 +409,7 @@ void
anv_image_view_init(struct anv_image_view *iview,
struct anv_device *device,
const VkImageViewCreateInfo* pCreateInfo,
- struct anv_cmd_buffer *cmd_buffer,
- VkImageUsageFlags usage_mask)
+ struct anv_cmd_buffer *cmd_buffer)
{
ANV_FROM_HANDLE(anv_image, image, pCreateInfo->image);
const VkImageSubresourceRange *range = &pCreateInfo->subresourceRange;
@@ -509,14 +471,7 @@ anv_image_view_init(struct anv_image_view *iview,
.depth = anv_minify(image->extent.depth , range->baseMipLevel),
};
- if (image->type == VK_IMAGE_TYPE_3D &&
- usage_mask != VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
- /* Meta renders to 3D texture slices. When it does so, it passes
- * usage_mask == VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT. Since meta is the
- * only thing that uses a non-zero usage_mask, this lets us easily
- * detect the one case where we actually want an array range used for
- * 3-D textures.
- */
+ if (image->type == VK_IMAGE_TYPE_3D) {
iview->isl.base_array_layer = 0;
iview->isl.array_len = iview->extent.depth;
}
@@ -528,7 +483,7 @@ anv_image_view_init(struct anv_image_view *iview,
iview->isl.usage = 0;
}
- if (image->usage & usage_mask & VK_IMAGE_USAGE_SAMPLED_BIT) {
+ if (image->usage & VK_IMAGE_USAGE_SAMPLED_BIT) {
iview->sampler_surface_state = alloc_surface_state(device, cmd_buffer);
struct isl_view view = iview->isl;
@@ -545,18 +500,7 @@ anv_image_view_init(struct anv_image_view *iview,
iview->sampler_surface_state.alloc_size = 0;
}
- /* This is kind-of hackish. It is possible, due to get_full_usage above,
- * to get a surface state with a non-renderable format but with
- * VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT. This happens in particular for
- * formats which aren't renderable but where we want to use Vulkan copy
- * commands so VK_IMAGE_USAGE_TRANSFER_DST_BIT is set. In the case of a
- * copy, meta will use a format that we can render to, but most of the rest
- * of the time, we don't want to create those surface states. Once we
- * start using blorp for copies, this problem will go away and we can
- * remove a lot of hacks.
- */
- if ((image->usage & usage_mask & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) &&
- isl_format_supports_rendering(&device->info, format.isl_format)) {
+ if (image->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
iview->color_rt_surface_state = alloc_surface_state(device, cmd_buffer);
struct isl_view view = iview->isl;
@@ -574,7 +518,7 @@ anv_image_view_init(struct anv_image_view *iview,
}
/* NOTE: This one needs to go last since it may stomp isl_view.format */
- if (image->usage & usage_mask & VK_IMAGE_USAGE_STORAGE_BIT) {
+ if (image->usage & VK_IMAGE_USAGE_STORAGE_BIT) {
iview->storage_surface_state = alloc_surface_state(device, cmd_buffer);
if (isl_has_matching_typed_storage_image_format(&device->info,
@@ -620,7 +564,7 @@ anv_CreateImageView(VkDevice _device,
if (view == NULL)
return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
- anv_image_view_init(view, device, pCreateInfo, NULL, ~0);
+ anv_image_view_init(view, device, pCreateInfo, NULL);
*pView = anv_image_view_to_handle(view);
@@ -750,20 +694,8 @@ anv_image_get_surface_for_aspect_mask(const struct anv_image *image,
{
switch (aspect_mask) {
case VK_IMAGE_ASPECT_COLOR_BIT:
- /* Dragons will eat you.
- *
- * Meta attaches all destination surfaces as color render targets. Guess
- * what surface the Meta Dragons really want.
- */
- if (image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT) {
- return &image->depth_surface;
- } else if (image->aspects & VK_IMAGE_ASPECT_STENCIL_BIT) {
- return &image->stencil_surface;
- } else {
- assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
- return &image->color_surface;
- }
- break;
+ assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
+ return &image->color_surface;
case VK_IMAGE_ASPECT_DEPTH_BIT:
assert(image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT);
return &image->depth_surface;