aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorConnor Abbott <[email protected]>2020-02-12 12:25:26 +0100
committerJonathan Marek <[email protected]>2020-02-12 21:31:57 -0500
commit041783d49d3aaf451420ce880dcd886388f4b274 (patch)
tree9d4f8719207e257ada336ed6223e714a0a3ac37f
parentab3db20cb5e8ef489b8331235498cd1806e4c6ea (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.c54
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;