Skip to content

Commit

Permalink
[fuchsia] Use upstream FUCHSIA_buffer_collection extension. (#30911)
Browse files Browse the repository at this point in the history
This updates Flutter engine to use the upstream FUCHSIA
buffer extension collection. It removes the obsolete
vkSetBufferCollectionConstraints() and replaces it with
vkSetBufferCollectionImageConstraints().
  • Loading branch information
gnoliyil authored Jan 21, 2022
1 parent c1fc046 commit 88df1ae
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 28 deletions.
74 changes: 57 additions & 17 deletions shell/platform/fuchsia/flutter/vulkan_surface.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "vulkan_surface.h"

#include <fuchsia/sysmem/cpp/fidl.h>
#include <lib/async/default.h>
#include <lib/ui/scenic/cpp/commands.h>

Expand All @@ -15,6 +16,8 @@
#include "third_party/skia/include/gpu/GrBackendSemaphore.h"
#include "third_party/skia/include/gpu/GrBackendSurface.h"
#include "third_party/skia/include/gpu/GrDirectContext.h"
#include "vulkan/vulkan_core.h"
#include "vulkan/vulkan_fuchsia.h"

#define LOG_AND_RETURN(cond, msg) \
if (cond) { \
Expand All @@ -33,6 +36,11 @@ constexpr VkImageCreateFlags kVulkanImageCreateFlags = 0;
constexpr VkImageUsageFlags kVkImageUsage =
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
const VkSysmemColorSpaceFUCHSIA kSrgbColorSpace = {
.sType = VK_STRUCTURE_TYPE_SYSMEM_COLOR_SPACE_FUCHSIA,
.pNext = nullptr,
.colorSpace = static_cast<uint32_t>(fuchsia::sysmem::ColorSpaceType::SRGB),
};

} // namespace

Expand All @@ -45,7 +53,7 @@ bool VulkanSurface::CreateVulkanImage(vulkan::VulkanProvider& vulkan_provider,
FML_CHECK(out_vulkan_image != nullptr);

out_vulkan_image->vk_collection_image_create_info = {
.sType = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIAX,
.sType = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA,
.pNext = nullptr,
.collection = collection_,
.index = 0,
Expand All @@ -70,10 +78,42 @@ bool VulkanSurface::CreateVulkanImage(vulkan::VulkanProvider& vulkan_provider,
.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
};

const VkImageFormatConstraintsInfoFUCHSIA format_constraints = {
.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_CONSTRAINTS_INFO_FUCHSIA,
.pNext = nullptr,
.imageCreateInfo = out_vulkan_image->vk_image_create_info,
.requiredFormatFeatures = VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT,
.flags = {},
.sysmemPixelFormat = {},
.colorSpaceCount = 1,
.pColorSpaces = &kSrgbColorSpace,
};

const VkImageConstraintsInfoFUCHSIA image_constraints = {
.sType = VK_STRUCTURE_TYPE_IMAGE_CONSTRAINTS_INFO_FUCHSIA,
.pNext = nullptr,
.formatConstraintsCount = 1,
.pFormatConstraints = &format_constraints,
.bufferCollectionConstraints =
{
.sType =
VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CONSTRAINTS_INFO_FUCHSIA,
.pNext = nullptr,
.minBufferCount = 1,
// Using the default value 0 means that we don't have any other
// constraints except for the minimum buffer count.
.maxBufferCount = 0,
.minBufferCountForCamping = 0,
.minBufferCountForDedicatedSlack = 0,
.minBufferCountForSharedSlack = 0,
},
.flags = {},
};

if (VK_CALL_LOG_ERROR(
vulkan_provider.vk().SetBufferCollectionConstraintsFUCHSIAX(
vulkan_provider.vk_device(), collection_,
&out_vulkan_image->vk_image_create_info)) != VK_SUCCESS) {
vulkan_provider.vk().SetBufferCollectionImageConstraintsFUCHSIA(
vulkan_provider.vk_device(), collection_, &image_constraints)) !=
VK_SUCCESS) {
return false;
}

Expand Down Expand Up @@ -278,22 +318,22 @@ bool VulkanSurface::AllocateDeviceMemory(
});
}

