diff --git a/src/imagination/vulkan/pvr_image.c b/src/imagination/vulkan/pvr_image.c index eeee713c6bd..f2995b80d5c 100644 --- a/src/imagination/vulkan/pvr_image.c +++ b/src/imagination/vulkan/pvr_image.c @@ -65,7 +65,9 @@ static void pvr_image_init_memlayout(struct pvr_image *image) } } -static void pvr_image_init_physical_extent(struct pvr_image *image) +static void +pvr_image_init_physical_extent(struct pvr_image *image, + unsigned pbe_stride_align) { assert(image->memlayout != PVR_MEMLAYOUT_UNDEFINED); @@ -90,8 +92,7 @@ static void pvr_image_init_physical_extent(struct pvr_image *image) if (image->vk.usage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT)) { image->physical_extent.width = - align(image->physical_extent.width, - ROGUE_PBESTATE_REG_WORD0_LINESTRIDE_UNIT_SIZE); + align(image->physical_extent.width, pbe_stride_align); } } } @@ -153,6 +154,13 @@ static void pvr_image_setup_mip_levels(struct pvr_image *image) image->size = image->layer_size * image->vk.array_layers; } +static unsigned +get_pbe_stride_align(const struct pvr_device_info *dev_info) +{ + return PVR_HAS_FEATURE(dev_info, pbe_stride_align_1pixel) ? + 1 : ROGUE_PBESTATE_REG_WORD0_LINESTRIDE_UNIT_SIZE; +} + VkResult pvr_CreateImage(VkDevice _device, const VkImageCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, @@ -182,9 +190,12 @@ VkResult pvr_CreateImage(VkDevice _device, */ image->alignment = 4096U; + unsigned pbe_stride_align = + get_pbe_stride_align(&device->pdevice->dev_info); + /* Initialize the image using the saved information from pCreateInfo */ pvr_image_init_memlayout(image); - pvr_image_init_physical_extent(image); + pvr_image_init_physical_extent(image, pbe_stride_align); pvr_image_setup_mip_levels(image); *pImage = pvr_image_to_handle(image);