diff options
author | Iago Toral Quiroga <itoral@igalia.com> | 2020-02-27 08:55:40 +0100 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2020-10-13 21:21:27 +0000 |
commit | c4f745527ec8a526bec44769828ea90e48ccb96b (patch) | |
tree | 2cb61df093ff62c224906219f43c81900414d1cd | |
parent | e338503c6b1e3f82782b5c6a5f1944a8be00c71a (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.c | 2 | ||||
-rw-r--r-- | src/broadcom/vulkan/v3dv_formats.c | 113 |
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; |