VkBufferCollectionCreateInfoFUCHSIAX import_info{
.sType = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CREATE_INFO_FUCHSIAX,
VkBufferCollectionCreateInfoFUCHSIA import_info{
.sType = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CREATE_INFO_FUCHSIA,
.pNext = nullptr,
.collectionToken = vulkan_token.Unbind().TakeChannel().release(),
};
VkBufferCollectionFUCHSIAX collection;
if (VK_CALL_LOG_ERROR(vulkan_provider_.vk().CreateBufferCollectionFUCHSIAX(
VkBufferCollectionFUCHSIA collection;
if (VK_CALL_LOG_ERROR(vulkan_provider_.vk().CreateBufferCollectionFUCHSIA(
vulkan_provider_.vk_device(), &import_info, nullptr, &collection)) !=
VK_SUCCESS) {
return false;
}

collection_ = vulkan::VulkanHandle<VkBufferCollectionFUCHSIAX_T*>{
collection, [&vulkan_provider = vulkan_provider_](
VkBufferCollectionFUCHSIAX collection) {
vulkan_provider.vk().DestroyBufferCollectionFUCHSIAX(
collection_ = vulkan::VulkanHandle<VkBufferCollectionFUCHSIA_T*>{
collection, [&vulkan_provider =
vulkan_provider_](VkBufferCollectionFUCHSIA collection) {
vulkan_provider.vk().DestroyBufferCollectionFUCHSIA(
vulkan_provider.vk_device(), collection, nullptr);
}};

Expand All @@ -306,17 +346,17 @@ bool VulkanSurface::AllocateDeviceMemory(
vulkan_image_.vk_memory_requirements;
VkImageCreateInfo& image_create_info = vulkan_image_.vk_image_create_info;

VkBufferCollectionPropertiesFUCHSIAX properties{
.sType = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES_FUCHSIAX};
VkBufferCollectionPropertiesFUCHSIA properties{
.sType = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES_FUCHSIA};
if (VK_CALL_LOG_ERROR(
vulkan_provider_.vk().GetBufferCollectionPropertiesFUCHSIAX(
vulkan_provider_.vk().GetBufferCollectionPropertiesFUCHSIA(
vulkan_provider_.vk_device(), collection_, &properties)) !=
VK_SUCCESS) {
return false;
}

VkImportMemoryBufferCollectionFUCHSIAX import_memory_info = {
.sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIAX,
VkImportMemoryBufferCollectionFUCHSIA import_memory_info = {
.sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA,
.pNext = nullptr,
.collection = collection_,
.index = 0,
Expand Down
4 changes: 2 additions & 2 deletions shell/platform/fuchsia/flutter/vulkan_surface.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ struct VulkanImage {
VulkanImage(VulkanImage&&) = default;
VulkanImage& operator=(VulkanImage&&) = default;

VkBufferCollectionImageCreateInfoFUCHSIAX vk_collection_image_create_info;
VkBufferCollectionImageCreateInfoFUCHSIA vk_collection_image_create_info;
VkImageCreateInfo vk_image_create_info;
VkMemoryRequirements vk_memory_requirements;
vulkan::VulkanHandle<VkImage> vk_image;
Expand Down Expand Up @@ -169,7 +169,7 @@ class VulkanSurface final : public SurfaceProducerSurface {
uint32_t buffer_id_ = 0;
fuchsia::ui::composition::BufferCollectionImportToken import_token_;
uint32_t image_id_ = 0;
vulkan::VulkanHandle<VkBufferCollectionFUCHSIAX> collection_;
vulkan::VulkanHandle<VkBufferCollectionFUCHSIA> collection_;
zx::event acquire_event_;
vulkan::VulkanHandle<VkSemaphore> acquire_semaphore_;
std::unique_ptr<vulkan::VulkanCommandBuffer> command_buffer_;
Expand Down
2 changes: 1 addition & 1 deletion vulkan/vulkan_device.cc
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ VulkanDevice::VulkanDevice(VulkanProcTable& p_vk,
VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME,
VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
VK_FUCHSIA_BUFFER_COLLECTION_X_EXTENSION_NAME,
VK_FUCHSIA_BUFFER_COLLECTION_EXTENSION_NAME,
#endif
};

Expand Down
8 changes: 4 additions & 4 deletions vulkan/vulkan_proc_table.cc
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,10 @@ bool VulkanProcTable::SetupDeviceProcAddresses(
ACQUIRE_PROC(ImportSemaphoreZirconHandleFUCHSIA, handle);
ACQUIRE_PROC(GetSemaphoreZirconHandleFUCHSIA, handle);
ACQUIRE_PROC(GetMemoryZirconHandleFUCHSIA, handle);
ACQUIRE_PROC(CreateBufferCollectionFUCHSIAX, handle);
ACQUIRE_PROC(DestroyBufferCollectionFUCHSIAX, handle);
ACQUIRE_PROC(SetBufferCollectionConstraintsFUCHSIAX, handle);
ACQUIRE_PROC(GetBufferCollectionPropertiesFUCHSIAX, handle);
ACQUIRE_PROC(CreateBufferCollectionFUCHSIA, handle);
ACQUIRE_PROC(DestroyBufferCollectionFUCHSIA, handle);
ACQUIRE_PROC(SetBufferCollectionImageConstraintsFUCHSIA, handle);
ACQUIRE_PROC(GetBufferCollectionPropertiesFUCHSIA, handle);
#endif // OS_FUCHSIA
#endif // TEST_VULKAN_PROCS
device_ = VulkanHandle<VkDevice>{handle, nullptr};
Expand Down
8 changes: 4 additions & 4 deletions vulkan/vulkan_proc_table.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,10 +120,10 @@ class VulkanProcTable : public fml::RefCountedThreadSafe<VulkanProcTable> {
DEFINE_PROC(ImportSemaphoreZirconHandleFUCHSIA);
DEFINE_PROC(GetSemaphoreZirconHandleFUCHSIA);
DEFINE_PROC(GetMemoryZirconHandleFUCHSIA);
DEFINE_PROC(CreateBufferCollectionFUCHSIAX);
DEFINE_PROC(DestroyBufferCollectionFUCHSIAX);
DEFINE_PROC(SetBufferCollectionConstraintsFUCHSIAX);
DEFINE_PROC(GetBufferCollectionPropertiesFUCHSIAX);
DEFINE_PROC(CreateBufferCollectionFUCHSIA);
DEFINE_PROC(DestroyBufferCollectionFUCHSIA);
DEFINE_PROC(SetBufferCollectionImageConstraintsFUCHSIA);
DEFINE_PROC(GetBufferCollectionPropertiesFUCHSIA);
#endif // OS_FUCHSIA
#endif // TEST_VULKAN_PROCS

Expand Down

0 comments on commit 88df1ae

Please sign in to comment.