summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChia-I Wu <olvaffe@gmail.com>2022-04-25 21:45:50 -0700
committerMarge Bot <emma+marge@anholt.net>2022-04-29 22:30:45 +0000
commit53d87865caca949ce3e73f2a8ec04c17d5818754 (patch)
treee93e583b30a405360f0f07bc0e4965086974fe9f
parentba9c917149e883b3e2b117de41e5a54dd6f9d0cc (diff)
turnip: fix drm modifier support with planar formats
We need to advertise the results of tu6_plane_count and handle VK_IMAGE_ASPECT_MEMORY_PLANE_*_BIT. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6374 Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16169>
-rw-r--r--src/freedreno/vulkan/tu_formats.c4
-rw-r--r--src/freedreno/vulkan/tu_image.c5
-rw-r--r--src/freedreno/vulkan/tu_private.h1
3 files changed, 7 insertions, 3 deletions
diff --git a/src/freedreno/vulkan/tu_formats.c b/src/freedreno/vulkan/tu_formats.c
index 429c898e5c0..600088835bc 100644
--- a/src/freedreno/vulkan/tu_formats.c
+++ b/src/freedreno/vulkan/tu_formats.c
@@ -329,7 +329,7 @@ tu_GetPhysicalDeviceFormatProperties2(
if (pFormatProperties->formatProperties.linearTilingFeatures) {
vk_outarray_append_typed(VkDrmFormatModifierPropertiesEXT, &out, mod_props) {
mod_props->drmFormatModifier = DRM_FORMAT_MOD_LINEAR;
- mod_props->drmFormatModifierPlaneCount = 1;
+ mod_props->drmFormatModifierPlaneCount = tu6_plane_count(format);
mod_props->drmFormatModifierTilingFeatures =
pFormatProperties->formatProperties.linearTilingFeatures;
}
@@ -341,7 +341,7 @@ tu_GetPhysicalDeviceFormatProperties2(
ubwc_possible(format, VK_IMAGE_TYPE_2D, 0, 0, physical_device->info, VK_SAMPLE_COUNT_1_BIT)) {
vk_outarray_append_typed(VkDrmFormatModifierPropertiesEXT, &out, mod_props) {
mod_props->drmFormatModifier = DRM_FORMAT_MOD_QCOM_COMPRESSED;
- mod_props->drmFormatModifierPlaneCount = 1;
+ mod_props->drmFormatModifierPlaneCount = tu6_plane_count(format);
mod_props->drmFormatModifierTilingFeatures =
pFormatProperties->formatProperties.optimalTilingFeatures;
}
diff --git a/src/freedreno/vulkan/tu_image.c b/src/freedreno/vulkan/tu_image.c
index 4c214f265c1..ff011f9bc3a 100644
--- a/src/freedreno/vulkan/tu_image.c
+++ b/src/freedreno/vulkan/tu_image.c
@@ -37,7 +37,7 @@
#include "tu_cs.h"
-static uint32_t
+uint32_t
tu6_plane_count(VkFormat format)
{
switch (format) {
@@ -71,10 +71,13 @@ tu6_plane_index(VkFormat format, VkImageAspectFlags aspect_mask)
{
switch (aspect_mask) {
default:
+ assert(aspect_mask != VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT);
return 0;
case VK_IMAGE_ASPECT_PLANE_1_BIT:
+ case VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT:
return 1;
case VK_IMAGE_ASPECT_PLANE_2_BIT:
+ case VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT:
return 2;
case VK_IMAGE_ASPECT_STENCIL_BIT:
return format == VK_FORMAT_D32_SFLOAT_S8_UINT;
diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h
index 00563280436..643040929c9 100644
--- a/src/freedreno/vulkan/tu_private.h
+++ b/src/freedreno/vulkan/tu_private.h
@@ -1675,6 +1675,7 @@ tu_get_levelCount(const struct tu_image *image,
: range->levelCount;
}
+uint32_t tu6_plane_count(VkFormat format);
enum pipe_format tu6_plane_format(VkFormat format, uint32_t plane);
uint32_t tu6_plane_index(VkFormat format, VkImageAspectFlags aspect_mask);