diff --git a/renderdoc/driver/vulkan/CMakeLists.txt b/renderdoc/driver/vulkan/CMakeLists.txt
index e3384b7a8..c91c08d9a 100644
--- a/renderdoc/driver/vulkan/CMakeLists.txt
+++ b/renderdoc/driver/vulkan/CMakeLists.txt
@@ -1,6 +1,7 @@
set(sources
vk_common.cpp
vk_common.h
+ vk_next_chains.cpp
vk_core.cpp
vk_core.h
vk_counters.cpp
diff --git a/renderdoc/driver/vulkan/renderdoc_vulkan.vcxproj b/renderdoc/driver/vulkan/renderdoc_vulkan.vcxproj
index 875ebb0e2..493187a18 100644
--- a/renderdoc/driver/vulkan/renderdoc_vulkan.vcxproj
+++ b/renderdoc/driver/vulkan/renderdoc_vulkan.vcxproj
@@ -105,6 +105,7 @@
true
+
diff --git a/renderdoc/driver/vulkan/renderdoc_vulkan.vcxproj.filters b/renderdoc/driver/vulkan/renderdoc_vulkan.vcxproj.filters
index f12e61217..ce8458a71 100644
--- a/renderdoc/driver/vulkan/renderdoc_vulkan.vcxproj.filters
+++ b/renderdoc/driver/vulkan/renderdoc_vulkan.vcxproj.filters
@@ -130,6 +130,9 @@
Util
+
+ Util
+
diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp
index 9d6aac18e..feff16798 100644
--- a/renderdoc/driver/vulkan/vk_common.cpp
+++ b/renderdoc/driver/vulkan/vk_common.cpp
@@ -285,533 +285,6 @@ bool VkInitParams::IsSupportedVersion(uint64_t ver)
return false;
}
-// utility function for when we're modifying one struct in a pNext chain, this
-// lets us just copy across a struct unmodified into some temporary memory and
-// append it onto a pNext chain we're building
-template
-void CopyNextChainedStruct(byte *&tempMem, const VkBaseInStructure *nextInput,
- VkBaseInStructure *&nextChainTail)
-{
- const VkStruct *instruct = (const VkStruct *)nextInput;
- VkStruct *outstruct = (VkStruct *)tempMem;
-
- tempMem = (byte *)(outstruct + 1);
-
- // copy the struct, nothing to unwrap
- *outstruct = *instruct;
-
- // default to NULL. It will be overwritten next time if there is a next object
- outstruct->pNext = NULL;
-
- // append this onto the chain
- nextChainTail->pNext = (const VkBaseInStructure *)outstruct;
- nextChainTail = (VkBaseInStructure *)outstruct;
-}
-
-// this is similar to the above function, but for use after we've modified a struct locally
-// e.g. to unwrap some members or patch flags, etc.
-template
-void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct,
- VkBaseInStructure *&nextChainTail)
-{
- tempMem = (byte *)(outputStruct + 1);
-
- // default to NULL. It will be overwritten in the next step if there is a next object
- outputStruct->pNext = NULL;
-
- // append this onto the chain
- nextChainTail->pNext = (const VkBaseInStructure *)outputStruct;
- nextChainTail = (VkBaseInStructure *)outputStruct;
-}
-
-size_t GetNextPatchSize(const void *pNext)
-{
- const VkBaseInStructure *next = (const VkBaseInStructure *)pNext;
- size_t memSize = 0;
-
- while(next)
- {
- // VkMemoryAllocateInfo
- if(next->sType == VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV)
- memSize += sizeof(VkDedicatedAllocationMemoryAllocateInfoNV);
- else if(next->sType == VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO)
- memSize += sizeof(VkMemoryDedicatedAllocateInfo);
- else if(next->sType == VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO)
- memSize += sizeof(VkMemoryAllocateFlagsInfo);
- else if(next->sType == VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV)
- memSize += sizeof(VkExportMemoryAllocateInfoNV);
- else if(next->sType == VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO)
- memSize += sizeof(VkExportMemoryAllocateInfo);
- else if(next->sType == VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR)
- memSize += sizeof(VkImportMemoryFdInfoKHR);
-
-#ifdef VK_NV_external_memory_win32
- else if(next->sType == VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV)
- memSize += sizeof(VkExportMemoryWin32HandleInfoNV);
- else if(next->sType == VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV)
- memSize += sizeof(VkImportMemoryWin32HandleInfoNV);
-#else
- else if(next->sType == VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV)
- RDCERR("Support for VK_NV_external_memory_win32 not compiled in");
- else if(next->sType == VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV)
- RDCERR("Support for VK_NV_external_memory_win32 not compiled in");
-#endif
-
-#ifdef VK_KHR_external_memory_win32
- else if(next->sType == VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR)
- memSize += sizeof(VkExportMemoryWin32HandleInfoKHR);
- else if(next->sType == VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR)
- memSize += sizeof(VkImportMemoryWin32HandleInfoKHR);
-#else
- else if(next->sType == VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR)
- RDCERR("Support for VK_KHR_external_memory_win32 not compiled in");
- else if(next->sType == VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR)
- RDCERR("Support for VK_KHR_external_memory_win32 not compiled in");
-#endif
-
- // VkSamplerCreateInfo
- else if(next->sType == VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO)
- memSize += sizeof(VkSamplerYcbcrConversionInfo);
- else if(next->sType == VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT)
- memSize += sizeof(VkSamplerReductionModeCreateInfoEXT);
-
- // VkSemaphoreCreateInfo
- else if(next->sType == VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO)
- memSize += sizeof(VkExportSemaphoreCreateInfoKHR);
-#ifdef VK_KHR_external_semaphore_win32
- else if(next->sType == VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR)
- memSize += sizeof(VkExportSemaphoreWin32HandleInfoKHR);
-#else
- else if(next->sType == VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR)
- RDCERR("Support for VK_KHR_external_memory_win32 not compiled in");
-#endif
-
- // VkFenceCreateInfo
- else if(next->sType == VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO)
- memSize += sizeof(VkExportFenceCreateInfoKHR);
-#ifdef VK_KHR_external_fence_win32
- else if(next->sType == VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR)
- memSize += sizeof(VkExportFenceWin32HandleInfoKHR);
-#else
- else if(next->sType == VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR)
- RDCERR("Support for VK_KHR_external_memory_win32 not compiled in");
-#endif
-
- // VkImageCreateInfo
- else if(next->sType == VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO)
- memSize += sizeof(VkExternalMemoryImageCreateInfo);
- else if(next->sType == VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV)
- memSize += sizeof(VkExternalMemoryImageCreateInfoNV);
- else if(next->sType == VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR)
- memSize += sizeof(VkImageSwapchainCreateInfoKHR);
- else if(next->sType == VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV)
- memSize += sizeof(VkDedicatedAllocationImageCreateInfoNV);
- else if(next->sType == VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR)
- memSize += sizeof(VkImageFormatListCreateInfoKHR);
-
- // VkBufferCreateInfo
- else if(next->sType == VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO)
- memSize += sizeof(VkExternalMemoryBufferCreateInfoKHR);
- else if(next->sType == VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV)
- memSize += sizeof(VkDedicatedAllocationBufferCreateInfoNV);
- else if(next->sType == VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO)
- memSize += sizeof(VkBindBufferMemoryDeviceGroupInfo);
-
- // VkBindImageMemoryInfo
- else if(next->sType == VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR)
- memSize += sizeof(VkBindImageMemorySwapchainInfoKHR);
- else if(next->sType == VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO)
- memSize += sizeof(VkBindImageMemoryDeviceGroupInfo);
- else if(next->sType == VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO)
- memSize += sizeof(VkBindImagePlaneMemoryInfo);
-
- // VkSwapchainCreateInfoKHR
- else if(next->sType == VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT)
- memSize += sizeof(VkSwapchainCounterCreateInfoEXT);
- else if(next->sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR)
- memSize += sizeof(VkDeviceGroupSwapchainCreateInfoKHR);
-
- // VkDeviceQueueCreateInfo
- else if(next->sType == VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT)
- memSize += sizeof(VkDeviceQueueGlobalPriorityCreateInfoEXT);
-
- // VkSubmitInfo
- else if(next->sType == VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO)
- memSize += sizeof(VkProtectedSubmitInfo);
- else if(next->sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO)
- memSize += sizeof(VkDeviceGroupSubmitInfo);
-
-#if defined(VK_KHR_win32_keyed_mutex) || defined(VK_NV_win32_keyed_mutex)
- else if(next->sType == VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV ||
- next->sType == VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR)
- {
- // the KHR and NV structs are identical
- memSize += sizeof(VkWin32KeyedMutexAcquireReleaseInfoKHR);
-
- VkWin32KeyedMutexAcquireReleaseInfoKHR *info = (VkWin32KeyedMutexAcquireReleaseInfoKHR *)next;
- memSize += info->acquireCount * sizeof(VkDeviceMemory);
- memSize += info->releaseCount * sizeof(VkDeviceMemory);
- }
-#else
- else if(next->sType == VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV ||
- next->sType == VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR)
- {
- RDCERR("Support for VK_KHR_win32_keyed_mutex / VK_NV_win32_keyed_mutex not compiled in");
- }
-#endif
-
- // VkBindSparseInfo
- else if(next->sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO)
- memSize += sizeof(VkDeviceGroupBindSparseInfo);
-
- // VkCommandBufferBeginInfo
- else if(next->sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO)
- memSize += sizeof(VkDeviceGroupCommandBufferBeginInfo);
-
- // VkRenderPassBeginInfo
- else if(next->sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO)
- memSize += sizeof(VkDeviceGroupRenderPassBeginInfo);
-
- // VkShaderModuleCreateInfo
- if(next->sType == VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT)
- memSize += sizeof(VkValidationCacheCreateInfoEXT);
-
- next = next->pNext;
- }
-
- return memSize;
-}
-
-void UnwrapNextChain(CaptureState state, const char *structName, byte *&tempMem,
- VkBaseInStructure *infoStruct)
-{
- // during capture, this walks the pNext chain and either copies structs that can be passed
- // straight through, or copies and modifies any with vulkan objects that need to be unwrapped.
- //
- // during replay, we do the same thing to prepare for dispatching to the driver, but we also strip
- // out any structs we don't want to replay - e.g. external memory. This means the data is
- // serialised and available for future use and for user inspection, but isn't replayed when not
- // necesary.
-
- VkBaseInStructure *nextChainTail = infoStruct;
- const VkBaseInStructure *nextInput = (const VkBaseInStructure *)infoStruct->pNext;
-
- // start with an empty chain. Every call to AppendModifiedChainedStruct / CopyNextChainedStruct
- // pushes on a new entry, but if there's only one entry in the list and it's one we want to skip,
- // this needs to start at NULL.
- nextChainTail->pNext = NULL;
- while(nextInput)
- {
- if(nextInput->sType == VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV ||
- nextInput->sType == VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO)
- {
- // KHR and NV structs are identical
- const VkMemoryDedicatedAllocateInfo *dedicatedIn =
- (const VkMemoryDedicatedAllocateInfo *)nextInput;
- VkMemoryDedicatedAllocateInfo *dedicatedOut = (VkMemoryDedicatedAllocateInfo *)tempMem;
-
- // copy and unwrap the struct
- dedicatedOut->sType = dedicatedIn->sType;
- dedicatedOut->buffer = Unwrap(dedicatedIn->buffer);
- dedicatedOut->image = Unwrap(dedicatedIn->image);
-
- // we replay this
- AppendModifiedChainedStruct(tempMem, dedicatedOut, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO)
- {
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV)
- {
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO)
- {
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR)
- {
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR)
- {
-#ifdef VK_KHR_external_memory_win32
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
-#else
- RDCERR("Support for VK_KHR_external_memory_win32 not compiled in");
-#endif
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR)
- {
-#ifdef VK_KHR_external_memory_win32
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
-#else
- RDCERR("Support for VK_KHR_external_memory_win32 not compiled in");
-#endif
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV)
- {
-#ifdef VK_NV_external_memory_win32
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
-#else
- RDCERR("Support for VK_NV_external_memory_win32 not compiled in");
-#endif
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV)
- {
-#ifdef VK_NV_external_memory_win32
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
-#else
- RDCERR("Support for VK_NV_external_memory_win32 not compiled in");
-#endif
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO)
- {
- const VkSamplerYcbcrConversionInfo *ycbcrIn = (const VkSamplerYcbcrConversionInfo *)nextInput;
- VkSamplerYcbcrConversionInfo *ycbcrOut = (VkSamplerYcbcrConversionInfo *)tempMem;
-
- // copy and unwrap the struct
- ycbcrOut->sType = ycbcrIn->sType;
- ycbcrOut->conversion = Unwrap(ycbcrIn->conversion);
-
- AppendModifiedChainedStruct(tempMem, ycbcrOut, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT)
- {
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO)
- {
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR)
- {
-#ifdef VK_KHR_external_semaphore_win32
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
-#else
- RDCERR("Support for VK_KHR_external_semaphore_win32 not compiled in");
-#endif
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO)
- {
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR)
- {
-#ifdef VK_KHR_external_fence_win32
-
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
-#else
- RDCERR("Support for VK_KHR_external_fence_win32 not compiled in");
-#endif
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO)
- {
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV)
- {
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR)
- {
- if(IsCaptureMode(state))
- {
- const VkImageSwapchainCreateInfoKHR *swapIn =
- (const VkImageSwapchainCreateInfoKHR *)nextInput;
- VkImageSwapchainCreateInfoKHR *swapOut = (VkImageSwapchainCreateInfoKHR *)tempMem;
-
- // copy and unwrap the struct
- swapOut->sType = swapIn->sType;
- swapOut->swapchain = Unwrap(swapIn->swapchain);
-
- AppendModifiedChainedStruct(tempMem, swapOut, nextChainTail);
- }
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV)
- {
- CopyNextChainedStruct(tempMem, nextInput,
- nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO)
- {
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV)
- {
- CopyNextChainedStruct(tempMem, nextInput,
- nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO)
- {
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR)
- {
- if(IsCaptureMode(state))
- {
- const VkBindImageMemorySwapchainInfoKHR *swapIn =
- (const VkBindImageMemorySwapchainInfoKHR *)nextInput;
- VkBindImageMemorySwapchainInfoKHR *swapOut = (VkBindImageMemorySwapchainInfoKHR *)tempMem;
-
- // copy and unwrap the struct
- swapOut->sType = swapIn->sType;
- swapOut->swapchain = Unwrap(swapIn->swapchain);
-
- AppendModifiedChainedStruct(tempMem, swapOut, nextChainTail);
- }
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO)
- {
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO)
- {
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT)
- {
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR)
- {
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT)
- {
- CopyNextChainedStruct(tempMem, nextInput,
- nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO)
- {
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO)
- {
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV ||
- nextInput->sType == VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR)
- {
-#if defined(VK_KHR_win32_keyed_mutex) || defined(VK_NV_win32_keyed_mutex)
- if(IsCaptureMode(state))
- {
- // KHR and NV structs are identical
- const VkWin32KeyedMutexAcquireReleaseInfoKHR *mutexIn =
- (const VkWin32KeyedMutexAcquireReleaseInfoKHR *)nextInput;
- VkWin32KeyedMutexAcquireReleaseInfoKHR *mutexOut =
- (VkWin32KeyedMutexAcquireReleaseInfoKHR *)tempMem;
-
- // append immediately so tempMem is incremented
- AppendModifiedChainedStruct(tempMem, mutexOut, nextChainTail);
-
- // copy sType and pointers we don't need to patch
- mutexOut->sType = mutexIn->sType;
- mutexOut->acquireCount = mutexIn->acquireCount;
- mutexOut->pAcquireKeys = mutexIn->pAcquireKeys;
- mutexOut->pAcquireTimeouts = mutexIn->pAcquireTimeouts;
- mutexOut->releaseCount = mutexIn->releaseCount;
- mutexOut->pReleaseKeys = mutexIn->pReleaseKeys;
-
- // allocate unwrapped arrays
- VkDeviceMemory *unwrappedAcquires = (VkDeviceMemory *)tempMem;
- tempMem += sizeof(VkDeviceMemory) * mutexIn->acquireCount;
- VkDeviceMemory *unwrappedReleases = (VkDeviceMemory *)tempMem;
- tempMem += sizeof(VkDeviceMemory) * mutexIn->releaseCount;
-
- // unwrap the arrays
- for(uint32_t mem = 0; mem < mutexIn->acquireCount; mem++)
- unwrappedAcquires[mem] = Unwrap(mutexIn->pAcquireSyncs[mem]);
- for(uint32_t mem = 0; mem < mutexIn->releaseCount; mem++)
- unwrappedReleases[mem] = Unwrap(mutexIn->pReleaseSyncs[mem]);
-
- mutexOut->pAcquireSyncs = unwrappedAcquires;
- mutexOut->pReleaseSyncs = unwrappedReleases;
- }
-#else
- RDCERR("Support for VK_KHR_win32_keyed_mutex / VK_NV_win32_keyed_mutex not compiled in");
-#endif
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO)
- {
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO)
- {
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO)
- {
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR)
- {
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO)
- {
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO)
- {
- CopyNextChainedStruct(tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO)
- {
- CopyNextChainedStruct(tempMem, nextInput,
- nextChainTail);
- }
- else if(nextInput->sType ==
- VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT)
- {
- CopyNextChainedStruct(
- tempMem, nextInput, nextChainTail);
- }
- else if(nextInput->sType ==
- VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO)
- {
- CopyNextChainedStruct(tempMem, nextInput,
- nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT)
- {
- CopyNextChainedStruct(tempMem, nextInput,
- nextChainTail);
- }
- else if(nextInput->sType == VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT)
- {
- if(IsCaptureMode(state))
- CopyNextChainedStruct(tempMem, nextInput,
- nextChainTail);
- }
- else
- {
- RDCERR("unrecognised struct %d in %s pNext chain", nextInput->sType, structName);
- // can't patch this struct, have to just copy it and hope it's the last in the chain
- nextChainTail->pNext = nextInput;
- }
-
- nextInput = nextInput->pNext;
- }
-}
-
VkAccessFlags MakeAccessMask(VkImageLayout layout)
{
switch(layout)
diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h
index 1755c02c7..ab3eb4716 100644
--- a/renderdoc/driver/vulkan/vk_common.h
+++ b/renderdoc/driver/vulkan/vk_common.h
@@ -271,27 +271,30 @@ VkBaseInStructure *FindNextStruct(VkStruct *haystack, VkStructureType needle)
template
bool RemoveNextStruct(VkStruct *haystack, VkStructureType needle)
{
+ bool ret = false;
+
// start from the haystack, and iterate
VkBaseInStructure *root = (VkBaseInStructure *)haystack;
while(root && root->pNext)
{
// at each point, if the *next* struct is the needle, then point our next pointer at whatever
// its was - either the next in the chain or NULL if it was at the end. Then we can return true
- // because we removed the struct (we assume no duplicates).
+ // because we removed the struct. We keep going to handle duplicates, but we continue and skip
+ // the list iterate as we now have a new root->pNext.
// Note that this can't remove the first struct in the chain but that's expected, we only want
// to remove extension structs.
if(root->pNext->sType == needle)
{
root->pNext = root->pNext->pNext;
- return true;
+ ret = true;
+ continue;
}
// move to the next struct
root = (VkBaseInStructure *)root->pNext;
}
- // struct wasn't found, bail
- return false;
+ return ret;
}
enum class MemoryScope : uint8_t
@@ -547,350 +550,607 @@ SERIALISE_VK_HANDLES();
// declare reflect-able types
-DECLARE_REFLECTION_STRUCT(VkAllocationCallbacks);
-DECLARE_REFLECTION_STRUCT(VkOffset2D);
-DECLARE_REFLECTION_STRUCT(VkExtent2D);
-DECLARE_REFLECTION_STRUCT(VkMemoryType);
-DECLARE_REFLECTION_STRUCT(VkMemoryHeap);
-DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceLimits);
-DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSparseProperties);
-DECLARE_REFLECTION_STRUCT(VkQueueFamilyProperties);
-DECLARE_REFLECTION_STRUCT(VkExtent3D);
-DECLARE_REFLECTION_STRUCT(VkPipelineShaderStageCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkOffset3D);
-DECLARE_REFLECTION_STRUCT(VkCommandBufferInheritanceInfo);
-DECLARE_REFLECTION_STRUCT(VkPipelineVertexInputStateCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkSparseBufferMemoryBindInfo);
-DECLARE_REFLECTION_STRUCT(VkSparseImageOpaqueMemoryBindInfo);
-DECLARE_REFLECTION_STRUCT(VkSparseImageMemoryBindInfo);
-DECLARE_REFLECTION_STRUCT(VkAttachmentDescription);
-DECLARE_REFLECTION_STRUCT(VkSubpassDescription);
-DECLARE_REFLECTION_STRUCT(VkSubpassDependency);
-DECLARE_REFLECTION_STRUCT(VkClearValue);
-DECLARE_REFLECTION_STRUCT(VkClearColorValue);
-DECLARE_REFLECTION_STRUCT(VkClearDepthStencilValue);
-DECLARE_REFLECTION_STRUCT(VkClearAttachment);
-DECLARE_REFLECTION_STRUCT(VkClearRect);
-DECLARE_REFLECTION_STRUCT(VkViewport);
-DECLARE_REFLECTION_STRUCT(VkPipelineColorBlendAttachmentState);
-DECLARE_REFLECTION_STRUCT(VkDescriptorPoolSize);
-DECLARE_REFLECTION_STRUCT(VkDescriptorImageInfo);
-DECLARE_REFLECTION_STRUCT(VkDescriptorBufferInfo);
-DECLARE_REFLECTION_STRUCT(VkSpecializationInfo);
-DECLARE_REFLECTION_STRUCT(VkAttachmentReference);
-DECLARE_REFLECTION_STRUCT(VkSparseImageMemoryBind);
-DECLARE_REFLECTION_STRUCT(VkVertexInputBindingDescription);
-DECLARE_REFLECTION_STRUCT(VkVertexInputAttributeDescription);
-DECLARE_REFLECTION_STRUCT(VkSpecializationMapEntry);
-DECLARE_REFLECTION_STRUCT(VkRect2D);
-DECLARE_REFLECTION_STRUCT(VkDeviceQueueCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceFeatures);
-DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMemoryProperties);
-DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceProperties);
-DECLARE_REFLECTION_STRUCT(VkDeviceCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkBufferCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkBufferViewCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkImageCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkMemoryRequirements);
-DECLARE_REFLECTION_STRUCT(VkImageViewCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkSparseMemoryBind);
+// pNext structs - always have deserialise for the next chain
+DECLARE_REFLECTION_STRUCT(VkAcquireNextImageInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkApplicationInfo);
+DECLARE_REFLECTION_STRUCT(VkAttachmentDescription2KHR);
+DECLARE_REFLECTION_STRUCT(VkAttachmentReference2KHR);
+DECLARE_REFLECTION_STRUCT(VkBindBufferMemoryDeviceGroupInfo);
+DECLARE_REFLECTION_STRUCT(VkBindBufferMemoryInfo);
+DECLARE_REFLECTION_STRUCT(VkBindImageMemoryDeviceGroupInfo);
+DECLARE_REFLECTION_STRUCT(VkBindImageMemoryInfo);
+DECLARE_REFLECTION_STRUCT(VkBindImageMemorySwapchainInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkBindImagePlaneMemoryInfo);
DECLARE_REFLECTION_STRUCT(VkBindSparseInfo);
-DECLARE_REFLECTION_STRUCT(VkSubmitInfo);
-DECLARE_REFLECTION_STRUCT(VkFramebufferCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkRenderPassCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkRenderPassBeginInfo);
-DECLARE_REFLECTION_STRUCT(VkPipelineInputAssemblyStateCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkPipelineTessellationStateCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkPipelineViewportStateCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkPipelineRasterizationStateCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkPipelineMultisampleStateCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkPipelineDepthStencilStateCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkPipelineColorBlendStateCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkPipelineDynamicStateCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkPipelineLayoutCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkPushConstantRange);
-DECLARE_REFLECTION_STRUCT(VkDescriptorSetLayoutBinding);
-DECLARE_REFLECTION_STRUCT(VkDescriptorSetLayoutCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkDescriptorPoolCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkDescriptorSetAllocateInfo);
-DECLARE_REFLECTION_STRUCT(VkWriteDescriptorSet);
-DECLARE_REFLECTION_STRUCT(VkCopyDescriptorSet);
-DECLARE_REFLECTION_STRUCT(VkCommandPoolCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkBufferCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkBufferMemoryBarrier);
+DECLARE_REFLECTION_STRUCT(VkBufferMemoryRequirementsInfo2);
+DECLARE_REFLECTION_STRUCT(VkBufferViewCreateInfo);
DECLARE_REFLECTION_STRUCT(VkCommandBufferAllocateInfo);
DECLARE_REFLECTION_STRUCT(VkCommandBufferBeginInfo);
-DECLARE_REFLECTION_STRUCT(VkStencilOpState);
-DECLARE_REFLECTION_STRUCT(VkQueryPoolCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkSemaphoreCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkCommandBufferInheritanceInfo);
+DECLARE_REFLECTION_STRUCT(VkCommandPoolCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkComputePipelineCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkCopyDescriptorSet);
+DECLARE_REFLECTION_STRUCT(VkDebugMarkerMarkerInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkDebugMarkerObjectNameInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkDebugMarkerObjectTagInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkDebugReportCallbackCreateInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkDebugUtilsLabelEXT);
+DECLARE_REFLECTION_STRUCT(VkDebugUtilsMessengerCallbackDataEXT);
+DECLARE_REFLECTION_STRUCT(VkDebugUtilsMessengerCreateInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkDebugUtilsObjectNameInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkDebugUtilsObjectTagInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkDedicatedAllocationBufferCreateInfoNV);
+DECLARE_REFLECTION_STRUCT(VkDedicatedAllocationImageCreateInfoNV);
+DECLARE_REFLECTION_STRUCT(VkDedicatedAllocationMemoryAllocateInfoNV);
+DECLARE_REFLECTION_STRUCT(VkDescriptorPoolCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkDescriptorSetAllocateInfo);
+DECLARE_REFLECTION_STRUCT(VkDescriptorSetLayoutCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkDescriptorSetLayoutSupport);
+DECLARE_REFLECTION_STRUCT(VkDescriptorUpdateTemplateCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkDeviceCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkDeviceEventInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkDeviceGroupBindSparseInfo);
+DECLARE_REFLECTION_STRUCT(VkDeviceGroupCommandBufferBeginInfo);
+DECLARE_REFLECTION_STRUCT(VkDeviceGroupDeviceCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkDeviceGroupPresentCapabilitiesKHR);
+DECLARE_REFLECTION_STRUCT(VkDeviceGroupPresentInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkDeviceGroupRenderPassBeginInfo);
+DECLARE_REFLECTION_STRUCT(VkDeviceGroupSubmitInfo);
+DECLARE_REFLECTION_STRUCT(VkDeviceGroupSwapchainCreateInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkDeviceQueueCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkDeviceQueueGlobalPriorityCreateInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkDeviceQueueInfo2);
+DECLARE_REFLECTION_STRUCT(VkDisplayEventInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkDisplayModeProperties2KHR);
+DECLARE_REFLECTION_STRUCT(VkDisplayPlaneCapabilities2KHR);
+DECLARE_REFLECTION_STRUCT(VkDisplayPlaneInfo2KHR);
+DECLARE_REFLECTION_STRUCT(VkDisplayPlaneProperties2KHR);
+DECLARE_REFLECTION_STRUCT(VkDisplayPowerInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkDisplayPresentInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkDisplayProperties2KHR);
DECLARE_REFLECTION_STRUCT(VkEventCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkExportFenceCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkExportMemoryAllocateInfo);
+DECLARE_REFLECTION_STRUCT(VkExportMemoryAllocateInfoNV);
+DECLARE_REFLECTION_STRUCT(VkExportSemaphoreCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkExternalBufferProperties);
+DECLARE_REFLECTION_STRUCT(VkExternalFenceProperties);
+DECLARE_REFLECTION_STRUCT(VkExternalImageFormatProperties);
+DECLARE_REFLECTION_STRUCT(VkExternalMemoryBufferCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkExternalMemoryImageCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkExternalMemoryImageCreateInfoNV);
+DECLARE_REFLECTION_STRUCT(VkExternalSemaphoreProperties);
DECLARE_REFLECTION_STRUCT(VkFenceCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkSamplerCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkPipelineCacheCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkShaderModuleCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkImageSubresourceRange);
-DECLARE_REFLECTION_STRUCT(VkImageSubresource);
-DECLARE_REFLECTION_STRUCT(VkImageSubresourceLayers);
+DECLARE_REFLECTION_STRUCT(VkFenceGetFdInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkFormatProperties2);
+DECLARE_REFLECTION_STRUCT(VkFramebufferCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkGraphicsPipelineCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkImageCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkImageFormatListCreateInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkImageFormatProperties2);
+DECLARE_REFLECTION_STRUCT(VkImageMemoryBarrier);
+DECLARE_REFLECTION_STRUCT(VkImageMemoryRequirementsInfo2);
+DECLARE_REFLECTION_STRUCT(VkImagePlaneMemoryRequirementsInfo);
+DECLARE_REFLECTION_STRUCT(VkImageSparseMemoryRequirementsInfo2);
+DECLARE_REFLECTION_STRUCT(VkImageSwapchainCreateInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkImageViewASTCDecodeModeEXT);
+DECLARE_REFLECTION_STRUCT(VkImageViewCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkImageViewUsageCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkImportFenceFdInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkImportMemoryFdInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkImportSemaphoreFdInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkInstanceCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkLayerDeviceCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkLayerInstanceCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkMappedMemoryRange);
+DECLARE_REFLECTION_STRUCT(VkMemoryAllocateFlagsInfo);
DECLARE_REFLECTION_STRUCT(VkMemoryAllocateInfo);
DECLARE_REFLECTION_STRUCT(VkMemoryBarrier);
-DECLARE_REFLECTION_STRUCT(VkBufferMemoryBarrier);
-DECLARE_REFLECTION_STRUCT(VkImageMemoryBarrier);
-DECLARE_REFLECTION_STRUCT(VkGraphicsPipelineCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkComputePipelineCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkComponentMapping);
-DECLARE_REFLECTION_STRUCT(VkMappedMemoryRange);
-DECLARE_REFLECTION_STRUCT(VkBufferImageCopy);
-DECLARE_REFLECTION_STRUCT(VkBufferCopy);
-DECLARE_REFLECTION_STRUCT(VkImageCopy);
-DECLARE_REFLECTION_STRUCT(VkImageBlit);
-DECLARE_REFLECTION_STRUCT(VkImageResolve);
-DECLARE_REFLECTION_STRUCT(VkSwapchainCreateInfoKHR);
-DECLARE_REFLECTION_STRUCT(VkDebugMarkerMarkerInfoEXT);
-DECLARE_REFLECTION_STRUCT(VkDescriptorUpdateTemplateEntry);
-DECLARE_REFLECTION_STRUCT(VkDescriptorUpdateTemplateCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkBindBufferMemoryInfo);
-DECLARE_REFLECTION_STRUCT(VkBindImageMemoryInfo);
-DECLARE_REFLECTION_STRUCT(VkPipelineRasterizationConservativeStateCreateInfoEXT);
-DECLARE_REFLECTION_STRUCT(VkPipelineTessellationDomainOriginStateCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkImageViewUsageCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkInputAttachmentAspectReference);
-DECLARE_REFLECTION_STRUCT(VkRenderPassInputAttachmentAspectCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkVertexInputBindingDivisorDescriptionEXT);
-DECLARE_REFLECTION_STRUCT(VkPipelineVertexInputDivisorStateCreateInfoEXT);
-DECLARE_REFLECTION_STRUCT(VkSamplerReductionModeCreateInfoEXT);
-DECLARE_REFLECTION_STRUCT(VkDebugUtilsLabelEXT);
-DECLARE_REFLECTION_STRUCT(VkSamplerYcbcrConversionCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkRenderPassMultiviewCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkDeviceQueueInfo2);
-DECLARE_REFLECTION_STRUCT(VkExportMemoryAllocateInfoNV);
-DECLARE_REFLECTION_STRUCT(VkExternalMemoryImageCreateInfoNV);
-DECLARE_REFLECTION_STRUCT(VkExternalMemoryImageCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkExportMemoryAllocateInfo);
-DECLARE_REFLECTION_STRUCT(VkExternalMemoryBufferCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkImportMemoryFdInfoKHR);
-DECLARE_REFLECTION_STRUCT(VkExportSemaphoreCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkExportFenceCreateInfo);
-DECLARE_REFLECTION_STRUCT(VkSwapchainCounterCreateInfoEXT);
-DECLARE_REFLECTION_STRUCT(VkDedicatedAllocationMemoryAllocateInfoNV);
-DECLARE_REFLECTION_STRUCT(VkDedicatedAllocationImageCreateInfoNV);
-DECLARE_REFLECTION_STRUCT(VkDedicatedAllocationBufferCreateInfoNV);
DECLARE_REFLECTION_STRUCT(VkMemoryDedicatedAllocateInfo);
-DECLARE_REFLECTION_STRUCT(VkDeviceQueueGlobalPriorityCreateInfoEXT);
-DECLARE_REFLECTION_STRUCT(VkBindImagePlaneMemoryInfo);
-DECLARE_REFLECTION_STRUCT(VkSamplerYcbcrConversionInfo);
-DECLARE_REFLECTION_STRUCT(VkDeviceGroupSwapchainCreateInfoKHR);
-DECLARE_REFLECTION_STRUCT(VkBindImageMemorySwapchainInfoKHR);
-DECLARE_REFLECTION_STRUCT(VkImageSwapchainCreateInfoKHR);
-DECLARE_REFLECTION_STRUCT(VkBindImageMemoryDeviceGroupInfo);
-DECLARE_REFLECTION_STRUCT(VkBindBufferMemoryDeviceGroupInfo);
-DECLARE_REFLECTION_STRUCT(VkDeviceGroupBindSparseInfo);
-DECLARE_REFLECTION_STRUCT(VkDeviceGroupSubmitInfo);
-DECLARE_REFLECTION_STRUCT(VkDeviceGroupCommandBufferBeginInfo);
-DECLARE_REFLECTION_STRUCT(VkDeviceGroupRenderPassBeginInfo);
-DECLARE_REFLECTION_STRUCT(VkMemoryAllocateFlagsInfo);
-DECLARE_REFLECTION_STRUCT(VkProtectedSubmitInfo);
-DECLARE_REFLECTION_STRUCT(VkImageFormatListCreateInfoKHR);
-DECLARE_REFLECTION_STRUCT(VkImageViewASTCDecodeModeEXT);
-DECLARE_REFLECTION_STRUCT(VkShaderModuleValidationCacheCreateInfoEXT);
-DECLARE_REFLECTION_STRUCT(VkAttachmentDescription2KHR);
-DECLARE_REFLECTION_STRUCT(VkSubpassDescription2KHR);
-DECLARE_REFLECTION_STRUCT(VkSubpassDependency2KHR);
-DECLARE_REFLECTION_STRUCT(VkAttachmentReference2KHR);
-DECLARE_REFLECTION_STRUCT(VkRenderPassCreateInfo2KHR);
-DECLARE_REFLECTION_STRUCT(VkSubpassBeginInfoKHR);
-DECLARE_REFLECTION_STRUCT(VkSubpassEndInfoKHR);
-DECLARE_REFLECTION_STRUCT(VkDispatchIndirectCommand);
-DECLARE_REFLECTION_STRUCT(VkDrawIndirectCommand);
-DECLARE_REFLECTION_STRUCT(VkDrawIndexedIndirectCommand);
+DECLARE_REFLECTION_STRUCT(VkMemoryDedicatedRequirements);
+DECLARE_REFLECTION_STRUCT(VkMemoryFdPropertiesKHR);
+DECLARE_REFLECTION_STRUCT(VkMemoryGetFdInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkMemoryRequirements2);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDevice16BitStorageFeatures);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDevice8BitStorageFeaturesKHR);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceASTCDecodeFeaturesEXT);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceConservativeRasterizationPropertiesEXT);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceDriverPropertiesKHR);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceExternalBufferInfo);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceExternalFenceInfo);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceExternalImageFormatInfo);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceExternalSemaphoreInfo);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceFeatures2);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceGroupProperties);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceIDProperties);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceImageFormatInfo2);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMaintenance3Properties);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMemoryProperties2);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMultiviewFeatures);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMultiviewProperties);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePCIBusInfoPropertiesEXT);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePointClippingProperties);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceProperties2);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceProtectedMemoryFeatures);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceProtectedMemoryProperties);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePushDescriptorPropertiesKHR);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSamplerYcbcrConversionFeatures);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceShaderAtomicInt64FeaturesKHR);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceShaderCorePropertiesAMD);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceShaderDrawParameterFeatures);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSparseImageFormatInfo2);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSubgroupProperties);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSurfaceInfo2KHR);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTransformFeedbackFeaturesEXT);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceTransformFeedbackPropertiesEXT);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceVariablePointerFeatures);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceVulkanMemoryModelFeaturesKHR);
+DECLARE_REFLECTION_STRUCT(VkPipelineCacheCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkPipelineColorBlendStateCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkPipelineDepthStencilStateCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkPipelineDynamicStateCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkPipelineInputAssemblyStateCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkPipelineLayoutCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkPipelineMultisampleStateCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkPipelineRasterizationConservativeStateCreateInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkPipelineRasterizationStateCreateInfo);
DECLARE_REFLECTION_STRUCT(VkPipelineRasterizationStateStreamCreateInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkPipelineShaderStageCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkPipelineTessellationDomainOriginStateCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkPipelineTessellationStateCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkPipelineVertexInputDivisorStateCreateInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkPipelineVertexInputStateCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkPipelineViewportStateCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkPresentInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkPresentRegionsKHR);
+DECLARE_REFLECTION_STRUCT(VkProtectedSubmitInfo);
+DECLARE_REFLECTION_STRUCT(VkQueryPoolCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkQueueFamilyProperties2);
+DECLARE_REFLECTION_STRUCT(VkRenderPassBeginInfo);
+DECLARE_REFLECTION_STRUCT(VkRenderPassCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkRenderPassCreateInfo2KHR);
+DECLARE_REFLECTION_STRUCT(VkRenderPassInputAttachmentAspectCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkRenderPassMultiviewCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkSamplerCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkSamplerReductionModeCreateInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkSamplerYcbcrConversionCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkSamplerYcbcrConversionImageFormatProperties);
+DECLARE_REFLECTION_STRUCT(VkSamplerYcbcrConversionInfo);
+DECLARE_REFLECTION_STRUCT(VkSemaphoreCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkSemaphoreGetFdInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkShaderModuleCreateInfo);
+DECLARE_REFLECTION_STRUCT(VkShaderModuleValidationCacheCreateInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkSharedPresentSurfaceCapabilitiesKHR);
+DECLARE_REFLECTION_STRUCT(VkSparseImageFormatProperties2);
+DECLARE_REFLECTION_STRUCT(VkSparseImageMemoryRequirements2);
+DECLARE_REFLECTION_STRUCT(VkSubmitInfo);
+DECLARE_REFLECTION_STRUCT(VkSubpassBeginInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkSubpassDependency2KHR);
+DECLARE_REFLECTION_STRUCT(VkSubpassDescription2KHR);
+DECLARE_REFLECTION_STRUCT(VkSubpassEndInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkSurfaceCapabilities2EXT);
+DECLARE_REFLECTION_STRUCT(VkSurfaceCapabilities2KHR);
+DECLARE_REFLECTION_STRUCT(VkSurfaceFormat2KHR);
+DECLARE_REFLECTION_STRUCT(VkSwapchainCounterCreateInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkSwapchainCreateInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkTextureLODGatherFormatPropertiesAMD);
+DECLARE_REFLECTION_STRUCT(VkValidationCacheCreateInfoEXT);
+DECLARE_REFLECTION_STRUCT(VkValidationFlagsEXT);
+DECLARE_REFLECTION_STRUCT(VkWriteDescriptorSet);
-DECLARE_DESERIALISE_TYPE(VkDeviceCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkBufferCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkBufferViewCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkImageCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkImageViewCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkAcquireNextImageInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkApplicationInfo);
+DECLARE_DESERIALISE_TYPE(VkAttachmentDescription2KHR);
+DECLARE_DESERIALISE_TYPE(VkAttachmentReference2KHR);
+DECLARE_DESERIALISE_TYPE(VkBindBufferMemoryDeviceGroupInfo);
+DECLARE_DESERIALISE_TYPE(VkBindBufferMemoryInfo);
+DECLARE_DESERIALISE_TYPE(VkBindImageMemoryDeviceGroupInfo);
+DECLARE_DESERIALISE_TYPE(VkBindImageMemoryInfo);
+DECLARE_DESERIALISE_TYPE(VkBindImageMemorySwapchainInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkBindImagePlaneMemoryInfo);
DECLARE_DESERIALISE_TYPE(VkBindSparseInfo);
-DECLARE_DESERIALISE_TYPE(VkSubmitInfo);
-DECLARE_DESERIALISE_TYPE(VkDescriptorSetAllocateInfo);
-DECLARE_DESERIALISE_TYPE(VkFramebufferCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkRenderPassCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkRenderPassBeginInfo);
-DECLARE_DESERIALISE_TYPE(VkCommandBufferBeginInfo);
-DECLARE_DESERIALISE_TYPE(VkCommandPoolCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkBufferCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkBufferMemoryBarrier);
+DECLARE_DESERIALISE_TYPE(VkBufferMemoryRequirementsInfo2);
+DECLARE_DESERIALISE_TYPE(VkBufferViewCreateInfo);
DECLARE_DESERIALISE_TYPE(VkCommandBufferAllocateInfo);
-DECLARE_DESERIALISE_TYPE(VkPipelineCacheCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkPipelineLayoutCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkShaderModuleCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkGraphicsPipelineCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkCommandBufferBeginInfo);
+DECLARE_DESERIALISE_TYPE(VkCommandBufferInheritanceInfo);
+DECLARE_DESERIALISE_TYPE(VkCommandPoolCreateInfo);
DECLARE_DESERIALISE_TYPE(VkComputePipelineCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkCopyDescriptorSet);
+DECLARE_DESERIALISE_TYPE(VkDebugMarkerMarkerInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkDebugMarkerObjectNameInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkDebugMarkerObjectTagInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkDebugReportCallbackCreateInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkDebugUtilsLabelEXT);
+DECLARE_DESERIALISE_TYPE(VkDebugUtilsMessengerCallbackDataEXT);
+DECLARE_DESERIALISE_TYPE(VkDebugUtilsMessengerCreateInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkDebugUtilsObjectNameInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkDebugUtilsObjectTagInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkDedicatedAllocationBufferCreateInfoNV);
+DECLARE_DESERIALISE_TYPE(VkDedicatedAllocationImageCreateInfoNV);
+DECLARE_DESERIALISE_TYPE(VkDedicatedAllocationMemoryAllocateInfoNV);
DECLARE_DESERIALISE_TYPE(VkDescriptorPoolCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkQueryPoolCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkSemaphoreCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkDescriptorSetAllocateInfo);
+DECLARE_DESERIALISE_TYPE(VkDescriptorSetLayoutCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkDescriptorSetLayoutSupport);
+DECLARE_DESERIALISE_TYPE(VkDescriptorUpdateTemplateCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkDeviceCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkDeviceEventInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkDeviceGroupBindSparseInfo);
+DECLARE_DESERIALISE_TYPE(VkDeviceGroupCommandBufferBeginInfo);
+DECLARE_DESERIALISE_TYPE(VkDeviceGroupDeviceCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkDeviceGroupPresentCapabilitiesKHR);
+DECLARE_DESERIALISE_TYPE(VkDeviceGroupPresentInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkDeviceGroupRenderPassBeginInfo);
+DECLARE_DESERIALISE_TYPE(VkDeviceGroupSubmitInfo);
+DECLARE_DESERIALISE_TYPE(VkDeviceGroupSwapchainCreateInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkDeviceQueueCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkDeviceQueueGlobalPriorityCreateInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkDeviceQueueInfo2);
+DECLARE_DESERIALISE_TYPE(VkDisplayEventInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkDisplayModeProperties2KHR);
+DECLARE_DESERIALISE_TYPE(VkDisplayPlaneCapabilities2KHR);
+DECLARE_DESERIALISE_TYPE(VkDisplayPlaneInfo2KHR);
+DECLARE_DESERIALISE_TYPE(VkDisplayPlaneProperties2KHR);
+DECLARE_DESERIALISE_TYPE(VkDisplayPowerInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkDisplayPresentInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkDisplayProperties2KHR);
DECLARE_DESERIALISE_TYPE(VkEventCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkExportFenceCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkExportMemoryAllocateInfo);
+DECLARE_DESERIALISE_TYPE(VkExportMemoryAllocateInfoNV);
+DECLARE_DESERIALISE_TYPE(VkExportSemaphoreCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkExternalBufferProperties);
+DECLARE_DESERIALISE_TYPE(VkExternalFenceProperties);
+DECLARE_DESERIALISE_TYPE(VkExternalImageFormatProperties);
+DECLARE_DESERIALISE_TYPE(VkExternalMemoryBufferCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkExternalMemoryImageCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkExternalMemoryImageCreateInfoNV);
+DECLARE_DESERIALISE_TYPE(VkExternalSemaphoreProperties);
DECLARE_DESERIALISE_TYPE(VkFenceCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkSamplerCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkFenceGetFdInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkFormatProperties2);
+DECLARE_DESERIALISE_TYPE(VkFramebufferCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkGraphicsPipelineCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkImageCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkImageFormatListCreateInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkImageFormatProperties2);
+DECLARE_DESERIALISE_TYPE(VkImageMemoryBarrier);
+DECLARE_DESERIALISE_TYPE(VkImageMemoryRequirementsInfo2);
+DECLARE_DESERIALISE_TYPE(VkImagePlaneMemoryRequirementsInfo);
+DECLARE_DESERIALISE_TYPE(VkImageSparseMemoryRequirementsInfo2);
+DECLARE_DESERIALISE_TYPE(VkImageSwapchainCreateInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkImageViewASTCDecodeModeEXT);
+DECLARE_DESERIALISE_TYPE(VkImageViewCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkImageViewUsageCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkImportFenceFdInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkImportMemoryFdInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkImportSemaphoreFdInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkInstanceCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkLayerDeviceCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkLayerInstanceCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkMappedMemoryRange);
+DECLARE_DESERIALISE_TYPE(VkMemoryAllocateFlagsInfo);
DECLARE_DESERIALISE_TYPE(VkMemoryAllocateInfo);
DECLARE_DESERIALISE_TYPE(VkMemoryBarrier);
-DECLARE_DESERIALISE_TYPE(VkBufferMemoryBarrier);
-DECLARE_DESERIALISE_TYPE(VkImageMemoryBarrier);
-DECLARE_DESERIALISE_TYPE(VkWriteDescriptorSet);
-DECLARE_DESERIALISE_TYPE(VkCopyDescriptorSet);
-DECLARE_DESERIALISE_TYPE(VkDescriptorSetLayoutCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkDescriptorUpdateTemplateCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkMappedMemoryRange);
-DECLARE_DESERIALISE_TYPE(VkSwapchainCreateInfoKHR);
-DECLARE_DESERIALISE_TYPE(VkDebugMarkerMarkerInfoEXT);
-DECLARE_DESERIALISE_TYPE(VkBindBufferMemoryInfo);
-DECLARE_DESERIALISE_TYPE(VkBindImageMemoryInfo);
-DECLARE_DESERIALISE_TYPE(VkPipelineRasterizationConservativeStateCreateInfoEXT);
-DECLARE_DESERIALISE_TYPE(VkPipelineTessellationDomainOriginStateCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkImageViewUsageCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkRenderPassInputAttachmentAspectCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkPipelineVertexInputDivisorStateCreateInfoEXT);
-DECLARE_DESERIALISE_TYPE(VkSamplerReductionModeCreateInfoEXT);
-DECLARE_DESERIALISE_TYPE(VkDebugUtilsLabelEXT);
-DECLARE_DESERIALISE_TYPE(VkSamplerYcbcrConversionCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkRenderPassMultiviewCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkDeviceQueueInfo2);
-DECLARE_DESERIALISE_TYPE(VkExportMemoryAllocateInfoNV);
-DECLARE_DESERIALISE_TYPE(VkExternalMemoryImageCreateInfoNV);
-DECLARE_DESERIALISE_TYPE(VkExportMemoryAllocateInfo);
-DECLARE_DESERIALISE_TYPE(VkExternalMemoryBufferCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkImportMemoryFdInfoKHR);
-DECLARE_DESERIALISE_TYPE(VkExportSemaphoreCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkExportFenceCreateInfo);
-DECLARE_DESERIALISE_TYPE(VkSwapchainCounterCreateInfoEXT);
-DECLARE_DESERIALISE_TYPE(VkDedicatedAllocationMemoryAllocateInfoNV);
-DECLARE_DESERIALISE_TYPE(VkDedicatedAllocationImageCreateInfoNV);
-DECLARE_DESERIALISE_TYPE(VkDedicatedAllocationBufferCreateInfoNV);
DECLARE_DESERIALISE_TYPE(VkMemoryDedicatedAllocateInfo);
-DECLARE_DESERIALISE_TYPE(VkDeviceQueueGlobalPriorityCreateInfoEXT);
-DECLARE_DESERIALISE_TYPE(VkBindImagePlaneMemoryInfo);
-DECLARE_DESERIALISE_TYPE(VkSamplerYcbcrConversionInfo);
-DECLARE_DESERIALISE_TYPE(VkDeviceGroupSwapchainCreateInfoKHR);
-DECLARE_DESERIALISE_TYPE(VkBindImageMemorySwapchainInfoKHR);
-DECLARE_DESERIALISE_TYPE(VkImageSwapchainCreateInfoKHR);
-DECLARE_DESERIALISE_TYPE(VkBindImageMemoryDeviceGroupInfo);
-DECLARE_DESERIALISE_TYPE(VkBindBufferMemoryDeviceGroupInfo);
-DECLARE_DESERIALISE_TYPE(VkDeviceGroupBindSparseInfo);
-DECLARE_DESERIALISE_TYPE(VkDeviceGroupSubmitInfo);
-DECLARE_DESERIALISE_TYPE(VkDeviceGroupCommandBufferBeginInfo);
-DECLARE_DESERIALISE_TYPE(VkDeviceGroupRenderPassBeginInfo);
-DECLARE_DESERIALISE_TYPE(VkMemoryAllocateFlagsInfo);
-DECLARE_DESERIALISE_TYPE(VkProtectedSubmitInfo);
-DECLARE_DESERIALISE_TYPE(VkImageFormatListCreateInfoKHR);
-DECLARE_DESERIALISE_TYPE(VkRenderPassCreateInfo2KHR);
-DECLARE_DESERIALISE_TYPE(VkSubpassBeginInfoKHR);
-DECLARE_DESERIALISE_TYPE(VkSubpassEndInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkMemoryDedicatedRequirements);
+DECLARE_DESERIALISE_TYPE(VkMemoryFdPropertiesKHR);
+DECLARE_DESERIALISE_TYPE(VkMemoryGetFdInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkMemoryRequirements2);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDevice16BitStorageFeatures);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDevice8BitStorageFeaturesKHR);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceASTCDecodeFeaturesEXT);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceConservativeRasterizationPropertiesEXT);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceDriverPropertiesKHR);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceExternalBufferInfo);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceExternalFenceInfo);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceExternalImageFormatInfo);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceExternalSemaphoreInfo);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceFeatures2);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceGroupProperties);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceIDProperties);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceImageFormatInfo2);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMaintenance3Properties);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMemoryProperties2);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMultiviewFeatures);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMultiviewProperties);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePCIBusInfoPropertiesEXT);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePointClippingProperties);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceProperties2);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceProtectedMemoryFeatures);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceProtectedMemoryProperties);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePushDescriptorPropertiesKHR);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSamplerYcbcrConversionFeatures);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceShaderAtomicInt64FeaturesKHR);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceShaderCorePropertiesAMD);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceShaderDrawParameterFeatures);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSparseImageFormatInfo2);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSubgroupProperties);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSurfaceInfo2KHR);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTransformFeedbackFeaturesEXT);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceTransformFeedbackPropertiesEXT);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceVariablePointerFeatures);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT);
+DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceVulkanMemoryModelFeaturesKHR);
+DECLARE_DESERIALISE_TYPE(VkPipelineCacheCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkPipelineColorBlendStateCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkPipelineDepthStencilStateCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkPipelineDynamicStateCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkPipelineInputAssemblyStateCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkPipelineLayoutCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkPipelineMultisampleStateCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkPipelineRasterizationConservativeStateCreateInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkPipelineRasterizationStateCreateInfo);
DECLARE_DESERIALISE_TYPE(VkPipelineRasterizationStateStreamCreateInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkPipelineShaderStageCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkPipelineTessellationDomainOriginStateCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkPipelineTessellationStateCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkPipelineVertexInputDivisorStateCreateInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkPipelineVertexInputStateCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkPipelineViewportStateCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkPresentInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkPresentRegionsKHR);
+DECLARE_DESERIALISE_TYPE(VkProtectedSubmitInfo);
+DECLARE_DESERIALISE_TYPE(VkQueryPoolCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkQueueFamilyProperties2);
+DECLARE_DESERIALISE_TYPE(VkRenderPassBeginInfo);
+DECLARE_DESERIALISE_TYPE(VkRenderPassCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkRenderPassCreateInfo2KHR);
+DECLARE_DESERIALISE_TYPE(VkRenderPassInputAttachmentAspectCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkRenderPassMultiviewCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkSamplerCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkSamplerReductionModeCreateInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkSamplerYcbcrConversionCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkSamplerYcbcrConversionImageFormatProperties);
+DECLARE_DESERIALISE_TYPE(VkSamplerYcbcrConversionInfo);
+DECLARE_DESERIALISE_TYPE(VkSemaphoreCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkSemaphoreGetFdInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkShaderModuleCreateInfo);
+DECLARE_DESERIALISE_TYPE(VkShaderModuleValidationCacheCreateInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkSharedPresentSurfaceCapabilitiesKHR);
+DECLARE_DESERIALISE_TYPE(VkSparseImageFormatProperties2);
+DECLARE_DESERIALISE_TYPE(VkSparseImageMemoryRequirements2);
+DECLARE_DESERIALISE_TYPE(VkSubmitInfo);
+DECLARE_DESERIALISE_TYPE(VkSubpassBeginInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkSubpassDependency2KHR);
+DECLARE_DESERIALISE_TYPE(VkSubpassDescription2KHR);
+DECLARE_DESERIALISE_TYPE(VkSubpassEndInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkSurfaceCapabilities2EXT);
+DECLARE_DESERIALISE_TYPE(VkSurfaceCapabilities2KHR);
+DECLARE_DESERIALISE_TYPE(VkSurfaceFormat2KHR);
+DECLARE_DESERIALISE_TYPE(VkSwapchainCounterCreateInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkSwapchainCreateInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkTextureLODGatherFormatPropertiesAMD);
+DECLARE_DESERIALISE_TYPE(VkValidationCacheCreateInfoEXT);
+DECLARE_DESERIALISE_TYPE(VkValidationFlagsEXT);
+DECLARE_DESERIALISE_TYPE(VkWriteDescriptorSet);
-#if defined(VK_KHR_external_memory_win32) || defined(VK_NV_external_memory_win32)
-DECLARE_REFLECTION_STRUCT(VkImportMemoryWin32HandleInfoNV);
-DECLARE_REFLECTION_STRUCT(VkExportMemoryWin32HandleInfoNV);
-DECLARE_REFLECTION_STRUCT(VkImportMemoryWin32HandleInfoKHR);
+// plain structs with no next chain
+DECLARE_REFLECTION_STRUCT(VkAllocationCallbacks);
+DECLARE_REFLECTION_STRUCT(VkAttachmentDescription);
+DECLARE_REFLECTION_STRUCT(VkAttachmentReference);
+DECLARE_REFLECTION_STRUCT(VkBufferCopy);
+DECLARE_REFLECTION_STRUCT(VkBufferImageCopy);
+DECLARE_REFLECTION_STRUCT(VkClearAttachment);
+DECLARE_REFLECTION_STRUCT(VkClearColorValue);
+DECLARE_REFLECTION_STRUCT(VkClearDepthStencilValue);
+DECLARE_REFLECTION_STRUCT(VkClearRect);
+DECLARE_REFLECTION_STRUCT(VkClearValue);
+DECLARE_REFLECTION_STRUCT(VkComponentMapping);
+DECLARE_REFLECTION_STRUCT(VkConformanceVersionKHR);
+DECLARE_REFLECTION_STRUCT(VkDescriptorBufferInfo);
+DECLARE_REFLECTION_STRUCT(VkDescriptorImageInfo);
+DECLARE_REFLECTION_STRUCT(VkDescriptorPoolSize);
+DECLARE_REFLECTION_STRUCT(VkDescriptorSetLayoutBinding);
+DECLARE_REFLECTION_STRUCT(VkDescriptorUpdateTemplateEntry);
+DECLARE_REFLECTION_STRUCT(VkDispatchIndirectCommand);
+DECLARE_REFLECTION_STRUCT(VkDisplayModeParametersKHR);
+DECLARE_REFLECTION_STRUCT(VkDisplayModePropertiesKHR);
+DECLARE_REFLECTION_STRUCT(VkDisplayPlaneCapabilitiesKHR);
+DECLARE_REFLECTION_STRUCT(VkDisplayPlanePropertiesKHR);
+DECLARE_REFLECTION_STRUCT(VkDisplayPropertiesKHR);
+DECLARE_REFLECTION_STRUCT(VkDrawIndexedIndirectCommand);
+DECLARE_REFLECTION_STRUCT(VkDrawIndirectCommand);
+DECLARE_REFLECTION_STRUCT(VkExtent2D);
+DECLARE_REFLECTION_STRUCT(VkExtent3D);
+DECLARE_REFLECTION_STRUCT(VkExternalMemoryProperties);
+DECLARE_REFLECTION_STRUCT(VkFormatProperties);
+DECLARE_REFLECTION_STRUCT(VkImageBlit);
+DECLARE_REFLECTION_STRUCT(VkImageCopy);
+DECLARE_REFLECTION_STRUCT(VkImageFormatProperties);
+DECLARE_REFLECTION_STRUCT(VkImageResolve);
+DECLARE_REFLECTION_STRUCT(VkImageSubresource);
+DECLARE_REFLECTION_STRUCT(VkImageSubresourceLayers);
+DECLARE_REFLECTION_STRUCT(VkImageSubresourceRange);
+DECLARE_REFLECTION_STRUCT(VkInputAttachmentAspectReference);
+DECLARE_REFLECTION_STRUCT(VkMemoryHeap);
+DECLARE_REFLECTION_STRUCT(VkMemoryRequirements);
+DECLARE_REFLECTION_STRUCT(VkMemoryType);
+DECLARE_REFLECTION_STRUCT(VkOffset2D);
+DECLARE_REFLECTION_STRUCT(VkOffset3D);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceFeatures);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceLimits);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMemoryProperties);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceProperties);
+DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSparseProperties);
+DECLARE_REFLECTION_STRUCT(VkPipelineColorBlendAttachmentState);
+DECLARE_REFLECTION_STRUCT(VkPresentRegionKHR);
+DECLARE_REFLECTION_STRUCT(VkPushConstantRange);
+DECLARE_REFLECTION_STRUCT(VkQueueFamilyProperties);
+DECLARE_REFLECTION_STRUCT(VkRect2D);
+DECLARE_REFLECTION_STRUCT(VkRectLayerKHR);
+DECLARE_REFLECTION_STRUCT(VkSparseBufferMemoryBindInfo);
+DECLARE_REFLECTION_STRUCT(VkSparseImageFormatProperties);
+DECLARE_REFLECTION_STRUCT(VkSparseImageMemoryBind);
+DECLARE_REFLECTION_STRUCT(VkSparseImageMemoryBindInfo);
+DECLARE_REFLECTION_STRUCT(VkSparseImageMemoryRequirements);
+DECLARE_REFLECTION_STRUCT(VkSparseImageOpaqueMemoryBindInfo);
+DECLARE_REFLECTION_STRUCT(VkSparseMemoryBind);
+DECLARE_REFLECTION_STRUCT(VkSpecializationInfo);
+DECLARE_REFLECTION_STRUCT(VkSpecializationMapEntry);
+DECLARE_REFLECTION_STRUCT(VkStencilOpState);
+DECLARE_REFLECTION_STRUCT(VkSubpassDependency);
+DECLARE_REFLECTION_STRUCT(VkSubpassDescription);
+DECLARE_REFLECTION_STRUCT(VkSurfaceCapabilitiesKHR);
+DECLARE_REFLECTION_STRUCT(VkSurfaceFormatKHR);
+DECLARE_REFLECTION_STRUCT(VkVertexInputAttributeDescription);
+DECLARE_REFLECTION_STRUCT(VkVertexInputBindingDescription);
+DECLARE_REFLECTION_STRUCT(VkVertexInputBindingDivisorDescriptionEXT);
+DECLARE_REFLECTION_STRUCT(VkViewport);
-DECLARE_DESERIALISE_TYPE(VkImportMemoryWin32HandleInfoNV);
-DECLARE_DESERIALISE_TYPE(VkExportMemoryWin32HandleInfoNV);
-DECLARE_DESERIALISE_TYPE(VkImportMemoryWin32HandleInfoKHR);
-#endif
+DECLARE_DESERIALISE_TYPE(VkDescriptorSetLayoutBinding);
+DECLARE_DESERIALISE_TYPE(VkPresentRegionKHR);
+DECLARE_DESERIALISE_TYPE(VkSparseBufferMemoryBindInfo);
+DECLARE_DESERIALISE_TYPE(VkSparseImageMemoryBindInfo);
+DECLARE_DESERIALISE_TYPE(VkSparseImageOpaqueMemoryBindInfo);
+DECLARE_DESERIALISE_TYPE(VkSpecializationInfo);
+DECLARE_DESERIALISE_TYPE(VkSubpassDescription);
-#ifdef VK_KHR_external_fence_win32
+// win32 only structs
+#if ENABLED(RDOC_WIN32)
+DECLARE_REFLECTION_STRUCT(VkD3D12FenceSubmitInfoKHR);
DECLARE_REFLECTION_STRUCT(VkExportFenceWin32HandleInfoKHR);
-
-DECLARE_DESERIALISE_TYPE(VkExportFenceWin32HandleInfoKHR);
-#endif
-
-#ifdef VK_KHR_external_semaphore_win32
+DECLARE_REFLECTION_STRUCT(VkExportMemoryWin32HandleInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkExportMemoryWin32HandleInfoNV);
DECLARE_REFLECTION_STRUCT(VkExportSemaphoreWin32HandleInfoKHR);
-
-DECLARE_DESERIALISE_TYPE(VkExportSemaphoreWin32HandleInfoKHR);
-#endif
-
-#if defined(VK_KHR_win32_keyed_mutex) || defined(VK_NV_win32_keyed_mutex)
-DECLARE_REFLECTION_STRUCT(VkWin32KeyedMutexAcquireReleaseInfoNV);
+DECLARE_REFLECTION_STRUCT(VkFenceGetWin32HandleInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkImportFenceWin32HandleInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkImportMemoryWin32HandleInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkImportMemoryWin32HandleInfoNV);
+DECLARE_REFLECTION_STRUCT(VkImportSemaphoreWin32HandleInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkMemoryGetWin32HandleInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkMemoryWin32HandlePropertiesKHR);
+DECLARE_REFLECTION_STRUCT(VkSemaphoreGetWin32HandleInfoKHR);
DECLARE_REFLECTION_STRUCT(VkWin32KeyedMutexAcquireReleaseInfoKHR);
+DECLARE_REFLECTION_STRUCT(VkWin32KeyedMutexAcquireReleaseInfoNV);
-DECLARE_DESERIALISE_TYPE(VkWin32KeyedMutexAcquireReleaseInfoNV);
+DECLARE_DESERIALISE_TYPE(VkD3D12FenceSubmitInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkExportFenceWin32HandleInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkExportMemoryWin32HandleInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkExportMemoryWin32HandleInfoNV);
+DECLARE_DESERIALISE_TYPE(VkExportSemaphoreWin32HandleInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkFenceGetWin32HandleInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkImportFenceWin32HandleInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkImportMemoryWin32HandleInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkImportMemoryWin32HandleInfoNV);
+DECLARE_DESERIALISE_TYPE(VkImportSemaphoreWin32HandleInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkMemoryGetWin32HandleInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkMemoryWin32HandlePropertiesKHR);
+DECLARE_DESERIALISE_TYPE(VkSemaphoreGetWin32HandleInfoKHR);
DECLARE_DESERIALISE_TYPE(VkWin32KeyedMutexAcquireReleaseInfoKHR);
+DECLARE_DESERIALISE_TYPE(VkWin32KeyedMutexAcquireReleaseInfoNV);
#endif
+// enums
+
DECLARE_REFLECTION_ENUM(VkFlagWithNoBits);
-DECLARE_REFLECTION_ENUM(VkQueueFlagBits);
-DECLARE_REFLECTION_ENUM(VkPipelineCreateFlagBits);
-DECLARE_REFLECTION_ENUM(VkPipelineStageFlagBits);
-DECLARE_REFLECTION_ENUM(VkBufferUsageFlagBits);
-DECLARE_REFLECTION_ENUM(VkImageUsageFlagBits);
-DECLARE_REFLECTION_ENUM(VkBufferCreateFlagBits);
-DECLARE_REFLECTION_ENUM(VkImageCreateFlagBits);
-DECLARE_REFLECTION_ENUM(VkSparseMemoryBindFlagBits);
-DECLARE_REFLECTION_ENUM(VkCommandPoolCreateFlagBits);
-DECLARE_REFLECTION_ENUM(VkCommandPoolResetFlagBits);
-DECLARE_REFLECTION_ENUM(VkCommandBufferUsageFlagBits);
-DECLARE_REFLECTION_ENUM(VkDescriptorPoolCreateFlagBits);
-DECLARE_REFLECTION_ENUM(VkFenceCreateFlagBits);
-DECLARE_REFLECTION_ENUM(VkQueryPipelineStatisticFlagBits);
-DECLARE_REFLECTION_ENUM(VkQueryControlFlagBits);
-DECLARE_REFLECTION_ENUM(VkQueryResultFlagBits);
-DECLARE_REFLECTION_ENUM(VkAttachmentDescriptionFlagBits);
-DECLARE_REFLECTION_ENUM(VkSampleCountFlagBits);
-DECLARE_REFLECTION_ENUM(VkImageAspectFlagBits);
-DECLARE_REFLECTION_ENUM(VkDependencyFlagBits);
-DECLARE_REFLECTION_ENUM(VkShaderStageFlagBits);
-DECLARE_REFLECTION_ENUM(VkMemoryHeapFlagBits);
-DECLARE_REFLECTION_ENUM(VkMemoryPropertyFlagBits);
DECLARE_REFLECTION_ENUM(VkAccessFlagBits);
-DECLARE_REFLECTION_ENUM(VkStencilFaceFlagBits);
-DECLARE_REFLECTION_ENUM(VkCullModeFlagBits);
-DECLARE_REFLECTION_ENUM(VkPipelineBindPoint);
-DECLARE_REFLECTION_ENUM(VkIndexType);
-DECLARE_REFLECTION_ENUM(VkImageType);
-DECLARE_REFLECTION_ENUM(VkImageTiling);
-DECLARE_REFLECTION_ENUM(VkImageViewType);
-DECLARE_REFLECTION_ENUM(VkVertexInputRate);
-DECLARE_REFLECTION_ENUM(VkPolygonMode);
-DECLARE_REFLECTION_ENUM(VkFrontFace);
-DECLARE_REFLECTION_ENUM(VkBlendFactor);
-DECLARE_REFLECTION_ENUM(VkBlendOp);
-DECLARE_REFLECTION_ENUM(VkDynamicState);
+DECLARE_REFLECTION_ENUM(VkAttachmentDescriptionFlagBits);
DECLARE_REFLECTION_ENUM(VkAttachmentLoadOp);
DECLARE_REFLECTION_ENUM(VkAttachmentStoreOp);
-DECLARE_REFLECTION_ENUM(VkStencilOp);
-DECLARE_REFLECTION_ENUM(VkLogicOp);
-DECLARE_REFLECTION_ENUM(VkCompareOp);
-DECLARE_REFLECTION_ENUM(VkFilter);
-DECLARE_REFLECTION_ENUM(VkSamplerMipmapMode);
-DECLARE_REFLECTION_ENUM(VkSamplerAddressMode);
+DECLARE_REFLECTION_ENUM(VkBlendFactor);
+DECLARE_REFLECTION_ENUM(VkBlendOp);
DECLARE_REFLECTION_ENUM(VkBorderColor);
-DECLARE_REFLECTION_ENUM(VkPrimitiveTopology);
-DECLARE_REFLECTION_ENUM(VkDescriptorType);
-DECLARE_REFLECTION_ENUM(VkQueryType);
-DECLARE_REFLECTION_ENUM(VkPhysicalDeviceType);
-DECLARE_REFLECTION_ENUM(VkSharingMode);
-DECLARE_REFLECTION_ENUM(VkCommandBufferLevel);
-DECLARE_REFLECTION_ENUM(VkSubpassContents);
-DECLARE_REFLECTION_ENUM(VkImageLayout);
-DECLARE_REFLECTION_ENUM(VkStructureType);
-DECLARE_REFLECTION_ENUM(VkComponentSwizzle);
-DECLARE_REFLECTION_ENUM(VkFormat);
-DECLARE_REFLECTION_ENUM(VkResult);
-DECLARE_REFLECTION_ENUM(VkSurfaceTransformFlagBitsKHR);
-DECLARE_REFLECTION_ENUM(VkCompositeAlphaFlagBitsKHR);
+DECLARE_REFLECTION_ENUM(VkBufferCreateFlagBits);
+DECLARE_REFLECTION_ENUM(VkBufferUsageFlagBits);
+DECLARE_REFLECTION_ENUM(VkChromaLocation);
DECLARE_REFLECTION_ENUM(VkColorSpaceKHR);
-DECLARE_REFLECTION_ENUM(VkPresentModeKHR);
-DECLARE_REFLECTION_ENUM(VkDescriptorUpdateTemplateType);
+DECLARE_REFLECTION_ENUM(VkCommandBufferLevel);
+DECLARE_REFLECTION_ENUM(VkCommandBufferUsageFlagBits);
+DECLARE_REFLECTION_ENUM(VkCommandPoolCreateFlagBits);
+DECLARE_REFLECTION_ENUM(VkCommandPoolResetFlagBits);
+DECLARE_REFLECTION_ENUM(VkCompareOp);
+DECLARE_REFLECTION_ENUM(VkComponentSwizzle);
+DECLARE_REFLECTION_ENUM(VkCompositeAlphaFlagBitsKHR);
DECLARE_REFLECTION_ENUM(VkConservativeRasterizationModeEXT);
-DECLARE_REFLECTION_ENUM(VkTessellationDomainOrigin);
+DECLARE_REFLECTION_ENUM(VkCullModeFlagBits);
+DECLARE_REFLECTION_ENUM(VkDebugReportFlagBitsEXT);
+DECLARE_REFLECTION_ENUM(VkDebugUtilsMessageSeverityFlagBitsEXT);
+DECLARE_REFLECTION_ENUM(VkDebugUtilsMessageTypeFlagBitsEXT);
+DECLARE_REFLECTION_ENUM(VkDependencyFlagBits);
+DECLARE_REFLECTION_ENUM(VkDescriptorPoolCreateFlagBits);
+DECLARE_REFLECTION_ENUM(VkDescriptorSetLayoutCreateFlagBits);
+DECLARE_REFLECTION_ENUM(VkDescriptorType);
+DECLARE_REFLECTION_ENUM(VkDescriptorUpdateTemplateType);
+DECLARE_REFLECTION_ENUM(VkDeviceGroupPresentModeFlagBitsKHR);
+DECLARE_REFLECTION_ENUM(VkDeviceQueueCreateFlagBits);
+DECLARE_REFLECTION_ENUM(VkDynamicState);
+DECLARE_REFLECTION_ENUM(VkExternalFenceHandleTypeFlagBits);
+DECLARE_REFLECTION_ENUM(VkExternalMemoryHandleTypeFlagBits);
+DECLARE_REFLECTION_ENUM(VkExternalMemoryHandleTypeFlagBitsNV);
+DECLARE_REFLECTION_ENUM(VkExternalSemaphoreHandleTypeFlagBits);
+DECLARE_REFLECTION_ENUM(VkFenceCreateFlagBits);
+DECLARE_REFLECTION_ENUM(VkFilter);
+DECLARE_REFLECTION_ENUM(VkFormat);
+DECLARE_REFLECTION_ENUM(VkFrontFace);
+DECLARE_REFLECTION_ENUM(VkImageAspectFlagBits);
+DECLARE_REFLECTION_ENUM(VkImageCreateFlagBits);
+DECLARE_REFLECTION_ENUM(VkImageLayout);
+DECLARE_REFLECTION_ENUM(VkImageTiling);
+DECLARE_REFLECTION_ENUM(VkImageType);
+DECLARE_REFLECTION_ENUM(VkImageUsageFlagBits);
+DECLARE_REFLECTION_ENUM(VkImageViewType);
+DECLARE_REFLECTION_ENUM(VkIndexType);
+DECLARE_REFLECTION_ENUM(VkLogicOp);
+DECLARE_REFLECTION_ENUM(VkMemoryAllocateFlagBits);
+DECLARE_REFLECTION_ENUM(VkMemoryHeapFlagBits);
+DECLARE_REFLECTION_ENUM(VkMemoryPropertyFlagBits);
+DECLARE_REFLECTION_ENUM(VkPhysicalDeviceType);
+DECLARE_REFLECTION_ENUM(VkPipelineBindPoint);
+DECLARE_REFLECTION_ENUM(VkPipelineCreateFlagBits);
+DECLARE_REFLECTION_ENUM(VkPipelineStageFlagBits);
+DECLARE_REFLECTION_ENUM(VkPolygonMode);
+DECLARE_REFLECTION_ENUM(VkPresentModeKHR);
+DECLARE_REFLECTION_ENUM(VkPrimitiveTopology);
+DECLARE_REFLECTION_ENUM(VkQueryControlFlagBits);
+DECLARE_REFLECTION_ENUM(VkQueryPipelineStatisticFlagBits);
+DECLARE_REFLECTION_ENUM(VkQueryResultFlagBits);
+DECLARE_REFLECTION_ENUM(VkQueryType);
+DECLARE_REFLECTION_ENUM(VkQueueFlagBits);
+DECLARE_REFLECTION_ENUM(VkQueueGlobalPriorityEXT);
+DECLARE_REFLECTION_ENUM(VkResult);
+DECLARE_REFLECTION_ENUM(VkSampleCountFlagBits);
+DECLARE_REFLECTION_ENUM(VkSamplerAddressMode);
+DECLARE_REFLECTION_ENUM(VkSamplerMipmapMode);
DECLARE_REFLECTION_ENUM(VkSamplerReductionModeEXT);
DECLARE_REFLECTION_ENUM(VkSamplerYcbcrModelConversion);
DECLARE_REFLECTION_ENUM(VkSamplerYcbcrRange);
-DECLARE_REFLECTION_ENUM(VkChromaLocation);
-DECLARE_REFLECTION_ENUM(VkDeviceQueueCreateFlagBits);
+DECLARE_REFLECTION_ENUM(VkShaderStageFlagBits);
+DECLARE_REFLECTION_ENUM(VkSharingMode);
+DECLARE_REFLECTION_ENUM(VkSparseMemoryBindFlagBits);
+DECLARE_REFLECTION_ENUM(VkStencilFaceFlagBits);
+DECLARE_REFLECTION_ENUM(VkStencilOp);
+DECLARE_REFLECTION_ENUM(VkStructureType);
+DECLARE_REFLECTION_ENUM(VkSubpassContents);
DECLARE_REFLECTION_ENUM(VkSubpassDescriptionFlagBits);
-DECLARE_REFLECTION_ENUM(VkDescriptorSetLayoutCreateFlagBits);
-DECLARE_REFLECTION_ENUM(VkSwapchainCreateFlagBitsKHR);
-DECLARE_REFLECTION_ENUM(VkExternalMemoryHandleTypeFlagBitsNV);
-DECLARE_REFLECTION_ENUM(VkExternalMemoryHandleTypeFlagBits);
-DECLARE_REFLECTION_ENUM(VkExternalSemaphoreHandleTypeFlagBits);
-DECLARE_REFLECTION_ENUM(VkExternalFenceHandleTypeFlagBits);
DECLARE_REFLECTION_ENUM(VkSurfaceCounterFlagBitsEXT);
-DECLARE_REFLECTION_ENUM(VkQueueGlobalPriorityEXT);
-DECLARE_REFLECTION_ENUM(VkDeviceGroupPresentModeFlagBitsKHR);
-DECLARE_REFLECTION_ENUM(VkMemoryAllocateFlagBits);
\ No newline at end of file
+DECLARE_REFLECTION_ENUM(VkSurfaceTransformFlagBitsKHR);
+DECLARE_REFLECTION_ENUM(VkSwapchainCreateFlagBitsKHR);
+DECLARE_REFLECTION_ENUM(VkTessellationDomainOrigin);
+DECLARE_REFLECTION_ENUM(VkVertexInputRate);
+
+DECLARE_REFLECTION_ENUM(VkDeviceEventTypeEXT);
+DECLARE_REFLECTION_ENUM(VkValidationCheckEXT);
+DECLARE_REFLECTION_ENUM(VkDriverIdKHR);
+DECLARE_REFLECTION_ENUM(VkSemaphoreImportFlagBits);
+DECLARE_REFLECTION_ENUM(VkFenceImportFlagBits);
+DECLARE_REFLECTION_ENUM(VkExternalSemaphoreFeatureFlagBits);
+DECLARE_REFLECTION_ENUM(VkExternalFenceFeatureFlagBits);
+DECLARE_REFLECTION_ENUM(VkDisplayPowerStateEXT);
+DECLARE_REFLECTION_ENUM(VkDisplayEventTypeEXT);
+DECLARE_REFLECTION_ENUM(VkSparseImageFormatFlagBits);
+DECLARE_REFLECTION_ENUM(VkFormatFeatureFlagBits);
+DECLARE_REFLECTION_ENUM(VkExternalMemoryFeatureFlagBits);
+DECLARE_REFLECTION_ENUM(VkDisplayPlaneAlphaFlagBitsKHR);
+DECLARE_REFLECTION_ENUM(VkPointClippingBehavior);
+DECLARE_REFLECTION_ENUM(VkSubgroupFeatureFlagBits);
\ No newline at end of file
diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp
new file mode 100644
index 000000000..107eca217
--- /dev/null
+++ b/renderdoc/driver/vulkan/vk_next_chains.cpp
@@ -0,0 +1,1254 @@
+/******************************************************************************
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2015-2018 Baldur Karlsson
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ ******************************************************************************/
+
+#include "vk_common.h"
+#include "vk_resources.h"
+
+template
+static void UnwrapInPlace(VkStruct &s)
+{
+ s = Unwrap(s);
+}
+
+// utility function for when we're modifying one struct in a pNext chain, this
+// lets us just copy across a struct unmodified into some temporary memory and
+// append it onto a pNext chain we're building
+static void CopyNextChainedStruct(const size_t structSize, byte *&tempMem,
+ const VkBaseInStructure *nextInput,
+ VkBaseInStructure *&nextChainTail)
+{
+ VkBaseInStructure *outstruct = (VkBaseInStructure *)tempMem;
+
+ tempMem += structSize;
+
+ // copy the struct, nothing to unwrap
+ memcpy(outstruct, nextInput, structSize);
+
+ // default to NULL. It will be overwritten next time if there is a next object
+ outstruct->pNext = NULL;
+
+ // append this onto the chain
+ nextChainTail->pNext = outstruct;
+ nextChainTail = outstruct;
+}
+
+// this is similar to the above function, but for use after we've modified a struct locally
+// e.g. to unwrap some members or patch flags, etc.
+template
+static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct,
+ VkBaseInStructure *&nextChainTail)
+{
+ tempMem = (byte *)(outputStruct + 1);
+
+ // default to NULL. It will be overwritten in the next step if there is a next object
+ outputStruct->pNext = NULL;
+
+ // append this onto the chain
+ nextChainTail->pNext = (const VkBaseInStructure *)outputStruct;
+ nextChainTail = (VkBaseInStructure *)outputStruct;
+}
+
+// define structs that just need to be copied with no unwrapping at all, or only unwrapping some
+// members - easily shared between GetNextPatchSize and UnwrapNextChain
+#define PROCESS_SIMPLE_STRUCTS() \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_APPLICATION_INFO, VkApplicationInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR, VkAttachmentDescription2KHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR, VkAttachmentReference2KHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO, \
+ VkBindBufferMemoryDeviceGroupInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO, \
+ VkBindImageMemoryDeviceGroupInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO, VkBindImagePlaneMemoryInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, VkBufferCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, VkCommandBufferBeginInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, VkCommandPoolCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT, VkDebugMarkerMarkerInfoEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, \
+ VkDebugReportCallbackCreateInfoEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, VkDebugUtilsLabelEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, \
+ VkDebugUtilsMessengerCreateInfoEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV, \
+ VkDedicatedAllocationBufferCreateInfoNV); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV, \
+ VkDedicatedAllocationImageCreateInfoNV); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, VkDescriptorPoolCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT, VkDescriptorSetLayoutSupport); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, VkDeviceCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO, VkDeviceGroupBindSparseInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO, \
+ VkDeviceGroupCommandBufferBeginInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR, \
+ VkDeviceGroupPresentCapabilitiesKHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR, VkDeviceGroupPresentInfoKHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO, \
+ VkDeviceGroupRenderPassBeginInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO, VkDeviceGroupSubmitInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR, \
+ VkDeviceGroupSwapchainCreateInfoKHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, VkDeviceQueueCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT, \
+ VkDeviceQueueGlobalPriorityCreateInfoEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2, VkDeviceQueueInfo2); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DISPLAY_MODE_PROPERTIES_2_KHR, VkDisplayModeProperties2KHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR, VkDisplayPlaneCapabilities2KHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DISPLAY_PLANE_INFO_2_KHR, VkDisplayPlaneInfo2KHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DISPLAY_PLANE_PROPERTIES_2_KHR, VkDisplayPlaneProperties2KHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR, VkDisplayPresentInfoKHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR, VkDisplayProperties2KHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, VkEventCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES, VkExternalBufferProperties); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES, VkExternalImageFormatProperties); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, VkFenceCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, VkFormatProperties2); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, VkImageCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR, VkImageFormatListCreateInfoKHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2, VkImageFormatProperties2); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO, \
+ VkImagePlaneMemoryRequirementsInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT, VkImageViewASTCDecodeModeEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, VkImageViewUsageCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, VkInstanceCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO, VkMemoryAllocateFlagsInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, VkMemoryAllocateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_MEMORY_BARRIER, VkMemoryBarrier); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS, VkMemoryDedicatedRequirements); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, VkMemoryRequirements2); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, \
+ VkPhysicalDevice16BitStorageFeatures); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR, \
+ VkPhysicalDevice8BitStorageFeaturesKHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, \
+ VkPhysicalDeviceASTCDecodeFeaturesEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT, \
+ VkPhysicalDeviceConservativeRasterizationPropertiesEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR, \
+ VkPhysicalDeviceDriverPropertiesKHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO, \
+ VkPhysicalDeviceExternalBufferInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO, \
+ VkPhysicalDeviceExternalImageFormatInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO, \
+ VkPhysicalDeviceExternalSemaphoreInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, VkPhysicalDeviceFeatures2); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES, VkPhysicalDeviceIDProperties); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, \
+ VkPhysicalDeviceImageFormatInfo2); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, \
+ VkPhysicalDeviceMaintenance3Properties); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2, \
+ VkPhysicalDeviceMemoryProperties2); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, \
+ VkPhysicalDeviceMultiviewFeatures); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, \
+ VkPhysicalDeviceMultiviewProperties); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT, \
+ VkPhysicalDevicePCIBusInfoPropertiesEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES, \
+ VkPhysicalDevicePointClippingProperties); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, VkPhysicalDeviceProperties2); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, \
+ VkPhysicalDeviceProtectedMemoryFeatures); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES, \
+ VkPhysicalDeviceProtectedMemoryProperties); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR, \
+ VkPhysicalDevicePushDescriptorPropertiesKHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT, \
+ VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, \
+ VkPhysicalDeviceSamplerYcbcrConversionFeatures); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR, \
+ VkPhysicalDeviceShaderAtomicInt64FeaturesKHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD, \
+ VkPhysicalDeviceShaderCorePropertiesAMD); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES, \
+ VkPhysicalDeviceShaderDrawParameterFeatures); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2, \
+ VkPhysicalDeviceSparseImageFormatInfo2); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, \
+ VkPhysicalDeviceSubgroupProperties); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, \
+ VkPhysicalDeviceTransformFeedbackFeaturesEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT, \
+ VkPhysicalDeviceTransformFeedbackPropertiesEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES, \
+ VkPhysicalDeviceVariablePointerFeatures); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, \
+ VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, \
+ VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR, \
+ VkPhysicalDeviceVulkanMemoryModelFeaturesKHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, VkPipelineCacheCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, \
+ VkPipelineColorBlendStateCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, \
+ VkPipelineDepthStencilStateCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, \
+ VkPipelineDynamicStateCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, \
+ VkPipelineInputAssemblyStateCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, \
+ VkPipelineMultisampleStateCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT, \
+ VkPipelineRasterizationConservativeStateCreateInfoEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, \
+ VkPipelineRasterizationStateCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT, \
+ VkPipelineRasterizationStateStreamCreateInfoEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, VkPipelineShaderStageCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO, \
+ VkPipelineTessellationDomainOriginStateCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, \
+ VkPipelineTessellationStateCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT, \
+ VkPipelineVertexInputDivisorStateCreateInfoEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, \
+ VkPipelineVertexInputStateCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, \
+ VkPipelineViewportStateCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR, VkPresentRegionsKHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, VkQueryPoolCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2, VkQueueFamilyProperties2); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, VkRenderPassCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR, VkRenderPassCreateInfo2KHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO, \
+ VkRenderPassInputAttachmentAspectCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, VkRenderPassMultiviewCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, VkSamplerCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT, \
+ VkSamplerReductionModeCreateInfoEXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO, \
+ VkSamplerYcbcrConversionCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES, \
+ VkSamplerYcbcrConversionImageFormatProperties); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, VkSemaphoreCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, VkShaderModuleCreateInfo); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR, \
+ VkSharedPresentSurfaceCapabilitiesKHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2, VkSparseImageFormatProperties2); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2, \
+ VkSparseImageMemoryRequirements2); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR, VkSubpassBeginInfoKHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR, VkSubpassDependency2KHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR, VkSubpassDescription2KHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR, VkSubpassEndInfoKHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT, VkSurfaceCapabilities2EXT); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR, VkSurfaceCapabilities2KHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR, VkSurfaceFormat2KHR); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD, \
+ VkTextureLODGatherFormatPropertiesAMD); \
+ COPY_STRUCT(VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT, VkValidationCacheCreateInfoEXT); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO, \
+ VkLayerInstanceCreateInfo); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO, VkLayerDeviceCreateInfo); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT, VkDeviceEventInfoEXT); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT, VkDisplayEventInfoEXT); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT, VkDisplayPowerInfoEXT); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO, VkExportFenceCreateInfo); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO, \
+ VkExportMemoryAllocateInfo); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV, \
+ VkExportMemoryAllocateInfoNV); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO, \
+ VkExportSemaphoreCreateInfo); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES, VkExternalFenceProperties); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO, \
+ VkExternalMemoryBufferCreateInfo); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO, \
+ VkExternalMemoryImageCreateInfo); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV, \
+ VkExternalMemoryImageCreateInfoNV); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES, \
+ VkExternalSemaphoreProperties); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR, VkImportMemoryFdInfoKHR); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR, VkMemoryFdPropertiesKHR); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO, \
+ VkPhysicalDeviceExternalFenceInfo); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO, VkProtectedSubmitInfo); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT, \
+ VkShaderModuleValidationCacheCreateInfoEXT); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT, \
+ VkSwapchainCounterCreateInfoEXT); \
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT, VkValidationFlagsEXT); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO, VkBindBufferMemoryInfo, \
+ UnwrapInPlace(out->buffer), UnwrapInPlace(out->memory)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO, VkBindImageMemoryInfo, \
+ UnwrapInPlace(out->image), UnwrapInPlace(out->memory)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, VkBufferMemoryBarrier, \
+ UnwrapInPlace(out->buffer)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2, \
+ VkBufferMemoryRequirementsInfo2, UnwrapInPlace(out->buffer)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO, VkBufferViewCreateInfo, \
+ UnwrapInPlace(out->buffer)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, VkCommandBufferAllocateInfo, \
+ UnwrapInPlace(out->commandPool)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, VkCommandBufferInheritanceInfo, \
+ UnwrapInPlace(out->renderPass), UnwrapInPlace(out->framebuffer)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, VkComputePipelineCreateInfo, \
+ UnwrapInPlace(out->stage.module), UnwrapInPlace(out->layout), \
+ UnwrapInPlace(out->basePipelineHandle)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET, VkCopyDescriptorSet, \
+ UnwrapInPlace(out->srcSet), UnwrapInPlace(out->dstSet)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV, \
+ VkDedicatedAllocationMemoryAllocateInfoNV, UnwrapInPlace(out->buffer), \
+ UnwrapInPlace(out->image)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO, \
+ VkDescriptorUpdateTemplateCreateInfo, UnwrapInPlace(out->descriptorSetLayout), \
+ UnwrapInPlace(out->pipelineLayout)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, VkImageMemoryBarrier, \
+ UnwrapInPlace(out->image)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2, \
+ VkImageMemoryRequirementsInfo2, UnwrapInPlace(out->image)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2, \
+ VkImageSparseMemoryRequirementsInfo2, UnwrapInPlace(out->image)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, VkImageViewCreateInfo, \
+ UnwrapInPlace(out->image)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, VkMappedMemoryRange, \
+ UnwrapInPlace(out->memory)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, VkMemoryDedicatedAllocateInfo, \
+ UnwrapInPlace(out->buffer), UnwrapInPlace(out->image)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, VkRenderPassBeginInfo, \
+ UnwrapInPlace(out->renderPass), UnwrapInPlace(out->framebuffer)); \
+ UNWRAP_STRUCT(VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO, VkSamplerYcbcrConversionInfo, \
+ UnwrapInPlace(out->conversion)); \
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR, \
+ VkAcquireNextImageInfoKHR, UnwrapInPlace(out->swapchain), \
+ UnwrapInPlace(out->semaphore), UnwrapInPlace(out->fence)); \
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR, \
+ VkBindImageMemorySwapchainInfoKHR, UnwrapInPlace(out->swapchain)); \
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR, VkFenceGetFdInfoKHR, \
+ UnwrapInPlace(out->fence)); \
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR, \
+ VkImageSwapchainCreateInfoKHR, UnwrapInPlace(out->swapchain)); \
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR, VkImportFenceFdInfoKHR, \
+ UnwrapInPlace(out->fence)); \
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR, \
+ VkImportSemaphoreFdInfoKHR, UnwrapInPlace(out->semaphore)); \
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR, VkMemoryGetFdInfoKHR, \
+ UnwrapInPlace(out->memory)); \
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR, \
+ VkPhysicalDeviceSurfaceInfo2KHR, UnwrapInPlace(out->surface)); \
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR, VkSemaphoreGetFdInfoKHR, \
+ UnwrapInPlace(out->semaphore)); \
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, VkSwapchainCreateInfoKHR, \
+ UnwrapInPlace(out->surface), UnwrapInPlace(out->oldSwapchain));
+
+// define cases for structs we don't handle at all - only the body of the case needs to be defined
+// per-function.
+#define UNHANDLED_STRUCTS() \
+ /* Surface creation structs would pull in dependencies on OS-specific includes, */ \
+ /* so we treat them as unsupported. */ \
+ case VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR: \
+ case VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR: \
+ case VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR: \
+ case VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA: \
+ case VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK: \
+ case VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK: \
+ case VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN: \
+ case VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR: \
+ case VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR: \
+ case VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR: \
+ case VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR: \
+ /* Output structure containing objects. Must be *wrapped* not unwrapped. */ \
+ /* So we treat this as unhandled in generic code and require specific handling. */ \
+ case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV: \
+ case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV: \
+ case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV: \
+ case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID: \
+ case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID: \
+ case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID: \
+ case VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV: \
+ case VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV: \
+ case VK_STRUCTURE_TYPE_CMD_PROCESS_COMMANDS_INFO_NVX: \
+ case VK_STRUCTURE_TYPE_CMD_RESERVE_SPACE_FOR_COMMANDS_INFO_NVX: \
+ case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT: \
+ case VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_FEATURES_NVX: \
+ case VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_LIMITS_NVX: \
+ case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: \
+ case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT: \
+ case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: \
+ case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID: \
+ case VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV: \
+ case VK_STRUCTURE_TYPE_GEOMETRY_NV: \
+ case VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV: \
+ case VK_STRUCTURE_TYPE_HDR_METADATA_EXT: \
+ case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT: \
+ case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: \
+ case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX: \
+ case VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: \
+ case VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT: \
+ case VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT: \
+ case VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: \
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV: \
+ case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: \
+ case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: \
+ case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: \
+ case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV: \
+ case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV: \
+ case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV: \
+ case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: \
+ case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV: \
+ case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV: \
+ case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE: \
+ case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV: \
+ case VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV: \
+ case VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV: \
+ case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT: \
+ case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV: \
+ case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT:
+
+size_t GetNextPatchSize(const void *pNext)
+{
+ const VkBaseInStructure *next = (const VkBaseInStructure *)pNext;
+ size_t memSize = 0;
+
+ while(next)
+ {
+#undef COPY_STRUCT_CAPTURE_ONLY
+#define COPY_STRUCT_CAPTURE_ONLY(StructType, StructName) \
+ case StructType: \
+ memSize += sizeof(StructName); \
+ break;
+
+#undef COPY_STRUCT
+#define COPY_STRUCT(StructType, StructName) \
+ case StructType: \
+ memSize += sizeof(StructName); \
+ break;
+
+#undef UNWRAP_STRUCT
+#define UNWRAP_STRUCT(StructType, StructName, ...) \
+ case StructType: \
+ memSize += sizeof(StructName); \
+ break;
+
+#undef UNWRAP_STRUCT_CAPTURE_ONLY
+#define UNWRAP_STRUCT_CAPTURE_ONLY(StructType, StructName, ...) \
+ case StructType: memSize += sizeof(StructName); break;
+
+ switch(next->sType)
+ {
+ PROCESS_SIMPLE_STRUCTS();
+
+ // complex structs to handle - require multiple allocations
+ case VK_STRUCTURE_TYPE_BIND_SPARSE_INFO:
+ {
+ memSize += sizeof(VkBindSparseInfo);
+
+ VkBindSparseInfo *info = (VkBindSparseInfo *)next;
+ memSize += info->waitSemaphoreCount * sizeof(VkSemaphore);
+ memSize += info->signalSemaphoreCount * sizeof(VkSemaphore);
+ memSize += info->bufferBindCount * sizeof(VkSparseBufferMemoryBindInfo);
+ memSize += info->imageOpaqueBindCount * sizeof(VkSparseImageOpaqueMemoryBindInfo);
+ memSize += info->imageBindCount * sizeof(VkSparseImageMemoryBindInfo);
+ for(uint32_t i = 0; i < info->bufferBindCount; i++)
+ memSize += info->pBufferBinds[i].bindCount * sizeof(VkSparseMemoryBind);
+ for(uint32_t i = 0; i < info->imageOpaqueBindCount; i++)
+ memSize += info->pImageOpaqueBinds[i].bindCount * sizeof(VkSparseMemoryBind);
+ for(uint32_t i = 0; i < info->imageBindCount; i++)
+ memSize += info->pImageBinds[i].bindCount * sizeof(VkSparseImageMemoryBind);
+ break;
+ }
+ case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO:
+ {
+ memSize += sizeof(VkDescriptorSetAllocateInfo);
+
+ VkDescriptorSetAllocateInfo *info = (VkDescriptorSetAllocateInfo *)next;
+ memSize += info->descriptorSetCount * sizeof(VkDescriptorSetLayout);
+ break;
+ }
+ case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO:
+ {
+ memSize += sizeof(VkDescriptorSetLayoutCreateInfo);
+
+ VkDescriptorSetLayoutCreateInfo *info = (VkDescriptorSetLayoutCreateInfo *)next;
+ memSize += info->bindingCount * sizeof(VkDescriptorSetLayoutBinding);
+
+ for(uint32_t i = 0; i < info->bindingCount; i++)
+ if(info->pBindings[i].pImmutableSamplers)
+ memSize += info->pBindings[i].descriptorCount * sizeof(VkSampler);
+ break;
+ }
+ case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
+ {
+ memSize += sizeof(VkDeviceGroupDeviceCreateInfo);
+
+ VkDeviceGroupDeviceCreateInfo *info = (VkDeviceGroupDeviceCreateInfo *)next;
+ memSize += info->physicalDeviceCount * sizeof(VkPhysicalDevice);
+ break;
+ }
+ case VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO:
+ {
+ memSize += sizeof(VkFramebufferCreateInfo);
+
+ VkFramebufferCreateInfo *info = (VkFramebufferCreateInfo *)next;
+ memSize += info->attachmentCount * sizeof(VkImageView);
+ break;
+ }
+ case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO:
+ {
+ memSize += sizeof(VkGraphicsPipelineCreateInfo);
+
+ VkGraphicsPipelineCreateInfo *info = (VkGraphicsPipelineCreateInfo *)next;
+ memSize += info->stageCount * sizeof(VkPipelineShaderStageCreateInfo);
+ break;
+ }
+ case VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO:
+ {
+ memSize += sizeof(VkPipelineLayoutCreateInfo);
+
+ VkPipelineLayoutCreateInfo *info = (VkPipelineLayoutCreateInfo *)next;
+ memSize += info->setLayoutCount * sizeof(VkDescriptorSetLayout);
+ break;
+ }
+ case VK_STRUCTURE_TYPE_PRESENT_INFO_KHR:
+ {
+ memSize += sizeof(VkPresentInfoKHR);
+
+ VkPresentInfoKHR *info = (VkPresentInfoKHR *)next;
+ memSize += info->waitSemaphoreCount * sizeof(VkSemaphore);
+ memSize += info->swapchainCount * sizeof(VkSwapchainKHR);
+ break;
+ }
+ case VK_STRUCTURE_TYPE_SUBMIT_INFO:
+ {
+ memSize += sizeof(VkSubmitInfo);
+
+ VkSubmitInfo *info = (VkSubmitInfo *)next;
+ memSize += info->waitSemaphoreCount * sizeof(VkSemaphore);
+ memSize += info->commandBufferCount * sizeof(VkCommandBuffer);
+ memSize += info->signalSemaphoreCount * sizeof(VkSemaphore);
+ break;
+ }
+ case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET:
+ {
+ memSize += sizeof(VkWriteDescriptorSet);
+
+ VkWriteDescriptorSet *info = (VkWriteDescriptorSet *)next;
+ switch(info->descriptorType)
+ {
+ case VK_DESCRIPTOR_TYPE_SAMPLER:
+ case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+ case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
+ case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+ memSize += info->descriptorCount * sizeof(VkDescriptorImageInfo);
+ break;
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+ memSize += info->descriptorCount * sizeof(VkBufferView);
+ break;
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
+ memSize += info->descriptorCount * sizeof(VkDescriptorBufferInfo);
+ break;
+ default: RDCERR("Unhandled descriptor type unwrapping VkWriteDescriptorSet"); break;
+ }
+ break;
+ }
+
+// NV win32 external memory extensions
+#if ENABLED(RDOC_WIN32)
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV,
+ VkImportMemoryWin32HandleInfoNV);
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV,
+ VkExportMemoryWin32HandleInfoNV);
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR,
+ VkImportMemoryWin32HandleInfoKHR);
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR,
+ VkExportMemoryWin32HandleInfoKHR);
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR,
+ VkMemoryWin32HandlePropertiesKHR);
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR,
+ VkExportSemaphoreWin32HandleInfoKHR);
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR,
+ VkD3D12FenceSubmitInfoKHR);
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR,
+ VkExportFenceWin32HandleInfoKHR);
+
+ case VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR:
+ memSize += sizeof(VkMemoryGetWin32HandleInfoKHR);
+ break;
+ case VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
+ memSize += sizeof(VkImportSemaphoreWin32HandleInfoKHR);
+ break;
+ case VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR:
+ memSize += sizeof(VkSemaphoreGetWin32HandleInfoKHR);
+ break;
+ case VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR:
+ memSize += sizeof(VkImportFenceWin32HandleInfoKHR);
+ break;
+ case VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR:
+ memSize += sizeof(VkFenceGetWin32HandleInfoKHR);
+ break;
+ case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
+ case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
+ {
+ // the KHR and NV structs are identical
+ memSize += sizeof(VkWin32KeyedMutexAcquireReleaseInfoKHR);
+
+ VkWin32KeyedMutexAcquireReleaseInfoKHR *info = (VkWin32KeyedMutexAcquireReleaseInfoKHR *)next;
+ memSize += info->acquireCount * sizeof(VkDeviceMemory);
+ memSize += info->releaseCount * sizeof(VkDeviceMemory);
+ break;
+ }
+#else
+ case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
+ case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
+ case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR:
+ case VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
+ case VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
+ case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
+ {
+ RDCERR("Support for win32 external memory extensions not compiled in");
+ break;
+ }
+#endif
+
+ case VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT:
+ case VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT:
+ case VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT:
+ case VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT:
+ case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT:
+ {
+ // could be implemented but would need extra work or doesn't make sense right now
+ RDCERR("Struct %s not handled in pNext chain", ToStr(next->sType).c_str());
+ break;
+ }
+
+ UNHANDLED_STRUCTS()
+ {
+ RDCERR("Unhandled struct %s in pNext chain", ToStr(next->sType).c_str());
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_RANGE_SIZE:
+ case VK_STRUCTURE_TYPE_MAX_ENUM:
+ RDCERR("Invalid value %x in pNext chain", next->sType);
+ break;
+ }
+
+ next = next->pNext;
+ }
+
+ return memSize;
+}
+
+void UnwrapNextChain(CaptureState state, const char *structName, byte *&tempMem,
+ VkBaseInStructure *infoStruct)
+{
+ // during capture, this walks the pNext chain and either copies structs that can be passed
+ // straight through, or copies and modifies any with vulkan objects that need to be unwrapped.
+ //
+ // during replay, we do the same thing to prepare for dispatching to the driver, but we also strip
+ // out any structs we don't want to replay - e.g. external memory. This means the data is
+ // serialised and available for future use and for user inspection, but isn't replayed when not
+ // necesary.
+
+ VkBaseInStructure *nextChainTail = infoStruct;
+ const VkBaseInStructure *nextInput = (const VkBaseInStructure *)infoStruct->pNext;
+
+#undef COPY_STRUCT_CAPTURE_ONLY
+#define COPY_STRUCT_CAPTURE_ONLY(StructType, StructName) \
+ case StructType: \
+ { \
+ if(IsCaptureMode(state)) \
+ CopyNextChainedStruct(sizeof(StructName), tempMem, nextInput, nextChainTail); \
+ break; \
+ }
+
+#undef COPY_STRUCT
+#define COPY_STRUCT(StructType, StructName) \
+ case StructType: \
+ { \
+ CopyNextChainedStruct(sizeof(StructName), tempMem, nextInput, nextChainTail); \
+ break; \
+ }
+
+#define UNWRAP_STRUCT_INNER(StructType, StructName, ...) \
+ { \
+ const StructName *in = (const StructName *)nextInput; \
+ StructName *out = (StructName *)tempMem; \
+ \
+ /* copy the struct */ \
+ *out = *in; \
+ /* abuse comma operator to unwrap all members */ \
+ __VA_ARGS__; \
+ \
+ AppendModifiedChainedStruct(tempMem, out, nextChainTail); \
+ }
+
+#undef UNWRAP_STRUCT
+#define UNWRAP_STRUCT(StructType, StructName, ...) \
+ case StructType: \
+ { \
+ UNWRAP_STRUCT_INNER(StructType, StructName, __VA_ARGS__) \
+ break; \
+ }
+
+#undef UNWRAP_STRUCT_CAPTURE_ONLY
+#define UNWRAP_STRUCT_CAPTURE_ONLY(StructType, StructName, ...) \
+ case StructType: \
+ { \
+ if(IsCaptureMode(state)) \
+ { \
+ UNWRAP_STRUCT_INNER(StructType, StructName, __VA_ARGS__) \
+ } \
+ break; \
+ }
+
+ // start with an empty chain. Every call to AppendModifiedChainedStruct / CopyNextChainedStruct
+ // pushes on a new entry, but if there's only one entry in the list and it's one we want to skip,
+ // this needs to start at NULL.
+ nextChainTail->pNext = NULL;
+ while(nextInput)
+ {
+ switch(nextInput->sType)
+ {
+ PROCESS_SIMPLE_STRUCTS();
+
+ // complex structs to handle - require multiple allocations
+ case VK_STRUCTURE_TYPE_BIND_SPARSE_INFO:
+ {
+ const VkBindSparseInfo *in = (const VkBindSparseInfo *)nextInput;
+ VkBindSparseInfo *out = (VkBindSparseInfo *)tempMem;
+
+ // append immediately so tempMem is incremented
+ AppendModifiedChainedStruct(tempMem, out, nextChainTail);
+
+ // allocate unwrapped arrays
+ VkSemaphore *outWaitSemaphores = (VkSemaphore *)tempMem;
+ tempMem += sizeof(VkSemaphore) * in->waitSemaphoreCount;
+ VkSemaphore *outSignalSemaphores = (VkSemaphore *)tempMem;
+ tempMem += sizeof(VkSemaphore) * in->signalSemaphoreCount;
+ VkSparseBufferMemoryBindInfo *outBufferBinds = (VkSparseBufferMemoryBindInfo *)tempMem;
+ tempMem += sizeof(VkSparseBufferMemoryBindInfo) * in->bufferBindCount;
+ VkSparseImageOpaqueMemoryBindInfo *outImageOpaqueBinds =
+ (VkSparseImageOpaqueMemoryBindInfo *)tempMem;
+ tempMem += sizeof(VkSparseImageOpaqueMemoryBindInfo) * in->imageOpaqueBindCount;
+ VkSparseImageMemoryBindInfo *outImageBinds = (VkSparseImageMemoryBindInfo *)tempMem;
+ tempMem += sizeof(VkSparseImageMemoryBindInfo) * in->imageBindCount;
+
+ *out = *in;
+
+ out->pWaitSemaphores = outWaitSemaphores;
+ out->pSignalSemaphores = outSignalSemaphores;
+ out->pBufferBinds = outBufferBinds;
+ out->pImageOpaqueBinds = outImageOpaqueBinds;
+ out->pImageBinds = outImageBinds;
+
+ for(uint32_t i = 0; i < in->waitSemaphoreCount; i++)
+ outWaitSemaphores[i] = Unwrap(in->pWaitSemaphores[i]);
+ for(uint32_t i = 0; i < in->signalSemaphoreCount; i++)
+ outSignalSemaphores[i] = Unwrap(in->pSignalSemaphores[i]);
+
+ VkSparseMemoryBind *outMemoryBinds = (VkSparseMemoryBind *)tempMem;
+
+ for(uint32_t i = 0; i < in->bufferBindCount; i++)
+ {
+ outBufferBinds[i] = in->pBufferBinds[i];
+ UnwrapInPlace(outBufferBinds[i].buffer);
+
+ outBufferBinds[i].pBinds = outMemoryBinds;
+
+ for(uint32_t b = 0; b < outBufferBinds[i].bindCount; b++)
+ {
+ outMemoryBinds[b] = in->pBufferBinds[i].pBinds[b];
+ UnwrapInPlace(outMemoryBinds[b].memory);
+ }
+
+ outMemoryBinds += outBufferBinds[i].bindCount;
+ tempMem += outBufferBinds[i].bindCount * sizeof(VkSparseMemoryBind);
+ }
+
+ for(uint32_t i = 0; i < in->imageOpaqueBindCount; i++)
+ {
+ outImageOpaqueBinds[i] = in->pImageOpaqueBinds[i];
+ UnwrapInPlace(outImageOpaqueBinds[i].image);
+
+ outImageOpaqueBinds[i].pBinds = outMemoryBinds;
+
+ for(uint32_t b = 0; b < outBufferBinds[i].bindCount; b++)
+ {
+ outMemoryBinds[b] = in->pImageOpaqueBinds[i].pBinds[b];
+ UnwrapInPlace(outMemoryBinds[b].memory);
+ }
+
+ outMemoryBinds += outImageOpaqueBinds[i].bindCount;
+ tempMem += outImageOpaqueBinds[i].bindCount * sizeof(VkSparseMemoryBind);
+ }
+
+ VkSparseImageMemoryBind *outImageMemoryBinds = (VkSparseImageMemoryBind *)tempMem;
+
+ for(uint32_t i = 0; i < in->imageBindCount; i++)
+ {
+ outImageBinds[i] = in->pImageBinds[i];
+ UnwrapInPlace(outImageBinds[i].image);
+
+ outImageBinds[i].pBinds = outImageMemoryBinds;
+
+ for(uint32_t b = 0; b < outBufferBinds[i].bindCount; b++)
+ {
+ outImageMemoryBinds[b] = in->pImageBinds[i].pBinds[b];
+ UnwrapInPlace(outImageMemoryBinds[b].memory);
+ }
+
+ outImageMemoryBinds += outImageBinds[i].bindCount;
+ tempMem += outImageBinds[i].bindCount * sizeof(VkSparseMemoryBind);
+ }
+
+ break;
+ }
+ case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO:
+ {
+ const VkDescriptorSetAllocateInfo *in = (const VkDescriptorSetAllocateInfo *)nextInput;
+ VkDescriptorSetAllocateInfo *out = (VkDescriptorSetAllocateInfo *)tempMem;
+
+ // append immediately so tempMem is incremented
+ AppendModifiedChainedStruct(tempMem, out, nextChainTail);
+
+ // allocate unwrapped array
+ VkDescriptorSetLayout *outLayouts = (VkDescriptorSetLayout *)tempMem;
+ tempMem += sizeof(VkDescriptorSetLayout) * in->descriptorSetCount;
+
+ *out = *in;
+ UnwrapInPlace(out->descriptorPool);
+
+ out->pSetLayouts = outLayouts;
+ for(uint32_t i = 0; i < in->descriptorSetCount; i++)
+ outLayouts[i] = Unwrap(in->pSetLayouts[i]);
+
+ break;
+ }
+ case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO:
+ {
+ const VkDescriptorSetLayoutCreateInfo *in =
+ (const VkDescriptorSetLayoutCreateInfo *)nextInput;
+ VkDescriptorSetLayoutCreateInfo *out = (VkDescriptorSetLayoutCreateInfo *)tempMem;
+
+ // append immediately so tempMem is incremented
+ AppendModifiedChainedStruct(tempMem, out, nextChainTail);
+
+ // allocate unwrapped array
+ VkDescriptorSetLayoutBinding *outBindings = (VkDescriptorSetLayoutBinding *)tempMem;
+ tempMem += sizeof(VkDescriptorSetLayoutBinding) * in->bindingCount;
+ VkSampler *outSamplers = (VkSampler *)tempMem;
+
+ *out = *in;
+ out->pBindings = outBindings;
+
+ for(uint32_t i = 0; i < out->bindingCount; i++)
+ {
+ outBindings[i] = in->pBindings[i];
+
+ if(outBindings[i].pImmutableSamplers)
+ {
+ outBindings[i].pImmutableSamplers = outSamplers;
+
+ for(uint32_t d = 0; d < out->pBindings[i].descriptorCount; d++)
+ outSamplers[d] = Unwrap(in->pBindings[i].pImmutableSamplers[d]);
+
+ tempMem += sizeof(VkSampler) * out->pBindings[i].descriptorCount;
+ outSamplers += out->pBindings[i].descriptorCount;
+ }
+ }
+
+ break;
+ }
+ case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
+ {
+ const VkDeviceGroupDeviceCreateInfo *in = (const VkDeviceGroupDeviceCreateInfo *)nextInput;
+ VkDeviceGroupDeviceCreateInfo *out = (VkDeviceGroupDeviceCreateInfo *)tempMem;
+
+ // append immediately so tempMem is incremented
+ AppendModifiedChainedStruct(tempMem, out, nextChainTail);
+
+ // allocate unwrapped array
+ VkPhysicalDevice *outDevices = (VkPhysicalDevice *)tempMem;
+ tempMem += sizeof(VkPhysicalDevice) * in->physicalDeviceCount;
+
+ *out = *in;
+ out->pPhysicalDevices = outDevices;
+
+ for(uint32_t i = 0; i < in->physicalDeviceCount; i++)
+ outDevices[i] = Unwrap(in->pPhysicalDevices[i]);
+
+ break;
+ }
+ case VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO:
+ {
+ const VkFramebufferCreateInfo *in = (const VkFramebufferCreateInfo *)nextInput;
+ VkFramebufferCreateInfo *out = (VkFramebufferCreateInfo *)tempMem;
+
+ // append immediately so tempMem is incremented
+ AppendModifiedChainedStruct(tempMem, out, nextChainTail);
+
+ // allocate unwrapped array
+ VkImageView *outAttachments = (VkImageView *)tempMem;
+ tempMem += sizeof(VkImageView) * in->attachmentCount;
+
+ *out = *in;
+ UnwrapInPlace(out->renderPass);
+
+ out->pAttachments = outAttachments;
+ for(uint32_t i = 0; i < in->attachmentCount; i++)
+ outAttachments[i] = Unwrap(in->pAttachments[i]);
+
+ break;
+ }
+ case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO:
+ {
+ const VkGraphicsPipelineCreateInfo *in = (const VkGraphicsPipelineCreateInfo *)nextInput;
+ VkGraphicsPipelineCreateInfo *out = (VkGraphicsPipelineCreateInfo *)tempMem;
+
+ // append immediately so tempMem is incremented
+ AppendModifiedChainedStruct(tempMem, out, nextChainTail);
+
+ // allocate unwrapped array
+ VkPipelineShaderStageCreateInfo *outShaders = (VkPipelineShaderStageCreateInfo *)tempMem;
+ tempMem += sizeof(VkPipelineShaderStageCreateInfo) * in->stageCount;
+
+ *out = *in;
+ UnwrapInPlace(out->layout);
+ UnwrapInPlace(out->renderPass);
+ UnwrapInPlace(out->basePipelineHandle);
+
+ out->pStages = outShaders;
+ for(uint32_t i = 0; i < in->stageCount; i++)
+ outShaders[i].module = Unwrap(in->pStages[i].module);
+
+ break;
+ }
+ case VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO:
+ {
+ const VkPipelineLayoutCreateInfo *in = (const VkPipelineLayoutCreateInfo *)nextInput;
+ VkPipelineLayoutCreateInfo *out = (VkPipelineLayoutCreateInfo *)tempMem;
+
+ // append immediately so tempMem is incremented
+ AppendModifiedChainedStruct(tempMem, out, nextChainTail);
+
+ // allocate unwrapped array
+ VkDescriptorSetLayout *outLayouts = (VkDescriptorSetLayout *)tempMem;
+ tempMem += sizeof(VkDescriptorSetLayout) * in->setLayoutCount;
+
+ *out = *in;
+
+ out->pSetLayouts = outLayouts;
+ for(uint32_t i = 0; i < in->setLayoutCount; i++)
+ outLayouts[i] = Unwrap(in->pSetLayouts[i]);
+
+ break;
+ }
+ case VK_STRUCTURE_TYPE_PRESENT_INFO_KHR:
+ {
+ const VkPresentInfoKHR *in = (const VkPresentInfoKHR *)nextInput;
+ VkPresentInfoKHR *out = (VkPresentInfoKHR *)tempMem;
+
+ // append immediately so tempMem is incremented
+ AppendModifiedChainedStruct(tempMem, out, nextChainTail);
+
+ // allocate unwrapped arrays
+ VkSemaphore *outWaitSemaphores = (VkSemaphore *)tempMem;
+ tempMem += sizeof(VkSemaphore) * in->waitSemaphoreCount;
+ VkSwapchainKHR *outSwapchains = (VkSwapchainKHR *)tempMem;
+ tempMem += sizeof(VkSwapchainKHR) * in->swapchainCount;
+
+ *out = *in;
+ out->pSwapchains = outSwapchains;
+ out->pWaitSemaphores = outWaitSemaphores;
+
+ for(uint32_t i = 0; i < in->swapchainCount; i++)
+ outSwapchains[i] = Unwrap(in->pSwapchains[i]);
+ for(uint32_t i = 0; i < in->waitSemaphoreCount; i++)
+ outWaitSemaphores[i] = Unwrap(in->pWaitSemaphores[i]);
+
+ break;
+ }
+ case VK_STRUCTURE_TYPE_SUBMIT_INFO:
+ {
+ const VkSubmitInfo *in = (const VkSubmitInfo *)nextInput;
+ VkSubmitInfo *out = (VkSubmitInfo *)tempMem;
+
+ // append immediately so tempMem is incremented
+ AppendModifiedChainedStruct(tempMem, out, nextChainTail);
+
+ // allocate unwrapped arrays
+ VkSemaphore *outWaitSemaphores = (VkSemaphore *)tempMem;
+ tempMem += sizeof(VkSemaphore) * in->waitSemaphoreCount;
+ VkCommandBuffer *outCmdBuffers = (VkCommandBuffer *)tempMem;
+ tempMem += sizeof(VkCommandBuffer) * in->commandBufferCount;
+ VkSemaphore *outSignalSemaphores = (VkSemaphore *)tempMem;
+ tempMem += sizeof(VkSemaphore) * in->signalSemaphoreCount;
+
+ *out = *in;
+ out->pWaitSemaphores = outWaitSemaphores;
+ out->pCommandBuffers = outCmdBuffers;
+ out->pSignalSemaphores = outSignalSemaphores;
+
+ for(uint32_t i = 0; i < in->waitSemaphoreCount; i++)
+ outWaitSemaphores[i] = Unwrap(in->pWaitSemaphores[i]);
+ for(uint32_t i = 0; i < in->commandBufferCount; i++)
+ outCmdBuffers[i] = Unwrap(in->pCommandBuffers[i]);
+ for(uint32_t i = 0; i < in->signalSemaphoreCount; i++)
+ outSignalSemaphores[i] = Unwrap(in->pSignalSemaphores[i]);
+
+ break;
+ }
+ case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET:
+ {
+ const VkWriteDescriptorSet *in = (const VkWriteDescriptorSet *)nextInput;
+ VkWriteDescriptorSet *out = (VkWriteDescriptorSet *)tempMem;
+
+ // append immediately so tempMem is incremented
+ AppendModifiedChainedStruct(tempMem, out, nextChainTail);
+
+ *out = *in;
+ UnwrapInPlace(out->dstSet);
+
+ switch(out->descriptorType)
+ {
+ case VK_DESCRIPTOR_TYPE_SAMPLER:
+ case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+ case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
+ case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+ {
+ VkDescriptorImageInfo *outBindings = (VkDescriptorImageInfo *)tempMem;
+ tempMem += sizeof(VkDescriptorImageInfo) * in->descriptorCount;
+
+ for(uint32_t d = 0; d < in->descriptorCount; d++)
+ {
+ outBindings[d] = in->pImageInfo[d];
+ UnwrapInPlace(outBindings[d].imageView);
+ UnwrapInPlace(outBindings[d].sampler);
+ }
+
+ break;
+ }
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+ {
+ VkBufferView *outBindings = (VkBufferView *)tempMem;
+ tempMem += sizeof(VkBufferView) * in->descriptorCount;
+
+ for(uint32_t d = 0; d < in->descriptorCount; d++)
+ outBindings[d] = Unwrap(in->pTexelBufferView[d]);
+
+ break;
+ }
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
+ {
+ VkDescriptorBufferInfo *outBindings = (VkDescriptorBufferInfo *)tempMem;
+ tempMem += sizeof(VkDescriptorBufferInfo) * in->descriptorCount;
+
+ for(uint32_t d = 0; d < in->descriptorCount; d++)
+ {
+ outBindings[d] = in->pBufferInfo[d];
+ UnwrapInPlace(outBindings[d].buffer);
+ }
+
+ break;
+ }
+ default: RDCERR("Unhandled descriptor type unwrapping VkWriteDescriptorSet"); break;
+ }
+
+ break;
+ }
+
+// NV win32 external memory extensions
+#if ENABLED(RDOC_WIN32)
+ // Structs that can be copied into place
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV,
+ VkImportMemoryWin32HandleInfoNV);
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV,
+ VkExportMemoryWin32HandleInfoNV);
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR,
+ VkImportMemoryWin32HandleInfoKHR);
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR,
+ VkExportMemoryWin32HandleInfoKHR);
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR,
+ VkMemoryWin32HandlePropertiesKHR);
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR,
+ VkExportSemaphoreWin32HandleInfoKHR);
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR,
+ VkD3D12FenceSubmitInfoKHR);
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR,
+ VkExportFenceWin32HandleInfoKHR);
+
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR,
+ VkMemoryGetWin32HandleInfoKHR, UnwrapInPlace(out->memory));
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR,
+ VkImportSemaphoreWin32HandleInfoKHR,
+ UnwrapInPlace(out->semaphore));
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR,
+ VkSemaphoreGetWin32HandleInfoKHR, UnwrapInPlace(out->semaphore));
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR,
+ VkImportFenceWin32HandleInfoKHR, UnwrapInPlace(out->fence));
+ UNWRAP_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR,
+ VkFenceGetWin32HandleInfoKHR, UnwrapInPlace(out->fence));
+
+ case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
+ case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
+ {
+ // strip during replay
+ if(IsCaptureMode(state))
+ {
+ // KHR and NV structs are identical
+ const VkWin32KeyedMutexAcquireReleaseInfoKHR *in =
+ (const VkWin32KeyedMutexAcquireReleaseInfoKHR *)nextInput;
+ VkWin32KeyedMutexAcquireReleaseInfoKHR *out =
+ (VkWin32KeyedMutexAcquireReleaseInfoKHR *)tempMem;
+
+ // append immediately so tempMem is incremented
+ AppendModifiedChainedStruct(tempMem, out, nextChainTail);
+
+ // copy struct across
+ *out = *in;
+
+ // allocate unwrapped arrays
+ VkDeviceMemory *unwrappedAcquires = (VkDeviceMemory *)tempMem;
+ tempMem += sizeof(VkDeviceMemory) * in->acquireCount;
+ VkDeviceMemory *unwrappedReleases = (VkDeviceMemory *)tempMem;
+ tempMem += sizeof(VkDeviceMemory) * in->releaseCount;
+
+ // unwrap the arrays
+ for(uint32_t mem = 0; mem < in->acquireCount; mem++)
+ unwrappedAcquires[mem] = Unwrap(in->pAcquireSyncs[mem]);
+ for(uint32_t mem = 0; mem < in->releaseCount; mem++)
+ unwrappedReleases[mem] = Unwrap(in->pReleaseSyncs[mem]);
+
+ out->pAcquireSyncs = unwrappedAcquires;
+ out->pReleaseSyncs = unwrappedReleases;
+ }
+ break;
+ }
+#else
+ case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
+ case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
+ case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR:
+ case VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
+ case VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR:
+ case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
+ case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
+ {
+ RDCERR("Support for win32 external memory extensions not compiled in");
+ nextChainTail->pNext = nextInput;
+ break;
+ }
+#endif
+
+ case VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT:
+ case VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT:
+ case VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT:
+ case VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT:
+ case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT:
+ {
+ // could be implemented but would need extra work or doesn't make sense right now
+ RDCERR("Struct %s not handled in %s pNext chain", ToStr(nextInput->sType).c_str(),
+ structName);
+ nextChainTail->pNext = nextInput;
+ break;
+ }
+
+ UNHANDLED_STRUCTS()
+ {
+ RDCERR("Unhandled struct %s in %s pNext chain", ToStr(nextInput->sType).c_str(),
+ structName);
+ nextChainTail->pNext = nextInput;
+ break;
+ }
+
+ case VK_STRUCTURE_TYPE_RANGE_SIZE:
+ case VK_STRUCTURE_TYPE_MAX_ENUM:
+ {
+ RDCERR("Invalid value %x in %s pNext chain", nextInput->sType, structName);
+ nextChainTail->pNext = nextInput;
+ break;
+ }
+ }
+
+ nextInput = nextInput->pNext;
+ }
+}
diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp
index 343b2c249..a8c31ce7e 100644
--- a/renderdoc/driver/vulkan/vk_serialise.cpp
+++ b/renderdoc/driver/vulkan/vk_serialise.cpp
@@ -138,135 +138,588 @@ SERIALISE_VK_HANDLES();
PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR, \
VkImportMemoryWin32HandleInfoKHR) \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR, \
- VkImportMemoryWin32HandleInfoKHR) \
+ VkExportMemoryWin32HandleInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR, \
+ VkMemoryWin32HandlePropertiesKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR, VkMemoryGetWin32HandleInfoKHR) \
\
/* VK_KHR_external_semaphore_win32 */ \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR, \
VkExportSemaphoreWin32HandleInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR, \
+ VkImportSemaphoreWin32HandleInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR, VkD3D12FenceSubmitInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR, \
+ VkSemaphoreGetWin32HandleInfoKHR) \
\
/* VK_KHR_external_fence_win32 */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR, VkExportFenceWin32HandleInfoKHR)
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR, VkExportFenceWin32HandleInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR, VkImportFenceWin32HandleInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR, VkFenceGetWin32HandleInfoKHR)
#else
-#define HANDLE_PNEXT_OS()
+#define HANDLE_PNEXT_OS() \
+ /* VK_NV_external_memory_win32 */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV) \
+ \
+ /* VK_NV_win32_keyed_mutex */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV) \
+ \
+ /* VK_KHR_win32_keyed_mutex */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR) \
+ \
+ /* VK_KHR_external_memory_win32 */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR) \
+ \
+ /* VK_KHR_external_semaphore_win32 */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR) \
+ \
+ /* VK_KHR_external_fence_win32 */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR)
#endif
// pNext structure type dispatch
-#define HANDLE_PNEXT() \
- /* we can ignore all external memory extension structs entirely. We don't need to */ \
- /* serialise or replay it as we won't actually use external memory and will just create */ \
- /* normal memory to replay with. */ \
- \
- /* OS-specific extensions */ \
- HANDLE_PNEXT_OS() \
- \
- /* VK_NV_external_memory */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV, VkExportMemoryAllocateInfoNV) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV, \
- VkExternalMemoryImageCreateInfoNV) \
- \
- /* VK_KHR_external_memory / ..._fd */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO, VkExportMemoryAllocateInfo) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO, VkExternalMemoryImageCreateInfo) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO, \
- VkExternalMemoryBufferCreateInfo) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR, VkImportMemoryFdInfoKHR) \
- \
- /* VK_KHR_external_semaphore */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO, VkExportSemaphoreCreateInfo) \
- \
- /* VK_KHR_external_fence */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO, VkExportFenceCreateInfo) \
- \
- /* we don't create real swapchains on replay, so we can ignore surface counters */ \
- /* VK_EXT_display_control */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT, VkSwapchainCounterCreateInfoEXT) \
- \
- /* for now we don't serialise dedicated memory on replay as it's only a performance */ \
- /* hint, and is only required in conjunction with shared memory (which we don't */ \
- /* replay). In future it might be helpful to serialise this for informational purposes. */ \
- \
- /* VK_NV_dedicated_allocation */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV, \
- VkDedicatedAllocationMemoryAllocateInfoNV) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV, \
- VkDedicatedAllocationImageCreateInfoNV) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV, \
- VkDedicatedAllocationBufferCreateInfoNV) \
- \
- /* VK_KHR_dedicated_allocation */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, VkMemoryDedicatedAllocateInfo) \
- \
- /* VK_EXT_global_priority */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT, \
- VkDeviceQueueGlobalPriorityCreateInfoEXT) \
- \
- /* for now we don't support ycbcr and force-disable the feature bit, so no-one should try */ \
- /* to pNext any of these structs anyway, but if they do, we ignore them */ \
- /* VK_KHR_sampler_ycbcr_conversion */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO, VkBindImagePlaneMemoryInfo) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO, VkSamplerYcbcrConversionInfo) \
- \
- /* for now we don't handle true device groups and report all physdevices in separate groups. */ \
- /* So we can safely ignore these structures as redundant/unneeded. */ \
- /* VK_KHR_device_group */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR, \
- VkDeviceGroupSwapchainCreateInfoKHR) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR, \
- VkBindImageMemorySwapchainInfoKHR) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR, VkImageSwapchainCreateInfoKHR) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO, \
- VkBindImageMemoryDeviceGroupInfo) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO, \
- VkBindBufferMemoryDeviceGroupInfo) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO, VkDeviceGroupBindSparseInfo) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO, VkDeviceGroupSubmitInfo) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO, \
- VkDeviceGroupCommandBufferBeginInfo) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO, \
- VkDeviceGroupRenderPassBeginInfo) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO, VkMemoryAllocateFlagsInfo) \
- \
- /* Vulkan 1.1 - protected memory */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO, VkProtectedSubmitInfo) \
- \
- /* VK_EXT_conservative_rasterization */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT, \
- VkPipelineRasterizationConservativeStateCreateInfoEXT) \
- \
- /* VK_KHR_maintenance2 */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO, \
- VkPipelineTessellationDomainOriginStateCreateInfo) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, VkImageViewUsageCreateInfo) \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO, \
- VkRenderPassInputAttachmentAspectCreateInfo) \
- \
- /* VK_EXT_vertex_attribute_divisor */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT, \
- VkPipelineVertexInputDivisorStateCreateInfoEXT) \
- \
- /* VK_EXT_sampler_filter_minmax */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT, \
- VkSamplerReductionModeCreateInfoEXT) \
- \
- /* VK_KHR_multiview */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, VkRenderPassMultiviewCreateInfo) \
- \
- /* VK_KHR_image_format_list */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR, VkImageFormatListCreateInfoKHR) \
- \
- /* VK_EXT_astc_decode_mode */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT, VkImageViewASTCDecodeModeEXT) \
- \
- /* VK_EXT_validation_cache */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT, \
- VkShaderModuleValidationCacheCreateInfoEXT) \
- \
- /* VK_EXT_transform_feedback */ \
- PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT, \
- VkPipelineRasterizationStateStreamCreateInfoEXT)
+#define HANDLE_PNEXT() \
+ /* OS-specific extensions */ \
+ HANDLE_PNEXT_OS() \
+ \
+ /* Core 1.0 structs. Should never be serialised in a pNext chain */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_APPLICATION_INFO, VkApplicationInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, VkInstanceCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, VkDeviceQueueCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, VkDeviceCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SUBMIT_INFO, VkSubmitInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, VkMemoryAllocateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, VkMappedMemoryRange) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_BIND_SPARSE_INFO, VkBindSparseInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, VkFenceCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, VkSemaphoreCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, VkEventCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, VkQueryPoolCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, VkBufferCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO, VkBufferViewCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, VkImageCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, VkImageViewCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, VkShaderModuleCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, VkPipelineCacheCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, VkPipelineShaderStageCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, \
+ VkPipelineVertexInputStateCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, \
+ VkPipelineInputAssemblyStateCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, \
+ VkPipelineTessellationStateCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, \
+ VkPipelineViewportStateCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, \
+ VkPipelineRasterizationStateCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, \
+ VkPipelineMultisampleStateCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, \
+ VkPipelineDepthStencilStateCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, \
+ VkPipelineColorBlendStateCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, \
+ VkPipelineDynamicStateCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, VkGraphicsPipelineCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, VkComputePipelineCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, VkPipelineLayoutCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, VkSamplerCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, VkDescriptorSetLayoutCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, VkDescriptorPoolCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, VkDescriptorSetAllocateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, VkWriteDescriptorSet) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET, VkCopyDescriptorSet) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, VkFramebufferCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, VkRenderPassCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, VkCommandPoolCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, VkCommandBufferAllocateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, VkCommandBufferInheritanceInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, VkCommandBufferBeginInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, VkRenderPassBeginInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, VkBufferMemoryBarrier) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, VkImageMemoryBarrier) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_MEMORY_BARRIER, VkMemoryBarrier) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO, VkLayerInstanceCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO, VkLayerDeviceCreateInfo) \
+ \
+ /* Vulkan 1.1 only, no extension - subgroups, protected memory */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, \
+ VkPhysicalDeviceSubgroupProperties) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO, VkProtectedSubmitInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2, VkDeviceQueueInfo2) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, \
+ VkPhysicalDeviceProtectedMemoryFeatures) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES, \
+ VkPhysicalDeviceProtectedMemoryProperties) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES, \
+ VkPhysicalDeviceShaderDrawParameterFeatures) \
+ \
+ /* VK_AMD_shader_core_properties */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD, \
+ VkPhysicalDeviceShaderCorePropertiesAMD) \
+ \
+ /* VK_AMD_texture_gather_bias_lod */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD, \
+ VkTextureLODGatherFormatPropertiesAMD) \
+ \
+ /* VK_EXT_astc_decode_mode */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT, VkImageViewASTCDecodeModeEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, \
+ VkPhysicalDeviceASTCDecodeFeaturesEXT) \
+ \
+ /* VK_EXT_conservative_rasterization */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT, \
+ VkPhysicalDeviceConservativeRasterizationPropertiesEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT, \
+ VkPipelineRasterizationConservativeStateCreateInfoEXT) \
+ \
+ /* VK_EXT_debug_marker */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT, VkDebugMarkerObjectNameInfoEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT, VkDebugMarkerObjectTagInfoEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT, VkDebugMarkerMarkerInfoEXT) \
+ \
+ /* VK_EXT_debug_report */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, \
+ VkDebugReportCallbackCreateInfoEXT) \
+ \
+ /* VK_EXT_debug_utils */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, VkDebugUtilsObjectNameInfoEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT, VkDebugUtilsObjectTagInfoEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, VkDebugUtilsLabelEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT, \
+ VkDebugUtilsMessengerCallbackDataEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, \
+ VkDebugUtilsMessengerCreateInfoEXT) \
+ \
+ /* VK_EXT_display_control */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT, VkDisplayPowerInfoEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT, VkDeviceEventInfoEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT, VkDisplayEventInfoEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT, VkSwapchainCounterCreateInfoEXT) \
+ \
+ /* VK_EXT_display_surface_counter */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT, VkSurfaceCapabilities2EXT) \
+ \
+ /* VK_EXT_global_priority */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT, \
+ VkDeviceQueueGlobalPriorityCreateInfoEXT) \
+ \
+ /* VK_EXT_pci_bus_info */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT, \
+ VkPhysicalDevicePCIBusInfoPropertiesEXT) \
+ \
+ /* VK_EXT_sampler_filter_minmax */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT, \
+ VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT, \
+ VkSamplerReductionModeCreateInfoEXT) \
+ \
+ /* VK_EXT_transform_feedback */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, \
+ VkPhysicalDeviceTransformFeedbackFeaturesEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT, \
+ VkPhysicalDeviceTransformFeedbackPropertiesEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT, \
+ VkPipelineRasterizationStateStreamCreateInfoEXT) \
+ \
+ /* VK_EXT_validation_cache */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT, VkValidationCacheCreateInfoEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT, \
+ VkShaderModuleValidationCacheCreateInfoEXT) \
+ \
+ /* VK_EXT_validation_flags */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT, VkValidationFlagsEXT) \
+ \
+ /* VK_EXT_vertex_attribute_divisor */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, \
+ VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT, \
+ VkPipelineVertexInputDivisorStateCreateInfoEXT) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, \
+ VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT) \
+ \
+ /* VK_KHR_8bit_storage */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR, \
+ VkPhysicalDevice8BitStorageFeaturesKHR) \
+ \
+ /* VK_KHR_16bit_storage */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, \
+ VkPhysicalDevice16BitStorageFeatures) \
+ \
+ /* VK_KHR_bind_memory2 */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO, VkBindBufferMemoryInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO, VkBindImageMemoryInfo) \
+ \
+ /* VK_KHR_create_renderpass2 */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR, VkAttachmentDescription2KHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR, VkAttachmentReference2KHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR, VkSubpassDescription2KHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR, VkSubpassDependency2KHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR, VkRenderPassCreateInfo2KHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR, VkSubpassBeginInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR, VkSubpassEndInfoKHR) \
+ \
+ /* VK_KHR_dedicated_allocation */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS, VkMemoryDedicatedRequirements) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, VkMemoryDedicatedAllocateInfo) \
+ \
+ /* VK_KHR_descriptor_update_template */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO, \
+ VkDescriptorUpdateTemplateCreateInfo) \
+ \
+ /* VK_KHR_device_group_creation */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES, VkPhysicalDeviceGroupProperties) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO, VkDeviceGroupDeviceCreateInfo) \
+ \
+ /* VK_KHR_device_group */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR, VkImageSwapchainCreateInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO, \
+ VkBindImageMemoryDeviceGroupInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO, \
+ VkBindBufferMemoryDeviceGroupInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO, VkDeviceGroupBindSparseInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO, VkDeviceGroupSubmitInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO, \
+ VkDeviceGroupCommandBufferBeginInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO, \
+ VkDeviceGroupRenderPassBeginInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO, VkMemoryAllocateFlagsInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR, \
+ VkDeviceGroupSwapchainCreateInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR, \
+ VkBindImageMemorySwapchainInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR, \
+ VkDeviceGroupPresentCapabilitiesKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR, VkDeviceGroupPresentInfoKHR) \
+ \
+ /* VK_KHR_display_swapchain */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR, VkDisplayPresentInfoKHR) \
+ \
+ /* VK_KHR_driver_properties */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR, \
+ VkPhysicalDeviceDriverPropertiesKHR) \
+ \
+ /* VK_KHR_external_fence_capabilities */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO, \
+ VkPhysicalDeviceExternalFenceInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES, VkExternalFenceProperties) \
+ \
+ /* VK_KHR_external_fence / ..._fd */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO, VkExportFenceCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR, VkImportFenceFdInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR, VkFenceGetFdInfoKHR) \
+ \
+ /* VK_KHR_external_memory_capabilities */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO, \
+ VkPhysicalDeviceExternalImageFormatInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES, VkExternalImageFormatProperties) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO, \
+ VkPhysicalDeviceExternalBufferInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES, VkExternalBufferProperties) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES, VkPhysicalDeviceIDProperties) \
+ \
+ /* VK_KHR_external_memory / ..._fd */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO, VkExportMemoryAllocateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO, VkExternalMemoryImageCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO, \
+ VkExternalMemoryBufferCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR, VkImportMemoryFdInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR, VkMemoryFdPropertiesKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR, VkMemoryGetFdInfoKHR) \
+ \
+ /* VK_KHR_external_semaphore_capabilities */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO, \
+ VkPhysicalDeviceExternalSemaphoreInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES, VkExternalSemaphoreProperties) \
+ \
+ /* VK_KHR_external_semaphore / ..._fd */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO, VkExportSemaphoreCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR, VkImportSemaphoreFdInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR, VkSemaphoreGetFdInfoKHR) \
+ \
+ /* VK_KHR_get_display_properties2 */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR, VkDisplayProperties2KHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DISPLAY_PLANE_PROPERTIES_2_KHR, VkDisplayPlaneProperties2KHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DISPLAY_MODE_PROPERTIES_2_KHR, VkDisplayModeProperties2KHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DISPLAY_PLANE_INFO_2_KHR, VkDisplayPlaneInfo2KHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR, VkDisplayPlaneCapabilities2KHR) \
+ \
+ /* VK_KHR_get_memory_requirements2 */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2, VkBufferMemoryRequirementsInfo2) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2, VkImageMemoryRequirementsInfo2) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2, \
+ VkImageSparseMemoryRequirementsInfo2) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, VkMemoryRequirements2) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2, \
+ VkSparseImageMemoryRequirements2) \
+ \
+ /* VK_KHR_get_physical_device_properties2 */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, VkPhysicalDeviceFeatures2) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, VkPhysicalDeviceProperties2) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, VkFormatProperties2) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2, VkImageFormatProperties2) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, \
+ VkPhysicalDeviceImageFormatInfo2) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2, VkQueueFamilyProperties2) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2, \
+ VkPhysicalDeviceMemoryProperties2) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2, VkSparseImageFormatProperties2) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2, \
+ VkPhysicalDeviceSparseImageFormatInfo2) \
+ \
+ /* VK_KHR_get_surface_capabilities2 */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR, VkPhysicalDeviceSurfaceInfo2KHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR, VkSurfaceCapabilities2KHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR, VkSurfaceFormat2KHR) \
+ \
+ /* VK_KHR_image_format_list */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR, VkImageFormatListCreateInfoKHR) \
+ \
+ /* VK_KHR_incremental_present */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR, VkPresentRegionsKHR) \
+ \
+ /* VK_KHR_maintenance2 */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES, \
+ VkPhysicalDevicePointClippingProperties) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO, \
+ VkRenderPassInputAttachmentAspectCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, VkImageViewUsageCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO, \
+ VkPipelineTessellationDomainOriginStateCreateInfo) \
+ \
+ /* VK_KHR_maintenance3 */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, \
+ VkPhysicalDeviceMaintenance3Properties) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT, VkDescriptorSetLayoutSupport) \
+ \
+ /* VK_KHR_multiview */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, VkRenderPassMultiviewCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, \
+ VkPhysicalDeviceMultiviewFeatures) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, \
+ VkPhysicalDeviceMultiviewProperties) \
+ \
+ /* VK_KHR_push_descriptor */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR, \
+ VkPhysicalDevicePushDescriptorPropertiesKHR) \
+ \
+ /* VK_KHR_sampler_ycbcr_conversion */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO, \
+ VkSamplerYcbcrConversionCreateInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO, VkSamplerYcbcrConversionInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO, VkBindImagePlaneMemoryInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO, \
+ VkImagePlaneMemoryRequirementsInfo) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, \
+ VkPhysicalDeviceSamplerYcbcrConversionFeatures) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES, \
+ VkSamplerYcbcrConversionImageFormatProperties) \
+ \
+ /* VK_KHR_shader_atomic_int64 */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR, \
+ VkPhysicalDeviceShaderAtomicInt64FeaturesKHR) \
+ \
+ /* VK_KHR_shared_presentable_image */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR, \
+ VkSharedPresentSurfaceCapabilitiesKHR) \
+ \
+ /* VK_KHR_swapchain */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, VkSwapchainCreateInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, VkPresentInfoKHR) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR, VkAcquireNextImageInfoKHR) \
+ \
+ /* VK_KHR_variable_pointers */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES, \
+ VkPhysicalDeviceVariablePointerFeatures) \
+ \
+ /* VK_KHR_vulkan_memory_model */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR, \
+ VkPhysicalDeviceVulkanMemoryModelFeaturesKHR) \
+ \
+ /* VK_NV_dedicated_allocation */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV, \
+ VkDedicatedAllocationMemoryAllocateInfoNV) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV, \
+ VkDedicatedAllocationImageCreateInfoNV) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV, \
+ VkDedicatedAllocationBufferCreateInfoNV) \
+ \
+ /* VK_NV_external_memory */ \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV, VkExportMemoryAllocateInfoNV) \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV, \
+ VkExternalMemoryImageCreateInfoNV) \
+ \
+ /* Surface creation structs. These would pull in dependencies on OS-specific includes. */ \
+ /* So treat them as unsupported. */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR) \
+ \
+ /* VK_AMD_memory_overallocation_behavior */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD) \
+ \
+ /* VK_AMD_rasterization_order */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD) \
+ \
+ /* VK_ANDROID_external_memory_android_hardware_buffer */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID) \
+ \
+ /* VK_EXT_blend_operation_advanced */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT) \
+ \
+ /* VK_EXT_calibrated_timestamps */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT) \
+ \
+ /* VK_EXT_conditional_rendering */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT) \
+ \
+ /* VK_EXT_descriptor_indexing */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT) \
+ \
+ /* VK_EXT_discard_rectangles */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT) \
+ \
+ /* VK_EXT_external_memory_host */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT) \
+ \
+ /* VK_EXT_hdr_metadata */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_HDR_METADATA_EXT) \
+ \
+ /* VK_EXT_image_drm_format_modifier */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT) \
+ \
+ /* VK_EXT_inline_uniform_block */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT) \
+ \
+ /* VK_EXT_sample_locations */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT) \
+ \
+ /* VK_EXT_scalar_block_layout */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT) \
+ \
+ /* VK_EXT_separate_stencil_usage */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT) \
+ \
+ /* VK_GOOGLE_display_timing */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE) \
+ \
+ /* VK_NV_clip_space_w_scaling */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV) \
+ \
+ /* VK_NV_compute_shader_derivatives */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV) \
+ \
+ /* VK_NV_corner_sampled_image */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV) \
+ \
+ /* VK_NV_device_diagnostic_checkpoints */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV) \
+ \
+ /* VK_NV_fragment_coverage_to_color */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV) \
+ \
+ /* VK_NV_fragment_shader_barycentric */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV) \
+ \
+ /* VK_NV_framebuffer_mixed_samples */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV) \
+ \
+ /* VK_NV_mesh_shader */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV) \
+ \
+ /* VK_NV_ray_tracing */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_GEOMETRY_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV) \
+ \
+ /* VK_NV_representative_fragment_test */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV) \
+ \
+ /* VK_NV_scissor_exclusive */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV) \
+ \
+ /* VK_NV_shader_image_footprint */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV) \
+ \
+ /* VK_NV_shading_rate_image */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV) \
+ \
+ /* VK_NV_viewport_swizzle */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV) \
+ \
+ /* VK_NVX_device_generated_commands */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_OBJECT_TABLE_CREATE_INFO_NVX) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVX) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_CMD_PROCESS_COMMANDS_INFO_NVX) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_CMD_RESERVE_SPACE_FOR_COMMANDS_INFO_NVX) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_LIMITS_NVX) \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DEVICE_GENERATED_COMMANDS_FEATURES_NVX) \
+ \
+ /* VK_NVX_multiview_per_view_attributes */ \
+ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX)
template
static void SerialiseNext(SerialiserType &ser, VkStructureType &sType, const void *&pNext)
@@ -297,6 +750,14 @@ static void SerialiseNext(SerialiserType &ser, VkStructureType &sType, const voi
// thing user-facing.
ser.Named("pNextType").Hidden();
+#define PNEXT_UNSUPPORTED(StructType) \
+ case StructType: \
+ { \
+ RDCERR("No support for " #StructType " is available in this build"); \
+ pNext = NULL; \
+ break; \
+ }
+
// if we come across a struct we should process, then serialise a pointer to it.
#define PNEXT_STRUCT(StructType, StructName) \
case StructType: \
@@ -304,21 +765,26 @@ static void SerialiseNext(SerialiserType &ser, VkStructureType &sType, const voi
StructName *nextStruct = NULL; \
ser.SerialiseNullable("pNext", nextStruct); \
pNext = nextStruct; \
+ handled = true; \
break; \
}
+ // we don't want a default case to ensure we get a compile error if we forget to implement a
+ // structure type, but we also want to error if the input is invalid, so have this flag here.
+ bool handled = false;
+
// this serialises the pNext with the right type, as nullable. We already know from above that
// there IS something here, so the nullable is redundant but convenient
switch(*nextType)
{
HANDLE_PNEXT();
- default:
- {
- RDCERR("Unexpected/unhandled next structure type %s", ToStr(*nextType).c_str());
- break;
- }
+ case VK_STRUCTURE_TYPE_RANGE_SIZE:
+ case VK_STRUCTURE_TYPE_MAX_ENUM: break;
}
+ if(!handled)
+ RDCERR("Invalid next structure sType: %x", *nextType);
+
// delete the type itself. Any pNext we serialised is saved in the pNext pointer and will be
// deleted in DeserialiseNext()
delete nextType;
@@ -328,6 +794,14 @@ static void SerialiseNext(SerialiserType &ser, VkStructureType &sType, const voi
}
else // ser.IsWriting()
{
+#undef PNEXT_UNSUPPORTED
+#define PNEXT_UNSUPPORTED(StructType) \
+ case StructType: \
+ { \
+ RDCERR("No support for " #StructType " is available in this build"); \
+ return; \
+ }
+
// if we come across a struct we should process, then serialise a pointer to its type (to tell the
// reading serialisation what struct is coming up), then a pointer to it.
// We don't have to go any further, the act of serialising this struct will walk the chain further,
@@ -340,9 +814,14 @@ static void SerialiseNext(SerialiserType &ser, VkStructureType &sType, const voi
ser.SerialiseNullable("pNextType", nextType); \
StructName *actual = (StructName *)next; \
ser.SerialiseNullable("pNext", actual); \
+ handled = true; \
return; \
}
+ // we don't want a default case to ensure we get a compile error if we forget to implement a
+ // structure type, but we also want to error if the input is invalid, so have this flag here.
+ bool handled = false;
+
// walk the pNext chain, skipping any structs we don't care about serialising.
VkBaseInStructure *next = (VkBaseInStructure *)pNext;
@@ -351,13 +830,13 @@ static void SerialiseNext(SerialiserType &ser, VkStructureType &sType, const voi
switch(next->sType)
{
HANDLE_PNEXT();
- default:
- {
- RDCERR("Unrecognised extension structure type %s", ToStr(next->sType).c_str());
- break;
- }
+ case VK_STRUCTURE_TYPE_RANGE_SIZE:
+ case VK_STRUCTURE_TYPE_MAX_ENUM: break;
}
+ if(!handled)
+ RDCERR("Invalid pNext structure sType: %x", next->sType);
+
// walk to the next item if we didn't serialise the current one
next = (VkBaseInStructure *)next->pNext;
}
@@ -382,23 +861,94 @@ static inline void DeserialiseNext(const void *pNext)
if(pNext == NULL)
return;
+#undef PNEXT_STRUCT
+#define PNEXT_STRUCT(StructType, StructName) \
+ case StructType: \
+ { \
+ VkStructureType *nextType = (VkStructureType *)gen; \
+ Deserialise(nextType); \
+ return; \
+ }
+
// walk the chain, deserialising from the tail back
const VkBaseInStructure *gen = (const VkBaseInStructure *)pNext;
- DeserialiseNext(gen->pNext);
+ switch(gen->sType)
+ {
+ HANDLE_PNEXT();
+ case VK_STRUCTURE_TYPE_RANGE_SIZE:
+ case VK_STRUCTURE_TYPE_MAX_ENUM: DeserialiseNext(gen); break;
+ }
delete gen;
}
+template
+void DoSerialise(SerialiserType &ser, VkApplicationInfo &el)
+{
+ RDCERR("Serialising VkApplicationInfo - this should always be a NULL optional element");
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkInstanceCreateInfo &el)
+{
+ RDCERR("Serialising VkInstanceCreateInfo - this should always be a NULL optional element");
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkLayerInstanceCreateInfo &el)
+{
+ RDCERR("Serialising VkLayerInstanceCreateInfo - this should always be a NULL optional element");
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkLayerDeviceCreateInfo &el)
+{
+ RDCERR("Serialising VkLayerDeviceCreateInfo - this should always be a NULL optional element");
+}
+
template
void DoSerialise(SerialiserType &ser, VkAllocationCallbacks &el)
{
RDCERR("Serialising VkAllocationCallbacks - this should always be a NULL optional element");
}
+template
+void DoSerialise(SerialiserType &ser, VkDebugMarkerObjectNameInfoEXT &el)
+{
+ RDCERR("Serialising VkDebugMarkerObjectNameInfoEXT - this should be handled specially");
+ // can't handle it here without duplicating objectType logic
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDebugMarkerObjectTagInfoEXT &el)
+{
+ RDCERR("Serialising VkDebugMarkerObjectTagInfoEXT - this should be handled specially");
+ // can't handle it here without duplicating objectType logic
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDebugUtilsObjectNameInfoEXT &el)
+{
+ RDCERR("Serialising VkDebugUtilsObjectNameInfoEXT - this should be handled specially");
+ // can't handle it here without duplicating objectType logic
+}
+
+template <>
+void Deserialise(const VkDebugUtilsObjectNameInfoEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDebugUtilsObjectTagInfoEXT &el)
+{
+ RDCERR("Serialising VkDebugUtilsObjectTagInfoEXT - this should be handled specially");
+ // can't handle it here without duplicating objectType logic
+}
+
template
void DoSerialise(SerialiserType &ser, VkDeviceQueueCreateInfo &el)
{
- if(ser.IsWriting() && el.sType != VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO)
- RDCWARN("sType not set properly: %u", el.sType);
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO);
SerialiseNext(ser, el.sType, el.pNext);
SERIALISE_MEMBER_TYPED(VkDeviceQueueCreateFlagBits, flags);
@@ -407,6 +957,13 @@ void DoSerialise(SerialiserType &ser, VkDeviceQueueCreateInfo &el)
SERIALISE_MEMBER_ARRAY(pQueuePriorities, queueCount);
}
+template <>
+void Deserialise(const VkDeviceQueueCreateInfo &el)
+{
+ DeserialiseNext(el.pNext);
+ delete[] el.pQueuePriorities;
+}
+
// technically this doesn't need a serialise function as it's POD,
// but we give it one just for ease of printing etc.
template
@@ -665,10 +1222,7 @@ void Deserialise(const VkDeviceCreateInfo &el)
{
DeserialiseNext(el.pNext);
for(uint32_t i = 0; i < el.queueCreateInfoCount; i++)
- {
- DeserialiseNext(el.pQueueCreateInfos[i].pNext);
- delete[] el.pQueueCreateInfos[i].pQueuePriorities;
- }
+ Deserialise(el.pQueueCreateInfos[i]);
delete[] el.pQueueCreateInfos;
delete[] el.ppEnabledExtensionNames;
delete[] el.ppEnabledLayerNames;
@@ -812,6 +1366,12 @@ void DoSerialise(SerialiserType &ser, VkSparseBufferMemoryBindInfo &el)
SERIALISE_MEMBER_ARRAY(pBinds, bindCount);
}
+template <>
+void Deserialise(const VkSparseBufferMemoryBindInfo &el)
+{
+ delete[] el.pBinds;
+}
+
template
void DoSerialise(SerialiserType &ser, VkSparseImageOpaqueMemoryBindInfo &el)
{
@@ -820,6 +1380,12 @@ void DoSerialise(SerialiserType &ser, VkSparseImageOpaqueMemoryBindInfo &el)
SERIALISE_MEMBER_ARRAY(pBinds, bindCount);
}
+template <>
+void Deserialise(const VkSparseImageOpaqueMemoryBindInfo &el)
+{
+ delete[] el.pBinds;
+}
+
template
void DoSerialise(SerialiserType &ser, VkSparseImageMemoryBind &el)
{
@@ -839,6 +1405,12 @@ void DoSerialise(SerialiserType &ser, VkSparseImageMemoryBindInfo &el)
SERIALISE_MEMBER_ARRAY(pBinds, bindCount);
}
+template <>
+void Deserialise(const VkSparseImageMemoryBindInfo &el)
+{
+ delete[] el.pBinds;
+}
+
template
void DoSerialise(SerialiserType &ser, VkBindSparseInfo &el)
{
@@ -865,13 +1437,13 @@ void Deserialise(const VkBindSparseInfo &el)
DeserialiseNext(el.pNext);
delete[] el.pWaitSemaphores;
for(uint32_t i = 0; i < el.bufferBindCount; i++)
- delete[] el.pBufferBinds[i].pBinds;
+ Deserialise(el.pBufferBinds[i]);
delete[] el.pBufferBinds;
for(uint32_t i = 0; i < el.imageOpaqueBindCount; i++)
- delete[] el.pImageOpaqueBinds[i].pBinds;
+ Deserialise(el.pImageOpaqueBinds[i]);
delete[] el.pImageOpaqueBinds;
for(uint32_t i = 0; i < el.imageBindCount; i++)
- delete[] el.pImageBinds[i].pBinds;
+ Deserialise(el.pImageBinds[i]);
delete[] el.pImageBinds;
delete[] el.pSignalSemaphores;
}
@@ -966,6 +1538,16 @@ void DoSerialise(SerialiserType &ser, VkSubpassDescription &el)
SERIALISE_MEMBER_ARRAY(pPreserveAttachments, preserveAttachmentCount);
}
+template <>
+void Deserialise(const VkSubpassDescription &el)
+{
+ delete[] el.pInputAttachments;
+ delete[] el.pColorAttachments;
+ delete[] el.pResolveAttachments;
+ delete el.pDepthStencilAttachment;
+ delete[] el.pPreserveAttachments;
+}
+
template
void DoSerialise(SerialiserType &ser, VkSubpassDependency &el)
{
@@ -1006,14 +1588,7 @@ void Deserialise(const VkRenderPassCreateInfo &el)
DeserialiseNext(el.pNext);
delete[] el.pAttachments;
for(uint32_t i = 0; i < el.subpassCount; i++)
- {
- delete el.pSubpasses[i].pDepthStencilAttachment;
- delete[] el.pSubpasses[i].pInputAttachments;
- delete[] el.pSubpasses[i].pColorAttachments;
- delete[] el.pSubpasses[i].pResolveAttachments;
- if(el.pSubpasses[i].pPreserveAttachments)
- delete[] el.pSubpasses[i].pPreserveAttachments;
- }
+ Deserialise(el.pSubpasses[i]);
delete[] el.pSubpasses;
delete[] el.pDependencies;
}
@@ -1068,6 +1643,14 @@ void DoSerialise(SerialiserType &ser, VkPipelineVertexInputStateCreateInfo &el)
SERIALISE_MEMBER_ARRAY(pVertexAttributeDescriptions, vertexAttributeDescriptionCount);
}
+template <>
+void Deserialise(const VkPipelineVertexInputStateCreateInfo &el)
+{
+ DeserialiseNext(el.pNext);
+ delete[] el.pVertexBindingDescriptions;
+ delete[] el.pVertexAttributeDescriptions;
+}
+
template
void DoSerialise(SerialiserType &ser, VkPipelineInputAssemblyStateCreateInfo &el)
{
@@ -1080,6 +1663,12 @@ void DoSerialise(SerialiserType &ser, VkPipelineInputAssemblyStateCreateInfo &el
SERIALISE_MEMBER(primitiveRestartEnable);
}
+template <>
+void Deserialise(const VkPipelineInputAssemblyStateCreateInfo &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkPipelineTessellationStateCreateInfo &el)
{
@@ -1090,6 +1679,12 @@ void DoSerialise(SerialiserType &ser, VkPipelineTessellationStateCreateInfo &el)
SERIALISE_MEMBER(patchControlPoints);
}
+template <>
+void Deserialise(const VkPipelineTessellationStateCreateInfo &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkPipelineViewportStateCreateInfo &el)
{
@@ -1104,6 +1699,14 @@ void DoSerialise(SerialiserType &ser, VkPipelineViewportStateCreateInfo &el)
SERIALISE_MEMBER_ARRAY(pScissors, scissorCount);
}
+template <>
+void Deserialise(const VkPipelineViewportStateCreateInfo &el)
+{
+ DeserialiseNext(el.pNext);
+ delete[] el.pViewports;
+ delete[] el.pScissors;
+}
+
template
void DoSerialise(SerialiserType &ser, VkPipelineRasterizationStateCreateInfo &el)
{
@@ -1124,6 +1727,12 @@ void DoSerialise(SerialiserType &ser, VkPipelineRasterizationStateCreateInfo &el
SERIALISE_MEMBER(lineWidth);
}
+template <>
+void Deserialise(const VkPipelineRasterizationStateCreateInfo &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkPipelineMultisampleStateCreateInfo &el)
{
@@ -1140,6 +1749,13 @@ void DoSerialise(SerialiserType &ser, VkPipelineMultisampleStateCreateInfo &el)
SERIALISE_MEMBER(alphaToOneEnable);
}
+template <>
+void Deserialise(const VkPipelineMultisampleStateCreateInfo &el)
+{
+ DeserialiseNext(el.pNext);
+ delete el.pSampleMask;
+}
+
template
void DoSerialise(SerialiserType &ser, VkPipelineColorBlendAttachmentState &el)
{
@@ -1167,6 +1783,13 @@ void DoSerialise(SerialiserType &ser, VkPipelineColorBlendStateCreateInfo &el)
SERIALISE_MEMBER(blendConstants);
}
+template <>
+void Deserialise(const VkPipelineColorBlendStateCreateInfo &el)
+{
+ DeserialiseNext(el.pNext);
+ delete[] el.pAttachments;
+}
+
template
void DoSerialise(SerialiserType &ser, VkPipelineDepthStencilStateCreateInfo &el)
{
@@ -1186,6 +1809,12 @@ void DoSerialise(SerialiserType &ser, VkPipelineDepthStencilStateCreateInfo &el)
SERIALISE_MEMBER(maxDepthBounds);
}
+template <>
+void Deserialise(const VkPipelineDepthStencilStateCreateInfo &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkPipelineDynamicStateCreateInfo &el)
{
@@ -1197,6 +1826,13 @@ void DoSerialise(SerialiserType &ser, VkPipelineDynamicStateCreateInfo &el)
SERIALISE_MEMBER_ARRAY(pDynamicStates, dynamicStateCount);
}
+template <>
+void Deserialise(const VkPipelineDynamicStateCreateInfo &el)
+{
+ DeserialiseNext(el.pNext);
+ delete[] el.pDynamicStates;
+}
+
template
void DoSerialise(SerialiserType &ser, VkCommandPoolCreateInfo &el)
{
@@ -1244,6 +1880,12 @@ void DoSerialise(SerialiserType &ser, VkCommandBufferInheritanceInfo &el)
SERIALISE_MEMBER_TYPED(VkQueryPipelineStatisticFlagBits, pipelineStatistics);
}
+template <>
+void Deserialise(const VkCommandBufferInheritanceInfo &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkCommandBufferBeginInfo &el)
{
@@ -1259,7 +1901,7 @@ void Deserialise(const VkCommandBufferBeginInfo &el)
{
DeserialiseNext(el.pNext);
if(el.pInheritanceInfo)
- DeserialiseNext(el.pInheritanceInfo->pNext);
+ Deserialise(*el.pInheritanceInfo);
delete el.pInheritanceInfo;
}
@@ -1381,6 +2023,17 @@ void DoSerialise(SerialiserType &ser, VkPipelineShaderStageCreateInfo &el)
SERIALISE_MEMBER_OPT(pSpecializationInfo);
}
+template <>
+void Deserialise(const VkPipelineShaderStageCreateInfo &el)
+{
+ DeserialiseNext(el.pNext);
+ if(el.pSpecializationInfo)
+ {
+ Deserialise(*el.pSpecializationInfo);
+ delete el.pSpecializationInfo;
+ }
+}
+
template
void DoSerialise(SerialiserType &ser, VkSpecializationMapEntry &el)
{
@@ -1414,6 +2067,13 @@ void DoSerialise(SerialiserType &ser, VkSpecializationInfo &el)
SERIALISE_MEMBER_ARRAY(pData, dataSize);
}
+template <>
+void Deserialise(const VkSpecializationInfo &el)
+{
+ FreeAlignedBuffer((byte *)el.pData);
+ delete[] el.pMapEntries;
+}
+
template
void DoSerialise(SerialiserType &ser, VkPipelineCacheCreateInfo &el)
{
@@ -1638,70 +2298,57 @@ template <>
void Deserialise(const VkGraphicsPipelineCreateInfo &el)
{
DeserialiseNext(el.pNext);
+
if(el.pVertexInputState)
{
- DeserialiseNext(el.pVertexInputState->pNext);
- delete[] el.pVertexInputState->pVertexBindingDescriptions;
- delete[] el.pVertexInputState->pVertexAttributeDescriptions;
+ Deserialise(*el.pVertexInputState);
delete el.pVertexInputState;
}
+
if(el.pInputAssemblyState)
{
- DeserialiseNext(el.pInputAssemblyState->pNext);
+ Deserialise(*el.pInputAssemblyState);
delete el.pInputAssemblyState;
}
+
if(el.pTessellationState)
{
- DeserialiseNext(el.pTessellationState->pNext);
+ Deserialise(*el.pTessellationState);
delete el.pTessellationState;
}
if(el.pViewportState)
{
- DeserialiseNext(el.pViewportState->pNext);
- if(el.pViewportState->pViewports)
- delete[] el.pViewportState->pViewports;
- if(el.pViewportState->pScissors)
- delete[] el.pViewportState->pScissors;
+ Deserialise(*el.pViewportState);
delete el.pViewportState;
}
if(el.pRasterizationState)
{
- DeserialiseNext(el.pRasterizationState->pNext);
+ Deserialise(*el.pRasterizationState);
delete el.pRasterizationState;
}
if(el.pMultisampleState)
{
- DeserialiseNext(el.pMultisampleState->pNext);
- delete el.pMultisampleState->pSampleMask;
+ Deserialise(*el.pMultisampleState);
delete el.pMultisampleState;
}
if(el.pDepthStencilState)
{
- DeserialiseNext(el.pDepthStencilState->pNext);
+ Deserialise(*el.pDepthStencilState);
delete el.pDepthStencilState;
}
if(el.pColorBlendState)
{
- DeserialiseNext(el.pColorBlendState->pNext);
- delete[] el.pColorBlendState->pAttachments;
+ Deserialise(*el.pColorBlendState);
delete el.pColorBlendState;
}
if(el.pDynamicState)
{
- DeserialiseNext(el.pDynamicState->pNext);
- if(el.pDynamicState->pDynamicStates)
- delete[] el.pDynamicState->pDynamicStates;
+ Deserialise(*el.pDynamicState);
delete el.pDynamicState;
}
for(uint32_t i = 0; i < el.stageCount; i++)
{
- DeserialiseNext(el.pStages[i].pNext);
- if(el.pStages[i].pSpecializationInfo)
- {
- FreeAlignedBuffer((byte *)el.pStages[i].pSpecializationInfo->pData);
- delete[] el.pStages[i].pSpecializationInfo->pMapEntries;
- delete el.pStages[i].pSpecializationInfo;
- }
+ Deserialise(el.pStages[i]);
}
delete[] el.pStages;
}
@@ -1726,8 +2373,7 @@ void Deserialise(const VkComputePipelineCreateInfo &el)
DeserialiseNext(el.stage.pNext);
if(el.stage.pSpecializationInfo)
{
- FreeAlignedBuffer((byte *)(el.stage.pSpecializationInfo->pData));
- delete[] el.stage.pSpecializationInfo->pMapEntries;
+ Deserialise(*el.stage.pSpecializationInfo);
delete el.stage.pSpecializationInfo;
}
}
@@ -1946,6 +2592,12 @@ void DoSerialise(SerialiserType &ser, VkDescriptorSetLayoutBinding &el)
SERIALISE_MEMBER_ARRAY(pImmutableSamplers, descriptorCount);
}
+template <>
+void Deserialise(const VkDescriptorSetLayoutBinding &el)
+{
+ delete[] el.pImmutableSamplers;
+}
+
template
void DoSerialise(SerialiserType &ser, VkDescriptorSetLayoutCreateInfo &el)
{
@@ -2127,6 +2779,21 @@ void DoSerialise(SerialiserType &ser, VkViewport &el)
SERIALISE_MEMBER(maxDepth);
}
+template
+void DoSerialise(SerialiserType &ser, VkSharedPresentSurfaceCapabilitiesKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER_TYPED(VkImageUsageFlagBits, sharedPresentSupportedUsageFlags);
+}
+
+template <>
+void Deserialise(const VkSharedPresentSurfaceCapabilitiesKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkSwapchainCreateInfoKHR &el)
{
@@ -2175,6 +2842,85 @@ void Deserialise(const VkSwapchainCreateInfoKHR &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkPresentInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PRESENT_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(waitSemaphoreCount);
+ SERIALISE_MEMBER_ARRAY(pWaitSemaphores, waitSemaphoreCount);
+
+ SERIALISE_MEMBER(swapchainCount);
+ SERIALISE_MEMBER_ARRAY_EMPTY(pSwapchains);
+ SERIALISE_MEMBER_ARRAY(pImageIndices, swapchainCount);
+ SERIALISE_MEMBER_ARRAY(pResults, swapchainCount);
+}
+
+template <>
+void Deserialise(const VkPresentInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+ delete[] el.pWaitSemaphores;
+ delete[] el.pSwapchains;
+ delete[] el.pImageIndices;
+ delete[] el.pResults;
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkAcquireNextImageInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ // don't need the swap chain itself
+ SERIALISE_MEMBER_EMPTY(swapchain);
+ SERIALISE_MEMBER(timeout);
+ SERIALISE_MEMBER(semaphore);
+ SERIALISE_MEMBER(fence);
+ SERIALISE_MEMBER(deviceMask);
+}
+
+template <>
+void Deserialise(const VkAcquireNextImageInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceVariablePointerFeatures &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(variablePointersStorageBuffer);
+ SERIALISE_MEMBER(variablePointers);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceVariablePointerFeatures &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceVulkanMemoryModelFeaturesKHR &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(vulkanMemoryModel);
+ SERIALISE_MEMBER(vulkanMemoryModelDeviceScope);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceVulkanMemoryModelFeaturesKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkDebugMarkerMarkerInfoEXT &el)
{
@@ -2191,6 +2937,99 @@ void Deserialise(const VkDebugMarkerMarkerInfoEXT &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkDebugReportCallbackCreateInfoEXT &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER_TYPED(VkDebugReportFlagBitsEXT, flags);
+
+ // serialise pointers as uint64 to ensure portability. We can't do much with the values apart from
+ // display them
+ uint64_t pfnCallback = (uint64_t)el.pfnCallback;
+ uint64_t pUserData = (uint64_t)el.pUserData;
+ ser.Serialise("pfnCallback", pfnCallback);
+ ser.Serialise("pUserData", pUserData);
+}
+
+template <>
+void Deserialise(const VkDebugReportCallbackCreateInfoEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDebugUtilsLabelEXT &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(pLabelName);
+ SERIALISE_MEMBER(color);
+}
+
+template <>
+void Deserialise(const VkDebugUtilsLabelEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDebugUtilsMessengerCallbackDataEXT &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER_TYPED(VkFlagWithNoBits, flags);
+ SERIALISE_MEMBER(pMessageIdName);
+ SERIALISE_MEMBER(messageIdNumber);
+ SERIALISE_MEMBER(pMessage);
+ SERIALISE_MEMBER(queueLabelCount);
+ SERIALISE_MEMBER_ARRAY(pQueueLabels, queueLabelCount);
+ SERIALISE_MEMBER(cmdBufLabelCount);
+ SERIALISE_MEMBER_ARRAY(pCmdBufLabels, cmdBufLabelCount);
+ SERIALISE_MEMBER(objectCount);
+ SERIALISE_MEMBER_ARRAY(pObjects, objectCount);
+}
+
+template <>
+void Deserialise(const VkDebugUtilsMessengerCallbackDataEXT &el)
+{
+ DeserialiseNext(el.pNext);
+
+ for(uint32_t i = 0; i < el.queueLabelCount; i++)
+ Deserialise(el.pQueueLabels[i]);
+ for(uint32_t i = 0; i < el.cmdBufLabelCount; i++)
+ Deserialise(el.pCmdBufLabels[i]);
+ for(uint32_t i = 0; i < el.objectCount; i++)
+ Deserialise(el.pObjects[i]);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDebugUtilsMessengerCreateInfoEXT &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER_TYPED(VkFlagWithNoBits, flags);
+ SERIALISE_MEMBER_TYPED(VkDebugUtilsMessageSeverityFlagBitsEXT, messageSeverity);
+ SERIALISE_MEMBER_TYPED(VkDebugUtilsMessageTypeFlagBitsEXT, messageType);
+
+ // serialise pointers as uint64 to ensure portability. We can't do much with the values apart from
+ // display them
+ uint64_t pfnUserCallback = (uint64_t)el.pfnUserCallback;
+ uint64_t pUserData = (uint64_t)el.pUserData;
+ ser.Serialise("pfnUserCallback", pfnUserCallback);
+ ser.Serialise("pUserData", pUserData);
+}
+
+template <>
+void Deserialise(const VkDebugUtilsMessengerCreateInfoEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
// this isn't a real vulkan type, it's our own "anything that could be in a descriptor"
// structure that
template
@@ -2350,6 +3189,30 @@ void Deserialise(const VkBindImageMemoryInfo &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceConservativeRasterizationPropertiesEXT &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(primitiveOverestimationSize);
+ SERIALISE_MEMBER(maxExtraPrimitiveOverestimationSize);
+ SERIALISE_MEMBER(extraPrimitiveOverestimationSizeGranularity);
+ SERIALISE_MEMBER(primitiveUnderestimation);
+ SERIALISE_MEMBER(conservativePointAndLineRasterization);
+ SERIALISE_MEMBER(degenerateTrianglesRasterized);
+ SERIALISE_MEMBER(degenerateLinesRasterized);
+ SERIALISE_MEMBER(fullyCoveredFragmentShaderInputVariable);
+ SERIALISE_MEMBER(conservativeRasterizationPostDepthCoverage);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceConservativeRasterizationPropertiesEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkPipelineRasterizationConservativeStateCreateInfoEXT &el)
{
@@ -2407,6 +3270,22 @@ void DoSerialise(SerialiserType &ser, VkInputAttachmentAspectReference &el)
SERIALISE_MEMBER_TYPED(VkImageAspectFlagBits, aspectMask);
}
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDevicePointClippingProperties &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(pointClippingBehavior);
+}
+
+template <>
+void Deserialise(const VkPhysicalDevicePointClippingProperties &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkRenderPassInputAttachmentAspectCreateInfo &el)
{
@@ -2432,6 +3311,22 @@ void DoSerialise(SerialiserType &ser, VkVertexInputBindingDivisorDescriptionEXT
SERIALISE_MEMBER(divisor);
}
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(maxVertexAttribDivisor);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkPipelineVertexInputDivisorStateCreateInfoEXT &el)
{
@@ -2450,6 +3345,76 @@ void Deserialise(const VkPipelineVertexInputDivisorStateCreateInfoEXT &el)
delete[] el.pVertexBindingDivisors;
}
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(vertexAttributeInstanceRateDivisor);
+ SERIALISE_MEMBER(vertexAttributeInstanceRateZeroDivisor);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDevice8BitStorageFeaturesKHR &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(storageBuffer8BitAccess);
+ SERIALISE_MEMBER(uniformAndStorageBuffer8BitAccess);
+ SERIALISE_MEMBER(storagePushConstant8);
+}
+
+template <>
+void Deserialise(const VkPhysicalDevice8BitStorageFeaturesKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDevice16BitStorageFeatures &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(storageBuffer16BitAccess);
+ SERIALISE_MEMBER(uniformAndStorageBuffer16BitAccess);
+ SERIALISE_MEMBER(storagePushConstant16);
+ SERIALISE_MEMBER(storageInputOutput16);
+}
+
+template <>
+void Deserialise(const VkPhysicalDevice16BitStorageFeatures &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(filterMinmaxSingleComponentFormats);
+ SERIALISE_MEMBER(filterMinmaxImageComponentMapping);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkSamplerReductionModeCreateInfoEXT &el)
{
@@ -2465,22 +3430,6 @@ void Deserialise(const VkSamplerReductionModeCreateInfoEXT &el)
DeserialiseNext(el.pNext);
}
-template
-void DoSerialise(SerialiserType &ser, VkDebugUtilsLabelEXT &el)
-{
- RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT);
- SerialiseNext(ser, el.sType, el.pNext);
-
- SERIALISE_MEMBER(pLabelName);
- SERIALISE_MEMBER(color);
-}
-
-template <>
-void Deserialise(const VkDebugUtilsLabelEXT &el)
-{
- DeserialiseNext(el.pNext);
-}
-
template
void DoSerialise(SerialiserType &ser, VkSamplerYcbcrConversionCreateInfo &el)
{
@@ -2503,6 +3452,38 @@ void Deserialise(const VkSamplerYcbcrConversionCreateInfo &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceMaintenance3Properties &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(maxPerSetDescriptors);
+ SERIALISE_MEMBER(maxMemoryAllocationSize);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceMaintenance3Properties &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDescriptorSetLayoutSupport &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(supported);
+}
+
+template <>
+void Deserialise(const VkDescriptorSetLayoutSupport &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkRenderPassMultiviewCreateInfo &el)
{
@@ -2526,6 +3507,123 @@ void Deserialise(const VkRenderPassMultiviewCreateInfo &el)
delete[] el.pCorrelationMasks;
}
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceMultiviewFeatures &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(multiview);
+ SERIALISE_MEMBER(multiviewGeometryShader);
+ SERIALISE_MEMBER(multiviewTessellationShader);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceMultiviewFeatures &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceMultiviewProperties &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(maxMultiviewViewCount);
+ SERIALISE_MEMBER(maxMultiviewInstanceIndex);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceMultiviewProperties &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDevicePushDescriptorPropertiesKHR &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(maxPushDescriptors);
+}
+
+template <>
+void Deserialise(const VkPhysicalDevicePushDescriptorPropertiesKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceSurfaceInfo2KHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ // don't need the surface
+ SERIALISE_MEMBER_EMPTY(surface);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceSurfaceInfo2KHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkSurfaceCapabilitiesKHR &el)
+{
+ SERIALISE_MEMBER(minImageCount);
+ SERIALISE_MEMBER(maxImageCount);
+ SERIALISE_MEMBER(currentExtent);
+ SERIALISE_MEMBER(minImageExtent);
+ SERIALISE_MEMBER(maxImageExtent);
+ SERIALISE_MEMBER(maxImageArrayLayers);
+ SERIALISE_MEMBER_TYPED(VkSurfaceTransformFlagBitsKHR, supportedTransforms);
+ SERIALISE_MEMBER(currentTransform);
+ SERIALISE_MEMBER_TYPED(VkCompositeAlphaFlagBitsKHR, supportedCompositeAlpha);
+ SERIALISE_MEMBER_TYPED(VkImageUsageFlagBits, supportedUsageFlags);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkSurfaceCapabilities2KHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(surfaceCapabilities);
+}
+
+template <>
+void Deserialise(const VkSurfaceCapabilities2KHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkSurfaceFormatKHR &el)
+{
+ SERIALISE_MEMBER(format);
+ SERIALISE_MEMBER(colorSpace);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkSurfaceFormat2KHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(surfaceFormat);
+}
+
+template <>
+void Deserialise(const VkSurfaceFormat2KHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkImageFormatListCreateInfoKHR &el)
{
@@ -2543,6 +3641,89 @@ void Deserialise(const VkImageFormatListCreateInfoKHR &el)
delete[] el.pViewFormats;
}
+template
+void DoSerialise(SerialiserType &ser, VkRectLayerKHR &el)
+{
+ SERIALISE_MEMBER(offset);
+ SERIALISE_MEMBER(extent);
+ SERIALISE_MEMBER(layer);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPresentRegionKHR &el)
+{
+ SERIALISE_MEMBER(rectangleCount);
+ SERIALISE_MEMBER_ARRAY(pRectangles, rectangleCount);
+}
+
+template <>
+void Deserialise(const VkPresentRegionKHR &el)
+{
+ delete[] el.pRectangles;
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPresentRegionsKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(swapchainCount);
+ SERIALISE_MEMBER_ARRAY(pRegions, swapchainCount);
+}
+
+template <>
+void Deserialise(const VkPresentRegionsKHR &el)
+{
+ DeserialiseNext(el.pNext);
+ delete[] el.pRegions;
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceShaderCorePropertiesAMD &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(shaderEngineCount);
+ SERIALISE_MEMBER(shaderArraysPerEngineCount);
+ SERIALISE_MEMBER(computeUnitsPerShaderArray);
+ SERIALISE_MEMBER(simdPerComputeUnit);
+ SERIALISE_MEMBER(wavefrontsPerSimd);
+ SERIALISE_MEMBER(wavefrontSize);
+ SERIALISE_MEMBER(sgprsPerSimd);
+ SERIALISE_MEMBER(minSgprAllocation);
+ SERIALISE_MEMBER(maxSgprAllocation);
+ SERIALISE_MEMBER(sgprAllocationGranularity);
+ SERIALISE_MEMBER(vgprsPerSimd);
+ SERIALISE_MEMBER(minVgprAllocation);
+ SERIALISE_MEMBER(maxVgprAllocation);
+ SERIALISE_MEMBER(vgprAllocationGranularity);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceShaderCorePropertiesAMD &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkTextureLODGatherFormatPropertiesAMD &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(supportsTextureGatherLODBiasAMD);
+}
+
+template <>
+void Deserialise(const VkTextureLODGatherFormatPropertiesAMD &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkImageViewASTCDecodeModeEXT &el)
{
@@ -2552,6 +3733,55 @@ void DoSerialise(SerialiserType &ser, VkImageViewASTCDecodeModeEXT &el)
SERIALISE_MEMBER(decodeMode);
}
+template <>
+void Deserialise(const VkImageViewASTCDecodeModeEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceASTCDecodeFeaturesEXT &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(decodeModeSharedExponent);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceASTCDecodeFeaturesEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkValidationCacheCreateInfoEXT &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER_TYPED(VkFlagWithNoBits, flags);
+
+ // don't serialise size_t, otherwise capture/replay between different bit-ness won't work
+ {
+ uint64_t initialDataSize = (uint64_t)el.initialDataSize;
+ ser.Serialise("initialDataSize", initialDataSize);
+ if(ser.IsReading())
+ el.initialDataSize = (size_t)initialDataSize;
+ }
+
+ // don't serialise the data
+ // SERIALISE_MEMBER_ARRAY(pInitialData, el.initialDataSize);
+}
+
+template <>
+void Deserialise(const VkValidationCacheCreateInfoEXT &el)
+{
+ DeserialiseNext(el.pNext);
+ // FreeAlignedBuffer((byte *)el.pInitialData);
+}
+
template
void DoSerialise(SerialiserType &ser, VkShaderModuleValidationCacheCreateInfoEXT &el)
{
@@ -2564,6 +3794,71 @@ void DoSerialise(SerialiserType &ser, VkShaderModuleValidationCacheCreateInfoEXT
// SERIALISE_MEMBER(validationCache);
}
+template <>
+void Deserialise(const VkShaderModuleValidationCacheCreateInfoEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkValidationFlagsEXT &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(disabledValidationCheckCount);
+ SERIALISE_MEMBER_ARRAY(pDisabledValidationChecks, disabledValidationCheckCount);
+}
+
+template <>
+void Deserialise(const VkValidationFlagsEXT &el)
+{
+ DeserialiseNext(el.pNext);
+ delete[] el.pDisabledValidationChecks;
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceTransformFeedbackFeaturesEXT &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(transformFeedback);
+ SERIALISE_MEMBER(geometryStreams);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceTransformFeedbackFeaturesEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceTransformFeedbackPropertiesEXT &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(maxTransformFeedbackStreams);
+ SERIALISE_MEMBER(maxTransformFeedbackBuffers);
+ SERIALISE_MEMBER(maxTransformFeedbackBufferSize);
+ SERIALISE_MEMBER(maxTransformFeedbackStreamDataSize);
+ SERIALISE_MEMBER(maxTransformFeedbackBufferDataSize);
+ SERIALISE_MEMBER(maxTransformFeedbackBufferDataStride);
+ SERIALISE_MEMBER(transformFeedbackQueries);
+ SERIALISE_MEMBER(transformFeedbackStreamsLinesTriangles);
+ SERIALISE_MEMBER(transformFeedbackRasterizationStreamSelect);
+ SERIALISE_MEMBER(transformFeedbackDraw);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceTransformFeedbackPropertiesEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkPipelineRasterizationStateStreamCreateInfoEXT &el)
{
@@ -2598,6 +3893,12 @@ void DoSerialise(SerialiserType &ser, VkAttachmentDescription2KHR &el)
SERIALISE_MEMBER(finalLayout);
}
+template <>
+void Deserialise(const VkAttachmentDescription2KHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkAttachmentReference2KHR &el)
{
@@ -2609,6 +3910,12 @@ void DoSerialise(SerialiserType &ser, VkAttachmentReference2KHR &el)
SERIALISE_MEMBER(aspectMask);
}
+template <>
+void Deserialise(const VkAttachmentReference2KHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkSubpassDescription2KHR &el)
{
@@ -2632,6 +3939,31 @@ void DoSerialise(SerialiserType &ser, VkSubpassDescription2KHR &el)
SERIALISE_MEMBER_ARRAY(pPreserveAttachments, preserveAttachmentCount);
}
+template <>
+void Deserialise(const VkSubpassDescription2KHR &el)
+{
+ DeserialiseNext(el.pNext);
+
+ if(el.pDepthStencilAttachment)
+ Deserialise(*el.pDepthStencilAttachment);
+ delete el.pDepthStencilAttachment;
+
+ for(uint32_t j = 0; j < el.colorAttachmentCount; j++)
+ {
+ Deserialise(el.pColorAttachments[j]);
+ if(el.pResolveAttachments)
+ Deserialise(el.pResolveAttachments[j]);
+ }
+ delete[] el.pColorAttachments;
+ delete[] el.pResolveAttachments;
+
+ for(uint32_t j = 0; j < el.inputAttachmentCount; j++)
+ Deserialise(el.pInputAttachments[j]);
+
+ delete[] el.pInputAttachments;
+ delete[] el.pPreserveAttachments;
+}
+
template
void DoSerialise(SerialiserType &ser, VkSubpassDependency2KHR &el)
{
@@ -2648,6 +3980,12 @@ void DoSerialise(SerialiserType &ser, VkSubpassDependency2KHR &el)
SERIALISE_MEMBER(viewOffset);
}
+template <>
+void Deserialise(const VkSubpassDependency2KHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkRenderPassCreateInfo2KHR &el)
{
@@ -2669,40 +4007,19 @@ template <>
void Deserialise(const VkRenderPassCreateInfo2KHR &el)
{
DeserialiseNext(el.pNext);
+
for(uint32_t i = 0; i < el.attachmentCount; i++)
- {
- DeserialiseNext(el.pAttachments[i].pNext);
- }
+ Deserialise(el.pAttachments[i]);
delete[] el.pAttachments;
+
for(uint32_t i = 0; i < el.subpassCount; i++)
- {
- DeserialiseNext(el.pSubpasses[i].pNext);
-
- if(el.pSubpasses[i].pDepthStencilAttachment)
- DeserialiseNext(el.pSubpasses[i].pDepthStencilAttachment->pNext);
-
- for(uint32_t j = 0; j < el.pSubpasses[i].colorAttachmentCount; j++)
- {
- DeserialiseNext(el.pSubpasses[i].pColorAttachments[j].pNext);
- if(el.pSubpasses[i].pResolveAttachments)
- DeserialiseNext(el.pSubpasses[i].pResolveAttachments[j].pNext);
- }
-
- for(uint32_t j = 0; j < el.pSubpasses[i].inputAttachmentCount; j++)
- DeserialiseNext(el.pSubpasses[i].pInputAttachments[j].pNext);
-
- delete el.pSubpasses[i].pDepthStencilAttachment;
- delete[] el.pSubpasses[i].pInputAttachments;
- delete[] el.pSubpasses[i].pColorAttachments;
- delete[] el.pSubpasses[i].pResolveAttachments;
- delete[] el.pSubpasses[i].pPreserveAttachments;
- }
+ Deserialise(el.pSubpasses[i]);
delete[] el.pSubpasses;
+
for(uint32_t i = 0; i < el.dependencyCount; i++)
- {
- DeserialiseNext(el.pDependencies[i].pNext);
- }
+ Deserialise(el.pDependencies[i]);
delete[] el.pDependencies;
+
delete[] el.pCorrelatedViewMasks;
}
@@ -2778,6 +4095,54 @@ void Deserialise(const VkDeviceQueueInfo2 &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceProtectedMemoryFeatures &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(protectedMemory);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceProtectedMemoryFeatures &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceProtectedMemoryProperties &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(protectedNoFault);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceProtectedMemoryProperties &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceShaderDrawParameterFeatures &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(shaderDrawParameters);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceShaderDrawParameterFeatures &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkExportMemoryAllocateInfoNV &el)
{
@@ -2823,6 +4188,96 @@ void Deserialise(const VkExternalMemoryImageCreateInfo &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceExternalImageFormatInfo &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(handleType);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceExternalImageFormatInfo &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkExternalMemoryProperties &el)
+{
+ SERIALISE_MEMBER_TYPED(VkExternalMemoryFeatureFlagBits, externalMemoryFeatures);
+ SERIALISE_MEMBER_TYPED(VkExternalMemoryHandleTypeFlagBits, exportFromImportedHandleTypes);
+ SERIALISE_MEMBER_TYPED(VkExternalMemoryHandleTypeFlagBits, compatibleHandleTypes);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkExternalImageFormatProperties &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(externalMemoryProperties);
+}
+
+template <>
+void Deserialise(const VkExternalImageFormatProperties &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceExternalBufferInfo &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(flags);
+ SERIALISE_MEMBER(usage);
+ SERIALISE_MEMBER(handleType);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceExternalBufferInfo &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkExternalBufferProperties &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(externalMemoryProperties);
+}
+
+template <>
+void Deserialise(const VkExternalBufferProperties &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceIDProperties &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(deviceUUID);
+ SERIALISE_MEMBER(driverUUID);
+ SERIALISE_MEMBER(deviceLUID);
+ SERIALISE_MEMBER(deviceNodeMask);
+ SERIALISE_MEMBER(deviceLUIDValid);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceIDProperties &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkExportMemoryAllocateInfo &el)
{
@@ -2860,7 +4315,7 @@ void DoSerialise(SerialiserType &ser, VkImportMemoryFdInfoKHR &el)
SerialiseNext(ser, el.sType, el.pNext);
SERIALISE_MEMBER(handleType);
- SERIALISE_MEMBER(fd);
+ SERIALISE_MEMBER_TYPED(int32_t, fd);
}
template <>
@@ -2869,6 +4324,69 @@ void Deserialise(const VkImportMemoryFdInfoKHR &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkMemoryFdPropertiesKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(memoryTypeBits);
+}
+
+template <>
+void Deserialise(const VkMemoryFdPropertiesKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkMemoryGetFdInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(memory);
+ SERIALISE_MEMBER(handleType);
+}
+
+template <>
+void Deserialise(const VkMemoryGetFdInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceExternalSemaphoreInfo &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(handleType);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceExternalSemaphoreInfo &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkExternalSemaphoreProperties &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER_TYPED(VkExternalSemaphoreHandleTypeFlagBits, exportFromImportedHandleTypes);
+ SERIALISE_MEMBER_TYPED(VkExternalSemaphoreHandleTypeFlagBits, compatibleHandleTypes);
+ SERIALISE_MEMBER_TYPED(VkExternalSemaphoreFeatureFlagBits, externalSemaphoreFeatures);
+}
+
+template <>
+void Deserialise(const VkExternalSemaphoreProperties &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkExportSemaphoreCreateInfo &el)
{
@@ -2884,6 +4402,116 @@ void Deserialise(const VkExportSemaphoreCreateInfo &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkImportSemaphoreFdInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(semaphore);
+ SERIALISE_MEMBER_TYPED(VkSemaphoreImportFlagBits, flags);
+ SERIALISE_MEMBER_TYPED(VkExternalSemaphoreHandleTypeFlagBits, handleType);
+ SERIALISE_MEMBER_TYPED(int32_t, fd);
+}
+
+template <>
+void Deserialise(const VkImportSemaphoreFdInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkSemaphoreGetFdInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(semaphore);
+ SERIALISE_MEMBER_TYPED(VkExternalSemaphoreHandleTypeFlagBits, handleType);
+}
+
+template <>
+void Deserialise(const VkSemaphoreGetFdInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDisplayPresentInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(srcRect);
+ SERIALISE_MEMBER(dstRect);
+ SERIALISE_MEMBER(persistent);
+}
+
+template <>
+void Deserialise(const VkDisplayPresentInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkConformanceVersionKHR &el)
+{
+ SERIALISE_MEMBER(major);
+ SERIALISE_MEMBER(minor);
+ SERIALISE_MEMBER(subminor);
+ SERIALISE_MEMBER(patch);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceDriverPropertiesKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(driverID);
+ SERIALISE_MEMBER(driverName);
+ SERIALISE_MEMBER(driverInfo);
+ SERIALISE_MEMBER(conformanceVersion);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceDriverPropertiesKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceExternalFenceInfo &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(handleType);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceExternalFenceInfo &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkExternalFenceProperties &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER_TYPED(VkExternalFenceHandleTypeFlagBits, exportFromImportedHandleTypes);
+ SERIALISE_MEMBER_TYPED(VkExternalFenceHandleTypeFlagBits, compatibleHandleTypes);
+ SERIALISE_MEMBER_TYPED(VkExternalFenceFeatureFlagBits, externalFenceFeatures);
+}
+
+template <>
+void Deserialise(const VkExternalFenceProperties &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkExportFenceCreateInfo &el)
{
@@ -2899,6 +4527,84 @@ void Deserialise(const VkExportFenceCreateInfo &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkImportFenceFdInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(fence);
+ SERIALISE_MEMBER_TYPED(VkFenceImportFlagBits, flags);
+ SERIALISE_MEMBER_TYPED(VkExternalFenceHandleTypeFlagBits, handleType);
+ SERIALISE_MEMBER_TYPED(int32_t, fd);
+}
+
+template <>
+void Deserialise(const VkImportFenceFdInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkFenceGetFdInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(handleType);
+}
+
+template <>
+void Deserialise(const VkFenceGetFdInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDisplayPowerInfoEXT &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(powerState);
+}
+
+template <>
+void Deserialise(const VkDisplayPowerInfoEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDeviceEventInfoEXT &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(deviceEvent);
+}
+
+template <>
+void Deserialise(const VkDeviceEventInfoEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDisplayEventInfoEXT &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(displayEvent);
+}
+
+template <>
+void Deserialise(const VkDisplayEventInfoEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkSwapchainCounterCreateInfoEXT &el)
{
@@ -2914,6 +4620,31 @@ void Deserialise(const VkSwapchainCounterCreateInfoEXT &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkSurfaceCapabilities2EXT &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(minImageCount);
+ SERIALISE_MEMBER(maxImageCount);
+ SERIALISE_MEMBER(currentExtent);
+ SERIALISE_MEMBER(minImageExtent);
+ SERIALISE_MEMBER(maxImageExtent);
+ SERIALISE_MEMBER(maxImageArrayLayers);
+ SERIALISE_MEMBER_TYPED(VkSurfaceTransformFlagBitsKHR, supportedTransforms);
+ SERIALISE_MEMBER(currentTransform);
+ SERIALISE_MEMBER_TYPED(VkCompositeAlphaFlagBitsKHR, supportedCompositeAlpha);
+ SERIALISE_MEMBER_TYPED(VkImageUsageFlagBits, supportedUsageFlags);
+ SERIALISE_MEMBER_TYPED(VkSurfaceCounterFlagBitsEXT, supportedSurfaceCounters);
+}
+
+template <>
+void Deserialise(const VkSurfaceCapabilities2EXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkDedicatedAllocationMemoryAllocateInfoNV &el)
{
@@ -2963,6 +4694,22 @@ void Deserialise(const VkDedicatedAllocationBufferCreateInfoNV &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkMemoryDedicatedRequirements &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(prefersDedicatedAllocation);
+ SERIALISE_MEMBER(requiresDedicatedAllocation);
+}
+
+template <>
+void Deserialise(const VkMemoryDedicatedRequirements &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkMemoryDedicatedAllocateInfo &el)
{
@@ -2995,6 +4742,25 @@ void Deserialise(const VkDeviceQueueGlobalPriorityCreateInfoEXT &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDevicePCIBusInfoPropertiesEXT &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(pciDomain);
+ SERIALISE_MEMBER(pciBus);
+ SERIALISE_MEMBER(pciDevice);
+ SERIALISE_MEMBER(pciFunction);
+}
+
+template <>
+void Deserialise(const VkPhysicalDevicePCIBusInfoPropertiesEXT &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkBindImagePlaneMemoryInfo &el)
{
@@ -3010,6 +4776,70 @@ void Deserialise(const VkBindImagePlaneMemoryInfo &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkImagePlaneMemoryRequirementsInfo &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(planeAspect);
+}
+
+template <>
+void Deserialise(const VkImagePlaneMemoryRequirementsInfo &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceSamplerYcbcrConversionFeatures &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(samplerYcbcrConversion);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceSamplerYcbcrConversionFeatures &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkSamplerYcbcrConversionImageFormatProperties &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(combinedImageSamplerDescriptorCount);
+}
+
+template <>
+void Deserialise(const VkSamplerYcbcrConversionImageFormatProperties &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceShaderAtomicInt64FeaturesKHR &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(shaderBufferInt64Atomics);
+ SERIALISE_MEMBER(shaderSharedInt64Atomics);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceShaderAtomicInt64FeaturesKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkSamplerYcbcrConversionInfo &el)
{
@@ -3056,6 +4886,85 @@ void Deserialise(const VkBindImageMemorySwapchainInfoKHR &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkDeviceGroupPresentCapabilitiesKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(presentMask);
+ SERIALISE_MEMBER_TYPED(VkDeviceGroupPresentModeFlagBitsKHR, modes);
+}
+
+template <>
+void Deserialise(const VkDeviceGroupPresentCapabilitiesKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDeviceGroupPresentInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(swapchainCount);
+ SERIALISE_MEMBER_ARRAY(pDeviceMasks, swapchainCount);
+ SERIALISE_MEMBER_TYPED(VkDeviceGroupPresentModeFlagBitsKHR, mode);
+}
+
+template <>
+void Deserialise(const VkDeviceGroupPresentInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+
+ delete[] el.pDeviceMasks;
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceGroupProperties &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ if(ser.IsReading())
+ {
+ for(uint32_t i = 0; i < VK_MAX_DEVICE_GROUP_SIZE; i++)
+ el.physicalDevices[i] = VK_NULL_HANDLE;
+ }
+
+ SERIALISE_MEMBER(physicalDeviceCount);
+ // manual call to Serialise to ensure we only serialise the number of devices, but also don't
+ // allocate memory
+ ser.Serialise("physicalDevices", (VkPhysicalDevice *&)el.physicalDevices,
+ (uint64_t)el.physicalDeviceCount, SerialiserFlags::NoFlags);
+ SERIALISE_MEMBER(subsetAllocation);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceGroupProperties &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDeviceGroupDeviceCreateInfo &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(physicalDeviceCount);
+ SERIALISE_MEMBER_ARRAY(pPhysicalDevices, physicalDeviceCount);
+}
+
+template <>
+void Deserialise(const VkDeviceGroupDeviceCreateInfo &el)
+{
+ DeserialiseNext(el.pNext);
+
+ delete[] el.pPhysicalDevices;
+}
+
template
void DoSerialise(SerialiserType &ser, VkImageSwapchainCreateInfoKHR &el)
{
@@ -3200,6 +5109,24 @@ void Deserialise(const VkMemoryAllocateFlagsInfo &el)
DeserialiseNext(el.pNext);
}
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceSubgroupProperties &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(subgroupSize);
+ SERIALISE_MEMBER_TYPED(VkShaderStageFlagBits, supportedStages);
+ SERIALISE_MEMBER_TYPED(VkSubgroupFeatureFlagBits, supportedOperations);
+ SERIALISE_MEMBER(quadOperationsInAllStages);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceSubgroupProperties &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
template
void DoSerialise(SerialiserType &ser, VkProtectedSubmitInfo &el)
{
@@ -3215,154 +5142,659 @@ void Deserialise(const VkProtectedSubmitInfo &el)
DeserialiseNext(el.pNext);
}
-INSTANTIATE_SERIALISE_TYPE(VkOffset2D);
-INSTANTIATE_SERIALISE_TYPE(VkExtent2D);
-INSTANTIATE_SERIALISE_TYPE(VkMemoryType);
-INSTANTIATE_SERIALISE_TYPE(VkMemoryHeap);
-INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceLimits);
-INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSparseProperties);
-INSTANTIATE_SERIALISE_TYPE(VkQueueFamilyProperties);
-INSTANTIATE_SERIALISE_TYPE(VkExtent3D);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineShaderStageCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkOffset3D);
-INSTANTIATE_SERIALISE_TYPE(VkCommandBufferInheritanceInfo);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineVertexInputStateCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkSparseBufferMemoryBindInfo);
-INSTANTIATE_SERIALISE_TYPE(VkSparseImageOpaqueMemoryBindInfo);
-INSTANTIATE_SERIALISE_TYPE(VkSparseImageMemoryBindInfo);
-INSTANTIATE_SERIALISE_TYPE(VkAttachmentDescription);
-INSTANTIATE_SERIALISE_TYPE(VkSubpassDescription);
-INSTANTIATE_SERIALISE_TYPE(VkSubpassDependency);
-INSTANTIATE_SERIALISE_TYPE(VkClearValue);
-INSTANTIATE_SERIALISE_TYPE(VkClearColorValue);
-INSTANTIATE_SERIALISE_TYPE(VkClearDepthStencilValue);
-INSTANTIATE_SERIALISE_TYPE(VkClearAttachment);
-INSTANTIATE_SERIALISE_TYPE(VkClearRect);
-INSTANTIATE_SERIALISE_TYPE(VkViewport);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineColorBlendAttachmentState);
-INSTANTIATE_SERIALISE_TYPE(VkDescriptorPoolSize);
-INSTANTIATE_SERIALISE_TYPE(VkDescriptorImageInfo);
-INSTANTIATE_SERIALISE_TYPE(VkDescriptorBufferInfo);
-INSTANTIATE_SERIALISE_TYPE(VkSpecializationInfo);
-INSTANTIATE_SERIALISE_TYPE(VkAttachmentReference);
-INSTANTIATE_SERIALISE_TYPE(VkSparseImageMemoryBind);
-INSTANTIATE_SERIALISE_TYPE(VkVertexInputBindingDescription);
-INSTANTIATE_SERIALISE_TYPE(VkVertexInputAttributeDescription);
-INSTANTIATE_SERIALISE_TYPE(VkSpecializationMapEntry);
-INSTANTIATE_SERIALISE_TYPE(VkRect2D);
-INSTANTIATE_SERIALISE_TYPE(VkDeviceQueueCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkAllocationCallbacks);
-INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceFeatures);
-INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMemoryProperties);
-INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceProperties);
-INSTANTIATE_SERIALISE_TYPE(VkDeviceCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkBufferCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkBufferViewCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkImageCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkImageViewCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkMemoryRequirements);
-INSTANTIATE_SERIALISE_TYPE(VkSparseMemoryBind);
+template
+void DoSerialise(SerialiserType &ser, VkDisplayPlaneInfo2KHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DISPLAY_PLANE_INFO_2_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ // don't serialise unwrapped VkDisplayModeKHR
+ // SERIALISE_MEMBER(mode);
+ SERIALISE_MEMBER(planeIndex);
+}
+
+template <>
+void Deserialise(const VkDisplayPlaneInfo2KHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDisplayPlaneCapabilitiesKHR &el)
+{
+ SERIALISE_MEMBER_TYPED(VkDisplayPlaneAlphaFlagBitsKHR, supportedAlpha);
+ SERIALISE_MEMBER(minSrcPosition);
+ SERIALISE_MEMBER(maxSrcPosition);
+ SERIALISE_MEMBER(minSrcExtent);
+ SERIALISE_MEMBER(maxSrcExtent);
+ SERIALISE_MEMBER(minDstPosition);
+ SERIALISE_MEMBER(maxDstPosition);
+ SERIALISE_MEMBER(minDstExtent);
+ SERIALISE_MEMBER(maxDstExtent);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDisplayPlaneCapabilities2KHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(capabilities);
+}
+
+template <>
+void Deserialise(const VkDisplayPlaneCapabilities2KHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDisplayPropertiesKHR &el)
+{
+ // don't serialise unwrapped VkDisplayKHR
+ // SERIALISE_MEMBER(display);
+ SERIALISE_MEMBER(displayName);
+ SERIALISE_MEMBER(physicalDimensions);
+ SERIALISE_MEMBER(physicalResolution);
+ SERIALISE_MEMBER_TYPED(VkSurfaceTransformFlagBitsKHR, supportedTransforms);
+ SERIALISE_MEMBER(planeReorderPossible);
+ SERIALISE_MEMBER(persistentContent);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDisplayProperties2KHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(displayProperties);
+}
+
+template <>
+void Deserialise(const VkDisplayProperties2KHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDisplayPlanePropertiesKHR &el)
+{
+ // don't serialise unwrapped VkDisplayKHR
+ // SERIALISE_MEMBER(currentDisplay);
+ SERIALISE_MEMBER(currentStackIndex);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDisplayPlaneProperties2KHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DISPLAY_PLANE_PROPERTIES_2_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(displayPlaneProperties);
+}
+
+template <>
+void Deserialise(const VkDisplayPlaneProperties2KHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDisplayModeParametersKHR &el)
+{
+ SERIALISE_MEMBER(visibleRegion);
+ SERIALISE_MEMBER(refreshRate);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDisplayModePropertiesKHR &el)
+{
+ // don't serialise unwrapped VkDisplayModeKHR
+ // SERIALISE_MEMBER(displayMode);
+ SERIALISE_MEMBER(parameters);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkDisplayModeProperties2KHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_DISPLAY_MODE_PROPERTIES_2_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(displayModeProperties);
+}
+
+template <>
+void Deserialise(const VkDisplayModeProperties2KHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkBufferMemoryRequirementsInfo2 &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(buffer);
+}
+
+template <>
+void Deserialise(const VkBufferMemoryRequirementsInfo2 &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkImageMemoryRequirementsInfo2 &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(image);
+}
+
+template <>
+void Deserialise(const VkImageMemoryRequirementsInfo2 &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkImageSparseMemoryRequirementsInfo2 &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(image);
+}
+
+template <>
+void Deserialise(const VkImageSparseMemoryRequirementsInfo2 &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkMemoryRequirements2 &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(memoryRequirements);
+}
+
+template <>
+void Deserialise(const VkMemoryRequirements2 &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkSparseImageMemoryRequirements &el)
+{
+ SERIALISE_MEMBER(formatProperties);
+ SERIALISE_MEMBER(imageMipTailFirstLod);
+ SERIALISE_MEMBER(imageMipTailSize);
+ SERIALISE_MEMBER(imageMipTailOffset);
+ SERIALISE_MEMBER(imageMipTailStride);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkSparseImageMemoryRequirements2 &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(memoryRequirements);
+}
+
+template <>
+void Deserialise(const VkSparseImageMemoryRequirements2 &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceFeatures2 &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(features);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceFeatures2 &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceProperties2 &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(properties);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceProperties2 &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkFormatProperties &el)
+{
+ SERIALISE_MEMBER_TYPED(VkFormatFeatureFlagBits, linearTilingFeatures);
+ SERIALISE_MEMBER_TYPED(VkFormatFeatureFlagBits, optimalTilingFeatures);
+ SERIALISE_MEMBER_TYPED(VkFormatFeatureFlagBits, bufferFeatures);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkFormatProperties2 &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(formatProperties);
+}
+
+template <>
+void Deserialise(const VkFormatProperties2 &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkImageFormatProperties &el)
+{
+ SERIALISE_MEMBER(maxExtent);
+ SERIALISE_MEMBER(maxMipLevels);
+ SERIALISE_MEMBER(maxArrayLayers);
+ SERIALISE_MEMBER_TYPED(VkSampleCountFlagBits, sampleCounts);
+ SERIALISE_MEMBER(maxResourceSize);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkImageFormatProperties2 &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(imageFormatProperties);
+}
+
+template <>
+void Deserialise(const VkImageFormatProperties2 &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceImageFormatInfo2 &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(format);
+ SERIALISE_MEMBER(type);
+ SERIALISE_MEMBER(tiling);
+ SERIALISE_MEMBER(usage);
+ SERIALISE_MEMBER(flags);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceImageFormatInfo2 &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkQueueFamilyProperties2 &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(queueFamilyProperties);
+}
+
+template <>
+void Deserialise(const VkQueueFamilyProperties2 &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceMemoryProperties2 &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(memoryProperties);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceMemoryProperties2 &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkSparseImageFormatProperties &el)
+{
+ SERIALISE_MEMBER_TYPED(VkImageAspectFlagBits, aspectMask);
+ SERIALISE_MEMBER(imageGranularity);
+ SERIALISE_MEMBER_TYPED(VkSparseImageFormatFlagBits, flags);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkSparseImageFormatProperties2 &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(properties);
+}
+
+template <>
+void Deserialise(const VkSparseImageFormatProperties2 &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkPhysicalDeviceSparseImageFormatInfo2 &el)
+{
+ RDCASSERT(ser.IsReading() ||
+ el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(format);
+ SERIALISE_MEMBER(type);
+ SERIALISE_MEMBER(samples);
+ SERIALISE_MEMBER(usage);
+ SERIALISE_MEMBER(tiling);
+}
+
+template <>
+void Deserialise(const VkPhysicalDeviceSparseImageFormatInfo2 &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+// pNext structs - always have deserialise for the next chain
+INSTANTIATE_SERIALISE_TYPE(VkAcquireNextImageInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkApplicationInfo);
+INSTANTIATE_SERIALISE_TYPE(VkAttachmentDescription2KHR);
+INSTANTIATE_SERIALISE_TYPE(VkAttachmentReference2KHR);
+INSTANTIATE_SERIALISE_TYPE(VkBindBufferMemoryDeviceGroupInfo);
+INSTANTIATE_SERIALISE_TYPE(VkBindBufferMemoryInfo);
+INSTANTIATE_SERIALISE_TYPE(VkBindImageMemoryDeviceGroupInfo);
+INSTANTIATE_SERIALISE_TYPE(VkBindImageMemoryInfo);
+INSTANTIATE_SERIALISE_TYPE(VkBindImageMemorySwapchainInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkBindImagePlaneMemoryInfo);
INSTANTIATE_SERIALISE_TYPE(VkBindSparseInfo);
-INSTANTIATE_SERIALISE_TYPE(VkSubmitInfo);
-INSTANTIATE_SERIALISE_TYPE(VkFramebufferCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkRenderPassCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkRenderPassBeginInfo);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineInputAssemblyStateCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineTessellationStateCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineViewportStateCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineRasterizationStateCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineMultisampleStateCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineDepthStencilStateCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineColorBlendStateCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineDynamicStateCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineLayoutCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkPushConstantRange);
-INSTANTIATE_SERIALISE_TYPE(VkDescriptorSetLayoutBinding);
-INSTANTIATE_SERIALISE_TYPE(VkDescriptorSetLayoutCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkDescriptorPoolCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkDescriptorSetAllocateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkWriteDescriptorSet);
-INSTANTIATE_SERIALISE_TYPE(VkCopyDescriptorSet);
-INSTANTIATE_SERIALISE_TYPE(VkCommandPoolCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkBufferCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkBufferMemoryBarrier);
+INSTANTIATE_SERIALISE_TYPE(VkBufferMemoryRequirementsInfo2);
+INSTANTIATE_SERIALISE_TYPE(VkBufferViewCreateInfo);
INSTANTIATE_SERIALISE_TYPE(VkCommandBufferAllocateInfo);
INSTANTIATE_SERIALISE_TYPE(VkCommandBufferBeginInfo);
-INSTANTIATE_SERIALISE_TYPE(VkStencilOpState);
-INSTANTIATE_SERIALISE_TYPE(VkQueryPoolCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkSemaphoreCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkCommandBufferInheritanceInfo);
+INSTANTIATE_SERIALISE_TYPE(VkCommandPoolCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkComputePipelineCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkCopyDescriptorSet);
+INSTANTIATE_SERIALISE_TYPE(VkDebugMarkerMarkerInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkDebugMarkerObjectNameInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkDebugMarkerObjectTagInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkDebugReportCallbackCreateInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkDebugUtilsLabelEXT);
+INSTANTIATE_SERIALISE_TYPE(VkDebugUtilsMessengerCallbackDataEXT);
+INSTANTIATE_SERIALISE_TYPE(VkDebugUtilsMessengerCreateInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkDebugUtilsObjectNameInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkDebugUtilsObjectTagInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkDedicatedAllocationBufferCreateInfoNV);
+INSTANTIATE_SERIALISE_TYPE(VkDedicatedAllocationImageCreateInfoNV);
+INSTANTIATE_SERIALISE_TYPE(VkDedicatedAllocationMemoryAllocateInfoNV);
+INSTANTIATE_SERIALISE_TYPE(VkDescriptorPoolCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkDescriptorSetAllocateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkDescriptorSetLayoutCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkDescriptorSetLayoutSupport);
+INSTANTIATE_SERIALISE_TYPE(VkDescriptorUpdateTemplateCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkDeviceCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkDeviceEventInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupBindSparseInfo);
+INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupCommandBufferBeginInfo);
+INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupDeviceCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupPresentCapabilitiesKHR);
+INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupPresentInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupRenderPassBeginInfo);
+INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupSubmitInfo);
+INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupSwapchainCreateInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkDeviceQueueCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkDeviceQueueGlobalPriorityCreateInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkDeviceQueueInfo2);
+INSTANTIATE_SERIALISE_TYPE(VkDisplayEventInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkDisplayModeProperties2KHR);
+INSTANTIATE_SERIALISE_TYPE(VkDisplayPlaneCapabilities2KHR);
+INSTANTIATE_SERIALISE_TYPE(VkDisplayPlaneInfo2KHR);
+INSTANTIATE_SERIALISE_TYPE(VkDisplayPlaneProperties2KHR);
+INSTANTIATE_SERIALISE_TYPE(VkDisplayPowerInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkDisplayPresentInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkDisplayProperties2KHR);
INSTANTIATE_SERIALISE_TYPE(VkEventCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkExportFenceCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkExportMemoryAllocateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkExportMemoryAllocateInfoNV);
+INSTANTIATE_SERIALISE_TYPE(VkExportSemaphoreCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkExternalBufferProperties);
+INSTANTIATE_SERIALISE_TYPE(VkExternalFenceProperties);
+INSTANTIATE_SERIALISE_TYPE(VkExternalImageFormatProperties);
+INSTANTIATE_SERIALISE_TYPE(VkExternalMemoryBufferCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkExternalMemoryImageCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkExternalMemoryImageCreateInfoNV);
+INSTANTIATE_SERIALISE_TYPE(VkExternalSemaphoreProperties);
INSTANTIATE_SERIALISE_TYPE(VkFenceCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkSamplerCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineCacheCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkShaderModuleCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkImageSubresourceRange);
-INSTANTIATE_SERIALISE_TYPE(VkImageSubresource);
-INSTANTIATE_SERIALISE_TYPE(VkImageSubresourceLayers);
+INSTANTIATE_SERIALISE_TYPE(VkFenceGetFdInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkFormatProperties2);
+INSTANTIATE_SERIALISE_TYPE(VkFramebufferCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkGraphicsPipelineCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkImageCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkImageFormatListCreateInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkImageFormatProperties2);
+INSTANTIATE_SERIALISE_TYPE(VkImageMemoryBarrier);
+INSTANTIATE_SERIALISE_TYPE(VkImageMemoryRequirementsInfo2);
+INSTANTIATE_SERIALISE_TYPE(VkImagePlaneMemoryRequirementsInfo);
+INSTANTIATE_SERIALISE_TYPE(VkImageSparseMemoryRequirementsInfo2);
+INSTANTIATE_SERIALISE_TYPE(VkImageSwapchainCreateInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkImageViewASTCDecodeModeEXT);
+INSTANTIATE_SERIALISE_TYPE(VkImageViewCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkImageViewUsageCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkImportFenceFdInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkImportMemoryFdInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkImportSemaphoreFdInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkInstanceCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkLayerDeviceCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkLayerInstanceCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkMappedMemoryRange);
+INSTANTIATE_SERIALISE_TYPE(VkMemoryAllocateFlagsInfo);
INSTANTIATE_SERIALISE_TYPE(VkMemoryAllocateInfo);
INSTANTIATE_SERIALISE_TYPE(VkMemoryBarrier);
-INSTANTIATE_SERIALISE_TYPE(VkBufferMemoryBarrier);
-INSTANTIATE_SERIALISE_TYPE(VkImageMemoryBarrier);
-INSTANTIATE_SERIALISE_TYPE(VkGraphicsPipelineCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkComputePipelineCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkComponentMapping);
-INSTANTIATE_SERIALISE_TYPE(VkMappedMemoryRange);
-INSTANTIATE_SERIALISE_TYPE(VkBufferImageCopy);
-INSTANTIATE_SERIALISE_TYPE(VkBufferCopy);
-INSTANTIATE_SERIALISE_TYPE(VkImageCopy);
-INSTANTIATE_SERIALISE_TYPE(VkImageBlit);
-INSTANTIATE_SERIALISE_TYPE(VkImageResolve);
-INSTANTIATE_SERIALISE_TYPE(VkSwapchainCreateInfoKHR);
-INSTANTIATE_SERIALISE_TYPE(VkDebugMarkerMarkerInfoEXT);
-INSTANTIATE_SERIALISE_TYPE(VkDescriptorUpdateTemplateCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkBindBufferMemoryInfo);
-INSTANTIATE_SERIALISE_TYPE(VkBindImageMemoryInfo);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineRasterizationConservativeStateCreateInfoEXT);
-INSTANTIATE_SERIALISE_TYPE(VkPipelineVertexInputDivisorStateCreateInfoEXT);
-INSTANTIATE_SERIALISE_TYPE(VkSamplerReductionModeCreateInfoEXT);
-INSTANTIATE_SERIALISE_TYPE(VkDebugUtilsLabelEXT);
-INSTANTIATE_SERIALISE_TYPE(VkSamplerYcbcrConversionCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkRenderPassMultiviewCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkDeviceQueueInfo2);
-INSTANTIATE_SERIALISE_TYPE(VkExportMemoryAllocateInfoNV);
-INSTANTIATE_SERIALISE_TYPE(VkExternalMemoryImageCreateInfoNV);
-INSTANTIATE_SERIALISE_TYPE(VkExportMemoryAllocateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkExternalMemoryBufferCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkImportMemoryFdInfoKHR);
-INSTANTIATE_SERIALISE_TYPE(VkExportSemaphoreCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkExportFenceCreateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkSwapchainCounterCreateInfoEXT);
-INSTANTIATE_SERIALISE_TYPE(VkDedicatedAllocationMemoryAllocateInfoNV);
-INSTANTIATE_SERIALISE_TYPE(VkDedicatedAllocationImageCreateInfoNV);
-INSTANTIATE_SERIALISE_TYPE(VkDedicatedAllocationBufferCreateInfoNV);
INSTANTIATE_SERIALISE_TYPE(VkMemoryDedicatedAllocateInfo);
-INSTANTIATE_SERIALISE_TYPE(VkDeviceQueueGlobalPriorityCreateInfoEXT);
-INSTANTIATE_SERIALISE_TYPE(VkBindImagePlaneMemoryInfo);
-INSTANTIATE_SERIALISE_TYPE(VkSamplerYcbcrConversionInfo);
-INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupSwapchainCreateInfoKHR);
-INSTANTIATE_SERIALISE_TYPE(VkBindImageMemorySwapchainInfoKHR);
-INSTANTIATE_SERIALISE_TYPE(VkImageSwapchainCreateInfoKHR);
-INSTANTIATE_SERIALISE_TYPE(VkBindImageMemoryDeviceGroupInfo);
-INSTANTIATE_SERIALISE_TYPE(VkBindBufferMemoryDeviceGroupInfo);
-INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupBindSparseInfo);
-INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupSubmitInfo);
-INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupCommandBufferBeginInfo);
-INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupRenderPassBeginInfo);
-INSTANTIATE_SERIALISE_TYPE(VkMemoryAllocateFlagsInfo);
+INSTANTIATE_SERIALISE_TYPE(VkMemoryDedicatedRequirements);
+INSTANTIATE_SERIALISE_TYPE(VkMemoryFdPropertiesKHR);
+INSTANTIATE_SERIALISE_TYPE(VkMemoryGetFdInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkMemoryRequirements2);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevice16BitStorageFeatures);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevice8BitStorageFeaturesKHR);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceASTCDecodeFeaturesEXT);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceConservativeRasterizationPropertiesEXT);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDriverPropertiesKHR);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceExternalBufferInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceExternalFenceInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceExternalImageFormatInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceExternalSemaphoreInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceFeatures2);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceGroupProperties);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceIDProperties);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceImageFormatInfo2);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMaintenance3Properties);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMemoryProperties2);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMultiviewFeatures);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMultiviewProperties);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePCIBusInfoPropertiesEXT);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePointClippingProperties);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceProperties2);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceProtectedMemoryFeatures);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceProtectedMemoryProperties);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePushDescriptorPropertiesKHR);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSamplerYcbcrConversionFeatures);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceShaderAtomicInt64FeaturesKHR);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceShaderCorePropertiesAMD);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceShaderDrawParameterFeatures);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSparseImageFormatInfo2);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSubgroupProperties);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSurfaceInfo2KHR);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTransformFeedbackFeaturesEXT);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceTransformFeedbackPropertiesEXT);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceVariablePointerFeatures);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceVulkanMemoryModelFeaturesKHR);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineCacheCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineColorBlendStateCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineDepthStencilStateCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineDynamicStateCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineInputAssemblyStateCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineLayoutCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineMultisampleStateCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineRasterizationConservativeStateCreateInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineRasterizationStateCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineRasterizationStateStreamCreateInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineShaderStageCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineTessellationDomainOriginStateCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineTessellationStateCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineVertexInputDivisorStateCreateInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineVertexInputStateCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineViewportStateCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkPresentInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkPresentRegionsKHR);
INSTANTIATE_SERIALISE_TYPE(VkProtectedSubmitInfo);
-INSTANTIATE_SERIALISE_TYPE(VkImageFormatListCreateInfoKHR);
-INSTANTIATE_SERIALISE_TYPE(VkImageViewASTCDecodeModeEXT);
-INSTANTIATE_SERIALISE_TYPE(VkShaderModuleValidationCacheCreateInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkQueryPoolCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkQueueFamilyProperties2);
+INSTANTIATE_SERIALISE_TYPE(VkRenderPassBeginInfo);
+INSTANTIATE_SERIALISE_TYPE(VkRenderPassCreateInfo);
INSTANTIATE_SERIALISE_TYPE(VkRenderPassCreateInfo2KHR);
+INSTANTIATE_SERIALISE_TYPE(VkRenderPassInputAttachmentAspectCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkRenderPassMultiviewCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkSamplerCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkSamplerReductionModeCreateInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkSamplerYcbcrConversionCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkSamplerYcbcrConversionImageFormatProperties);
+INSTANTIATE_SERIALISE_TYPE(VkSamplerYcbcrConversionInfo);
+INSTANTIATE_SERIALISE_TYPE(VkSemaphoreCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkSemaphoreGetFdInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkShaderModuleCreateInfo);
+INSTANTIATE_SERIALISE_TYPE(VkShaderModuleValidationCacheCreateInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkSharedPresentSurfaceCapabilitiesKHR);
+INSTANTIATE_SERIALISE_TYPE(VkSparseImageFormatProperties2);
+INSTANTIATE_SERIALISE_TYPE(VkSparseImageMemoryRequirements2);
+INSTANTIATE_SERIALISE_TYPE(VkSubmitInfo);
INSTANTIATE_SERIALISE_TYPE(VkSubpassBeginInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkSubpassDependency2KHR);
+INSTANTIATE_SERIALISE_TYPE(VkSubpassDescription2KHR);
INSTANTIATE_SERIALISE_TYPE(VkSubpassEndInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkSurfaceCapabilities2EXT);
+INSTANTIATE_SERIALISE_TYPE(VkSurfaceCapabilities2KHR);
+INSTANTIATE_SERIALISE_TYPE(VkSurfaceFormat2KHR);
+INSTANTIATE_SERIALISE_TYPE(VkSwapchainCounterCreateInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkSwapchainCreateInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkTextureLODGatherFormatPropertiesAMD);
+INSTANTIATE_SERIALISE_TYPE(VkValidationCacheCreateInfoEXT);
+INSTANTIATE_SERIALISE_TYPE(VkValidationFlagsEXT);
+INSTANTIATE_SERIALISE_TYPE(VkWriteDescriptorSet);
+
+// plain structs with no next chain
+INSTANTIATE_SERIALISE_TYPE(VkAllocationCallbacks);
+INSTANTIATE_SERIALISE_TYPE(VkAttachmentDescription);
+INSTANTIATE_SERIALISE_TYPE(VkAttachmentReference);
+INSTANTIATE_SERIALISE_TYPE(VkBufferCopy);
+INSTANTIATE_SERIALISE_TYPE(VkBufferImageCopy);
+INSTANTIATE_SERIALISE_TYPE(VkClearAttachment);
+INSTANTIATE_SERIALISE_TYPE(VkClearColorValue);
+INSTANTIATE_SERIALISE_TYPE(VkClearDepthStencilValue);
+INSTANTIATE_SERIALISE_TYPE(VkClearRect);
+INSTANTIATE_SERIALISE_TYPE(VkClearValue);
+INSTANTIATE_SERIALISE_TYPE(VkComponentMapping);
+INSTANTIATE_SERIALISE_TYPE(VkConformanceVersionKHR);
+INSTANTIATE_SERIALISE_TYPE(VkDescriptorBufferInfo);
+INSTANTIATE_SERIALISE_TYPE(VkDescriptorImageInfo);
+INSTANTIATE_SERIALISE_TYPE(VkDescriptorPoolSize);
+INSTANTIATE_SERIALISE_TYPE(VkDescriptorSetLayoutBinding);
+INSTANTIATE_SERIALISE_TYPE(VkDescriptorUpdateTemplateEntry);
INSTANTIATE_SERIALISE_TYPE(VkDispatchIndirectCommand);
-INSTANTIATE_SERIALISE_TYPE(VkDrawIndirectCommand);
+INSTANTIATE_SERIALISE_TYPE(VkDisplayModeParametersKHR);
+INSTANTIATE_SERIALISE_TYPE(VkDisplayModePropertiesKHR);
+INSTANTIATE_SERIALISE_TYPE(VkDisplayPlaneCapabilitiesKHR);
+INSTANTIATE_SERIALISE_TYPE(VkDisplayPlanePropertiesKHR);
+INSTANTIATE_SERIALISE_TYPE(VkDisplayPropertiesKHR);
INSTANTIATE_SERIALISE_TYPE(VkDrawIndexedIndirectCommand);
+INSTANTIATE_SERIALISE_TYPE(VkDrawIndirectCommand);
+INSTANTIATE_SERIALISE_TYPE(VkExtent2D);
+INSTANTIATE_SERIALISE_TYPE(VkExtent3D);
+INSTANTIATE_SERIALISE_TYPE(VkExternalMemoryProperties);
+INSTANTIATE_SERIALISE_TYPE(VkFormatProperties);
+INSTANTIATE_SERIALISE_TYPE(VkImageBlit);
+INSTANTIATE_SERIALISE_TYPE(VkImageCopy);
+INSTANTIATE_SERIALISE_TYPE(VkImageFormatProperties);
+INSTANTIATE_SERIALISE_TYPE(VkImageResolve);
+INSTANTIATE_SERIALISE_TYPE(VkImageSubresource);
+INSTANTIATE_SERIALISE_TYPE(VkImageSubresourceLayers);
+INSTANTIATE_SERIALISE_TYPE(VkImageSubresourceRange);
+INSTANTIATE_SERIALISE_TYPE(VkInputAttachmentAspectReference);
+INSTANTIATE_SERIALISE_TYPE(VkMemoryHeap);
+INSTANTIATE_SERIALISE_TYPE(VkMemoryRequirements);
+INSTANTIATE_SERIALISE_TYPE(VkMemoryType);
+INSTANTIATE_SERIALISE_TYPE(VkOffset2D);
+INSTANTIATE_SERIALISE_TYPE(VkOffset3D);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceFeatures);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceLimits);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMemoryProperties);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceProperties);
+INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSparseProperties);
+INSTANTIATE_SERIALISE_TYPE(VkPipelineColorBlendAttachmentState);
+INSTANTIATE_SERIALISE_TYPE(VkPresentRegionKHR);
+INSTANTIATE_SERIALISE_TYPE(VkPushConstantRange);
+INSTANTIATE_SERIALISE_TYPE(VkQueueFamilyProperties);
+INSTANTIATE_SERIALISE_TYPE(VkRect2D);
+INSTANTIATE_SERIALISE_TYPE(VkRectLayerKHR);
+INSTANTIATE_SERIALISE_TYPE(VkSparseBufferMemoryBindInfo);
+INSTANTIATE_SERIALISE_TYPE(VkSparseImageFormatProperties);
+INSTANTIATE_SERIALISE_TYPE(VkSparseImageMemoryBind);
+INSTANTIATE_SERIALISE_TYPE(VkSparseImageMemoryBindInfo);
+INSTANTIATE_SERIALISE_TYPE(VkSparseImageMemoryRequirements);
+INSTANTIATE_SERIALISE_TYPE(VkSparseImageOpaqueMemoryBindInfo);
+INSTANTIATE_SERIALISE_TYPE(VkSparseMemoryBind);
+INSTANTIATE_SERIALISE_TYPE(VkSpecializationInfo);
+INSTANTIATE_SERIALISE_TYPE(VkSpecializationMapEntry);
+INSTANTIATE_SERIALISE_TYPE(VkStencilOpState);
+INSTANTIATE_SERIALISE_TYPE(VkSubpassDependency);
+INSTANTIATE_SERIALISE_TYPE(VkSubpassDescription);
+INSTANTIATE_SERIALISE_TYPE(VkSurfaceCapabilitiesKHR);
+INSTANTIATE_SERIALISE_TYPE(VkSurfaceFormatKHR);
+INSTANTIATE_SERIALISE_TYPE(VkVertexInputAttributeDescription);
+INSTANTIATE_SERIALISE_TYPE(VkVertexInputBindingDescription);
+INSTANTIATE_SERIALISE_TYPE(VkVertexInputBindingDivisorDescriptionEXT);
+INSTANTIATE_SERIALISE_TYPE(VkViewport);
INSTANTIATE_SERIALISE_TYPE(DescriptorSetSlot);
INSTANTIATE_SERIALISE_TYPE(ImageRegionState);
INSTANTIATE_SERIALISE_TYPE(ImageLayouts);
-#if defined(VK_KHR_external_memory_win32) || defined(VK_NV_external_memory_win32)
+#if ENABLED(RDOC_WIN32)
template
void DoSerialise(SerialiserType &ser, VkImportMemoryWin32HandleInfoNV &el)
{
@@ -3449,12 +5881,75 @@ void Deserialise(const VkImportMemoryWin32HandleInfoKHR &el)
DeserialiseNext(el.pNext);
}
-INSTANTIATE_SERIALISE_TYPE(VkImportMemoryWin32HandleInfoNV);
-INSTANTIATE_SERIALISE_TYPE(VkExportMemoryWin32HandleInfoNV);
-INSTANTIATE_SERIALISE_TYPE(VkImportMemoryWin32HandleInfoKHR);
-#endif // #if defined(VK_KHR_external_memory_win32) || defined(VK_NV_external_memory_win32)
+template
+void DoSerialise(SerialiserType &ser, VkExportMemoryWin32HandleInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ {
+ // serialise pointer as plain integer, rather than recursing and serialising struct
+ uint64_t pAttributes = (uint64_t)el.pAttributes;
+ ser.Serialise("pAttributes", pAttributes).TypedAs("SECURITY_ATTRIBUTES*");
+
+ // won't be valid on read, though we won't try to replay this anyway
+ if(ser.IsReading())
+ el.pAttributes = NULL;
+ }
+
+ SERIALISE_MEMBER_TYPED(uint32_t, dwAccess);
+
+ {
+ std::string name;
+
+ if(ser.IsWriting())
+ name = el.name ? StringFormat::Wide2UTF8(std::wstring(el.name)) : "";
+
+ ser.Serialise("name", name);
+
+ // we don't expose UTF82Wide on all platforms, but as above this struct won't be valid anyway
+ if(ser.IsReading())
+ el.name = NULL;
+ }
+}
+
+template <>
+void Deserialise(const VkExportMemoryWin32HandleInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkMemoryWin32HandlePropertiesKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(memoryTypeBits);
+}
+
+template <>
+void Deserialise(const VkMemoryWin32HandlePropertiesKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkMemoryGetWin32HandleInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(memory);
+ SERIALISE_MEMBER(handleType);
+}
+
+template <>
+void Deserialise(const VkMemoryGetWin32HandleInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
-#ifdef VK_KHR_external_fence_win32
template
void DoSerialise(SerialiserType &ser, VkExportFenceWin32HandleInfoKHR &el)
{
@@ -3493,10 +5988,61 @@ void Deserialise(const VkExportFenceWin32HandleInfoKHR &el)
DeserialiseNext(el.pNext);
}
-INSTANTIATE_SERIALISE_TYPE(VkExportFenceWin32HandleInfoKHR);
-#endif // #ifdef VK_KHR_external_fence_win32
+template
+void DoSerialise(SerialiserType &ser, VkImportFenceWin32HandleInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(fence);
+ SERIALISE_MEMBER_TYPED(VkFenceImportFlagBits, flags);
+ SERIALISE_MEMBER(handleType);
+
+ {
+ uint64_t handle = (uint64_t)el.handle;
+ ser.Serialise("handle", handle);
+
+ // won't be valid on read, though we won't try to replay this anyway
+ if(ser.IsReading())
+ el.handle = NULL;
+ }
+
+ {
+ std::string name;
+
+ if(ser.IsWriting())
+ name = el.name ? StringFormat::Wide2UTF8(std::wstring(el.name)) : "";
+
+ ser.Serialise("name", name);
+
+ // we don't expose UTF82Wide on all platforms, but as above this struct won't be valid anyway
+ if(ser.IsReading())
+ el.name = L"???";
+ }
+}
+
+template <>
+void Deserialise(const VkImportFenceWin32HandleInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkFenceGetWin32HandleInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(fence);
+ SERIALISE_MEMBER(handleType);
+}
+
+template <>
+void Deserialise(const VkFenceGetWin32HandleInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
-#ifdef VK_KHR_external_semaphore_win32
template
void DoSerialise(SerialiserType &ser, VkExportSemaphoreWin32HandleInfoKHR &el)
{
@@ -3535,10 +6081,81 @@ void Deserialise(const VkExportSemaphoreWin32HandleInfoKHR &el)
DeserialiseNext(el.pNext);
}
-INSTANTIATE_SERIALISE_TYPE(VkExportSemaphoreWin32HandleInfoKHR);
-#endif // #ifdef VK_KHR_external_semaphore_win32
+template
+void DoSerialise(SerialiserType &ser, VkImportSemaphoreWin32HandleInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(semaphore);
+ SERIALISE_MEMBER_TYPED(VkSemaphoreImportFlagBits, flags);
+ SERIALISE_MEMBER(handleType);
+
+ {
+ uint64_t handle = (uint64_t)el.handle;
+ ser.Serialise("handle", handle);
+
+ // won't be valid on read, though we won't try to replay this anyway
+ if(ser.IsReading())
+ el.handle = NULL;
+ }
+
+ {
+ std::string name;
+
+ if(ser.IsWriting())
+ name = el.name ? StringFormat::Wide2UTF8(std::wstring(el.name)) : "";
+
+ ser.Serialise("name", name);
+
+ // we don't expose UTF82Wide on all platforms, but as above this struct won't be valid anyway
+ if(ser.IsReading())
+ el.name = L"???";
+ }
+}
+
+template <>
+void Deserialise(const VkImportSemaphoreWin32HandleInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkD3D12FenceSubmitInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(waitSemaphoreValuesCount);
+ SERIALISE_MEMBER_ARRAY(pWaitSemaphoreValues, waitSemaphoreValuesCount);
+ SERIALISE_MEMBER(signalSemaphoreValuesCount);
+ SERIALISE_MEMBER_ARRAY(pSignalSemaphoreValues, signalSemaphoreValuesCount);
+}
+
+template <>
+void Deserialise(const VkD3D12FenceSubmitInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+ delete[] el.pWaitSemaphoreValues;
+ delete[] el.pSignalSemaphoreValues;
+}
+
+template
+void DoSerialise(SerialiserType &ser, VkSemaphoreGetWin32HandleInfoKHR &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR);
+ SerialiseNext(ser, el.sType, el.pNext);
+
+ SERIALISE_MEMBER(semaphore);
+ SERIALISE_MEMBER(handleType);
+}
+
+template <>
+void Deserialise(const VkSemaphoreGetWin32HandleInfoKHR &el)
+{
+ DeserialiseNext(el.pNext);
+}
-#if defined(VK_KHR_win32_keyed_mutex) || defined(VK_NV_win32_keyed_mutex)
template
void DoSerialise(SerialiserType &ser, VkWin32KeyedMutexAcquireReleaseInfoNV &el)
{
@@ -3595,6 +6212,19 @@ void Deserialise(const VkWin32KeyedMutexAcquireReleaseInfoKHR &el)
delete[] el.pReleaseKeys;
}
+INSTANTIATE_SERIALISE_TYPE(VkImportMemoryWin32HandleInfoNV);
+INSTANTIATE_SERIALISE_TYPE(VkExportMemoryWin32HandleInfoNV);
INSTANTIATE_SERIALISE_TYPE(VkWin32KeyedMutexAcquireReleaseInfoNV);
INSTANTIATE_SERIALISE_TYPE(VkWin32KeyedMutexAcquireReleaseInfoKHR);
-#endif // #if defined(VK_KHR_win32_keyed_mutex) || defined(VK_NV_win32_keyed_mutex)
\ No newline at end of file
+INSTANTIATE_SERIALISE_TYPE(VkImportMemoryWin32HandleInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkExportMemoryWin32HandleInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkMemoryWin32HandlePropertiesKHR);
+INSTANTIATE_SERIALISE_TYPE(VkMemoryGetWin32HandleInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkExportSemaphoreWin32HandleInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkImportSemaphoreWin32HandleInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkD3D12FenceSubmitInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkSemaphoreGetWin32HandleInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkExportFenceWin32HandleInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkImportFenceWin32HandleInfoKHR);
+INSTANTIATE_SERIALISE_TYPE(VkFenceGetWin32HandleInfoKHR);
+#endif
\ No newline at end of file
diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp
index 70db30d5e..44aa9a2e2 100644
--- a/renderdoc/driver/vulkan/vk_stringise.cpp
+++ b/renderdoc/driver/vulkan/vk_stringise.cpp
@@ -711,6 +711,45 @@ std::string DoStringise(const VkDeviceGroupPresentModeFlagBitsKHR &el)
END_BITFIELD_STRINGISE();
}
+template <>
+std::string DoStringise(const VkDebugReportFlagBitsEXT &el)
+{
+ BEGIN_BITFIELD_STRINGISE(VkDebugReportFlagBitsEXT);
+ {
+ STRINGISE_BITFIELD_BIT(VK_DEBUG_REPORT_INFORMATION_BIT_EXT);
+ STRINGISE_BITFIELD_BIT(VK_DEBUG_REPORT_WARNING_BIT_EXT);
+ STRINGISE_BITFIELD_BIT(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT);
+ STRINGISE_BITFIELD_BIT(VK_DEBUG_REPORT_ERROR_BIT_EXT);
+ STRINGISE_BITFIELD_BIT(VK_DEBUG_REPORT_DEBUG_BIT_EXT);
+ }
+ END_BITFIELD_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkDebugUtilsMessageSeverityFlagBitsEXT &el)
+{
+ BEGIN_BITFIELD_STRINGISE(VkDebugUtilsMessageSeverityFlagBitsEXT);
+ {
+ STRINGISE_BITFIELD_BIT(VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT);
+ STRINGISE_BITFIELD_BIT(VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT);
+ STRINGISE_BITFIELD_BIT(VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT);
+ STRINGISE_BITFIELD_BIT(VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT);
+ }
+ END_BITFIELD_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkDebugUtilsMessageTypeFlagBitsEXT &el)
+{
+ BEGIN_BITFIELD_STRINGISE(VkDebugUtilsMessageTypeFlagBitsEXT);
+ {
+ STRINGISE_BITFIELD_BIT(VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT);
+ STRINGISE_BITFIELD_BIT(VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT);
+ STRINGISE_BITFIELD_BIT(VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT);
+ }
+ END_BITFIELD_STRINGISE();
+}
+
template <>
std::string DoStringise(const VkMemoryAllocateFlagBits &el)
{
@@ -1823,50 +1862,32 @@ std::string DoStringise(const VkResult &el)
template <>
std::string DoStringise(const VkSurfaceTransformFlagBitsKHR &el)
{
- string ret;
- if(el & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR)
- ret += " | VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR";
- if(el & VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR)
- ret += " | VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR";
- if(el & VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR)
- ret += " | VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR";
- if(el & VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR)
- ret += " | VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR";
- if(el & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR)
- ret += " | VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR";
- if(el & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR)
- ret += " | VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR";
- if(el & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR)
- ret += " | VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR";
- if(el & VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR)
- ret += " | VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR";
- if(el & VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR)
- ret += " | VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR";
-
- if(!ret.empty())
- ret = ret.substr(3);
-
- return ret;
+ BEGIN_BITFIELD_STRINGISE(VkSurfaceTransformFlagBitsKHR);
+ {
+ STRINGISE_BITFIELD_BIT(VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR);
+ STRINGISE_BITFIELD_BIT(VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR);
+ STRINGISE_BITFIELD_BIT(VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR);
+ STRINGISE_BITFIELD_BIT(VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR);
+ STRINGISE_BITFIELD_BIT(VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR);
+ STRINGISE_BITFIELD_BIT(VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR);
+ STRINGISE_BITFIELD_BIT(VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR);
+ STRINGISE_BITFIELD_BIT(VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR);
+ STRINGISE_BITFIELD_BIT(VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR);
+ }
+ END_BITFIELD_STRINGISE();
}
template <>
std::string DoStringise(const VkCompositeAlphaFlagBitsKHR &el)
{
- string ret;
-
- if(el & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR)
- ret += " | VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR";
- if(el & VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR)
- ret += " | VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR";
- if(el & VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR)
- ret += " | VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR";
- if(el & VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR)
- ret += " | VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR";
-
- if(!ret.empty())
- ret = ret.substr(3);
-
- return ret;
+ BEGIN_BITFIELD_STRINGISE(VkCompositeAlphaFlagBitsKHR);
+ {
+ STRINGISE_BITFIELD_BIT(VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR);
+ STRINGISE_BITFIELD_BIT(VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR);
+ STRINGISE_BITFIELD_BIT(VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR);
+ STRINGISE_BITFIELD_BIT(VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR);
+ }
+ END_BITFIELD_STRINGISE();
}
template <>
@@ -1993,44 +2014,44 @@ std::string DoStringise(const VkChromaLocation &el)
template <>
std::string DoStringise(const VkDeviceQueueCreateFlagBits &el)
{
- BEGIN_ENUM_STRINGISE(VkDeviceQueueCreateFlagBits);
+ BEGIN_BITFIELD_STRINGISE(VkDeviceQueueCreateFlagBits);
{
- STRINGISE_ENUM(VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT)
+ STRINGISE_BITFIELD_BIT(VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT)
}
- END_ENUM_STRINGISE();
+ END_BITFIELD_STRINGISE();
}
template <>
std::string DoStringise(const VkSubpassDescriptionFlagBits &el)
{
- BEGIN_ENUM_STRINGISE(VkSubpassDescriptionFlagBits);
+ BEGIN_BITFIELD_STRINGISE(VkSubpassDescriptionFlagBits);
{
- STRINGISE_ENUM(VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX)
- STRINGISE_ENUM(VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX)
+ STRINGISE_BITFIELD_BIT(VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX)
+ STRINGISE_BITFIELD_BIT(VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX)
}
- END_ENUM_STRINGISE();
+ END_BITFIELD_STRINGISE();
}
template <>
std::string DoStringise(const VkDescriptorSetLayoutCreateFlagBits &el)
{
- BEGIN_ENUM_STRINGISE(VkDescriptorSetLayoutCreateFlagBits);
+ BEGIN_BITFIELD_STRINGISE(VkDescriptorSetLayoutCreateFlagBits);
{
- STRINGISE_ENUM(VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR)
- STRINGISE_ENUM(VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT)
+ STRINGISE_BITFIELD_BIT(VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR)
+ STRINGISE_BITFIELD_BIT(VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT)
}
- END_ENUM_STRINGISE();
+ END_BITFIELD_STRINGISE();
}
template <>
std::string DoStringise(const VkSwapchainCreateFlagBitsKHR &el)
{
- BEGIN_ENUM_STRINGISE(VkSwapchainCreateFlagBitsKHR);
+ BEGIN_BITFIELD_STRINGISE(VkSwapchainCreateFlagBitsKHR);
{
- STRINGISE_ENUM(VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR)
- STRINGISE_ENUM(VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR)
+ STRINGISE_BITFIELD_BIT(VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR)
+ STRINGISE_BITFIELD_BIT(VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR)
}
- END_ENUM_STRINGISE();
+ END_BITFIELD_STRINGISE();
}
template <>
@@ -2046,6 +2067,212 @@ std::string DoStringise(const VkQueueGlobalPriorityEXT &el)
END_ENUM_STRINGISE();
}
+template <>
+std::string DoStringise(const VkDeviceEventTypeEXT &el)
+{
+ BEGIN_ENUM_STRINGISE(VkDeviceEventTypeEXT);
+ {
+ STRINGISE_ENUM(VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT)
+ }
+ END_ENUM_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkValidationCheckEXT &el)
+{
+ BEGIN_ENUM_STRINGISE(VkValidationCheckEXT);
+ {
+ STRINGISE_ENUM(VK_VALIDATION_CHECK_ALL_EXT)
+ STRINGISE_ENUM(VK_VALIDATION_CHECK_SHADERS_EXT)
+ }
+ END_ENUM_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkDriverIdKHR &el)
+{
+ BEGIN_ENUM_STRINGISE(VkDriverIdKHR);
+ {
+ STRINGISE_ENUM(VK_DRIVER_ID_AMD_PROPRIETARY_KHR)
+ STRINGISE_ENUM(VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR)
+ STRINGISE_ENUM(VK_DRIVER_ID_MESA_RADV_KHR)
+ STRINGISE_ENUM(VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR)
+ STRINGISE_ENUM(VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR)
+ STRINGISE_ENUM(VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR)
+ STRINGISE_ENUM(VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR)
+ STRINGISE_ENUM(VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR)
+ STRINGISE_ENUM(VK_DRIVER_ID_ARM_PROPRIETARY_KHR)
+ STRINGISE_ENUM(VK_DRIVER_ID_GOOGLE_PASTEL_KHR)
+ }
+ END_ENUM_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkDisplayPowerStateEXT &el)
+{
+ BEGIN_ENUM_STRINGISE(VkDisplayPowerStateEXT);
+ {
+ STRINGISE_ENUM(VK_DISPLAY_POWER_STATE_OFF_EXT)
+ STRINGISE_ENUM(VK_DISPLAY_POWER_STATE_SUSPEND_EXT)
+ STRINGISE_ENUM(VK_DISPLAY_POWER_STATE_ON_EXT)
+ }
+ END_ENUM_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkDisplayEventTypeEXT &el)
+{
+ BEGIN_ENUM_STRINGISE(VkDisplayEventTypeEXT);
+ {
+ STRINGISE_ENUM(VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT)
+ }
+ END_ENUM_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkPointClippingBehavior &el)
+{
+ BEGIN_ENUM_STRINGISE(VkPointClippingBehavior);
+ {
+ STRINGISE_ENUM(VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES)
+ STRINGISE_ENUM(VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY)
+ }
+ END_ENUM_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkSemaphoreImportFlagBits &el)
+{
+ BEGIN_BITFIELD_STRINGISE(VkSemaphoreImportFlagBits);
+ {
+ STRINGISE_BITFIELD_BIT(VK_SEMAPHORE_IMPORT_TEMPORARY_BIT)
+ }
+ END_BITFIELD_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkFenceImportFlagBits &el)
+{
+ BEGIN_BITFIELD_STRINGISE(VkFenceImportFlagBits);
+ {
+ STRINGISE_BITFIELD_BIT(VK_FENCE_IMPORT_TEMPORARY_BIT)
+ }
+ END_BITFIELD_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkExternalSemaphoreFeatureFlagBits &el)
+{
+ BEGIN_BITFIELD_STRINGISE(VkExternalSemaphoreFeatureFlagBits);
+ {
+ STRINGISE_BITFIELD_BIT(VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT)
+ STRINGISE_BITFIELD_BIT(VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT)
+ }
+ END_BITFIELD_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkExternalFenceFeatureFlagBits &el)
+{
+ BEGIN_BITFIELD_STRINGISE(VkExternalFenceFeatureFlagBits);
+ {
+ STRINGISE_BITFIELD_BIT(VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT)
+ STRINGISE_BITFIELD_BIT(VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT)
+ }
+ END_BITFIELD_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkSparseImageFormatFlagBits &el)
+{
+ BEGIN_BITFIELD_STRINGISE(VkSparseImageFormatFlagBits);
+ {
+ STRINGISE_BITFIELD_BIT(VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT)
+ STRINGISE_BITFIELD_BIT(VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT)
+ STRINGISE_BITFIELD_BIT(VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT)
+ }
+ END_BITFIELD_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkFormatFeatureFlagBits &el)
+{
+ BEGIN_BITFIELD_STRINGISE(VkFormatFeatureFlagBits);
+ {
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_BLIT_SRC_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_BLIT_DST_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_TRANSFER_DST_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT)
+ STRINGISE_BITFIELD_BIT(
+ VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT)
+ STRINGISE_BITFIELD_BIT(
+ VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT)
+ STRINGISE_BITFIELD_BIT(
+ VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_DISJOINT_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG)
+ STRINGISE_BITFIELD_BIT(VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT)
+ }
+ END_BITFIELD_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkExternalMemoryFeatureFlagBits &el)
+{
+ BEGIN_BITFIELD_STRINGISE(VkExternalMemoryFeatureFlagBits);
+ {
+ STRINGISE_BITFIELD_BIT(VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT)
+ STRINGISE_BITFIELD_BIT(VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT)
+ STRINGISE_BITFIELD_BIT(VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT)
+ }
+ END_BITFIELD_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkDisplayPlaneAlphaFlagBitsKHR &el)
+{
+ BEGIN_BITFIELD_STRINGISE(VkDisplayPlaneAlphaFlagBitsKHR);
+ {
+ STRINGISE_BITFIELD_BIT(VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR)
+ STRINGISE_BITFIELD_BIT(VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR)
+ STRINGISE_BITFIELD_BIT(VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR)
+ STRINGISE_BITFIELD_BIT(VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_PREMULTIPLIED_BIT_KHR)
+ }
+ END_BITFIELD_STRINGISE();
+}
+
+template <>
+std::string DoStringise(const VkSubgroupFeatureFlagBits &el)
+{
+ BEGIN_BITFIELD_STRINGISE(VkSubgroupFeatureFlagBits);
+ {
+ STRINGISE_BITFIELD_BIT(VK_SUBGROUP_FEATURE_BASIC_BIT)
+ STRINGISE_BITFIELD_BIT(VK_SUBGROUP_FEATURE_VOTE_BIT)
+ STRINGISE_BITFIELD_BIT(VK_SUBGROUP_FEATURE_ARITHMETIC_BIT)
+ STRINGISE_BITFIELD_BIT(VK_SUBGROUP_FEATURE_BALLOT_BIT)
+ STRINGISE_BITFIELD_BIT(VK_SUBGROUP_FEATURE_SHUFFLE_BIT)
+ STRINGISE_BITFIELD_BIT(VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT)
+ STRINGISE_BITFIELD_BIT(VK_SUBGROUP_FEATURE_CLUSTERED_BIT)
+ STRINGISE_BITFIELD_BIT(VK_SUBGROUP_FEATURE_QUAD_BIT)
+ STRINGISE_BITFIELD_BIT(VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV)
+ }
+ END_BITFIELD_STRINGISE();
+}
+
template <>
std::string DoStringise(const VkExtent3D &el)
{