diff options
author | Peter Varga <pvarga@inf.u-szeged.hu> | 2022-10-27 14:34:46 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2022-11-15 10:17:24 +0000 |
commit | 45f9fe2ca801ed970d657d5b7a0d81f7c854595a (patch) | |
tree | e89df8bd488e386db5291c3175ca6e7e51f9d10c /chromium | |
parent | 3d26dbfc59473d97bd3e05bde83c3047a286de2b (diff) | |
download | qtwebengine-chromium-45f9fe2ca801ed970d657d5b7a0d81f7c854595a.tar.gz |
Make GrVkImage external
Task-number: QTBUG-107669
Change-Id: I8ba6c8bab4f29c13b368a8e53f762d6aac1f009c
Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/435455
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/442494
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium')
6 files changed, 67 insertions, 0 deletions
diff --git a/chromium/gpu/vulkan/init/gr_vk_memory_allocator_impl.cc b/chromium/gpu/vulkan/init/gr_vk_memory_allocator_impl.cc index 2fe87c19396..54d355a6ee6 100644 --- a/chromium/gpu/vulkan/init/gr_vk_memory_allocator_impl.cc +++ b/chromium/gpu/vulkan/init/gr_vk_memory_allocator_impl.cc @@ -42,6 +42,10 @@ class GrVkMemoryAllocatorImpl : public GrVkMemoryAllocator { info.pool = VK_NULL_HANDLE; info.pUserData = nullptr; +#if defined(TOOLKIT_QT) + info.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT; +#endif + if (AllocationPropertyFlags::kDedicatedAllocation & flags) { info.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT; } diff --git a/chromium/gpu/vulkan/init/vulkan_factory.cc b/chromium/gpu/vulkan/init/vulkan_factory.cc index 64e06d0ff16..e8fd24046c7 100644 --- a/chromium/gpu/vulkan/init/vulkan_factory.cc +++ b/chromium/gpu/vulkan/init/vulkan_factory.cc @@ -26,6 +26,7 @@ namespace gpu { +#if !defined(TOOLKIT_QT) std::unique_ptr<VulkanImplementation> CreateVulkanImplementation( bool use_swiftshader, bool allow_protected_memory) { @@ -59,5 +60,6 @@ std::unique_ptr<VulkanImplementation> CreateVulkanImplementation( #endif #endif } +#endif // !defined(TOOLKIT_QT) } // namespace gpu diff --git a/chromium/gpu/vulkan/vma_wrapper.cc b/chromium/gpu/vulkan/vma_wrapper.cc index 8110f721f24..be87848bffe 100644 --- a/chromium/gpu/vulkan/vma_wrapper.cc +++ b/chromium/gpu/vulkan/vma_wrapper.cc @@ -66,6 +66,25 @@ VkResult CreateAllocator(VkPhysicalDevice physical_device, if (!is_thread_safe) { allocator_info.flags = VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT; } +#if defined(TOOLKIT_QT) + VkPhysicalDeviceMemoryProperties mem_properties; + function_pointers->vkGetPhysicalDeviceMemoryProperties(physical_device, + &mem_properties); + std::vector<VkExternalMemoryHandleTypeFlagsKHR> external_memory_handle_types(mem_properties.memoryTypeCount, 0); + for (uint32_t i = 0; i < mem_properties.memoryTypeCount; ++i) { + VkMemoryPropertyFlags property_flags = mem_properties.memoryTypes[i].propertyFlags; + if (property_flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) { + external_memory_handle_types[i] = +#if BUILDFLAG(IS_WIN) + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR; +#else + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR; +#endif + } + } + allocator_info.pTypeExternalMemoryHandleTypes = external_memory_handle_types.data(); +#endif // defined(TOOLKIT_QT) + return vmaCreateAllocator(&allocator_info, pAllocator); } diff --git a/chromium/third_party/skia/src/gpu/ganesh/vk/GrVkBuffer.cpp b/chromium/third_party/skia/src/gpu/ganesh/vk/GrVkBuffer.cpp index d04b2cec28a..cbd40e392ab 100644 --- a/chromium/third_party/skia/src/gpu/ganesh/vk/GrVkBuffer.cpp +++ b/chromium/third_party/skia/src/gpu/ganesh/vk/GrVkBuffer.cpp @@ -129,6 +129,20 @@ sk_sp<GrVkBuffer> GrVkBuffer::Make(GrVkGpu* gpu, bufInfo.queueFamilyIndexCount = 0; bufInfo.pQueueFamilyIndices = nullptr; +#if defined(TOOLKIT_QT) + // This is a workaround to avoid validation error messages when enabling external memmory + // allocation by VMA. + VkExternalMemoryBufferCreateInfo externalMemoryBufferCreateInfo = { VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO }; + externalMemoryBufferCreateInfo.pNext = nullptr; + externalMemoryBufferCreateInfo.handleTypes = +#if defined(SK_BUILD_FOR_WIN) + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR; +#else + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR; +#endif + bufInfo.pNext = &externalMemoryBufferCreateInfo; +#endif // defined(TOOLKIT_QT) + VkResult err; err = VK_CALL(gpu, CreateBuffer(gpu->device(), &bufInfo, nullptr, &buffer)); if (err) { diff --git a/chromium/third_party/skia/src/gpu/ganesh/vk/GrVkGpu.cpp b/chromium/third_party/skia/src/gpu/ganesh/vk/GrVkGpu.cpp index 4822a643a43..9b08304292d 100644 --- a/chromium/third_party/skia/src/gpu/ganesh/vk/GrVkGpu.cpp +++ b/chromium/third_party/skia/src/gpu/ganesh/vk/GrVkGpu.cpp @@ -1632,6 +1632,14 @@ bool GrVkGpu::createVkImageForBackendSurface(VkFormat vkFormat, imageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; imageDesc.fIsProtected = fProtectedContext; +#if defined(TOOLKIT_QT) && defined(SK_BUILD_FOR_WIN) + if (fPhysDevProps.vendorID == 0x8086) { + // FIXME: This is a workaround for Intel drivers on Windows. + // The imported VkImage has artifacts if the tiling is not linear. + imageDesc.fImageTiling = VK_IMAGE_TILING_LINEAR; + } +#endif + if (!GrVkImage::InitImageInfo(this, imageDesc, info)) { SkDebugf("Failed to init image info\n"); return false; diff --git a/chromium/third_party/skia/src/gpu/ganesh/vk/GrVkImage.cpp b/chromium/third_party/skia/src/gpu/ganesh/vk/GrVkImage.cpp index 702536a7a67..5718b4787ff 100644 --- a/chromium/third_party/skia/src/gpu/ganesh/vk/GrVkImage.cpp +++ b/chromium/third_party/skia/src/gpu/ganesh/vk/GrVkImage.cpp @@ -489,9 +489,29 @@ bool GrVkImage::InitImageInfo(GrVkGpu* gpu, const ImageDesc& imageDesc, GrVkImag if (imageDesc.fIsProtected == GrProtected::kYes || gpu->protectedContext()) { createflags |= VK_IMAGE_CREATE_PROTECTED_BIT; } + +#if defined(TOOLKIT_QT) + // The initialLayout should be undefined for the external image. + // https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkImageCreateInfo.html#VUID-VkImageCreateInfo-pNext-01443 + initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + + VkExternalMemoryImageCreateInfoKHR externalMemoryImageCreateInfo = { VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR }; + externalMemoryImageCreateInfo.pNext = nullptr; + externalMemoryImageCreateInfo.handleTypes = +#if defined(SK_BUILD_FOR_WIN) + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR; +#else + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR; +#endif // defined(SK_BUILD_FOR_WIN) +#endif // defined(TOOLKIT_QT) + const VkImageCreateInfo imageCreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // sType +#if defined(TOOLKIT_QT) + &externalMemoryImageCreateInfo, // pNext +#else nullptr, // pNext +#endif createflags, // VkImageCreateFlags imageDesc.fImageType, // VkImageType imageDesc.fFormat, // VkFormat |