diff --git a/system/vulkan/func_table.cpp b/system/vulkan/func_table.cpp index 44e385ded8f52fbe902dfce9aa4fc4dc8a4b94a9..f5b380e23c6df69a7ddf52a9c4b1ffa71f9299cf 100644 --- a/system/vulkan/func_table.cpp +++ b/system/vulkan/func_table.cpp @@ -666,7 +666,8 @@ static VkResult entry_vkCreateImageView( AEMU_SCOPED_TRACE("vkCreateImageView"); auto vkEnc = HostConnection::get()->vkEncoder(); VkResult vkCreateImageView_VkResult_return = (VkResult)0; - vkCreateImageView_VkResult_return = vkEnc->vkCreateImageView(device, pCreateInfo, pAllocator, pView); + auto resources = ResourceTracker::get(); + vkCreateImageView_VkResult_return = resources->on_vkCreateImageView(vkEnc, VK_SUCCESS, device, pCreateInfo, pAllocator, pView); return vkCreateImageView_VkResult_return; } static void entry_vkDestroyImageView( diff --git a/system/vulkan_enc/AndroidHardwareBuffer.cpp b/system/vulkan_enc/AndroidHardwareBuffer.cpp index 516791bd60e9c0c9ecdd1cb1a344bc2fb0e5abc2..5cebdc28ebad9881024a9afa30a149bd401ed2d1 100644 --- a/system/vulkan_enc/AndroidHardwareBuffer.cpp +++ b/system/vulkan_enc/AndroidHardwareBuffer.cpp @@ -59,9 +59,7 @@ VkResult getAndroidHardwareBufferPropertiesANDROID( VkAndroidHardwareBufferPropertiesANDROID* pProperties) { VkAndroidHardwareBufferFormatPropertiesANDROID* ahbFormatProps = - vk_find_struct<VkAndroidHardwareBufferFormatPropertiesANDROID>( - pProperties, - VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID); + vk_find_struct<VkAndroidHardwareBufferFormatPropertiesANDROID>(pProperties); if (ahbFormatProps) { AHardwareBuffer_Desc desc; @@ -101,7 +99,10 @@ VkResult getAndroidHardwareBufferPropertiesANDROID( ahbFormatProps->samplerYcbcrConversionComponents.b = VK_COMPONENT_SWIZZLE_IDENTITY; ahbFormatProps->samplerYcbcrConversionComponents.a = VK_COMPONENT_SWIZZLE_IDENTITY; - ahbFormatProps->suggestedYcbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601; + ahbFormatProps->suggestedYcbcrModel = + android_format_is_yuv(desc.format) ? + VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601 : + VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY; ahbFormatProps->suggestedYcbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_FULL; ahbFormatProps->suggestedXChromaOffset = VK_CHROMA_LOCATION_MIDPOINT; diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp index 3b5bdb85f79c486d85d43e4e635013bd598fa6e8..4e86c20adb518da9c8ab150e029f2070d6239a1b 100644 --- a/system/vulkan_enc/ResourceTracker.cpp +++ b/system/vulkan_enc/ResourceTracker.cpp @@ -14,6 +14,7 @@ // limitations under the License. #include "ResourceTracker.h" +#include "goldfish_vk_private_defs.h" #include "../OpenglSystemCommon/EmulatorFeatureInfo.h" @@ -26,31 +27,6 @@ typedef uint32_t zx_handle_t; void zx_handle_close(zx_handle_t) { } void zx_event_create(int, zx_handle_t*) { } -typedef struct VkImportMemoryZirconHandleInfoFUCHSIA { - VkStructureType sType; - const void* pNext; - VkExternalMemoryHandleTypeFlagBits handleType; - uint32_t handle; -} VkImportMemoryZirconHandleInfoFUCHSIA; - -typedef uint32_t VkBufferCollectionFUCHSIA; - -typedef struct VkImportMemoryBufferCollectionFUCHSIA { - VkStructureType sType; - const void* pNext; - VkBufferCollectionFUCHSIA collection; - uint32_t index; -} VkImportMemoryBufferCollectionFUCHSIA; - -#define VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA \ - ((VkStructureType)1001000000) -#define VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA \ - ((VkStructureType)1001000000) -#define VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA \ - ((VkStructureType)0x00000800) -#define VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TEMP_ZIRCON_EVENT_BIT_FUCHSIA \ - ((VkStructureType)0x00000020) - #include "AndroidHardwareBuffer.h" #endif // VK_USE_PLATFORM_ANDROID_KHR @@ -1548,24 +1524,19 @@ public: // }; const VkExportMemoryAllocateInfo* exportAllocateInfoPtr = - vk_find_struct<VkExportMemoryAllocateInfo>(pAllocateInfo, - VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO); + vk_find_struct<VkExportMemoryAllocateInfo>(pAllocateInfo); const VkImportAndroidHardwareBufferInfoANDROID* importAhbInfoPtr = - vk_find_struct<VkImportAndroidHardwareBufferInfoANDROID>(pAllocateInfo, - VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID); + vk_find_struct<VkImportAndroidHardwareBufferInfoANDROID>(pAllocateInfo); const VkImportMemoryBufferCollectionFUCHSIA* importBufferCollectionInfoPtr = - vk_find_struct<VkImportMemoryBufferCollectionFUCHSIA>(pAllocateInfo, - VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA); + vk_find_struct<VkImportMemoryBufferCollectionFUCHSIA>(pAllocateInfo); const VkImportMemoryZirconHandleInfoFUCHSIA* importVmoInfoPtr = - vk_find_struct<VkImportMemoryZirconHandleInfoFUCHSIA>(pAllocateInfo, - VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA); + vk_find_struct<VkImportMemoryZirconHandleInfoFUCHSIA>(pAllocateInfo); const VkMemoryDedicatedAllocateInfo* dedicatedAllocInfoPtr = - vk_find_struct<VkMemoryDedicatedAllocateInfo>(pAllocateInfo, - VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO); + vk_find_struct<VkMemoryDedicatedAllocateInfo>(pAllocateInfo); bool shouldPassThroughDedicatedAllocInfo = !exportAllocateInfoPtr && @@ -2116,8 +2087,7 @@ public: transformExternalResourceMemoryRequirementsForGuest(&reqs2->memoryRequirements); VkMemoryDedicatedRequirements* dedicatedReqs = - vk_find_struct<VkMemoryDedicatedRequirements>( - reqs2, VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS); + vk_find_struct<VkMemoryDedicatedRequirements>(reqs2); if (!dedicatedReqs) return; @@ -2146,8 +2116,7 @@ public: transformExternalResourceMemoryRequirementsForGuest(&reqs2->memoryRequirements); VkMemoryDedicatedRequirements* dedicatedReqs = - vk_find_struct<VkMemoryDedicatedRequirements>( - reqs2, VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS); + vk_find_struct<VkMemoryDedicatedRequirements>(reqs2); if (!dedicatedReqs) return; @@ -2167,9 +2136,7 @@ public: VkExternalMemoryImageCreateInfo localExtImgCi; const VkExternalMemoryImageCreateInfo* extImgCiPtr = - vk_find_struct<VkExternalMemoryImageCreateInfo>( - pCreateInfo, - VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO); + vk_find_struct<VkExternalMemoryImageCreateInfo>(pCreateInfo); if (extImgCiPtr) { localExtImgCi = vk_make_orphan_copy(*extImgCiPtr); vk_append_struct(&structChainIter, &localExtImgCi); @@ -2178,9 +2145,7 @@ public: #ifdef VK_USE_PLATFORM_ANDROID_KHR VkNativeBufferANDROID localAnb; const VkNativeBufferANDROID* anbInfoPtr = - vk_find_struct<VkNativeBufferANDROID>( - pCreateInfo, - VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID); + vk_find_struct<VkNativeBufferANDROID>(pCreateInfo); if (anbInfoPtr) { localAnb = vk_make_orphan_copy(*anbInfoPtr); vk_append_struct(&structChainIter, &localAnb); @@ -2188,9 +2153,7 @@ public: VkExternalFormatANDROID localExtFormatAndroid; const VkExternalFormatANDROID* extFormatAndroidPtr = - vk_find_struct<VkExternalFormatANDROID>( - pCreateInfo, - VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID); + vk_find_struct<VkExternalFormatANDROID>(pCreateInfo); if (extFormatAndroidPtr) { localExtFormatAndroid = vk_make_orphan_copy(*extFormatAndroidPtr); @@ -2208,9 +2171,7 @@ public: #ifdef VK_USE_PLATFORM_FUCHSIA const VkBufferCollectionImageCreateInfoFUCHSIA* extBufferCollectionPtr = - vk_find_struct<VkBufferCollectionImageCreateInfoFUCHSIA>( - pCreateInfo, - VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA); + vk_find_struct<VkBufferCollectionImageCreateInfoFUCHSIA>(pCreateInfo); if (extBufferCollectionPtr) { auto collection = reinterpret_cast<fuchsia::sysmem::BufferCollectionSyncPtr*>( extBufferCollectionPtr->collection); @@ -2288,9 +2249,7 @@ public: #ifdef VK_USE_PLATFORM_ANDROID_KHR const VkExternalFormatANDROID* extFormatAndroidPtr = - vk_find_struct<VkExternalFormatANDROID>( - pCreateInfo, - VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID); + vk_find_struct<VkExternalFormatANDROID>(pCreateInfo); if (extFormatAndroidPtr) { if (extFormatAndroidPtr->externalFormat) { localCreateInfo.format = @@ -2315,9 +2274,7 @@ public: #ifdef VK_USE_PLATFORM_ANDROID_KHR const VkExternalFormatANDROID* extFormatAndroidPtr = - vk_find_struct<VkExternalFormatANDROID>( - pCreateInfo, - VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID); + vk_find_struct<VkExternalFormatANDROID>(pCreateInfo); if (extFormatAndroidPtr) { if (extFormatAndroidPtr->externalFormat) { localCreateInfo.format = @@ -2412,8 +2369,7 @@ public: info.createInfo.pNext = nullptr; const VkExternalMemoryBufferCreateInfo* extBufCi = - vk_find_struct<VkExternalMemoryBufferCreateInfo>(pCreateInfo, - VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO); + vk_find_struct<VkExternalMemoryBufferCreateInfo>(pCreateInfo); if (!extBufCi) return res; @@ -2504,9 +2460,7 @@ public: VkSemaphoreCreateInfo finalCreateInfo = *pCreateInfo; const VkExportSemaphoreCreateInfoKHR* exportSemaphoreInfoPtr = - vk_find_struct<VkExportSemaphoreCreateInfoKHR>( - pCreateInfo, - VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR); + vk_find_struct<VkExportSemaphoreCreateInfoKHR>(pCreateInfo); #ifdef VK_USE_PLATFORM_FUCHSIA bool exportEvent = exportSemaphoreInfoPtr && @@ -3075,9 +3029,7 @@ public: (void)input_result; VkAndroidHardwareBufferUsageANDROID* output_ahw_usage = - vk_find_struct<VkAndroidHardwareBufferUsageANDROID>( - pImageFormatProperties, - VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID); + vk_find_struct<VkAndroidHardwareBufferUsageANDROID>(pImageFormatProperties); VkResult hostRes; @@ -3170,6 +3122,32 @@ public: return VK_SUCCESS; } + VkResult on_vkCreateImageView( + void* context, VkResult input_result, + VkDevice device, + const VkImageViewCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkImageView* pView) { + + VkEncoder* enc = (VkEncoder*)context; + (void)input_result; + + VkImageViewCreateInfo localCreateInfo = vk_make_orphan_copy(*pCreateInfo); + +#ifdef VK_USE_PLATFORM_ANDROID_KHR + const VkExternalFormatANDROID* extFormatAndroidPtr = + vk_find_struct<VkExternalFormatANDROID>(pCreateInfo); + if (extFormatAndroidPtr) { + if (extFormatAndroidPtr->externalFormat) { + localCreateInfo.format = + vk_format_from_android(extFormatAndroidPtr->externalFormat); + } + } +#endif + + return enc->vkCreateImageView(device, &localCreateInfo, pAllocator, pView); + } + uint32_t getApiVersionFromInstance(VkInstance instance) const { AutoLock lock(mLock); uint32_t api = kMinApiVersion; @@ -3811,6 +3789,16 @@ VkResult ResourceTracker::on_vkResetCommandBuffer( context, input_result, commandBuffer, flags); } +VkResult ResourceTracker::on_vkCreateImageView( + void* context, VkResult input_result, + VkDevice device, + const VkImageViewCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkImageView* pView) { + return mImpl->on_vkCreateImageView( + context, input_result, device, pCreateInfo, pAllocator, pView); +} + void ResourceTracker::deviceMemoryTransform_tohost( VkDeviceMemory* memory, uint32_t memoryCount, VkDeviceSize* offset, uint32_t offsetCount, diff --git a/system/vulkan_enc/ResourceTracker.h b/system/vulkan_enc/ResourceTracker.h index 1f073c8f24897fc8e93b4ee7c74b84ff1e351461..6429d6f4be713e016c22df07eb3b16d339ab0836 100644 --- a/system/vulkan_enc/ResourceTracker.h +++ b/system/vulkan_enc/ResourceTracker.h @@ -334,6 +334,13 @@ public: VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags); + VkResult on_vkCreateImageView( + void* context, VkResult input_result, + VkDevice device, + const VkImageViewCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkImageView* pView); + bool isMemoryTypeHostVisible(VkDevice device, uint32_t typeIndex) const; uint8_t* getMappedPointer(VkDeviceMemory memory); VkDeviceSize getMappedSize(VkDeviceMemory memory); diff --git a/system/vulkan_enc/goldfish_vk_private_defs.h b/system/vulkan_enc/goldfish_vk_private_defs.h index b1e5dcc29eb48c0020d9cf11879f15f5b4125cf4..15d30e141cd6f187ad28fd793a61f1acc4c169a7 100644 --- a/system/vulkan_enc/goldfish_vk_private_defs.h +++ b/system/vulkan_enc/goldfish_vk_private_defs.h @@ -443,6 +443,35 @@ typedef struct VkBufferCollectionImageCreateInfoFUCHSIA { ((VkStructureType)1001004005) #endif // VK_USE_PLATFORM_FUCHSIA +#ifdef VK_USE_PLATFORM_ANDROID_KHR + +typedef struct VkImportMemoryZirconHandleInfoFUCHSIA { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlagBits handleType; + uint32_t handle; +} VkImportMemoryZirconHandleInfoFUCHSIA; + +typedef uint32_t VkBufferCollectionFUCHSIA; + +typedef struct VkImportMemoryBufferCollectionFUCHSIA { + VkStructureType sType; + const void* pNext; + VkBufferCollectionFUCHSIA collection; + uint32_t index; +} VkImportMemoryBufferCollectionFUCHSIA; + +#define VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA \ + ((VkStructureType)1001000000) +#define VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA \ + ((VkStructureType)1001000000) +#define VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA \ + ((VkStructureType)0x00000800) +#define VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TEMP_ZIRCON_EVENT_BIT_FUCHSIA \ + ((VkStructureType)0x00000020) + +#endif // VK_USE_PLATFORM_ANDROID_KHR + #ifdef __cplusplus } // extern "C" #endif diff --git a/system/vulkan_enc/vk_format_info.h b/system/vulkan_enc/vk_format_info.h index 0337f95a088b79428bab3bda9a31173b9eb9e009..c70f45ff72a5651d3811433eafdb235ab836f345 100644 --- a/system/vulkan_enc/vk_format_info.h +++ b/system/vulkan_enc/vk_format_info.h @@ -78,6 +78,18 @@ android_format_from_vk(VkFormat vk_format) } } +static inline bool +android_format_is_yuv(unsigned android_format) +{ + switch (android_format) { + case HAL_PIXEL_FORMAT_NV12_Y_TILED_INTEL: + return true; + + default: + return false; + } +} + static inline VkImageAspectFlags vk_format_aspects(VkFormat format) { diff --git a/system/vulkan_enc/vk_struct_id.h b/system/vulkan_enc/vk_struct_id.h new file mode 100644 index 0000000000000000000000000000000000000000..893389c7e064ed616081237a970b5d8d61124c33 --- /dev/null +++ b/system/vulkan_enc/vk_struct_id.h @@ -0,0 +1,57 @@ +// Copyright (C) 2018 The Android Open Source Project +// Copyright (C) 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#pragma once + +#include <vulkan/vulkan.h> +#include "goldfish_vk_private_defs.h" + +template <class T> struct vk_get_vk_struct_id; + +#define REGISTER_VK_STRUCT_ID(T, ID) \ + template <> struct vk_get_vk_struct_id<T> { static constexpr VkStructureType id = ID; }; + +REGISTER_VK_STRUCT_ID(VkAndroidHardwareBufferPropertiesANDROID, VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID); +REGISTER_VK_STRUCT_ID(VkAndroidHardwareBufferFormatPropertiesANDROID, VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID); +REGISTER_VK_STRUCT_ID(VkAndroidHardwareBufferUsageANDROID, VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID); +REGISTER_VK_STRUCT_ID(VkBufferCreateInfo, VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO); +REGISTER_VK_STRUCT_ID(VkImageCreateInfo, VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO); +REGISTER_VK_STRUCT_ID(VkImageFormatProperties2, VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2); +REGISTER_VK_STRUCT_ID(VkNativeBufferANDROID, VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID); +REGISTER_VK_STRUCT_ID(VkExternalFormatANDROID, VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID); +REGISTER_VK_STRUCT_ID(VkExternalMemoryBufferCreateInfo, VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO); +REGISTER_VK_STRUCT_ID(VkExternalMemoryImageCreateInfo, VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO); +REGISTER_VK_STRUCT_ID(VkMemoryAllocateInfo, VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO); +REGISTER_VK_STRUCT_ID(VkMemoryDedicatedAllocateInfo, VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO); +REGISTER_VK_STRUCT_ID(VkMemoryDedicatedRequirements, VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS); +REGISTER_VK_STRUCT_ID(VkImportAndroidHardwareBufferInfoANDROID, VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID); +REGISTER_VK_STRUCT_ID(VkExportMemoryAllocateInfo, VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO); +REGISTER_VK_STRUCT_ID(VkMemoryRequirements2, VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2); +REGISTER_VK_STRUCT_ID(VkSemaphoreCreateInfo, VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO); +REGISTER_VK_STRUCT_ID(VkExportSemaphoreCreateInfoKHR, VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR); +REGISTER_VK_STRUCT_ID(VkSamplerYcbcrConversionCreateInfo, VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO); +REGISTER_VK_STRUCT_ID(VkImportColorBufferGOOGLE, VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE); +REGISTER_VK_STRUCT_ID(VkImageViewCreateInfo, VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO); + +#ifdef VK_USE_PLATFORM_ANDROID_KHR +// These two should be under Android +REGISTER_VK_STRUCT_ID(VkImportMemoryBufferCollectionFUCHSIA, VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA); +REGISTER_VK_STRUCT_ID(VkImportMemoryZirconHandleInfoFUCHSIA, VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA); +#endif // VK_USE_PLATFORM_ANDROID_KHR + +#ifdef VK_USE_PLATFORM_FUCHSIA +REGISTER_VK_STRUCT_ID(VkBufferCollectionImageCreateInfoFUCHSIA, VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA); +#endif // VK_USE_PLATFORM_FUCHSIA + +#undef REGISTER_VK_STRUCT_ID diff --git a/system/vulkan_enc/vk_util.h b/system/vulkan_enc/vk_util.h index 41410d34f4c46c98b1f2781517760c68b9507ee7..39de99189d6fd696f230a44c0a9e881efb2da872 100644 --- a/system/vulkan_enc/vk_util.h +++ b/system/vulkan_enc/vk_util.h @@ -27,6 +27,7 @@ #include <vulkan/vulkan.h> #include <stdlib.h> +#include "vk_struct_id.h" struct vk_struct_common { VkStructureType sType; @@ -196,23 +197,17 @@ __vk_find_struct(void *start, VkStructureType sType) return NULL; } -template <class T> void vk_is_vk_struct(T *s) +template <class T, class H> T* vk_find_struct(H* head) { - static_assert(sizeof(s->sType) == sizeof(VkStructureType), "Vulkan structures has the sType field of type VkStructureType"); - static_assert(sizeof(s->pNext) == sizeof(void*), "Vulkan structures has the pNext field of void*"); + vk_get_vk_struct_id<H>::id; + return static_cast<T*>(__vk_find_struct(static_cast<void*>(head), vk_get_vk_struct_id<T>::id)); } -template <class T, class H> T* vk_find_struct(H* head, VkStructureType sType) +template <class T, class H> const T* vk_find_struct(const H* head) { - vk_is_vk_struct(head); - return static_cast<T*>(__vk_find_struct(static_cast<void*>(head), sType)); -} - -template <class T, class H> const T* vk_find_struct(const H* head, VkStructureType sType) -{ - vk_is_vk_struct(head); + vk_get_vk_struct_id<H>::id; return static_cast<const T*>(__vk_find_struct(const_cast<void*>(static_cast<const void*>(head)), - sType)); + vk_get_vk_struct_id<T>::id)); } uint32_t vk_get_driver_version(void); @@ -233,14 +228,14 @@ template <class T> T vk_make_orphan_copy(const T& vk_struct) { template <class T> vk_struct_chain_iterator vk_make_chain_iterator(T* vk_struct) { - vk_is_vk_struct(vk_struct); + vk_get_vk_struct_id<T>::id; vk_struct_chain_iterator result = { reinterpret_cast<vk_struct_common*>(vk_struct) }; return result; } template <class T> void vk_append_struct(vk_struct_chain_iterator* i, T* vk_struct) { - vk_is_vk_struct(vk_struct); + vk_get_vk_struct_id<T>::id; vk_struct_common* p = i->value; if (p->pNext) {