Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit cb44de1

Browse files
committed
[fuchsia] Use upstream FUCHSIA_buffer_collection extension.
This updates Flutter engine to use the upstream FUCHSIA buffer extension collection. It removes the obsolete vkSetBufferCollectionConstraints() and replaces it with vkSetBufferCollectionImageConstraints(). Bug: flutter/flutter#96312
1 parent 0dbddc0 commit cb44de1

File tree

5 files changed

+68
-28
lines changed

5 files changed

+68
-28
lines changed

shell/platform/fuchsia/flutter/vulkan_surface.cc

Lines changed: 57 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "vulkan_surface.h"
66

7+
#include <fuchsia/sysmem/cpp/fidl.h>
78
#include <lib/async/default.h>
89
#include <lib/ui/scenic/cpp/commands.h>
910

@@ -15,6 +16,8 @@
1516
#include "third_party/skia/include/gpu/GrBackendSemaphore.h"
1617
#include "third_party/skia/include/gpu/GrBackendSurface.h"
1718
#include "third_party/skia/include/gpu/GrDirectContext.h"
19+
#include "vulkan/vulkan_core.h"
20+
#include "vulkan/vulkan_fuchsia.h"
1821

1922
#define LOG_AND_RETURN(cond, msg) \
2023
if (cond) { \
@@ -33,6 +36,11 @@ constexpr VkImageCreateFlags kVulkanImageCreateFlags = 0;
3336
constexpr VkImageUsageFlags kVkImageUsage =
3437
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
3538
VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
39+
const VkSysmemColorSpaceFUCHSIA kSrgbColorSpace = {
40+
.sType = VK_STRUCTURE_TYPE_SYSMEM_COLOR_SPACE_FUCHSIA,
41+
.pNext = nullptr,
42+
.colorSpace = static_cast<uint32_t>(fuchsia::sysmem::ColorSpaceType::SRGB),
43+
};
3644

3745
} // namespace
3846

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

4755
out_vulkan_image->vk_collection_image_create_info = {
48-
.sType = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIAX,
56+
.sType = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA,
4957
.pNext = nullptr,
5058
.collection = collection_,
5159
.index = 0,
@@ -70,10 +78,42 @@ bool VulkanSurface::CreateVulkanImage(vulkan::VulkanProvider& vulkan_provider,
7078
.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
7179
};
7280

81+
const VkImageFormatConstraintsInfoFUCHSIA format_constraints = {
82+
.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_CONSTRAINTS_INFO_FUCHSIA,
83+
.pNext = nullptr,
84+
.imageCreateInfo = out_vulkan_image->vk_image_create_info,
85+
.requiredFormatFeatures = VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT,
86+
.flags = {},
87+
.sysmemPixelFormat = {},
88+
.colorSpaceCount = 1,
89+
.pColorSpaces = &kSrgbColorSpace,
90+
};
91+
92+
const VkImageConstraintsInfoFUCHSIA image_constraints = {
93+
.sType = VK_STRUCTURE_TYPE_IMAGE_CONSTRAINTS_INFO_FUCHSIA,
94+
.pNext = nullptr,
95+
.formatConstraintsCount = 1,
96+
.pFormatConstraints = &format_constraints,
97+
.bufferCollectionConstraints =
98+
{
99+
.sType =
100+
VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CONSTRAINTS_INFO_FUCHSIA,
101+
.pNext = nullptr,
102+
.minBufferCount = 1,
103+
// Using the default value 0 means that we don't have any other
104+
// constraints except for the minimum buffer count.
105+
.maxBufferCount = 0,
106+
.minBufferCountForCamping = 0,
107+
.minBufferCountForDedicatedSlack = 0,
108+
.minBufferCountForSharedSlack = 0,
109+
},
110+
.flags = {},
111+
};
112+
73113
if (VK_CALL_LOG_ERROR(
74-
vulkan_provider.vk().SetBufferCollectionConstraintsFUCHSIAX(
75-
vulkan_provider.vk_device(), collection_,
76-
&out_vulkan_image->vk_image_create_info)) != VK_SUCCESS) {
114+
vulkan_provider.vk().SetBufferCollectionImageConstraintsFUCHSIA(
115+
vulkan_provider.vk_device(), collection_, &image_constraints)) !=
116+
VK_SUCCESS) {
77117
return false;
78118
}
79119

@@ -278,22 +318,22 @@ bool VulkanSurface::AllocateDeviceMemory(
278318
});
279319
}
280320

