summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNanley Chery <[email protected]>2016-01-26 18:40:54 -0800
committerJason Ekstrand <[email protected]>2016-01-27 15:12:42 -0800
commitd3c1fd53e284db7e8a63e8fd1d9219c710a2890e (patch)
tree38e6dcd2cdd1b10b7c0dd6a75ff93b6ebd7871b1
parent6a579ded87a4192ed2f1a015ca8c6535d323ce1c (diff)
anv/image: Use custom VkBufferImageCopy for iview initialization
Use a custom VkBufferImageCopy with the user-provided struct as the base. A few fields are modified when the iview is uncompressed and the underlying image is compressed.
-rw-r--r--src/vulkan/anv_image.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/vulkan/anv_image.c b/src/vulkan/anv_image.c
index 6c1c92d61c6..9294bab621d 100644
--- a/src/vulkan/anv_image.c
+++ b/src/vulkan/anv_image.c
@@ -488,6 +488,8 @@ anv_image_view_init(struct anv_image_view *iview,
{
ANV_FROM_HANDLE(anv_image, image, pCreateInfo->image);
const VkImageSubresourceRange *range = &pCreateInfo->subresourceRange;
+ VkImageViewCreateInfo mCreateInfo;
+ memcpy(&mCreateInfo, pCreateInfo, sizeof(VkImageViewCreateInfo));
assert(range->layerCount > 0);
assert(range->baseMipLevel < image->levels);
@@ -545,6 +547,11 @@ anv_image_view_init(struct anv_image_view *iview,
iview->level_0_extent.width = DIV_ROUND_UP(image->extent.width , isl_layout->bw);
iview->level_0_extent.height = DIV_ROUND_UP(image->extent.height, isl_layout->bh);
iview->level_0_extent.depth = DIV_ROUND_UP(image->extent.depth , isl_layout->bd);
+ iview->level_0_extent.width = anv_minify(iview->level_0_extent.width , range->baseMipLevel);
+ iview->level_0_extent.height = anv_minify(iview->level_0_extent.height, range->baseMipLevel);
+ iview->level_0_extent.depth = anv_minify(iview->level_0_extent.depth , range->baseMipLevel);
+ mCreateInfo.subresourceRange.baseMipLevel = 0;
+ mCreateInfo.subresourceRange.baseArrayLayer = 0;
} else {
iview->level_0_extent.width = image->extent.width ;
iview->level_0_extent.height = image->extent.height;
@@ -561,7 +568,7 @@ anv_image_view_init(struct anv_image_view *iview,
iview->nonrt_surface_state = alloc_surface_state(device, cmd_buffer);
anv_fill_image_surface_state(device, iview->nonrt_surface_state,
- iview, pCreateInfo,
+ iview, &mCreateInfo,
VK_IMAGE_USAGE_SAMPLED_BIT);
} else {
iview->nonrt_surface_state.alloc_size = 0;
@@ -571,7 +578,7 @@ anv_image_view_init(struct anv_image_view *iview,
iview->color_rt_surface_state = alloc_surface_state(device, cmd_buffer);
anv_fill_image_surface_state(device, iview->color_rt_surface_state,
- iview, pCreateInfo,
+ iview, &mCreateInfo,
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
} else {
iview->color_rt_surface_state.alloc_size = 0;
@@ -582,7 +589,7 @@ anv_image_view_init(struct anv_image_view *iview,
if (has_matching_storage_typed_format(device, iview->format))
anv_fill_image_surface_state(device, iview->storage_surface_state,
- iview, pCreateInfo,
+ iview, &mCreateInfo,
VK_IMAGE_USAGE_STORAGE_BIT);
else
anv_fill_buffer_surface_state(device, iview->storage_surface_state,