internal unsafe void MarshalTo(SharpVk.Interop.Khronos.Experimental.DeviceGroupPresentInfo *pointer) { pointer->SType = StructureType.DeviceGroupPresentInfoKhx; pointer->Next = null; pointer->SwapchainCount = (uint)(this.DeviceMasks?.Length ?? 0); if (this.DeviceMasks != null) { var fieldPointer = (uint *)(Interop.HeapUtil.AllocateAndClear <uint>(this.DeviceMasks.Length).ToPointer()); for (int index = 0; index < (uint)(this.DeviceMasks.Length); index++) { fieldPointer[index] = this.DeviceMasks[index]; } pointer->DeviceMasks = fieldPointer; } else { pointer->DeviceMasks = null; } pointer->Mode = this.Mode; }
/// <summary> /// Queue an image for presentation. /// </summary> /// <param name="extendedHandle"> /// The Queue handle to extend. /// </param> /// <param name="waitSemaphores"> /// </param> /// <param name="swapchains"> /// </param> /// <param name="imageIndices"> /// </param> /// <param name="results"> /// </param> /// <param name="displayPresentInfoKhr"> /// Extension struct /// </param> /// <param name="presentRegionsKhr"> /// Extension struct /// </param> /// <param name="deviceGroupPresentInfoKhx"> /// Extension struct /// </param> /// <param name="presentTimesInfoGoogle"> /// Extension struct /// </param> public static unsafe Result Present(this SharpVk.Queue extendedHandle, ArrayProxy <SharpVk.Semaphore>?waitSemaphores, ArrayProxy <SharpVk.Khronos.Swapchain>?swapchains, ArrayProxy <uint>?imageIndices, ArrayProxy <SharpVk.Result>?results = null, SharpVk.Khronos.DisplayPresentInfo?displayPresentInfoKhr = null, SharpVk.Khronos.PresentRegions?presentRegionsKhr = null, SharpVk.Khronos.Experimental.DeviceGroupPresentInfo?deviceGroupPresentInfoKhx = null, SharpVk.Google.PresentTimesInfo?presentTimesInfoGoogle = null) { try { Result result = default(Result); CommandCache commandCache = default(CommandCache); SharpVk.Interop.Khronos.PresentInfo *marshalledPresentInfo = default(SharpVk.Interop.Khronos.PresentInfo *); void *nextPointer = default(void *); if (displayPresentInfoKhr != null) { SharpVk.Interop.Khronos.DisplayPresentInfo *extensionPointer = default(SharpVk.Interop.Khronos.DisplayPresentInfo *); extensionPointer = (SharpVk.Interop.Khronos.DisplayPresentInfo *)(Interop.HeapUtil.Allocate <SharpVk.Interop.Khronos.DisplayPresentInfo>()); displayPresentInfoKhr.Value.MarshalTo(extensionPointer); extensionPointer->Next = nextPointer; nextPointer = extensionPointer; } if (presentRegionsKhr != null) { SharpVk.Interop.Khronos.PresentRegions *extensionPointer = default(SharpVk.Interop.Khronos.PresentRegions *); extensionPointer = (SharpVk.Interop.Khronos.PresentRegions *)(Interop.HeapUtil.Allocate <SharpVk.Interop.Khronos.PresentRegions>()); presentRegionsKhr.Value.MarshalTo(extensionPointer); extensionPointer->Next = nextPointer; nextPointer = extensionPointer; } if (deviceGroupPresentInfoKhx != null) { SharpVk.Interop.Khronos.Experimental.DeviceGroupPresentInfo *extensionPointer = default(SharpVk.Interop.Khronos.Experimental.DeviceGroupPresentInfo *); extensionPointer = (SharpVk.Interop.Khronos.Experimental.DeviceGroupPresentInfo *)(Interop.HeapUtil.Allocate <SharpVk.Interop.Khronos.Experimental.DeviceGroupPresentInfo>()); deviceGroupPresentInfoKhx.Value.MarshalTo(extensionPointer); extensionPointer->Next = nextPointer; nextPointer = extensionPointer; } if (presentTimesInfoGoogle != null) { SharpVk.Interop.Google.PresentTimesInfo *extensionPointer = default(SharpVk.Interop.Google.PresentTimesInfo *); extensionPointer = (SharpVk.Interop.Google.PresentTimesInfo *)(Interop.HeapUtil.Allocate <SharpVk.Interop.Google.PresentTimesInfo>()); presentTimesInfoGoogle.Value.MarshalTo(extensionPointer); extensionPointer->Next = nextPointer; nextPointer = extensionPointer; } commandCache = extendedHandle.commandCache; marshalledPresentInfo = (SharpVk.Interop.Khronos.PresentInfo *)(Interop.HeapUtil.Allocate <SharpVk.Interop.Khronos.PresentInfo>()); marshalledPresentInfo->SType = StructureType.PresentInfo; marshalledPresentInfo->Next = nextPointer; marshalledPresentInfo->WaitSemaphoreCount = (uint)(Interop.HeapUtil.GetLength(waitSemaphores)); if (waitSemaphores.IsNull()) { marshalledPresentInfo->WaitSemaphores = null; } else { if (waitSemaphores.Value.Contents == ProxyContents.Single) { marshalledPresentInfo->WaitSemaphores = (SharpVk.Interop.Semaphore *)(Interop.HeapUtil.Allocate <SharpVk.Interop.Semaphore>()); *(SharpVk.Interop.Semaphore *)(marshalledPresentInfo->WaitSemaphores) = waitSemaphores.Value.GetSingleValue()?.handle ?? default(SharpVk.Interop.Semaphore); } else { var fieldPointer = (SharpVk.Interop.Semaphore *)(Interop.HeapUtil.AllocateAndClear <SharpVk.Interop.Semaphore>(Interop.HeapUtil.GetLength(waitSemaphores.Value)).ToPointer()); for (int index = 0; index < (uint)(Interop.HeapUtil.GetLength(waitSemaphores.Value)); index++) { fieldPointer[index] = waitSemaphores.Value[index]?.handle ?? default(SharpVk.Interop.Semaphore); } marshalledPresentInfo->WaitSemaphores = fieldPointer; } } marshalledPresentInfo->SwapchainCount = (uint)(Interop.HeapUtil.GetLength(swapchains)); if (swapchains.IsNull()) { marshalledPresentInfo->Swapchains = null; } else { if (swapchains.Value.Contents == ProxyContents.Single) { marshalledPresentInfo->Swapchains = (SharpVk.Interop.Khronos.Swapchain *)(Interop.HeapUtil.Allocate <SharpVk.Interop.Khronos.Swapchain>()); *(SharpVk.Interop.Khronos.Swapchain *)(marshalledPresentInfo->Swapchains) = swapchains.Value.GetSingleValue()?.handle ?? default(SharpVk.Interop.Khronos.Swapchain); } else { var fieldPointer = (SharpVk.Interop.Khronos.Swapchain *)(Interop.HeapUtil.AllocateAndClear <SharpVk.Interop.Khronos.Swapchain>(Interop.HeapUtil.GetLength(swapchains.Value)).ToPointer()); for (int index = 0; index < (uint)(Interop.HeapUtil.GetLength(swapchains.Value)); index++) { fieldPointer[index] = swapchains.Value[index]?.handle ?? default(SharpVk.Interop.Khronos.Swapchain); } marshalledPresentInfo->Swapchains = fieldPointer; } } if (imageIndices.IsNull()) { marshalledPresentInfo->ImageIndices = null; } else { if (imageIndices.Value.Contents == ProxyContents.Single) { marshalledPresentInfo->ImageIndices = (uint *)(Interop.HeapUtil.Allocate <uint>()); *(uint *)(marshalledPresentInfo->ImageIndices) = imageIndices.Value.GetSingleValue(); } else { var fieldPointer = (uint *)(Interop.HeapUtil.AllocateAndClear <uint>(Interop.HeapUtil.GetLength(imageIndices.Value)).ToPointer()); for (int index = 0; index < (uint)(Interop.HeapUtil.GetLength(imageIndices.Value)); index++) { fieldPointer[index] = imageIndices.Value[index]; } marshalledPresentInfo->ImageIndices = fieldPointer; } } if (results.IsNull()) { marshalledPresentInfo->Results = null; } else { if (results.Value.Contents == ProxyContents.Single) { marshalledPresentInfo->Results = (SharpVk.Result *)(Interop.HeapUtil.Allocate <SharpVk.Result>()); *(SharpVk.Result *)(marshalledPresentInfo->Results) = results.Value.GetSingleValue(); } else { var fieldPointer = (SharpVk.Result *)(Interop.HeapUtil.AllocateAndClear <SharpVk.Result>(Interop.HeapUtil.GetLength(results.Value)).ToPointer()); for (int index = 0; index < (uint)(Interop.HeapUtil.GetLength(results.Value)); index++) { fieldPointer[index] = results.Value[index]; } marshalledPresentInfo->Results = fieldPointer; } } SharpVk.Interop.Khronos.VkQueuePresentDelegate commandDelegate = commandCache.GetCommandDelegate <SharpVk.Interop.Khronos.VkQueuePresentDelegate>("vkQueuePresentKHR", "device"); result = commandDelegate(extendedHandle.handle, marshalledPresentInfo); if (SharpVkException.IsError(result)) { throw SharpVkException.Create(result); } return(result); } finally { Interop.HeapUtil.FreeAll(); } }