diff options
-rw-r--r-- | vulkan/libvulkan/Android.bp | 17 | ||||
-rw-r--r-- | vulkan/libvulkan/api_gen.cpp | 3 | ||||
-rw-r--r-- | vulkan/libvulkan/api_gen.h | 3 | ||||
-rw-r--r-- | vulkan/libvulkan/driver.cpp | 13 | ||||
-rw-r--r-- | vulkan/libvulkan/driver_gen.cpp | 4 | ||||
-rw-r--r-- | vulkan/libvulkan/driver_gen.h | 4 | ||||
-rw-r--r-- | vulkan/libvulkan/libvulkan_flags.aconfig | 10 | ||||
-rw-r--r-- | vulkan/libvulkan/swapchain.cpp | 47 | ||||
-rw-r--r-- | vulkan/nulldrv/null_driver_gen.cpp | 3 | ||||
-rw-r--r-- | vulkan/nulldrv/null_driver_gen.h | 3 | ||||
-rw-r--r-- | vulkan/scripts/api_generator.py | 6 | ||||
-rw-r--r-- | vulkan/scripts/driver_generator.py | 7 | ||||
-rw-r--r-- | vulkan/scripts/null_generator.py | 6 |
13 files changed, 123 insertions, 3 deletions
diff --git a/vulkan/libvulkan/Android.bp b/vulkan/libvulkan/Android.bp index 436e6c6b7c..4c4e3417a3 100644 --- a/vulkan/libvulkan/Android.bp +++ b/vulkan/libvulkan/Android.bp @@ -32,6 +32,18 @@ ndk_library { ], } +aconfig_declarations { + name: "libvulkan_flags", + package: "com.android.graphics.libvulkan.flags", + container: "system", + srcs: ["libvulkan_flags.aconfig"], +} + +cc_aconfig_library { + name: "libvulkanflags", + aconfig_declarations: "libvulkan_flags", +} + cc_library_shared { name: "libvulkan", llndk: { @@ -113,5 +125,8 @@ cc_library_shared { "android.hardware.graphics.common@1.0", "libSurfaceFlingerProp", ], - static_libs: ["libgrallocusage"], + static_libs: [ + "libgrallocusage", + "libvulkanflags", + ], } diff --git a/vulkan/libvulkan/api_gen.cpp b/vulkan/libvulkan/api_gen.cpp index a3fe33e67e..9ff0b46c0f 100644 --- a/vulkan/libvulkan/api_gen.cpp +++ b/vulkan/libvulkan/api_gen.cpp @@ -25,6 +25,9 @@ #undef VK_NO_PROTOTYPES #include "api.h" +/* + * This file is autogenerated by api_generator.py. Do not edit directly. + */ namespace vulkan { namespace api { diff --git a/vulkan/libvulkan/api_gen.h b/vulkan/libvulkan/api_gen.h index 4998018882..b468a8911b 100644 --- a/vulkan/libvulkan/api_gen.h +++ b/vulkan/libvulkan/api_gen.h @@ -25,6 +25,9 @@ #include "driver_gen.h" +/* + * This file is autogenerated by api_generator.py. Do not edit directly. + */ namespace vulkan { namespace api { diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp index ef213f0c7a..01436db4ae 100644 --- a/vulkan/libvulkan/driver.cpp +++ b/vulkan/libvulkan/driver.cpp @@ -41,10 +41,12 @@ #include <new> #include <vector> +#include <com_android_graphics_libvulkan_flags.h> #include "stubhal.h" using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; +using namespace com::android::graphics::libvulkan; extern "C" android_namespace_t* android_get_exported_namespace(const char*); @@ -688,6 +690,7 @@ void CreateInfoWrapper::FilterExtension(const char* name) { case ProcHook::KHR_incremental_present: case ProcHook::KHR_shared_presentable_image: case ProcHook::KHR_swapchain: + case ProcHook::KHR_swapchain_mutable_format: case ProcHook::EXT_hdr_metadata: case ProcHook::EXT_swapchain_maintenance1: case ProcHook::ANDROID_external_memory_android_hardware_buffer: @@ -740,6 +743,7 @@ void CreateInfoWrapper::FilterExtension(const char* name) { break; case ProcHook::ANDROID_external_memory_android_hardware_buffer: case ProcHook::KHR_external_fence_fd: + case ProcHook::KHR_swapchain_mutable_format: case ProcHook::EXTENSION_UNKNOWN: // Extensions we don't need to do anything about at this level break; @@ -1251,6 +1255,15 @@ VkResult EnumerateDeviceExtensionProperties( VK_EXT_SWAPCHAIN_MAINTENANCE_1_SPEC_VERSION}); } + VkPhysicalDeviceProperties pDeviceProperties; + data.driver.GetPhysicalDeviceProperties(physicalDevice, &pDeviceProperties); + if (flags::swapchain_mutable_format_ext() && + pDeviceProperties.apiVersion >= VK_API_VERSION_1_2) { + loader_extensions.push_back( + {VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME, + VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_SPEC_VERSION}); + } + // enumerate our extensions first if (!pLayerName && pProperties) { uint32_t count = std::min( diff --git a/vulkan/libvulkan/driver_gen.cpp b/vulkan/libvulkan/driver_gen.cpp index 8f090083f8..f741977d50 100644 --- a/vulkan/libvulkan/driver_gen.cpp +++ b/vulkan/libvulkan/driver_gen.cpp @@ -26,6 +26,9 @@ namespace vulkan { namespace driver { +/* + * This file is autogenerated by driver_generator.py. Do not edit directly. + */ namespace { // clang-format off @@ -613,6 +616,7 @@ ProcHook::Extension GetProcHookExtension(const char* name) { if (strcmp(name, "VK_KHR_external_semaphore_capabilities") == 0) return ProcHook::KHR_external_semaphore_capabilities; if (strcmp(name, "VK_KHR_external_fence_capabilities") == 0) return ProcHook::KHR_external_fence_capabilities; if (strcmp(name, "VK_KHR_external_fence_fd") == 0) return ProcHook::KHR_external_fence_fd; + if (strcmp(name, "VK_KHR_swapchain_mutable_format") == 0) return ProcHook::KHR_swapchain_mutable_format; // clang-format on return ProcHook::EXTENSION_UNKNOWN; } diff --git a/vulkan/libvulkan/driver_gen.h b/vulkan/libvulkan/driver_gen.h index 4527214c3f..649c0f1a17 100644 --- a/vulkan/libvulkan/driver_gen.h +++ b/vulkan/libvulkan/driver_gen.h @@ -26,6 +26,9 @@ #include <optional> #include <vector> +/* + * This file is autogenerated by driver_generator.py. Do not edit directly. + */ namespace vulkan { namespace driver { @@ -59,6 +62,7 @@ struct ProcHook { KHR_external_semaphore_capabilities, KHR_external_fence_capabilities, KHR_external_fence_fd, + KHR_swapchain_mutable_format, EXTENSION_CORE_1_0, EXTENSION_CORE_1_1, diff --git a/vulkan/libvulkan/libvulkan_flags.aconfig b/vulkan/libvulkan/libvulkan_flags.aconfig new file mode 100644 index 0000000000..891bc0261b --- /dev/null +++ b/vulkan/libvulkan/libvulkan_flags.aconfig @@ -0,0 +1,10 @@ +package: "com.android.graphics.libvulkan.flags" +container: "system" + +flag { + name: "swapchain_mutable_format_ext" + namespace: "core_graphics" + description: "Enable the VK_KHR_swapchain_mutable_format vulkan extension" + bug: "341978292" + is_fixed_read_only: true +} diff --git a/vulkan/libvulkan/swapchain.cpp b/vulkan/libvulkan/swapchain.cpp index ba2b8887bc..09b0a145af 100644 --- a/vulkan/libvulkan/swapchain.cpp +++ b/vulkan/libvulkan/swapchain.cpp @@ -1472,6 +1472,12 @@ static VkResult getProducerUsage(const VkDevice& device, .flags = create_protected_swapchain ? VK_IMAGE_CREATE_PROTECTED_BIT : 0u, }; + // If supporting mutable format swapchain add the mutable format flag + if (create_info->flags & VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR) { + image_format_info.flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; + image_format_info.flags |= VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR; + } + VkAndroidHardwareBufferUsageANDROID ahb_usage; ahb_usage.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID; ahb_usage.pNext = nullptr; @@ -1890,6 +1896,11 @@ VkResult CreateSwapchainKHR(VkDevice device, num_images = 1; } + VkImageFormatListCreateInfo extra_mutable_formats = { + .sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR, + }; + VkImageFormatListCreateInfo* extra_mutable_formats_ptr; + // Look through the create_info pNext chain passed to createSwapchainKHR // for an image compression control struct. // if one is found AND the appropriate extensions are enabled, create a @@ -1908,7 +1919,29 @@ VkResult CreateSwapchainKHR(VkDevice device, image_compression.pNext = nullptr; usage_info_pNext = &image_compression; } break; - + case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: { + const VkImageFormatListCreateInfo* format_list = + reinterpret_cast<const VkImageFormatListCreateInfo*>( + create_infos); + if (create_info->flags & + VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR) { + if (format_list && format_list->viewFormatCount > 0 && + format_list->pViewFormats) { + extra_mutable_formats.viewFormatCount = + format_list->viewFormatCount; + extra_mutable_formats.pViewFormats = + format_list->pViewFormats; + extra_mutable_formats_ptr = &extra_mutable_formats; + } else { + ALOGE( + "vk_swapchain_create_mutable_format_bit_khr was " + "set during swapchain creation but no valid " + "vkimageformatlistcreateinfo was found in the " + "pnext chain"); + return VK_ERROR_INITIALIZATION_FAILED; + } + } + } break; default: // Ignore all other info structs break; @@ -2004,6 +2037,11 @@ VkResult CreateSwapchainKHR(VkDevice device, .pQueueFamilyIndices = create_info->pQueueFamilyIndices, }; + if (create_info->flags & VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR) { + image_create.flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; + image_create.flags |= VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR; + } + // Note: don't do deferred allocation for shared present modes. There's only one buffer // involved so very little benefit. if ((create_info->flags & VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT) && @@ -2013,7 +2051,7 @@ VkResult CreateSwapchainKHR(VkDevice device, // AcquireNextImage. VkImageSwapchainCreateInfoKHR image_swapchain_create = { .sType = VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR, - .pNext = nullptr, + .pNext = extra_mutable_formats_ptr, .swapchain = HandleFromSwapchain(swapchain), }; image_create.pNext = &image_swapchain_create; @@ -2065,6 +2103,11 @@ VkResult CreateSwapchainKHR(VkDevice device, ANativeWindowBuffer_getHardwareBuffer(img.buffer.get()); image_create.pNext = &image_native_buffer; + if (extra_mutable_formats_ptr) { + extra_mutable_formats_ptr->pNext = image_create.pNext; + image_create.pNext = extra_mutable_formats_ptr; + } + ATRACE_BEGIN("CreateImage"); result = dispatch.CreateImage(device, &image_create, nullptr, &img.image); diff --git a/vulkan/nulldrv/null_driver_gen.cpp b/vulkan/nulldrv/null_driver_gen.cpp index d34851e536..40a45af94e 100644 --- a/vulkan/nulldrv/null_driver_gen.cpp +++ b/vulkan/nulldrv/null_driver_gen.cpp @@ -24,6 +24,9 @@ using namespace null_driver; +/* + * This file is autogenerated by null_generator.py. Do not edit directly. + */ namespace { struct NameProc { diff --git a/vulkan/nulldrv/null_driver_gen.h b/vulkan/nulldrv/null_driver_gen.h index fb3bd05e07..0d1e223226 100644 --- a/vulkan/nulldrv/null_driver_gen.h +++ b/vulkan/nulldrv/null_driver_gen.h @@ -22,6 +22,9 @@ #include <vulkan/vk_android_native_buffer.h> #include <vulkan/vulkan.h> +/* + * This file is autogenerated by null_generator.py. Do not edit directly. + */ namespace null_driver { PFN_vkVoidFunction GetGlobalProcAddr(const char* name); diff --git a/vulkan/scripts/api_generator.py b/vulkan/scripts/api_generator.py index be24172eed..001af208a8 100644 --- a/vulkan/scripts/api_generator.py +++ b/vulkan/scripts/api_generator.py @@ -61,6 +61,9 @@ def gen_h(): #include "driver_gen.h" +/* + * This file is autogenerated by api_generator.py. Do not edit directly. + */ namespace vulkan { namespace api { @@ -283,6 +286,9 @@ def gen_cpp(): #undef VK_NO_PROTOTYPES #include "api.h" +/* + * This file is autogenerated by api_generator.py. Do not edit directly. + */ namespace vulkan { namespace api { diff --git a/vulkan/scripts/driver_generator.py b/vulkan/scripts/driver_generator.py index 48c0ae9304..61595993f1 100644 --- a/vulkan/scripts/driver_generator.py +++ b/vulkan/scripts/driver_generator.py @@ -49,6 +49,7 @@ _KNOWN_EXTENSIONS = _INTERCEPTED_EXTENSIONS + [ 'VK_KHR_external_semaphore_capabilities', 'VK_KHR_external_fence_capabilities', 'VK_KHR_external_fence_fd', + 'VK_KHR_swapchain_mutable_format', ] # Functions needed at vulkan::driver level. @@ -224,6 +225,9 @@ def gen_h(): #include <optional> #include <vector> +/* + * This file is autogenerated by driver_generator.py. Do not edit directly. + */ namespace vulkan { namespace driver { @@ -503,6 +507,9 @@ def gen_cpp(): namespace vulkan { namespace driver { +/* + * This file is autogenerated by driver_generator.py. Do not edit directly. + */ namespace { // clang-format off\n\n""") diff --git a/vulkan/scripts/null_generator.py b/vulkan/scripts/null_generator.py index 3624c1d032..5c5bea316b 100644 --- a/vulkan/scripts/null_generator.py +++ b/vulkan/scripts/null_generator.py @@ -55,6 +55,9 @@ def gen_h(): #include <vulkan/vk_android_native_buffer.h> #include <vulkan/vulkan.h> +/* + * This file is autogenerated by null_generator.py. Do not edit directly. + */ namespace null_driver { PFN_vkVoidFunction GetGlobalProcAddr(const char* name); @@ -97,6 +100,9 @@ def gen_cpp(): using namespace null_driver; +/* + * This file is autogenerated by null_generator.py. Do not edit directly. + */ namespace { struct NameProc { |