summaryrefslogtreecommitdiff
path: root/chromium
diff options
context:
space:
mode:
authorPeter Varga <pvarga@inf.u-szeged.hu>2022-10-27 14:34:46 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2022-11-15 10:17:24 +0000
commit45f9fe2ca801ed970d657d5b7a0d81f7c854595a (patch)
treee89df8bd488e386db5291c3175ca6e7e51f9d10c /chromium
parent3d26dbfc59473d97bd3e05bde83c3047a286de2b (diff)
downloadqtwebengine-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')
-rw-r--r--chromium/gpu/vulkan/init/gr_vk_memory_allocator_impl.cc4
-rw-r--r--chromium/gpu/vulkan/init/vulkan_factory.cc2
-rw-r--r--chromium/gpu/vulkan/vma_wrapper.cc19
-rw-r--r--chromium/third_party/skia/src/gpu/ganesh/vk/GrVkBuffer.cpp14
-rw-r--r--chromium/third_party/skia/src/gpu/ganesh/vk/GrVkGpu.cpp8
-rw-r--r--chromium/third_party/skia/src/gpu/ganesh/vk/GrVkImage.cpp20
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