summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIago Toral Quiroga <itoral@igalia.com>2020-02-27 08:55:40 +0100
committerMarge Bot <eric+marge@anholt.net>2020-10-13 21:21:27 +0000
commitc4f745527ec8a526bec44769828ea90e48ccb96b (patch)
tree2cb61df093ff62c224906219f43c81900414d1cd
parente338503c6b1e3f82782b5c6a5f1944a8be00c71a (diff)
v3dv: meet requirements for supported format features and properties
For now this is only about advertising what is required, many things here still lack an implementation. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
-rw-r--r--src/broadcom/vulkan/v3dv_device.c2
-rw-r--r--src/broadcom/vulkan/v3dv_formats.c113
2 files changed, 95 insertions, 20 deletions
diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c
index 4f4b8d736d3..69fe921167a 100644
--- a/src/broadcom/vulkan/v3dv_device.c
+++ b/src/broadcom/vulkan/v3dv_device.c
@@ -556,7 +556,7 @@ v3dv_GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice,
.alphaToOne = false,
.multiViewport = false,
.samplerAnisotropy = false,
- .textureCompressionETC2 = false,
+ .textureCompressionETC2 = true,
.textureCompressionASTC_LDR = false,
.textureCompressionBC = false,
.occlusionQueryPrecise = false,
diff --git a/src/broadcom/vulkan/v3dv_formats.c b/src/broadcom/vulkan/v3dv_formats.c
index 2780ec25b54..5e9e84fa83e 100644
--- a/src/broadcom/vulkan/v3dv_formats.c
+++ b/src/broadcom/vulkan/v3dv_formats.c
@@ -46,18 +46,19 @@
return_size, \
}
-#define SWIZ_X001 SWIZ(X, 0, 0, 1)
-#define SWIZ_XY01 SWIZ(X, Y, 0, 1)
-#define SWIZ_XYZ1 SWIZ(X, Y, Z, 1)
-#define SWIZ_XYZW SWIZ(X, Y, Z, W)
-#define SWIZ_YZWX SWIZ(Y, Z, W, X)
-#define SWIZ_YZW1 SWIZ(Y, Z, W, 1)
-#define SWIZ_ZYXW SWIZ(Z, Y, X, W)
-#define SWIZ_ZYX1 SWIZ(Z, Y, X, 1)
-#define SWIZ_XXXY SWIZ(X, X, X, Y)
-#define SWIZ_XXX1 SWIZ(X, X, X, 1)
-#define SWIZ_XXXX SWIZ(X, X, X, X)
-#define SWIZ_000X SWIZ(0, 0, 0, X)
+#define SWIZ_X001 SWIZ(X, 0, 0, 1)
+#define SWIZ_XY01 SWIZ(X, Y, 0, 1)
+#define SWIZ_XYZ1 SWIZ(X, Y, Z, 1)
+#define SWIZ_XYZW SWIZ(X, Y, Z, W)
+#define SWIZ_YZWX SWIZ(Y, Z, W, X)
+#define SWIZ_YZW1 SWIZ(Y, Z, W, 1)
+#define SWIZ_ZYXW SWIZ(Z, Y, X, W)
+#define SWIZ_ZYX1 SWIZ(Z, Y, X, 1)
+#define SWIZ_XXXY SWIZ(X, X, X, Y)
+#define SWIZ_XXX1 SWIZ(X, X, X, 1)
+#define SWIZ_XXXX SWIZ(X, X, X, X)
+#define SWIZ_000X SWIZ(0, 0, 0, X)
+#define SWIZ_WXYZ SWIZ(W, X, Y, Z)
/* FIXME: expand format table to describe whether the format is supported
* for buffer surfaces (texel buffers, vertex buffers, etc).
@@ -120,6 +121,20 @@ static const struct v3dv_format format_table[] = {
FORMAT(R32_SINT, R32I, R32I, SWIZ_X001, 32),
FORMAT(R32_UINT, R32UI, R32UI, SWIZ_X001, 32),
+ /* Color, packed */
+ FORMAT(B4G4R4A4_UNORM_PACK16, ABGR4444, RGBA4, SWIZ_ZYXW, 16), /* Swap RB */
+ FORMAT(R5G6B5_UNORM_PACK16, BGR565, RGB565, SWIZ_XYZ1, 16),
+ FORMAT(A1R5G5B5_UNORM_PACK16, ABGR1555, RGB5_A1, SWIZ_WXYZ, 16), /* Swap RB + Reverse */
+ FORMAT(A8B8G8R8_UNORM_PACK32, RGBA8, RGBA8, SWIZ_XYZW, 16), /* RGBA8 UNORM */
+ FORMAT(A8B8G8R8_SNORM_PACK32, NO, RGBA8_SNORM, SWIZ_XYZW, 16), /* RGBA8 SNORM */
+ FORMAT(A8B8G8R8_UINT_PACK32, RGBA8UI, RGBA8UI, SWIZ_XYZW, 16), /* RGBA8 UINT */
+ FORMAT(A8B8G8R8_SINT_PACK32, RGBA8I, RGBA8I, SWIZ_XYZW, 16), /* RGBA8 SINT */
+ FORMAT(A8B8G8R8_SRGB_PACK32, SRGB8_ALPHA8, RGBA8, SWIZ_XYZW, 16), /* RGBA8 sRGB */
+ FORMAT(A2B10G10R10_UNORM_PACK32,RGB10_A2, RGB10_A2, SWIZ_XYZW, 16),
+ FORMAT(A2B10G10R10_UINT_PACK32, RGB10_A2UI, RGB10_A2UI, SWIZ_XYZW, 16),
+ FORMAT(E5B9G9R9_UFLOAT_PACK32, NO, RGB9_E5, SWIZ_XYZW, 16),
+ FORMAT(B10G11R11_UFLOAT_PACK32, R11F_G11F_B10F,R11F_G11F_B10F, SWIZ_XYZW, 16),
+
/* Depth */
FORMAT(D16_UNORM, D16, DEPTH_COMP16, SWIZ_XXXX, 32),
FORMAT(D32_SFLOAT, D32F, DEPTH_COMP32F, SWIZ_XXXX, 32),
@@ -127,6 +142,18 @@ static const struct v3dv_format format_table[] = {
/* Depth + Stencil */
FORMAT(D24_UNORM_S8_UINT, D24S8, DEPTH24_X8, SWIZ_XXXX, 32),
+
+ /* Compressed: ETC2 / EAC */
+ FORMAT(ETC2_R8G8B8_UNORM_BLOCK, NO, RGB8_ETC2, SWIZ_XYZ1, 16),
+ FORMAT(ETC2_R8G8B8_SRGB_BLOCK, NO, RGB8_ETC2, SWIZ_XYZ1, 16),
+ FORMAT(ETC2_R8G8B8A1_UNORM_BLOCK, NO, RGB8_PUNCHTHROUGH_ALPHA1, SWIZ_XYZW, 16),
+ FORMAT(ETC2_R8G8B8A1_SRGB_BLOCK, NO, RGB8_PUNCHTHROUGH_ALPHA1, SWIZ_XYZW, 16),
+ FORMAT(ETC2_R8G8B8A8_UNORM_BLOCK, NO, RGBA8_ETC2_EAC, SWIZ_XYZW, 16),
+ FORMAT(ETC2_R8G8B8A8_SRGB_BLOCK, NO, RGBA8_ETC2_EAC, SWIZ_XYZW, 16),
+ FORMAT(EAC_R11_UNORM_BLOCK, NO, R11_EAC, SWIZ_X001, 16),
+ FORMAT(EAC_R11_SNORM_BLOCK, NO, SIGNED_R11_EAC, SWIZ_X001, 16),
+ FORMAT(EAC_R11G11_UNORM_BLOCK, NO, RG11_EAC, SWIZ_XY01, 16),
+ FORMAT(EAC_R11G11_SNORM_BLOCK, NO, SIGNED_RG11_EAC, SWIZ_XY01, 16),
};
const struct v3dv_format *
@@ -318,6 +345,16 @@ image_format_features(VkFormat vk_format,
}
}
+ const struct util_format_description *desc =
+ vk_format_description(vk_format);
+ assert(desc);
+
+ if (desc->layout == UTIL_FORMAT_LAYOUT_PLAIN && desc->is_array) {
+ flags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
+ if (desc->nr_channels == 1 && vk_format_is_int(vk_format))
+ flags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT;
+ }
+
return flags;
}
@@ -330,17 +367,35 @@ buffer_format_features(VkFormat vk_format, const struct v3dv_format *v3dv_format
if (!v3dv_format->supported)
return 0;
- /* FIXME */
- const VkImageAspectFlags aspects = vk_format_aspects(vk_format);
- if (aspects != VK_IMAGE_ASPECT_COLOR_BIT)
+ /* We probably only want to support buffer formats that have a
+ * color format specification.
+ */
+ if (!vk_format_is_color(vk_format))
return 0;
- VkFormatFeatureFlags flags = 0;
+ const struct util_format_description *desc =
+ vk_format_description(vk_format);
+ assert(desc);
- flags |= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT;
+ VkFormatFeatureFlags flags = 0;
+ if (desc->layout == UTIL_FORMAT_LAYOUT_PLAIN && desc->is_array) {
+ flags |= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
+ VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT |
+ VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT;
+ } else if (vk_format == VK_FORMAT_A2B10G10R10_UNORM_PACK32) {
+ flags |= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT |
+ VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT;
+ } else if (vk_format == VK_FORMAT_A2B10G10R10_UINT_PACK32 ||
+ vk_format == VK_FORMAT_B10G11R11_UFLOAT_PACK32) {
+ flags |= VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT;
+ }
- /* FIXME: add texel uniform/storage for formats that are "image compatible"
- */
+ if (desc->layout == UTIL_FORMAT_LAYOUT_PLAIN &&
+ desc->is_array &&
+ desc->nr_channels == 1 &&
+ vk_format_is_int(vk_format)) {
+ flags |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT;
+ }
return flags;
}
@@ -468,7 +523,27 @@ get_image_format_properties(
unreachable("bad VkImageType");
}
+ /* From the Vulkan 1.0 spec, section 34.1.1. Supported Sample Counts:
+ *
+ * sampleCounts will be set to VK_SAMPLE_COUNT_1_BIT if at least one of the
+ * following conditions is true:
+ *
+ * - tiling is VK_IMAGE_TILING_LINEAR
+ * - type is not VK_IMAGE_TYPE_2D
+ * - flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
+ * - neither the VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT flag nor the
+ * VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT flag in
+ * VkFormatProperties::optimalTilingFeatures returned by
+ * vkGetPhysicalDeviceFormatProperties is set.
+ */
pImageFormatProperties->sampleCounts = VK_SAMPLE_COUNT_1_BIT;
+ if (info->tiling != VK_IMAGE_TILING_LINEAR &&
+ info->type == VK_IMAGE_TYPE_2D &&
+ !(info->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
+ (format_feature_flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT ||
+ format_feature_flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
+ pImageFormatProperties->sampleCounts |= VK_SAMPLE_COUNT_4_BIT;
+ }
if (info->tiling == VK_IMAGE_TILING_LINEAR)
pImageFormatProperties->maxMipLevels = 1;