03-17-2016, 08:46 PM -
(03-17-2016, 06:11 PM)vlj Wrote: Actually the spec allows this for linear tiling :
Quote:Images created with tiling equal to VK_IMAGE_TILING_LINEAR have further restrictions on their limits and capabilities compared to images created with tiling equal to VK_IMAGE_TILING_OPTIMAL. Creation of images with tiling VK_IMAGE_TILING_LINEAR may not be supported unless other parameters meet all of the constraints:
imageType is VK_IMAGE_TYPE_2D
format is not a depth/stencil format
mipLevels is 1
arrayLayers is 1
samples is VK_SAMPLE_COUNT_1_BIT
usage only includes VK_IMAGE_USAGE_TRANSFER_SRC_BIT and/or VK_IMAGE_USAGE_TRANSFER_DST_BIT
Implementations may support additional limits and capabilities beyond those listed above. To determine the specific capabilities of an implementation, query the valid usage bits by calling vkGetPhysicalDeviceFormatProperties and the valid limits for mipLevels and arrayLayers by calling vkGetPhysicalDeviceImageFormatProperties.
In my case the driver reports linear tiling support for VK_IMAGE_USAGE_SAMPLED_BIT for RGBA8 format. Unfortunatly the mipLevel constraint applies.
The backend should not only check for VkFormatProperties::linearTilingFeatures bits but also calls vkGetPhysicalDeviceImageFormatProperties (https://www.khronos.org/registry/vulkan/...Properties ).
I tried to enforce optimal tiling for sampled image here :
https://github.com/RPCS3/rpcs3/blob/mast...e.cpp#L226
but then it crashes in this block:
https://github.com/RPCS3/rpcs3/blob/mast...e.cpp#L375
Its odd that it crashed; even with optimal tiling, writing data usually goes okay on radeon, just that textures display as garbage. Memory layout issues maybe? To use mipmaps, it seems every layer will have to be uploaded individually, so the staging texture should have only one mipmap level in cases where linear tiling is limited to 1 mipmap level. The resulting allocated block with linear tiling may be too small to actually fit all the miplevels since the texture is only allowed one level. You could try forcing the texture upload functions to only deal with one mipmap level and see if it works ok.