From 1f70a1516b156aafca6f69d4304550cf06851017 Mon Sep 17 00:00:00 2001 From: Qining Lu Date: Tue, 6 Nov 2018 16:57:59 -0500 Subject: [PATCH] Vulkan: Track the const pNext pointers for all supported cases So that we won't accidentally record invalid pNext pointer which may potentially crash the replay --- gapis/api/vulkan/api/buffer.api | 11 ++ .../api/vulkan/api/command_buffer_control.api | 47 ++++- gapis/api/vulkan/api/descriptor.api | 68 ++++++- gapis/api/vulkan/api/device.api | 26 ++- gapis/api/vulkan/api/image.api | 22 +++ gapis/api/vulkan/api/instance.api | 26 ++- gapis/api/vulkan/api/memory.api | 12 ++ gapis/api/vulkan/api/pipeline.api | 178 +++++++++++++++++- .../api/properties_features_requirements.api | 12 ++ gapis/api/vulkan/api/query_pool.api | 11 ++ gapis/api/vulkan/api/queue.api | 25 +++ .../api/vulkan/api/renderpass_framebuffer.api | 33 ++++ gapis/api/vulkan/api/synchronization.api | 99 +++++++++- .../khr_get_memory_requirements2.api | 12 +- .../khr_get_physical_device_properties2.api | 25 +++ .../khr_get_surface_capabilities2.api | 26 ++- gapis/api/vulkan/extensions/khr_swapchain.api | 19 +- 17 files changed, 629 insertions(+), 23 deletions(-) diff --git a/gapis/api/vulkan/api/buffer.api b/gapis/api/vulkan/api/buffer.api index 00b850609b..a3e52430d5 100644 --- a/gapis/api/vulkan/api/buffer.api +++ b/gapis/api/vulkan/api/buffer.api @@ -169,6 +169,17 @@ cmd VkResult vkCreateBufferView( if !(device in Devices) { vkErrorInvalidDevice(device) } if pCreateInfo == null { vkErrorNullPointer("VkBufferViewCreateInfo") } buffer_view_create_info := pCreateInfo[0] + // handle mapped memory range pNext + if buffer_view_create_info.pNext != null { + numPNext := numberOfPNext(buffer_view_create_info.pNext) + next := MutableVoidPtr(as!void*(buffer_view_create_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkBufferViewCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } handle := ? bufferViewObject := new!BufferViewObject( diff --git a/gapis/api/vulkan/api/command_buffer_control.api b/gapis/api/vulkan/api/command_buffer_control.api index 9b9c7e73a3..febb5a3feb 100644 --- a/gapis/api/vulkan/api/command_buffer_control.api +++ b/gapis/api/vulkan/api/command_buffer_control.api @@ -58,6 +58,17 @@ cmd VkResult vkCreateCommandPool( if !(device in Devices) { vkErrorInvalidDevice(device) } if pCreateInfo == null { vkErrorNullPointer("VkCommandPoolCreateInfo") } create_info := pCreateInfo[0] + // handle pNext + if create_info.pNext != null { + numPNext := numberOfPNext(create_info.pNext) + next := MutableVoidPtr(as!void*(create_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkCommandPoolCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } handle := ? if pCommandPool == null { vkErrorNullPointer("VkCommandPool") } @@ -289,6 +300,17 @@ cmd VkResult vkAllocateCommandBuffers( if !(device in Devices) { vkErrorInvalidDevice(device) } if pAllocateInfo == null { vkErrorNullPointer("VkCommandBufferAllocateInfo") } allocateInfo := pAllocateInfo[0] + // handle pNext + if allocateInfo.pNext != null { + numPNext := numberOfPNext(allocateInfo.pNext) + next := MutableVoidPtr(as!void*(allocateInfo.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkCommandBufferAllocateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } count := allocateInfo.commandBufferCount fence @@ -345,7 +367,18 @@ cmd VkResult vkBeginCommandBuffer( info := pBeginInfo[0] begin := new!CommandBufferBegin(Flags: info.flags,Inherited: false) - // TODO: pBeginInfo->pNext + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkCommandBufferBeginInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + if info.pInheritanceInfo != null { inheritanceInfo := info.pInheritanceInfo[0] begin.Inherited = true @@ -355,7 +388,17 @@ cmd VkResult vkBeginCommandBuffer( begin.InheritedOcclusionQuery = inheritanceInfo.occlusionQueryEnable begin.InheritedQueryFlags = inheritanceInfo.queryFlags begin.InheritedPipelineStatsFlags = inheritanceInfo.pipelineStatistics - // TODO: pBeginInfo->pInheritanceInfo->pNext + // handle pBeginInfo->pInheritanceInfo->pNext + if inheritanceInfo.pNext != null { + numPNext := numberOfPNext(inheritanceInfo.pNext) + next := MutableVoidPtr(as!void*(inheritanceInfo.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkCommandBufferInheritanceInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } } buff := CommandBuffers[commandBuffer] buff.BeginInfo = begin diff --git a/gapis/api/vulkan/api/descriptor.api b/gapis/api/vulkan/api/descriptor.api index e399089185..ae8b2eefdf 100644 --- a/gapis/api/vulkan/api/descriptor.api +++ b/gapis/api/vulkan/api/descriptor.api @@ -66,7 +66,17 @@ cmd VkResult vkCreateDescriptorSetLayout( if !(device in Devices) { vkErrorInvalidDevice(device) } if pCreateInfo == null { vkErrorNullPointer("VkDescriptorSetLayoutCreateInfo") } info := pCreateInfo[0] - // TODO: info.pNext + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkDescriptorSetLayoutCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } count := info.bindingCount bindings := info.pBindings[0:count] descriptorSetLayout := new!DescriptorSetLayoutObject() @@ -137,6 +147,17 @@ cmd VkResult vkCreateDescriptorPool( if !(device in Devices) { vkErrorInvalidDevice(device) } if pCreateInfo == null { vkErrorNullPointer("VkDescriptorPoolCreateInfo") } info := pCreateInfo[0] + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkDescriptorPoolCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } pool := new!DescriptorPoolObject( Device: device, Flags: info.flags, @@ -146,7 +167,6 @@ cmd VkResult vkCreateDescriptorPool( for i in (0 .. info.poolSizeCount) { pool.Sizes[i] = sizes[i] } - // TODO: info.pNext handle := ? if pDescriptorPool == null { vkErrorNullPointer("VkDescriptorPool") } @@ -237,7 +257,17 @@ cmd VkResult vkAllocateDescriptorSets( if !(device in Devices) { vkErrorInvalidDevice(device) } if pAllocateInfo == null { vkErrorNullPointer("VkDescriptorSetAllocateInfo") } info := pAllocateInfo[0] - // TODO: info.pNext + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkDescriptorSetAllocateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } count := info.descriptorSetCount layouts := info.pSetLayouts[0:count] @@ -530,6 +560,38 @@ cmd void vkUpdateDescriptorSets( u32 descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies) { if !(device in Devices) { vkErrorInvalidDevice(device) } + ws := pDescriptorWrites[0:descriptorWriteCount] + for i in (0 .. descriptorWriteCount) { + w := ws[i] + // handle VkWriteDescriptorSet pNext + if w.pNext != null { + numPNext := numberOfPNext(w.pNext) + next := MutableVoidPtr(as!void*(w.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkWriteDescriptorSet + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + } + + cs := pDescriptorCopies[0:descriptorCopyCount] + for i in (0 .. descriptorCopyCount) { + c := cs[i] + // handle VkCopyDescriptorSet pNext + if c.pNext != null { + numPNext := numberOfPNext(c.pNext) + next := MutableVoidPtr(as!void*(c.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkCopyDescriptorSet + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + + } writes := RewriteWriteDescriptorSets( descriptorWriteCount, diff --git a/gapis/api/vulkan/api/device.api b/gapis/api/vulkan/api/device.api index a6d5d2655b..10c0d42284 100644 --- a/gapis/api/vulkan/api/device.api +++ b/gapis/api/vulkan/api/device.api @@ -129,10 +129,34 @@ sub ref!DeviceObject createDeviceObject(const VkDeviceCreateInfo* data) { if data == null { vkErrorNullPointer("VkDeviceCreateInfo") } info := data[0] - // TODO: pNext + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkDeviceCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + queueCreateInfos := info.pQueueCreateInfos[0:info.queueCreateInfoCount] for i in (0 .. info.queueCreateInfoCount) { queue_info := queueCreateInfos[i] + + // handle pNext + if queue_info.pNext != null { + numPNext := numberOfPNext(queue_info.pNext) + next := MutableVoidPtr(as!void*(queue_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkDeviceQueueCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + queue_priorities := queue_info.pQueuePriorities[0:queue_info.queueCount] for j in (0 .. queue_info.queueCount) { object.Queues[len(object.Queues)] = diff --git a/gapis/api/vulkan/api/image.api b/gapis/api/vulkan/api/image.api index d2a61ec81e..e56e86aeeb 100644 --- a/gapis/api/vulkan/api/image.api +++ b/gapis/api/vulkan/api/image.api @@ -419,6 +419,17 @@ cmd VkResult vkCreateImageView( if !(device in Devices) { vkErrorInvalidDevice(device) } if pCreateInfo == null { vkErrorNullPointer("VkImageViewCreateInfo") } image_view_create_info := pCreateInfo[0] + // handle pNext + if image_view_create_info.pNext != null { + numPNext := numberOfPNext(image_view_create_info.pNext) + next := MutableVoidPtr(as!void*(image_view_create_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkImageViewCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } handle := ? if !(image_view_create_info.image in Images) { vkErrorInvalidImage(image_view_create_info.image) } else { @@ -528,6 +539,17 @@ cmd VkResult vkCreateSampler( if !(device in Devices) { vkErrorInvalidDevice(device) } if pCreateInfo == null { vkErrorNullPointer("VkSamplerCreateInfo") } create_info := pCreateInfo[0] + // handle pNext + if create_info.pNext != null { + numPNext := numberOfPNext(create_info.pNext) + next := MutableVoidPtr(as!void*(create_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkSamplerCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } sampler := new!SamplerObject( Device: device, MagFilter: create_info.magFilter, diff --git a/gapis/api/vulkan/api/instance.api b/gapis/api/vulkan/api/instance.api index 26f42dac31..921ec7dee3 100644 --- a/gapis/api/vulkan/api/instance.api +++ b/gapis/api/vulkan/api/instance.api @@ -90,7 +90,18 @@ sub ref!InstanceObject createInstanceObject(const VkInstanceCreateInfo* createIn if createInfo == null { vkErrorNullPointer("VkInstanceCreateInfo") } info := createInfo[0] - // TODO: handle pNext + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkInstanceCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + if (info.pApplicationInfo != null) { object.ApiVersion = readVkApplicationInfo(info.pApplicationInfo) } else { @@ -120,7 +131,18 @@ sub ref!InstanceObject createInstanceObject(const VkInstanceCreateInfo* createIn sub u32 readVkApplicationInfo(const VkApplicationInfo* applicationInfo) { info := applicationInfo[0] - // TODO: handle pNext + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkApplicationInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + if (info.pApplicationName != null) { _ = as!string(info.pApplicationName) } diff --git a/gapis/api/vulkan/api/memory.api b/gapis/api/vulkan/api/memory.api index cdaa321a57..8d341e34d6 100644 --- a/gapis/api/vulkan/api/memory.api +++ b/gapis/api/vulkan/api/memory.api @@ -198,6 +198,18 @@ cmd VkResult vkFlushMappedMemoryRanges( memoryRanges := pMemoryRanges[0:memoryRangeCount] for i in (0 .. memoryRangeCount) { flushRange := memoryRanges[i] + // handle mapped memory range pNext + if flushRange.pNext != null { + numPNext := numberOfPNext(flushRange.pNext) + next := MutableVoidPtr(as!void*(flushRange.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkMappedMemoryRange + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + if !(flushRange.memory in DeviceMemories) { vkErrorInvalidDeviceMemory(flushRange.memory) } memoryObject := DeviceMemories[flushRange.memory] mappedLocation := as!u8*(memoryObject.MappedLocation) diff --git a/gapis/api/vulkan/api/pipeline.api b/gapis/api/vulkan/api/pipeline.api index b23c6d7c23..ed161ac506 100644 --- a/gapis/api/vulkan/api/pipeline.api +++ b/gapis/api/vulkan/api/pipeline.api @@ -247,13 +247,34 @@ cmd VkResult vkCreateGraphicsPipelines( ) obj.Device = device create_info := infos[i] - // TODO: create_info.pNext + // handle pNext + if create_info.pNext != null { + numPNext := numberOfPNext(create_info.pNext) + next := MutableVoidPtr(as!void*(create_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkGraphicsPipelineCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } obj.Flags = create_info.flags pipeline_shader_stage_create_infos := create_info.pStages[0:create_info.stageCount] for j in (0 .. create_info.stageCount) { stage_create_info := pipeline_shader_stage_create_infos[j] + // handle shader stage pNext + if stage_create_info.pNext != null { + numPNext := numberOfPNext(stage_create_info.pNext) + next := MutableVoidPtr(as!void*(stage_create_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPipelineShaderStageCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } if !(stage_create_info.module in ShaderModules) { vkErrorInvalidShaderModule(stage_create_info.module) } stage_data := StageData( Stage: stage_create_info.stage, @@ -276,7 +297,17 @@ cmd VkResult vkCreateGraphicsPipelines( vertex_input_state := create_info.pVertexInputState[0] vertex_descriptions := vertex_input_state.pVertexBindingDescriptions[0: vertex_input_state.vertexBindingDescriptionCount] - // TODO: vertex_input_state.pNext + // handle vertex input state pNext + if vertex_input_state.pNext != null { + numPNext := numberOfPNext(vertex_input_state.pNext) + next := MutableVoidPtr(as!void*(vertex_input_state.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPipelineVertexInputStateCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } for b in (0 .. vertex_input_state.vertexBindingDescriptionCount) { vertex_binding := vertex_descriptions[b] obj.VertexInputState.BindingDescriptions[vertex_binding.binding] = vertex_binding @@ -293,18 +324,51 @@ cmd VkResult vkCreateGraphicsPipelines( input_assembly_state := create_info.pInputAssemblyState[0] obj.InputAssemblyState.Topology = input_assembly_state.topology obj.InputAssemblyState.PrimitiveRestartEnable = input_assembly_state.primitiveRestartEnable + // handle input assembly state pNext + if input_assembly_state.pNext != null { + numPNext := numberOfPNext(input_assembly_state.pNext) + next := MutableVoidPtr(as!void*(input_assembly_state.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPipelineInputAssemblyStateCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } - // TODO: pInputAssemblypNext if (create_info.pTessellationState != null) { tessellation_state := create_info.pTessellationState[0] + // handle tessellation state pNext + if tessellation_state.pNext != null { + numPNext := numberOfPNext(tessellation_state.pNext) + next := MutableVoidPtr(as!void*(tessellation_state.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPipelineTessellationStateCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + obj.TessellationState = new!TessellationStateData( PatchControlPoints: tessellation_state.patchControlPoints ) } if (create_info.pViewportState != null) { - // TODO: pViewportpNext pipeline_viewport_state_create_info := create_info.pViewportState[0] + // viewport state pNext + if pipeline_viewport_state_create_info.pNext != null { + numPNext := numberOfPNext(pipeline_viewport_state_create_info.pNext) + next := MutableVoidPtr(as!void*(pipeline_viewport_state_create_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPipelineViewportStateCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + viewport_data := new!ViewportData() @@ -347,7 +411,17 @@ cmd VkResult vkCreateGraphicsPipelines( obj.RasterizationState.DepthBiasSlopeFactor = rasterization_state.depthBiasSlopeFactor obj.RasterizationState.LineWidth = rasterization_state.lineWidth - // TODO _.pNext + // handle rasterization state pNext + if rasterization_state.pNext != null { + numPNext := numberOfPNext(rasterization_state.pNext) + next := MutableVoidPtr(as!void*(rasterization_state.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPipelineRasterizationStateCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } if (create_info.pMultisampleState != null) { multisample_state := create_info.pMultisampleState[0] @@ -358,7 +432,17 @@ cmd VkResult vkCreateGraphicsPipelines( AlphaToCoverageEnable: multisample_state.alphaToCoverageEnable, AlphaToOneEnable: multisample_state.alphaToOneEnable ) - // TODO: multisample_state.pNext + // handle multisample state pNext + if multisample_state.pNext != null { + numPNext := numberOfPNext(multisample_state.pNext) + next := MutableVoidPtr(as!void*(multisample_state.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPipelineMultisampleStateCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } if (multisample_state.pSampleMask != null) { num_samples := as!u32(multisample_state.rasterizationSamples) sizeof_samplemask := (num_samples + 31) / 32 @@ -371,8 +455,18 @@ cmd VkResult vkCreateGraphicsPipelines( } if (create_info.pDepthStencilState != null) { - // TODO: pDepthStencilpNext depth_stencil_state := create_info.pDepthStencilState[0] + // handle depth stencil state pNext + if depth_stencil_state.pNext != null { + numPNext := numberOfPNext(depth_stencil_state.pNext) + next := MutableVoidPtr(as!void*(depth_stencil_state.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPipelineDepthStencilStateCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } obj.DepthState = new!DepthData( DepthTestEnable: depth_stencil_state.depthTestEnable, DepthWriteEnable: depth_stencil_state.depthWriteEnable, @@ -391,7 +485,17 @@ cmd VkResult vkCreateGraphicsPipelines( LogicOp: color_blend_state.logicOp, BlendConstants: color_blend_state.blendConstants ) - // TODO: color_blend_state.pNext + // handle color blend state pNext + if color_blend_state.pNext != null { + numPNext := numberOfPNext(color_blend_state.pNext) + next := MutableVoidPtr(as!void*(color_blend_state.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPipelineColorBlendStateCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } attachments := color_blend_state.pAttachments[0: color_blend_state.attachmentCount] for k in (0 .. color_blend_state.attachmentCount) { @@ -402,7 +506,17 @@ cmd VkResult vkCreateGraphicsPipelines( if (create_info.pDynamicState != null) { dynamic_state_info := create_info.pDynamicState[0] dynamic_data := new!DynamicData() - // TODO: dynamic_state_info.pNext + // handle dynamic_state_info.pNext + if dynamic_state_info.pNext != null { + numPNext := numberOfPNext(dynamic_state_info.pNext) + next := MutableVoidPtr(as!void*(dynamic_state_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPipelineDynamicStateCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } states := dynamic_state_info.pDynamicStates[0: dynamic_state_info.dynamicStateCount] for k in (0 .. dynamic_state_info.dynamicStateCount) { @@ -464,6 +578,17 @@ cmd VkResult vkCreateComputePipelines( infos := pCreateInfos[0:createInfoCount] for i in (0 .. createInfoCount) { info := infos[i] + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkComputePipelineCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } obj := new!ComputePipelineObject( PipelineCache: PipelineCaches[pipelineCache], Device: device, @@ -471,6 +596,18 @@ cmd VkResult vkCreateComputePipelines( PipelineLayout: PipelineLayouts[info.layout] ) stage_create_info := infos[i].stage + // handle pNext + if stage_create_info.pNext != null { + numPNext := numberOfPNext(stage_create_info.pNext) + next := MutableVoidPtr(as!void*(stage_create_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPipelineShaderStageCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + stage_data := StageData( Stage: stage_create_info.stage, Module: ShaderModules[stage_create_info.module], @@ -551,6 +688,17 @@ cmd VkResult vkCreateShaderModule( if !(device in Devices) { vkErrorInvalidDevice(device) } if pCreateInfo == null { vkErrorNullPointer("VkShaderModuleCreateInfo") } create_info := pCreateInfo[0] + // handle pNext + if create_info.pNext != null { + numPNext := numberOfPNext(create_info.pNext) + next := MutableVoidPtr(as!void*(create_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkShaderModuleCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } num_words := as!u64(create_info.codeSize) / 4 object := new!ShaderModuleObject(device, clone(create_info.pCode[0:num_words])) @@ -593,6 +741,18 @@ cmd VkResult vkCreatePipelineCache( if !(device in Devices) { vkErrorInvalidDevice(device) } if pCreateInfo == null { vkErrorNullPointer("VkPipelineCacheCreateInfo") } create_info := pCreateInfo[0] + // handle pNext + if create_info.pNext != null { + numPNext := numberOfPNext(create_info.pNext) + next := MutableVoidPtr(as!void*(create_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPipelineCacheCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + read(as!u8*(create_info.pInitialData)[0:create_info.initialDataSize]) handle := ? if pPipelineCache == null { vkErrorNullPointer("VkPipelineCache") } diff --git a/gapis/api/vulkan/api/properties_features_requirements.api b/gapis/api/vulkan/api/properties_features_requirements.api index c53e2b8713..be629a5d4a 100644 --- a/gapis/api/vulkan/api/properties_features_requirements.api +++ b/gapis/api/vulkan/api/properties_features_requirements.api @@ -355,6 +355,18 @@ cmd VkResult vkGetPhysicalDeviceImageFormatProperties2( if !(physicalDevice in PhysicalDevices) { vkErrorInvalidPhysicalDevice(physicalDevice) } if pImageFormatInfo == null { vkErrorNullPointer("const VkPhysicalDeviceImageFormatInfo2") } if pImageFormatProperties == null { vkErrorNullPointer("VkImageFormatProperties2") } + info := pImageFormatInfo[0] + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPhysicalDeviceImageFormatInfo2 + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } pImageFormatProperties[0] = ? // TODO: handle pNext return ? diff --git a/gapis/api/vulkan/api/query_pool.api b/gapis/api/vulkan/api/query_pool.api index d511e2b95e..df7f233d55 100644 --- a/gapis/api/vulkan/api/query_pool.api +++ b/gapis/api/vulkan/api/query_pool.api @@ -67,6 +67,17 @@ cmd VkResult vkCreateQueryPool( if !(device in Devices) { vkErrorInvalidDevice(device) } if pCreateInfo == null { vkErrorNullPointer("VkQueuePoolCreateInfo") } info := pCreateInfo[0] + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkQueryPoolCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } handle := ? pool := new!QueryPoolObject( diff --git a/gapis/api/vulkan/api/queue.api b/gapis/api/vulkan/api/queue.api index 7b32e6f31d..cafc4cd5b4 100644 --- a/gapis/api/vulkan/api/queue.api +++ b/gapis/api/vulkan/api/queue.api @@ -96,6 +96,19 @@ cmd VkResult vkQueueSubmit( enterSubcontext() for i in (0 .. submitCount) { info := submitInfo[i] + + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkQueueSubmitInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + wait_semaphores := info.pWaitSemaphores[0:info.waitSemaphoreCount] for j in (0 .. info.waitSemaphoreCount) { LastBoundQueue.PendingCommands[len(LastBoundQueue.PendingCommands)] @@ -263,6 +276,18 @@ cmd VkResult vkQueueBindSparse( enterSubcontext() for i in (0 .. bindInfoCount) { info := infos[i] + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkBindSparseInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + wait_semaphores := info.pWaitSemaphores[0:info.waitSemaphoreCount] for j in (0 .. info.waitSemaphoreCount) { LastBoundQueue.PendingCommands[len(LastBoundQueue.PendingCommands)] diff --git a/gapis/api/vulkan/api/renderpass_framebuffer.api b/gapis/api/vulkan/api/renderpass_framebuffer.api index ba616d9c13..13ee06a5e7 100644 --- a/gapis/api/vulkan/api/renderpass_framebuffer.api +++ b/gapis/api/vulkan/api/renderpass_framebuffer.api @@ -61,6 +61,17 @@ cmd VkResult vkCreateFramebuffer( if !(device in Devices) { vkErrorInvalidDevice(device) } if pCreateInfo == null { vkErrorNullPointer("VkFramebufferCreateInfo") } create_info := pCreateInfo[0] + // handle pNext + if create_info.pNext != null { + numPNext := numberOfPNext(create_info.pNext) + next := MutableVoidPtr(as!void*(create_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkFramebufferCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } attachments := create_info.pAttachments[0:create_info.attachmentCount] framebufferObject := new!FramebufferObject(Device: device, @@ -133,6 +144,17 @@ cmd VkResult vkCreateRenderPass( renderPass.Device = device if pCreateInfo == null { vkErrorNullPointer("VkRenderPassCreateInfo") } info := pCreateInfo[0] + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkRenderPassCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } attachments := info.pAttachments[0:info.attachmentCount] for i in (0 .. info.attachmentCount) { @@ -240,6 +262,17 @@ cmd void vkCmdBeginRenderPass( begin_info := pRenderPassBegin[0] if !(begin_info.renderPass in RenderPasses) { vkErrorInvalidRenderPass(begin_info.renderPass) } if !(begin_info.framebuffer in Framebuffers) { vkErrorInvalidFramebuffer(begin_info.framebuffer) } + // handle pNext + if begin_info.pNext != null { + numPNext := numberOfPNext(begin_info.pNext) + next := MutableVoidPtr(as!void*(begin_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkRenderPassCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } args := new!vkCmdBeginRenderPassArgs( Contents: contents, RenderPass: begin_info.renderPass, diff --git a/gapis/api/vulkan/api/synchronization.api b/gapis/api/vulkan/api/synchronization.api index d540c9a41f..35f3c8f1a5 100644 --- a/gapis/api/vulkan/api/synchronization.api +++ b/gapis/api/vulkan/api/synchronization.api @@ -58,6 +58,18 @@ cmd VkResult vkCreateFence( if pCreateInfo == null { vkErrorNullPointer("VkFenceCreateInfo") } f := new!FenceObject() create_info := pCreateInfo[0] + // handle pNext + if create_info.pNext != null { + numPNext := numberOfPNext(create_info.pNext) + next := MutableVoidPtr(as!void*(create_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkFenceCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + f.Device = device if ((as!u32(create_info.flags) & as!u32(VK_FENCE_CREATE_SIGNALED_BIT)) != 0) { @@ -157,7 +169,18 @@ cmd VkResult vkCreateSemaphore( VkSemaphore* pSemaphore) { if !(device in Devices) { vkErrorInvalidDevice(device) } if pCreateInfo == null { vkErrorNullPointer("VkSemaphoreCreateInfo") } - _ = pCreateInfo[0] + create_info := pCreateInfo[0] + // handle pNext + if create_info.pNext != null { + numPNext := numberOfPNext(create_info.pNext) + next := MutableVoidPtr(as!void*(create_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkSemaphoreCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } handle := ? semaphoreObject := new!SemaphoreObject(Device: device, @@ -200,7 +223,19 @@ cmd VkResult vkCreateEvent( VkEvent* pEvent) { if !(device in Devices) { vkErrorInvalidDevice(device) } if pCreateInfo == null { vkErrorNullPointer("VkEventCreateInfo") } - read(pCreateInfo[0:1]) + create_info := pCreateInfo[0] + // handle pNext + if create_info.pNext != null { + numPNext := numberOfPNext(create_info.pNext) + next := MutableVoidPtr(as!void*(create_info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkEventCreateInfo + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + event := new!EventObject() event.Device = device event.Signaled = false @@ -383,8 +418,11 @@ cmd void vkCmdWaitEvents( DstStageMask: dstStageMask, ) events := pEvents[0:eventCount] + handleMemoryBarriersPNext(pMemoryBarriers, memoryBarrierCount) memoryBarriers := pMemoryBarriers[0:memoryBarrierCount] + handleBufferMemoryBarriersPNext(pBufferMemoryBarriers, bufferMemoryBarrierCount) bufferMemoryBarriers := pBufferMemoryBarriers[0:bufferMemoryBarrierCount] + handleImageMemoryBarriersPNext(pImageMemoryBarriers, imageMemoryBarrierCount) imageMemoryBarriers := pImageMemoryBarriers[0:imageMemoryBarrierCount] for i in (0 .. eventCount) { if !(events[i] in Events) { vkErrorInvalidEvent(events[i]) } @@ -433,6 +471,60 @@ sub void dovkCmdPipelineBarrier(ref!vkCmdPipelineBarrierArgs args) { } } +sub void handleMemoryBarriersPNext(const VkMemoryBarrier* pBarriers, u32 count) { + barriers := pBarriers[0:count] + for i in (0 .. count) { + b := barriers[i] + // handle pNext + if b.pNext != null { + numPNext := numberOfPNext(b.pNext) + next := MutableVoidPtr(as!void*(b.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkMemoryBarrier + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + } +} + +sub void handleBufferMemoryBarriersPNext(const VkBufferMemoryBarrier* pBarriers, u32 count) { + barriers := pBarriers[0:count] + for i in (0 .. count) { + b := barriers[i] + // handle pNext + if b.pNext != null { + numPNext := numberOfPNext(b.pNext) + next := MutableVoidPtr(as!void*(b.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkBufferMemoryBarrier + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + } +} + +sub void handleImageMemoryBarriersPNext(const VkImageMemoryBarrier* pBarriers, u32 count) { + barriers := pBarriers[0:count] + for i in (0 .. count) { + b := barriers[i] + // handle pNext + if b.pNext != null { + numPNext := numberOfPNext(b.pNext) + next := MutableVoidPtr(as!void*(b.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkImageMemoryBarrier + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + } +} + @threadSafety("app") @indirect("VkCommandBuffer", "VkDevice") cmd void vkCmdPipelineBarrier( @@ -452,16 +544,19 @@ cmd void vkCmdPipelineBarrier( DstStageMask: dstStageMask, DependencyFlags: dependencyFlags ) + handleMemoryBarriersPNext(pMemoryBarriers, memoryBarrierCount) memoryBarriers := pMemoryBarriers[0:memoryBarrierCount] for i in (0 .. memoryBarrierCount) { args.MemoryBarriers[i] = memoryBarriers[i] } + handleBufferMemoryBarriersPNext(pBufferMemoryBarriers, bufferMemoryBarrierCount) bufferMemoryBarriers := pBufferMemoryBarriers[0:bufferMemoryBarrierCount] for i in (0 .. bufferMemoryBarrierCount) { args.BufferMemoryBarriers[i] = bufferMemoryBarriers[i] } + handleImageMemoryBarriersPNext(pImageMemoryBarriers, imageMemoryBarrierCount) imageMemoryBarriers := pImageMemoryBarriers[0:imageMemoryBarrierCount] for i in (0 .. imageMemoryBarrierCount) { args.ImageMemoryBarriers[i] = imageMemoryBarriers[i] diff --git a/gapis/api/vulkan/extensions/khr_get_memory_requirements2.api b/gapis/api/vulkan/extensions/khr_get_memory_requirements2.api index 4bed7cc857..72722acb3d 100644 --- a/gapis/api/vulkan/extensions/khr_get_memory_requirements2.api +++ b/gapis/api/vulkan/extensions/khr_get_memory_requirements2.api @@ -183,7 +183,17 @@ cmd void vkGetImageSparseMemoryRequirements2KHR( info := pInfo[0] image := info.image if !(image in Images) { vkErrorInvalidImage(image) } - // TODO: handle pNext + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkImageSparseMemoryRequirementsInfo2KHR + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } if pSparseMemoryRequirementCount == null { vkErrorNullPointer("uint32_t") } read(pSparseMemoryRequirementCount[0:1]) diff --git a/gapis/api/vulkan/extensions/khr_get_physical_device_properties2.api b/gapis/api/vulkan/extensions/khr_get_physical_device_properties2.api index 2d3bb15408..dcf2341c41 100644 --- a/gapis/api/vulkan/extensions/khr_get_physical_device_properties2.api +++ b/gapis/api/vulkan/extensions/khr_get_physical_device_properties2.api @@ -155,6 +155,18 @@ cmd VkResult vkGetPhysicalDeviceImageFormatProperties2KHR( if !(physicalDevice in PhysicalDevices) { vkErrorInvalidPhysicalDevice(physicalDevice) } if pImageFormatInfo == null { vkErrorNullPointer("const VkPhysicalDeviceImageFormatInfo2KHR") } if pImageFormatProperties == null { vkErrorNullPointer("VkImageFormatProperties2KHR") } + info := pImageFormatInfo[0] + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPhysicalDeviceImageFormatInfo2KHR + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } pImageFormatProperties[0] = ? // TODO: handle pNext return ? @@ -215,6 +227,19 @@ cmd void vkGetPhysicalDeviceSparseImageFormatProperties2KHR( VkSparseImageFormatProperties2KHR* pProperties) { if !(physicalDevice in PhysicalDevices) { vkErrorInvalidPhysicalDevice(physicalDevice) } if pPropertyCount == null { vkErrorNullPointer("uint32_t") } + info := pFormatInfo[0] + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPhysicalDeviceSparseImageFormatInfo2KHR + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + _ = pPropertyCount[0] if pProperties == null { diff --git a/gapis/api/vulkan/extensions/khr_get_surface_capabilities2.api b/gapis/api/vulkan/extensions/khr_get_surface_capabilities2.api index 5f1da7aa91..ccfdec3ab4 100644 --- a/gapis/api/vulkan/extensions/khr_get_surface_capabilities2.api +++ b/gapis/api/vulkan/extensions/khr_get_surface_capabilities2.api @@ -67,7 +67,18 @@ cmd VkResult vkGetPhysicalDeviceSurfaceCapabilities2KHR( if !(physicalDevice in PhysicalDevices) { vkErrorInvalidPhysicalDevice(physicalDevice) } if pSurfaceInfo == null { vkErrorNullPointer("const VkPhysicalDeviceSurfaceInfo2KHR") } info := pSurfaceInfo[0] - // TODO: handle pNext + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPhysicalDeviceSurfaceInfo2KHR + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + if !(info.surface in Surfaces) { vkErrorInvalidSurface(info.surface) } if pSurfaceCapabilities == null { vkErrorNullPointer("VkSurfaceCapabilitiesKHR") } pSurfaceCapabilities[0] = ? @@ -87,7 +98,18 @@ cmd VkResult vkGetPhysicalDeviceSurfaceFormats2KHR( if !(physicalDevice in PhysicalDevices) { vkErrorInvalidPhysicalDevice(physicalDevice) } if pSurfaceInfo == null { vkErrorNullPointer("const VkPhysicalDeviceSurfaceInfo2KHR") } info := pSurfaceInfo[0] - // TODO: handle pNext + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for VkPhysicalDeviceSurfaceInfo2KHR + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } + if !(info.surface in Surfaces) { vkErrorInvalidSurface(info.surface) } if pSurfaceFormatCount == null { vkErrorNullPointer("uint32_t") } _ = pSurfaceFormatCount[0] diff --git a/gapis/api/vulkan/extensions/khr_swapchain.api b/gapis/api/vulkan/extensions/khr_swapchain.api index 1064d4d50f..86cc1c1124 100644 --- a/gapis/api/vulkan/extensions/khr_swapchain.api +++ b/gapis/api/vulkan/extensions/khr_swapchain.api @@ -270,7 +270,24 @@ cmd VkResult vkQueuePresentKHR( info := pPresentInfo[0] - // TODO: handle pNext + + // handle pNext + if info.pNext != null { + numPNext := numberOfPNext(info.pNext) + next := MutableVoidPtr(as!void*(info.pNext)) + for i in (0 .. numPNext) { + sType := as!const VkStructureType*(next.Ptr)[0:1][0] + _ = sType + // TODO: handle extensions for queue present + // Example: Device Gropu Extension + // switch sType { + // case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: { + // ext := as!VkDeviceGroupPresentInfoKHR*(next.Ptr)[0] + // } + // } + next.Ptr = as!VulkanStructHeader*(next.Ptr)[0:1][0].PNext + } + } if (info.pWaitSemaphores != null) { wait_semaphores := info.pWaitSemaphores[0:info.waitSemaphoreCount]