281-
VkBufferCollectionCreateInfoFUCHSIAX import_info{
282-
.sType = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CREATE_INFO_FUCHSIAX,
321+
VkBufferCollectionCreateInfoFUCHSIA import_info{
322+
.sType = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CREATE_INFO_FUCHSIA,
283323
.pNext = nullptr,
284324
.collectionToken = vulkan_token.Unbind().TakeChannel().release(),
285325
};
286-
VkBufferCollectionFUCHSIAX collection;
287-
if (VK_CALL_LOG_ERROR(vulkan_provider_.vk().CreateBufferCollectionFUCHSIAX(
326+
VkBufferCollectionFUCHSIA collection;
327+
if (VK_CALL_LOG_ERROR(vulkan_provider_.vk().CreateBufferCollectionFUCHSIA(
288328
vulkan_provider_.vk_device(), &import_info, nullptr, &collection)) !=
289329
VK_SUCCESS) {
290330
return false;
291331
}
292332

293-
collection_ = vulkan::VulkanHandle<VkBufferCollectionFUCHSIAX_T*>{
294-
collection, [&vulkan_provider = vulkan_provider_](
295-
VkBufferCollectionFUCHSIAX collection) {
296-
vulkan_provider.vk().DestroyBufferCollectionFUCHSIAX(
333+
collection_ = vulkan::VulkanHandle<VkBufferCollectionFUCHSIA_T*>{
334+
collection, [&vulkan_provider =
335+
vulkan_provider_](VkBufferCollectionFUCHSIA collection) {
336+
vulkan_provider.vk().DestroyBufferCollectionFUCHSIA(
297337
vulkan_provider.vk_device(), collection, nullptr);
298338
}};
299339

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

309-
VkBufferCollectionPropertiesFUCHSIAX properties{
310-
.sType = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES_FUCHSIAX};
349+
VkBufferCollectionPropertiesFUCHSIA properties{
350+
.sType = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES_FUCHSIA};
311351
if (VK_CALL_LOG_ERROR(
312-
vulkan_provider_.vk().GetBufferCollectionPropertiesFUCHSIAX(
352+
vulkan_provider_.vk().GetBufferCollectionPropertiesFUCHSIA(
313353
vulkan_provider_.vk_device(), collection_, &properties)) !=
314354
VK_SUCCESS) {
315355
return false;
316356
}
317357

318-
VkImportMemoryBufferCollectionFUCHSIAX import_memory_info = {
319-
.sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIAX,
358+
VkImportMemoryBufferCollectionFUCHSIA import_memory_info = {
359+
.sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA,
320360
.pNext = nullptr,
321361
.collection = collection_,
322362
.index = 0,

shell/platform/fuchsia/flutter/vulkan_surface.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct VulkanImage {
3030
VulkanImage(VulkanImage&&) = default;
3131
VulkanImage& operator=(VulkanImage&&) = default;
3232

33-
VkBufferCollectionImageCreateInfoFUCHSIAX vk_collection_image_create_info;
33+
VkBufferCollectionImageCreateInfoFUCHSIA vk_collection_image_create_info;
3434
VkImageCreateInfo vk_image_create_info;
3535
VkMemoryRequirements vk_memory_requirements;
3636
vulkan::VulkanHandle<VkImage> vk_image;
@@ -169,7 +169,7 @@ class VulkanSurface final : public SurfaceProducerSurface {
169169
uint32_t buffer_id_ = 0;
170170
fuchsia::ui::composition::BufferCollectionImportToken import_token_;
171171
uint32_t image_id_ = 0;
172-
vulkan::VulkanHandle<VkBufferCollectionFUCHSIAX> collection_;
172+
vulkan::VulkanHandle<VkBufferCollectionFUCHSIA> collection_;
173173
zx::event acquire_event_;
174174
vulkan::VulkanHandle<VkSemaphore> acquire_semaphore_;
175175
std::unique_ptr<vulkan::VulkanCommandBuffer> command_buffer_;

vulkan/vulkan_device.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ VulkanDevice::VulkanDevice(VulkanProcTable& p_vk,
6969
VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
7070
VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME,
7171
VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
72-
VK_FUCHSIA_BUFFER_COLLECTION_X_EXTENSION_NAME,
72+
VK_FUCHSIA_BUFFER_COLLECTION_EXTENSION_NAME,
7373
#endif
7474
};
7575

vulkan/vulkan_proc_table.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,10 @@ bool VulkanProcTable::SetupDeviceProcAddresses(
141141
ACQUIRE_PROC(ImportSemaphoreZirconHandleFUCHSIA, handle);
142142
ACQUIRE_PROC(GetSemaphoreZirconHandleFUCHSIA, handle);
143143
ACQUIRE_PROC(GetMemoryZirconHandleFUCHSIA, handle);
144-
ACQUIRE_PROC(CreateBufferCollectionFUCHSIAX, handle);
145-
ACQUIRE_PROC(DestroyBufferCollectionFUCHSIAX, handle);
146-
ACQUIRE_PROC(SetBufferCollectionConstraintsFUCHSIAX, handle);
147-
ACQUIRE_PROC(GetBufferCollectionPropertiesFUCHSIAX, handle);
144+
ACQUIRE_PROC(CreateBufferCollectionFUCHSIA, handle);
145+
ACQUIRE_PROC(DestroyBufferCollectionFUCHSIA, handle);
146+
ACQUIRE_PROC(SetBufferCollectionImageConstraintsFUCHSIA, handle);
147+
ACQUIRE_PROC(GetBufferCollectionPropertiesFUCHSIA, handle);
148148
#endif // OS_FUCHSIA
149149
#endif // TEST_VULKAN_PROCS
150150
device_ = VulkanHandle<VkDevice>{handle, nullptr};

vulkan/vulkan_proc_table.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,10 @@ class VulkanProcTable : public fml::RefCountedThreadSafe<VulkanProcTable> {
120120
DEFINE_PROC(ImportSemaphoreZirconHandleFUCHSIA);
121121
DEFINE_PROC(GetSemaphoreZirconHandleFUCHSIA);
122122
DEFINE_PROC(GetMemoryZirconHandleFUCHSIA);
123-
DEFINE_PROC(CreateBufferCollectionFUCHSIAX);
124-
DEFINE_PROC(DestroyBufferCollectionFUCHSIAX);
125-
DEFINE_PROC(SetBufferCollectionConstraintsFUCHSIAX);
126-
DEFINE_PROC(GetBufferCollectionPropertiesFUCHSIAX);
123+
DEFINE_PROC(CreateBufferCollectionFUCHSIA);
124+
DEFINE_PROC(DestroyBufferCollectionFUCHSIA);
125+
DEFINE_PROC(SetBufferCollectionImageConstraintsFUCHSIA);
126+
DEFINE_PROC(GetBufferCollectionPropertiesFUCHSIA);
127127
#endif // OS_FUCHSIA
128128
#endif // TEST_VULKAN_PROCS
129129

0 commit comments

Comments
 (0)