radv: fix rowPitch for R32G32B32 formats on GFX9
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 6 May 2019 14:17:26 +0000 (16:17 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 6 May 2019 17:07:44 +0000 (19:07 +0200)
The pitch is actually the number of components per row. We found
the problem when we implemented some meta operations for these
formats and the wrong pitch has been confirmed with a small test case.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108325
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_image.c

index 7c9a72c93c1c23bbfe035ca536fa92108f89a211..3ffb4e9574947da851fa899956518395548963ee 100644 (file)
@@ -1456,7 +1456,19 @@ void radv_GetImageSubresourceLayout(
 
        if (device->physical_device->rad_info.chip_class >= GFX9) {
                pLayout->offset = plane->offset + surface->u.gfx9.offset[level] + surface->u.gfx9.surf_slice_size * layer;
-               pLayout->rowPitch = surface->u.gfx9.surf_pitch * surface->bpe;
+               if (image->vk_format == VK_FORMAT_R32G32B32_UINT ||
+                   image->vk_format == VK_FORMAT_R32G32B32_SINT ||
+                   image->vk_format == VK_FORMAT_R32G32B32_SFLOAT) {
+                       /* Adjust the number of bytes between each row because
+                        * the pitch is actually the number of components per
+                        * row.
+                        */
+                       pLayout->rowPitch = surface->u.gfx9.surf_pitch * surface->bpe / 3;
+               } else {
+                       assert(util_is_power_of_two_nonzero(surface->bpe));
+                       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;