diff options
author | Connor Abbott <[email protected]> | 2020-02-12 12:25:26 +0100 |
---|---|---|
committer | Jonathan Marek <[email protected]> | 2020-02-12 21:31:57 -0500 |
commit | 041783d49d3aaf451420ce880dcd886388f4b274 (patch) | |
tree | 9d4f8719207e257ada336ed6223e714a0a3ac37f | |
parent | ab3db20cb5e8ef489b8331235498cd1806e4c6ea (diff) |
tu: Disable linear depth attachments
Also, disable importing depth/stencil textures.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3713>
-rw-r--r-- | src/freedreno/vulkan/tu_formats.c | 54 |
1 files changed, 44 insertions, 10 deletions
diff --git a/src/freedreno/vulkan/tu_formats.c b/src/freedreno/vulkan/tu_formats.c index f49348ab916..660557b043e 100644 --- a/src/freedreno/vulkan/tu_formats.c +++ b/src/freedreno/vulkan/tu_formats.c @@ -723,7 +723,7 @@ tu_physical_device_get_format_properties( VkFormat format, VkFormatProperties *out_properties) { - VkFormatFeatureFlags image = 0, buffer = 0; + VkFormatFeatureFlags linear = 0, optimal = 0, buffer = 0; const struct util_format_description *desc = vk_format_description(format); const struct tu_native_format *native_fmt = tu6_get_native_format(format); if (!desc || !native_fmt) { @@ -736,22 +736,32 @@ tu_physical_device_get_format_properties( } if (native_fmt->tex >= 0 || native_fmt->rb >= 0) - image |= VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT; + optimal |= VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT; if (native_fmt->tex >= 0) { - image |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT; + optimal |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT; buffer |= VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT; } if (native_fmt->rb >= 0) - image |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT; - + optimal |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT; + + /* For the most part, we can do anything with a linear image that we could + * do with a tiled image. However, we can't support sysmem rendering with a + * linear depth texture, because we don't know if there's a bit to control + * the tiling of the depth buffer in BYPASS mode, and the blob also + * disables linear depth rendering, so there's no way to discover it. We + * also can't force GMEM mode, because there are other situations where we + * have to use sysmem rendering. So follow the blob here, and only enable + * DEPTH_STENCIL_ATTACHMENT_BIT for the optimal features. + */ + linear = optimal; if (tu6_pipe2depth(format) != (enum a6xx_depth_format)~0) - image |= VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT; + optimal |= VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT; end: - out_properties->linearTilingFeatures = image; - out_properties->optimalTilingFeatures = image; + out_properties->linearTilingFeatures = linear; + out_properties->optimalTilingFeatures = optimal; out_properties->bufferFeatures = buffer; } @@ -812,8 +822,32 @@ tu_get_image_format_properties( tu_physical_device_get_format_properties(physical_device, info->format, &format_props); - assert(format_props.optimalTilingFeatures == format_props.linearTilingFeatures); - format_feature_flags = format_props.optimalTilingFeatures; + + switch (info->tiling) { + case VK_IMAGE_TILING_LINEAR: + format_feature_flags = format_props.linearTilingFeatures; + break; + + case VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT: + /* The only difference between optimal and linear is currently whether + * depth/stencil attachments are allowed on depth/stencil formats. + * There's no reason to allow importing depth/stencil textures, so just + * disallow it and then this annoying edge case goes away. + * + * TODO: If anyone cares, we could enable this by looking at the + * modifier and checking if it's LINEAR or not. + */ + if (vk_format_is_depth_or_stencil(info->format)) + goto unsupported; + + assert(format_props.optimalTilingFeatures == format_props.linearTilingFeatures); + /* fallthrough */ + case VK_IMAGE_TILING_OPTIMAL: + format_feature_flags = format_props.optimalTilingFeatures; + break; + default: + unreachable("bad VkPhysicalDeviceImageFormatInfo2"); + } if (format_feature_flags == 0) goto unsupported; |