static unsigned radv_choose_tiling(struct radv_device *device, const struct radv_image_create_info *create_info) { const VkImageCreateInfo *pCreateInfo = create_info->vk_info; if (pCreateInfo->tiling == VK_IMAGE_TILING_LINEAR) { assert(pCreateInfo->samples <= 1); return RADEON_SURF_MODE_LINEAR_ALIGNED; } if (!vk_format_is_compressed(pCreateInfo->format) && !vk_format_is_depth_or_stencil(pCreateInfo->format) && device->physical_device->rad_info.chip_class <= VI) { /* this causes hangs in some VK CTS tests on GFX9. */ /* Textures with a very small height are recommended to be linear. */ if (pCreateInfo->imageType == VK_IMAGE_TYPE_1D || /* Only very thin and long 2D textures should benefit from * linear_aligned. */ (pCreateInfo->extent.width > 8 && pCreateInfo->extent.height <= 2)) return RADEON_SURF_MODE_LINEAR_ALIGNED; } /* MSAA resources must be 2D tiled. */ if (pCreateInfo->samples > 1) return RADEON_SURF_MODE_2D; return RADEON_SURF_MODE_2D; }
uint32_t radv_translate_tex_numformat(VkFormat format, const struct vk_format_description *desc, int first_non_void) { switch (format) { case VK_FORMAT_D24_UNORM_S8_UINT: return V_008F14_IMG_NUM_FORMAT_UNORM; default: if (first_non_void < 0) { if (vk_format_is_compressed(format)) { switch (format) { case VK_FORMAT_BC1_RGB_SRGB_BLOCK: case VK_FORMAT_BC1_RGBA_SRGB_BLOCK: case VK_FORMAT_BC2_SRGB_BLOCK: case VK_FORMAT_BC3_SRGB_BLOCK: case VK_FORMAT_BC7_SRGB_BLOCK: return V_008F14_IMG_NUM_FORMAT_SRGB; case VK_FORMAT_BC4_SNORM_BLOCK: case VK_FORMAT_BC5_SNORM_BLOCK: case VK_FORMAT_BC6H_SFLOAT_BLOCK: return V_008F14_IMG_NUM_FORMAT_SNORM; default: return V_008F14_IMG_NUM_FORMAT_UNORM; } } else if (desc->layout == VK_FORMAT_LAYOUT_SUBSAMPLED) { return V_008F14_IMG_NUM_FORMAT_UNORM; } else { return V_008F14_IMG_NUM_FORMAT_FLOAT; } } else if (desc->colorspace == VK_FORMAT_COLORSPACE_SRGB) { return V_008F14_IMG_NUM_FORMAT_SRGB; } else { switch (desc->channel[first_non_void].type) { case VK_FORMAT_TYPE_FLOAT: return V_008F14_IMG_NUM_FORMAT_FLOAT; case VK_FORMAT_TYPE_SIGNED: if (desc->channel[first_non_void].normalized) return V_008F14_IMG_NUM_FORMAT_SNORM; else if (desc->channel[first_non_void].pure_integer) return V_008F14_IMG_NUM_FORMAT_SINT; else return V_008F14_IMG_NUM_FORMAT_SSCALED; case VK_FORMAT_TYPE_UNSIGNED: if (desc->channel[first_non_void].normalized) return V_008F14_IMG_NUM_FORMAT_UNORM; else if (desc->channel[first_non_void].pure_integer) return V_008F14_IMG_NUM_FORMAT_UINT; else return V_008F14_IMG_NUM_FORMAT_USCALED; default: return V_008F14_IMG_NUM_FORMAT_UNORM; } } } }