From: Chad Versace Date: Wed, 7 Oct 2015 01:17:09 +0000 (-0700) Subject: vk: Add anv_image::usage X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=44143a1f4658143b8acc4aaf515603f9507442f1;p=mesa.git vk: Add anv_image::usage It's a copy of VkImageCreateInfo::usage. Will be used for the VkAttachmentView/VkImageView merge. --- diff --git a/src/vulkan/anv_image.c b/src/vulkan/anv_image.c index 29a442daa43..b95cadca9e7 100644 --- a/src/vulkan/anv_image.c +++ b/src/vulkan/anv_image.c @@ -304,8 +304,21 @@ anv_image_create(VkDevice _device, image->format = anv_format_for_vk_format(pCreateInfo->format); image->levels = pCreateInfo->mipLevels; image->array_size = pCreateInfo->arraySize; + image->usage = pCreateInfo->usage; image->surf_type = surf_type; + if (pCreateInfo->usage & VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT) { + /* Meta will transfer from the image by binding it as a texture. */ + image->usage |= VK_IMAGE_USAGE_SAMPLED_BIT; + } + + if (pCreateInfo->usage & VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT) { + /* Meta will transfer to the image by binding it as a color attachment, + * even if the image format is not a color format. + */ + image->usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + } + if (likely(anv_format_is_color(image->format))) { r = anv_image_make_surface(create_info, image->format, &image->size, &image->alignment, @@ -458,6 +471,11 @@ anv_image_view_init(struct anv_image_view *iview, const VkImageViewCreateInfo* pCreateInfo, struct anv_cmd_buffer *cmd_buffer) { + ANV_FROM_HANDLE(anv_image, image, pCreateInfo->image); + + assert(image->usage & (VK_IMAGE_USAGE_SAMPLED_BIT | + VK_IMAGE_USAGE_STORAGE_BIT)); + switch (device->info.gen) { case 7: gen7_image_view_init(iview, device, pCreateInfo, cmd_buffer); @@ -506,6 +524,8 @@ anv_depth_stencil_view_init(struct anv_image_view *iview, { ANV_FROM_HANDLE(anv_image, image, pCreateInfo->image); + assert(image->usage & VK_IMAGE_USAGE_DEPTH_STENCIL_BIT); + iview->image = image; iview->format = anv_format_for_vk_format(pCreateInfo->format); @@ -565,6 +585,10 @@ anv_color_attachment_view_init(struct anv_image_view *iview, const VkAttachmentViewCreateInfo* pCreateInfo, struct anv_cmd_buffer *cmd_buffer) { + ANV_FROM_HANDLE(anv_image, image, pCreateInfo->image); + + assert(image->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); + switch (device->info.gen) { case 7: gen7_color_attachment_view_init(iview, device, pCreateInfo, cmd_buffer); diff --git a/src/vulkan/anv_private.h b/src/vulkan/anv_private.h index 3326625ebb3..06ab1dc65a6 100644 --- a/src/vulkan/anv_private.h +++ b/src/vulkan/anv_private.h @@ -1202,6 +1202,7 @@ struct anv_image { VkExtent3D extent; uint32_t levels; uint32_t array_size; + VkImageUsageFlags usage; /**< VkImageCreateInfo::usage */ VkDeviceSize size; uint32_t alignment; diff --git a/src/vulkan/gen7_state.c b/src/vulkan/gen7_state.c index d7a4b10c6e8..5829d03d3e3 100644 --- a/src/vulkan/gen7_state.c +++ b/src/vulkan/gen7_state.c @@ -369,6 +369,7 @@ gen7_color_attachment_view_init(struct anv_image_view *iview, struct anv_surface *surface = anv_image_get_surface_for_color_attachment(image); + assert(image->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); anv_assert(pCreateInfo->arraySize > 0); anv_assert(pCreateInfo->mipLevel < image->levels); anv_assert(pCreateInfo->baseArraySlice + pCreateInfo->arraySize <= image->array_size); diff --git a/src/vulkan/gen8_state.c b/src/vulkan/gen8_state.c index e836613db42..3c479e1c23e 100644 --- a/src/vulkan/gen8_state.c +++ b/src/vulkan/gen8_state.c @@ -295,6 +295,7 @@ gen8_color_attachment_view_init(struct anv_image_view *iview, uint32_t depth = 1; /* RENDER_SURFACE_STATE::Depth */ uint32_t rt_view_extent = 1; /* RENDER_SURFACE_STATE::RenderTargetViewExtent */ + assert(image->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); anv_assert(pCreateInfo->arraySize > 0); anv_assert(pCreateInfo->mipLevel < image->levels); anv_assert(pCreateInfo->baseArraySlice + pCreateInfo->arraySize <= image->array_size);