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
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;
3336constexpr 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 ,
0 commit comments