diff options
author | Dave Airlie <airlied@redhat.com> | 2017-08-15 15:35:52 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2017-09-13 17:17:07 +1000 |
commit | 3633bae36b56a8667d31096b3c3472ab388c4fbf (patch) | |
tree | e1d964c925b7990b897f40d0bba6ccb96fac21b1 | |
parent | aba441be44a2e4bb914e805c4cd064c72e4ea038 (diff) |
radv/gfx9: fix image resource handling.
GFX9 changes how images are layed out, so this needs updating.
Fixes: dEQP-VK.query_pool.statistics_query.*
Cc: "17.2" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | src/amd/vulkan/radv_image.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c index df288666be..46b62052a0 100644 --- a/src/amd/vulkan/radv_image.c +++ b/src/amd/vulkan/radv_image.c @@ -1059,23 +1059,34 @@ radv_DestroyImage(VkDevice _device, VkImage _image, } void radv_GetImageSubresourceLayout( - VkDevice device, + VkDevice _device, VkImage _image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout) { RADV_FROM_HANDLE(radv_image, image, _image); + RADV_FROM_HANDLE(radv_device, device, _device); int level = pSubresource->mipLevel; int layer = pSubresource->arrayLayer; struct radeon_surf *surface = &image->surface; - pLayout->offset = surface->u.legacy.level[level].offset + surface->u.legacy.level[level].slice_size * layer; - pLayout->rowPitch = surface->u.legacy.level[level].nblk_x * surface->bpe; - pLayout->arrayPitch = surface->u.legacy.level[level].slice_size; - pLayout->depthPitch = surface->u.legacy.level[level].slice_size; - pLayout->size = surface->u.legacy.level[level].slice_size; - if (image->type == VK_IMAGE_TYPE_3D) - pLayout->size *= u_minify(image->info.depth, level); + if (device->physical_device->rad_info.chip_class >= GFX9) { + pLayout->offset = surface->u.gfx9.offset[level] + surface->u.gfx9.surf_slice_size * layer; + pLayout->rowPitch = surface->u.gfx9.surf_pitch * surface->bpe; + pLayout->arrayPitch = surface->u.gfx9.surf_slice_size; + pLayout->depthPitch = surface->u.gfx9.surf_slice_size; + pLayout->size = surface->u.gfx9.surf_slice_size; + if (image->type == VK_IMAGE_TYPE_3D) + pLayout->size *= u_minify(image->info.depth, level); + } else { + pLayout->offset = surface->u.legacy.level[level].offset + surface->u.legacy.level[level].slice_size * layer; + pLayout->rowPitch = surface->u.legacy.level[level].nblk_x * surface->bpe; + pLayout->arrayPitch = surface->u.legacy.level[level].slice_size; + pLayout->depthPitch = surface->u.legacy.level[level].slice_size; + pLayout->size = surface->u.legacy.level[level].slice_size; + if (image->type == VK_IMAGE_TYPE_3D) + pLayout->size *= u_minify(image->info.depth, level); + } } |