From 210e68874bbf5321adc6e6464a80526c177f8741 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 1 Oct 2018 16:14:24 -0500 Subject: [PATCH] vulkan/wsi: Use the interface from the real modifiers extension The anv implementation still isn't quite complete, but we can at least start using the structs from the real extension. v2: Fix circular pNext list (Lionel) Reviewed-by: Bas Nieuwenhuizen Reviewed-by: Lionel Landwerlin Part-of: --- src/freedreno/vulkan/tu_formats.c | 15 ++++---- src/freedreno/vulkan/tu_image.c | 11 +++--- src/intel/vulkan/anv_extensions.py | 1 + src/intel/vulkan/anv_formats.c | 13 +++---- src/intel/vulkan/anv_image.c | 40 ++++++++++++++++------ src/intel/vulkan/anv_wsi.c | 8 ----- src/vulkan/wsi/wsi_common.c | 55 ++++++++++++++++++------------ src/vulkan/wsi/wsi_common.h | 19 +---------- 8 files changed, 86 insertions(+), 76 deletions(-) diff --git a/src/freedreno/vulkan/tu_formats.c b/src/freedreno/vulkan/tu_formats.c index a0a18c1728d..1f5dfc4a232 100644 --- a/src/freedreno/vulkan/tu_formats.c +++ b/src/freedreno/vulkan/tu_formats.c @@ -786,20 +786,21 @@ tu_GetPhysicalDeviceFormatProperties2( tu_physical_device_get_format_properties( physical_device, format, &pFormatProperties->formatProperties); - struct wsi_format_modifier_properties_list *list = - vk_find_struct(pFormatProperties->pNext, WSI_FORMAT_MODIFIER_PROPERTIES_LIST_MESA); + VkDrmFormatModifierPropertiesListEXT *list = + vk_find_struct(pFormatProperties->pNext, DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT); if (list) { - VK_OUTARRAY_MAKE(out, list->modifier_properties, &list->modifier_count); + VK_OUTARRAY_MAKE(out, list->pDrmFormatModifierProperties, + &list->drmFormatModifierCount); vk_outarray_append(&out, mod_props) { - mod_props->modifier = DRM_FORMAT_MOD_LINEAR; - mod_props->modifier_plane_count = 1; + mod_props->drmFormatModifier = DRM_FORMAT_MOD_LINEAR; + mod_props->drmFormatModifierPlaneCount = 1; } /* TODO: any cases where this should be disabled? */ vk_outarray_append(&out, mod_props) { - mod_props->modifier = DRM_FORMAT_MOD_QCOM_COMPRESSED; - mod_props->modifier_plane_count = 1; + mod_props->drmFormatModifier = DRM_FORMAT_MOD_QCOM_COMPRESSED; + mod_props->drmFormatModifierPlaneCount = 1; } } } diff --git a/src/freedreno/vulkan/tu_image.c b/src/freedreno/vulkan/tu_image.c index 83e0d9e9b2a..1f4c454299d 100644 --- a/src/freedreno/vulkan/tu_image.c +++ b/src/freedreno/vulkan/tu_image.c @@ -346,14 +346,15 @@ tu_CreateImage(VkDevice device, pAllocator, pImage); #endif - const struct wsi_image_create_info *wsi_info = - vk_find_struct_const(pCreateInfo->pNext, WSI_IMAGE_CREATE_INFO_MESA); uint64_t modifier = DRM_FORMAT_MOD_INVALID; + if (pCreateInfo->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) { + const VkImageDrmFormatModifierListCreateInfoEXT *mod_info = + vk_find_struct_const(pCreateInfo->pNext, + IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT); - if (wsi_info) { modifier = DRM_FORMAT_MOD_LINEAR; - for (unsigned i = 0; i < wsi_info->modifier_count; i++) { - if (wsi_info->modifiers[i] == DRM_FORMAT_MOD_QCOM_COMPRESSED) + for (unsigned i = 0; i < mod_info->drmFormatModifierCount; i++) { + if (mod_info->pDrmFormatModifiers[i] == DRM_FORMAT_MOD_QCOM_COMPRESSED) modifier = DRM_FORMAT_MOD_QCOM_COMPRESSED; } } diff --git a/src/intel/vulkan/anv_extensions.py b/src/intel/vulkan/anv_extensions.py index 99076f4d16e..de57f5f300d 100644 --- a/src/intel/vulkan/anv_extensions.py +++ b/src/intel/vulkan/anv_extensions.py @@ -144,6 +144,7 @@ EXTENSIONS = [ Extension('VK_EXT_global_priority', 1, 'device->has_context_priority'), Extension('VK_EXT_host_query_reset', 1, True), + Extension('VK_EXT_image_drm_format_modifier', 1, False), Extension('VK_EXT_index_type_uint8', 1, True), Extension('VK_EXT_inline_uniform_block', 1, True), Extension('VK_EXT_line_rasterization', 1, True), diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c index 7bd08c87722..a1c4923cf2c 100644 --- a/src/intel/vulkan/anv_formats.c +++ b/src/intel/vulkan/anv_formats.c @@ -717,11 +717,12 @@ get_buffer_format_features(const struct gen_device_info *devinfo, static void get_wsi_format_modifier_properties_list(const struct anv_physical_device *physical_device, VkFormat vk_format, - struct wsi_format_modifier_properties_list *list) + VkDrmFormatModifierPropertiesListEXT *list) { const struct anv_format *anv_format = anv_get_format(vk_format); - VK_OUTARRAY_MAKE(out, list->modifier_properties, &list->modifier_count); + VK_OUTARRAY_MAKE(out, list->pDrmFormatModifierProperties, + &list->drmFormatModifierCount); /* This is a simplified list where all the modifiers are available */ assert(vk_format == VK_FORMAT_B8G8R8_SRGB || @@ -751,11 +752,11 @@ get_wsi_format_modifier_properties_list(const struct anv_physical_device *physic continue; vk_outarray_append(&out, mod_props) { - mod_props->modifier = modifiers[i]; + mod_props->drmFormatModifier = modifiers[i]; if (isl_drm_modifier_has_aux(modifiers[i])) - mod_props->modifier_plane_count = 2; + mod_props->drmFormatModifierPlaneCount = 2; else - mod_props->modifier_plane_count = anv_format->n_planes; + mod_props->drmFormatModifierPlaneCount = anv_format->n_planes; } } } @@ -793,7 +794,7 @@ void anv_GetPhysicalDeviceFormatProperties2( vk_foreach_struct(ext, pFormatProperties->pNext) { /* Use unsigned since some cases are not in the VkStructureType enum. */ switch ((unsigned)ext->sType) { - case VK_STRUCTURE_TYPE_WSI_FORMAT_MODIFIER_PROPERTIES_LIST_MESA: + case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: get_wsi_format_modifier_properties_list(physical_device, format, (void *)ext); break; diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 14dd88537c1..37e1cae32ae 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -111,6 +111,8 @@ choose_isl_tiling_flags(const struct anv_image_create_info *anv_info, case VK_IMAGE_TILING_LINEAR: flags = ISL_TILING_LINEAR_BIT; break; + case VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT: + flags = 1 << isl_mod_info->tiling; } if (anv_info->isl_tiling_flags) @@ -119,9 +121,6 @@ choose_isl_tiling_flags(const struct anv_image_create_info *anv_info, if (legacy_scanout) flags &= ISL_TILING_LINEAR_BIT | ISL_TILING_X_BIT; - if (isl_mod_info) - flags &= 1 << isl_mod_info->tiling; - assert(flags); return flags; @@ -589,10 +588,14 @@ anv_image_create(VkDevice _device, const struct wsi_image_create_info *wsi_info = vk_find_struct_const(pCreateInfo->pNext, WSI_IMAGE_CREATE_INFO_MESA); - if (wsi_info && wsi_info->modifier_count > 0) { + + if (pCreateInfo->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) { + const VkImageDrmFormatModifierListCreateInfoEXT *mod_info = + vk_find_struct_const(pCreateInfo->pNext, + IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT); isl_mod_info = choose_drm_format_mod(&device->instance->physicalDevice, - wsi_info->modifier_count, - wsi_info->modifiers); + mod_info->drmFormatModifierCount, + mod_info->pDrmFormatModifiers); assert(isl_mod_info); } @@ -725,13 +728,13 @@ anv_image_from_swapchain(VkDevice device, local_create_info.usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; /* If the image has a particular modifier, specify that modifier. */ - struct wsi_image_create_info local_wsi_info = { - .sType = VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA, - .modifier_count = 1, - .modifiers = &swapchain_image->drm_format_mod, + VkImageDrmFormatModifierListCreateInfoEXT local_modifier_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT, + .drmFormatModifierCount = 1, + .pDrmFormatModifiers = &swapchain_image->drm_format_mod, }; if (swapchain_image->drm_format_mod != DRM_FORMAT_MOD_INVALID) - __vk_append_struct(&local_create_info, &local_wsi_info); + __vk_append_struct(&local_create_info, &local_modifier_info); return anv_image_create(device, &(struct anv_image_create_info) { @@ -1066,6 +1069,21 @@ void anv_GetImageSubresourceLayout( } } +VkResult anv_GetImageDrmFormatModifierPropertiesEXT( + VkDevice device, + VkImage _image, + VkImageDrmFormatModifierPropertiesEXT* pProperties) +{ + ANV_FROM_HANDLE(anv_image, image, _image); + + assert(pProperties->sType = + VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT); + + pProperties->drmFormatModifier = image->drm_format_mod; + + return VK_SUCCESS; +} + /** * This function determines the optimal buffer to use for a given * VkImageLayout and other pieces of information needed to make that diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c index ed5d077b4ab..29f13a06e1a 100644 --- a/src/intel/vulkan/anv_wsi.c +++ b/src/intel/vulkan/anv_wsi.c @@ -33,13 +33,6 @@ anv_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName) return anv_lookup_entrypoint(&physical_device->info, pName); } -static uint64_t -anv_wsi_image_get_modifier(VkImage _image) -{ - ANV_FROM_HANDLE(anv_image, image, _image); - return image->drm_format_mod; -} - static void anv_wsi_signal_semaphore_for_memory(VkDevice _device, VkSemaphore _semaphore, @@ -97,7 +90,6 @@ anv_init_wsi(struct anv_physical_device *physical_device) return result; physical_device->wsi_device.supports_modifiers = true; - physical_device->wsi_device.image_get_modifier = anv_wsi_image_get_modifier; physical_device->wsi_device.signal_semaphore_for_memory = anv_wsi_signal_semaphore_for_memory; physical_device->wsi_device.signal_fence_for_memory = diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index e8e38843fce..cc5e233093f 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -90,6 +90,7 @@ wsi_device_init(struct wsi_device *wsi, WSI_GET_CB(FreeMemory); WSI_GET_CB(FreeCommandBuffers); WSI_GET_CB(GetBufferMemoryRequirements); + WSI_GET_CB(GetImageDrmFormatModifierPropertiesEXT); WSI_GET_CB(GetImageMemoryRequirements); WSI_GET_CB(GetImageSubresourceLayout); WSI_GET_CB(GetMemoryFdKHR); @@ -350,11 +351,6 @@ wsi_create_native_image(const struct wsi_swapchain *chain, for (int i = 0; i < ARRAY_SIZE(image->fds); i++) image->fds[i] = -1; - struct wsi_image_create_info image_wsi_info = { - .sType = VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA, - .pNext = NULL, - }; - VkImageCreateInfo image_info = { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .flags = 0, @@ -376,20 +372,24 @@ wsi_create_native_image(const struct wsi_swapchain *chain, .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, }; - __vk_append_struct(&image_info, &image_wsi_info); + struct wsi_image_create_info image_wsi_info; + VkImageDrmFormatModifierListCreateInfoEXT image_modifier_list; uint32_t image_modifier_count = 0, modifier_prop_count = 0; - struct wsi_format_modifier_properties *modifier_props = NULL; + struct VkDrmFormatModifierPropertiesEXT *modifier_props = NULL; uint64_t *image_modifiers = NULL; if (num_modifier_lists == 0) { /* If we don't have modifiers, fall back to the legacy "scanout" flag */ - image_wsi_info.scanout = true; + image_wsi_info = (struct wsi_image_create_info) { + .sType = VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA, + .scanout = true, + }; + __vk_append_struct(&image_info, &image_wsi_info); } else { /* The winsys can't request modifiers if we don't support them. */ assert(wsi->supports_modifiers); - struct wsi_format_modifier_properties_list modifier_props_list = { - .sType = VK_STRUCTURE_TYPE_WSI_FORMAT_MODIFIER_PROPERTIES_LIST_MESA, - .pNext = NULL, + struct VkDrmFormatModifierPropertiesListEXT modifier_props_list = { + .sType = VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT, }; VkFormatProperties2 format_props = { .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, @@ -398,10 +398,10 @@ wsi_create_native_image(const struct wsi_swapchain *chain, wsi->GetPhysicalDeviceFormatProperties2KHR(wsi->pdevice, pCreateInfo->imageFormat, &format_props); - assert(modifier_props_list.modifier_count > 0); + assert(modifier_props_list.drmFormatModifierCount > 0); modifier_props = vk_alloc(&chain->alloc, sizeof(*modifier_props) * - modifier_props_list.modifier_count, + modifier_props_list.drmFormatModifierCount, 8, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND); if (!modifier_props) { @@ -409,11 +409,11 @@ wsi_create_native_image(const struct wsi_swapchain *chain, goto fail; } - modifier_props_list.modifier_properties = modifier_props; + modifier_props_list.pDrmFormatModifierProperties = modifier_props; wsi->GetPhysicalDeviceFormatProperties2KHR(wsi->pdevice, pCreateInfo->imageFormat, &format_props); - modifier_prop_count = modifier_props_list.modifier_count; + modifier_prop_count = modifier_props_list.drmFormatModifierCount; uint32_t max_modifier_count = 0; for (uint32_t l = 0; l < num_modifier_lists; l++) @@ -436,7 +436,7 @@ wsi_create_native_image(const struct wsi_swapchain *chain, */ for (uint32_t i = 0; i < num_modifiers[l]; i++) { for (uint32_t j = 0; j < modifier_prop_count; j++) { - if (modifier_props[j].modifier == modifiers[l][i]) + if (modifier_props[j].drmFormatModifier == modifiers[l][i]) image_modifiers[image_modifier_count++] = modifiers[l][i]; } } @@ -447,8 +447,13 @@ wsi_create_native_image(const struct wsi_swapchain *chain, } if (image_modifier_count > 0) { - image_wsi_info.modifier_count = image_modifier_count; - image_wsi_info.modifiers = image_modifiers; + image_modifier_list = (VkImageDrmFormatModifierListCreateInfoEXT) { + .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT, + .drmFormatModifierCount = image_modifier_count, + .pDrmFormatModifiers = image_modifiers, + }; + image_info.tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT; + __vk_append_struct(&image_info, &image_modifier_list); } else { /* TODO: Add a proper error here */ assert(!"Failed to find a supported modifier! This should never " @@ -511,12 +516,20 @@ wsi_create_native_image(const struct wsi_swapchain *chain, goto fail; if (num_modifier_lists > 0) { - image->drm_modifier = wsi->image_get_modifier(image->image); + VkImageDrmFormatModifierPropertiesEXT image_mod_props = { + .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT, + }; + result = wsi->GetImageDrmFormatModifierPropertiesEXT(chain->device, + image->image, + &image_mod_props); + if (result != VK_SUCCESS) + goto fail; + image->drm_modifier = image_mod_props.drmFormatModifier; assert(image->drm_modifier != DRM_FORMAT_MOD_INVALID); for (uint32_t j = 0; j < modifier_prop_count; j++) { - if (modifier_props[j].modifier == image->drm_modifier) { - image->num_planes = modifier_props[j].modifier_plane_count; + if (modifier_props[j].drmFormatModifier == image->drm_modifier) { + image->num_planes = modifier_props[j].drmFormatModifierPlaneCount; break; } } diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index 3e3f79b1a4a..8d633039331 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -35,7 +35,6 @@ */ #define VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA (VkStructureType)1000001002 #define VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO_MESA (VkStructureType)1000001003 -#define VK_STRUCTURE_TYPE_WSI_FORMAT_MODIFIER_PROPERTIES_LIST_MESA (VkStructureType)1000001004 #define VK_STRUCTURE_TYPE_WSI_SURFACE_SUPPORTED_COUNTERS_MESA (VkStructureType)1000001005 #define VK_STRUCTURE_TYPE_WSI_MEMORY_SIGNAL_SUBMIT_INFO_MESA (VkStructureType)1000001006 @@ -43,9 +42,6 @@ struct wsi_image_create_info { VkStructureType sType; const void *pNext; bool scanout; - - uint32_t modifier_count; - const uint64_t *modifiers; }; struct wsi_memory_allocate_info { @@ -54,20 +50,6 @@ struct wsi_memory_allocate_info { bool implicit_sync; }; -struct wsi_format_modifier_properties { - uint64_t modifier; - uint32_t modifier_plane_count; -}; - -/* Chain in for vkGetPhysicalDeviceFormatProperties2KHR */ -struct wsi_format_modifier_properties_list { - VkStructureType sType; - const void *pNext; - - uint32_t modifier_count; - struct wsi_format_modifier_properties *modifier_properties; -}; - /* To be chained into VkSurfaceCapabilities2KHR */ struct wsi_surface_supported_counters { VkStructureType sType; @@ -166,6 +148,7 @@ struct wsi_device { WSI_CB(FreeMemory); WSI_CB(FreeCommandBuffers); WSI_CB(GetBufferMemoryRequirements); + WSI_CB(GetImageDrmFormatModifierPropertiesEXT); WSI_CB(GetImageMemoryRequirements); WSI_CB(GetImageSubresourceLayout); WSI_CB(GetMemoryFdKHR); -- 2.30.2