/// <summary> /// /// </summary> public unsafe void PushConstants(SharpVk.PipelineLayout layout, SharpVk.ShaderStageFlags stageFlags, uint offset, byte[] values) { try { byte *marshalledValues = default(byte *); if (values != null) { var fieldPointer = (byte *)(Interop.HeapUtil.AllocateAndClear <byte>(values.Length).ToPointer()); for (int index = 0; index < (uint)(values.Length); index++) { fieldPointer[index] = values[index]; } marshalledValues = fieldPointer; } else { marshalledValues = null; } Interop.Commands.vkCmdPushConstants(this.handle, layout?.handle ?? default(SharpVk.Interop.PipelineLayout), stageFlags, offset, (uint)(values?.Length ?? 0), marshalledValues); } finally { Interop.HeapUtil.FreeAll(); } }
/// <summary> /// Pushes descriptor updates into a command buffer using a descriptor /// update template. /// </summary> /// <param name="extendedHandle"> /// The CommandBuffer handle to extend. /// </param> /// <param name="descriptorUpdateTemplate"> /// </param> /// <param name="layout"> /// </param> /// <param name="set"> /// </param> /// <param name="data"> /// </param> public static unsafe void PushDescriptorSetWithTemplate(this SharpVk.CommandBuffer extendedHandle, SharpVk.DescriptorUpdateTemplate descriptorUpdateTemplate, SharpVk.PipelineLayout layout, uint set, IntPtr data) { try { CommandCache commandCache = default(CommandCache); commandCache = extendedHandle.commandCache; SharpVk.Interop.Khronos.VkCommandBufferPushDescriptorSetWithTemplateDelegate commandDelegate = commandCache.Cache.vkCmdPushDescriptorSetWithTemplateKHR; commandDelegate(extendedHandle.handle, descriptorUpdateTemplate?.handle ?? default(SharpVk.Interop.DescriptorUpdateTemplate), layout?.handle ?? default(SharpVk.Interop.PipelineLayout), set, data.ToPointer()); } finally { Interop.HeapUtil.FreeAll(); } }
/// <summary> /// Pushes descriptor updates into a command buffer. /// </summary> /// <param name="extendedHandle"> /// The CommandBuffer handle to extend. /// </param> /// <param name="pipelineBindPoint"> /// </param> /// <param name="layout"> /// </param> /// <param name="set"> /// </param> /// <param name="descriptorWrites"> /// </param> public static unsafe void PushDescriptorSet(this SharpVk.CommandBuffer extendedHandle, SharpVk.PipelineBindPoint pipelineBindPoint, SharpVk.PipelineLayout layout, uint set, ArrayProxy <SharpVk.WriteDescriptorSet>?descriptorWrites) { try { CommandCache commandCache = default(CommandCache); SharpVk.Interop.WriteDescriptorSet *marshalledDescriptorWrites = default(SharpVk.Interop.WriteDescriptorSet *); commandCache = extendedHandle.commandCache; if (descriptorWrites.IsNull()) { marshalledDescriptorWrites = null; } else { if (descriptorWrites.Value.Contents == ProxyContents.Single) { marshalledDescriptorWrites = (SharpVk.Interop.WriteDescriptorSet *)(Interop.HeapUtil.Allocate <SharpVk.Interop.WriteDescriptorSet>()); descriptorWrites.Value.GetSingleValue().MarshalTo(&*(SharpVk.Interop.WriteDescriptorSet *)(marshalledDescriptorWrites)); } else { var fieldPointer = (SharpVk.Interop.WriteDescriptorSet *)(Interop.HeapUtil.AllocateAndClear <SharpVk.Interop.WriteDescriptorSet>(Interop.HeapUtil.GetLength(descriptorWrites.Value)).ToPointer()); for (int index = 0; index < (uint)(Interop.HeapUtil.GetLength(descriptorWrites.Value)); index++) { descriptorWrites.Value[index].MarshalTo(&fieldPointer[index]); } marshalledDescriptorWrites = fieldPointer; } } SharpVk.Interop.Khronos.VkCommandBufferPushDescriptorSetDelegate commandDelegate = commandCache.Cache.vkCmdPushDescriptorSetKHR; commandDelegate(extendedHandle.handle, pipelineBindPoint, layout?.handle ?? default(SharpVk.Interop.PipelineLayout), set, (uint)(Interop.HeapUtil.GetLength(descriptorWrites)), marshalledDescriptorWrites); } finally { Interop.HeapUtil.FreeAll(); } }
/// <summary> /// /// </summary> /// <param name="extendedHandle"> /// The Device handle to extend. /// </param> /// <param name="pipelineCache"> /// </param> /// <param name="flags"> /// </param> /// <param name="stages"> /// </param> /// <param name="groups"> /// </param> /// <param name="maxRecursionDepth"> /// </param> /// <param name="layout"> /// </param> /// <param name="basePipelineHandle"> /// </param> /// <param name="basePipelineIndex"> /// </param> /// <param name="pipelineCreationFeedbackCreateInfoExt"> /// Extension struct /// </param> /// <param name="allocator"> /// </param> public static unsafe SharpVk.Pipeline CreateRayTracingPipeline(this SharpVk.Device extendedHandle, SharpVk.PipelineCache pipelineCache, ArrayProxy <SharpVk.PipelineShaderStageCreateInfo>?stages, ArrayProxy <SharpVk.NVidia.RayTracingShaderGroupCreateInfo>?groups, uint maxRecursionDepth, SharpVk.PipelineLayout layout, SharpVk.Pipeline basePipelineHandle, int basePipelineIndex, SharpVk.PipelineCreateFlags?flags = default(SharpVk.PipelineCreateFlags?), SharpVk.Multivendor.PipelineCreationFeedbackCreateInfo?pipelineCreationFeedbackCreateInfoExt = null, SharpVk.AllocationCallbacks?allocator = default(SharpVk.AllocationCallbacks?)) { try { SharpVk.Pipeline result = default(SharpVk.Pipeline); CommandCache commandCache = default(CommandCache); uint marshalledCreateInfoCount = default(uint); SharpVk.Interop.NVidia.RayTracingPipelineCreateInfo *marshalledCreateInfos = default(SharpVk.Interop.NVidia.RayTracingPipelineCreateInfo *); void *vkRayTracingPipelineCreateInfoNVNextPointer = default(void *); SharpVk.Interop.AllocationCallbacks *marshalledAllocator = default(SharpVk.Interop.AllocationCallbacks *); SharpVk.Interop.Pipeline * marshalledPipelines = default(SharpVk.Interop.Pipeline *); if (pipelineCreationFeedbackCreateInfoExt != null) { SharpVk.Interop.Multivendor.PipelineCreationFeedbackCreateInfo *extensionPointer = default(SharpVk.Interop.Multivendor.PipelineCreationFeedbackCreateInfo *); extensionPointer = (SharpVk.Interop.Multivendor.PipelineCreationFeedbackCreateInfo *)(Interop.HeapUtil.Allocate <SharpVk.Interop.Multivendor.PipelineCreationFeedbackCreateInfo>()); pipelineCreationFeedbackCreateInfoExt.Value.MarshalTo(extensionPointer); extensionPointer->Next = vkRayTracingPipelineCreateInfoNVNextPointer; vkRayTracingPipelineCreateInfoNVNextPointer = extensionPointer; } commandCache = extendedHandle.commandCache; marshalledCreateInfoCount = 1; marshalledCreateInfos = (SharpVk.Interop.NVidia.RayTracingPipelineCreateInfo *)(Interop.HeapUtil.Allocate <SharpVk.Interop.NVidia.RayTracingPipelineCreateInfo>()); marshalledCreateInfos->SType = StructureType.RayTracingPipelineCreateInfo; marshalledCreateInfos->Next = vkRayTracingPipelineCreateInfoNVNextPointer; if (flags != null) { marshalledCreateInfos->Flags = flags.Value; } else { marshalledCreateInfos->Flags = default(SharpVk.PipelineCreateFlags); } marshalledCreateInfos->StageCount = (uint)(Interop.HeapUtil.GetLength(stages)); if (stages.IsNull()) { marshalledCreateInfos->Stages = null; } else { if (stages.Value.Contents == ProxyContents.Single) { marshalledCreateInfos->Stages = (SharpVk.Interop.PipelineShaderStageCreateInfo *)(Interop.HeapUtil.Allocate <SharpVk.Interop.PipelineShaderStageCreateInfo>()); stages.Value.GetSingleValue().MarshalTo(&*(SharpVk.Interop.PipelineShaderStageCreateInfo *)(marshalledCreateInfos->Stages)); } else { var fieldPointer = (SharpVk.Interop.PipelineShaderStageCreateInfo *)(Interop.HeapUtil.AllocateAndClear <SharpVk.Interop.PipelineShaderStageCreateInfo>(Interop.HeapUtil.GetLength(stages.Value)).ToPointer()); for (int index = 0; index < (uint)(Interop.HeapUtil.GetLength(stages.Value)); index++) { stages.Value[index].MarshalTo(&fieldPointer[index]); } marshalledCreateInfos->Stages = fieldPointer; } } marshalledCreateInfos->GroupCount = (uint)(Interop.HeapUtil.GetLength(groups)); if (groups.IsNull()) { marshalledCreateInfos->Groups = null; } else { if (groups.Value.Contents == ProxyContents.Single) { marshalledCreateInfos->Groups = (SharpVk.Interop.NVidia.RayTracingShaderGroupCreateInfo *)(Interop.HeapUtil.Allocate <SharpVk.Interop.NVidia.RayTracingShaderGroupCreateInfo>()); groups.Value.GetSingleValue().MarshalTo(&*(SharpVk.Interop.NVidia.RayTracingShaderGroupCreateInfo *)(marshalledCreateInfos->Groups)); } else { var fieldPointer = (SharpVk.Interop.NVidia.RayTracingShaderGroupCreateInfo *)(Interop.HeapUtil.AllocateAndClear <SharpVk.Interop.NVidia.RayTracingShaderGroupCreateInfo>(Interop.HeapUtil.GetLength(groups.Value)).ToPointer()); for (int index = 0; index < (uint)(Interop.HeapUtil.GetLength(groups.Value)); index++) { groups.Value[index].MarshalTo(&fieldPointer[index]); } marshalledCreateInfos->Groups = fieldPointer; } } marshalledCreateInfos->MaxRecursionDepth = maxRecursionDepth; marshalledCreateInfos->Layout = layout?.handle ?? default(SharpVk.Interop.PipelineLayout); marshalledCreateInfos->BasePipelineHandle = basePipelineHandle?.handle ?? default(SharpVk.Interop.Pipeline); marshalledCreateInfos->BasePipelineIndex = basePipelineIndex; if (allocator != null) { marshalledAllocator = (SharpVk.Interop.AllocationCallbacks *)(Interop.HeapUtil.Allocate <SharpVk.Interop.AllocationCallbacks>()); allocator.Value.MarshalTo(marshalledAllocator); } else { marshalledAllocator = default(SharpVk.Interop.AllocationCallbacks *); } marshalledPipelines = (SharpVk.Interop.Pipeline *)(Interop.HeapUtil.Allocate <SharpVk.Interop.Pipeline>(1)); SharpVk.Interop.NVidia.VkDeviceCreateRayTracingPipelinesDelegate commandDelegate = commandCache.Cache.vkCreateRayTracingPipelinesNV; Result methodResult = commandDelegate(extendedHandle.handle, pipelineCache?.handle ?? default(SharpVk.Interop.PipelineCache), marshalledCreateInfoCount, marshalledCreateInfos, marshalledAllocator, marshalledPipelines); if (SharpVkException.IsError(methodResult)) { throw SharpVkException.Create(methodResult); } result = new SharpVk.Pipeline(extendedHandle, *marshalledPipelines); return(result); } finally { Interop.HeapUtil.FreeAll(); } }
/// <summary> /// /// </summary> public static unsafe SharpVk.Khronos.DescriptorUpdateTemplate CreateDescriptorUpdateTemplate(this SharpVk.Device extendedHandle, SharpVk.Khronos.DescriptorUpdateTemplateEntry[] descriptorUpdateEntries, SharpVk.Khronos.DescriptorUpdateTemplateType templateType, SharpVk.DescriptorSetLayout descriptorSetLayout, SharpVk.PipelineLayout pipelineLayout, SharpVk.Khronos.DescriptorUpdateTemplateCreateFlags?flags = default(SharpVk.Khronos.DescriptorUpdateTemplateCreateFlags?), SharpVk.PipelineBindPoint?pipelineBindPoint = default(SharpVk.PipelineBindPoint?), uint?set = default(uint?), SharpVk.AllocationCallbacks?allocator = default(SharpVk.AllocationCallbacks?)) { try { SharpVk.Khronos.DescriptorUpdateTemplate result = default(SharpVk.Khronos.DescriptorUpdateTemplate); CommandCache commandCache = default(CommandCache); SharpVk.Interop.Khronos.DescriptorUpdateTemplateCreateInfo *marshalledCreateInfo = default(SharpVk.Interop.Khronos.DescriptorUpdateTemplateCreateInfo *); SharpVk.Interop.AllocationCallbacks * marshalledAllocator = default(SharpVk.Interop.AllocationCallbacks *); SharpVk.Interop.Khronos.DescriptorUpdateTemplate marshalledDescriptorUpdateTemplate = default(SharpVk.Interop.Khronos.DescriptorUpdateTemplate); commandCache = extendedHandle.commandCache; marshalledCreateInfo = (SharpVk.Interop.Khronos.DescriptorUpdateTemplateCreateInfo *)(Interop.HeapUtil.Allocate <SharpVk.Interop.Khronos.DescriptorUpdateTemplateCreateInfo>()); marshalledCreateInfo->SType = StructureType.DescriptorUpdateTemplateCreateInfoKhr; marshalledCreateInfo->Next = null; if (flags != null) { marshalledCreateInfo->Flags = flags.Value; } else { marshalledCreateInfo->Flags = default(SharpVk.Khronos.DescriptorUpdateTemplateCreateFlags); } marshalledCreateInfo->DescriptorUpdateEntryCount = (uint)(descriptorUpdateEntries?.Length ?? 0); if (descriptorUpdateEntries != null) { var fieldPointer = (SharpVk.Khronos.DescriptorUpdateTemplateEntry *)(Interop.HeapUtil.AllocateAndClear <SharpVk.Khronos.DescriptorUpdateTemplateEntry>(descriptorUpdateEntries.Length).ToPointer()); for (int index = 0; index < (uint)(descriptorUpdateEntries.Length); index++) { fieldPointer[index] = descriptorUpdateEntries[index]; } marshalledCreateInfo->DescriptorUpdateEntries = fieldPointer; } else { marshalledCreateInfo->DescriptorUpdateEntries = null; } marshalledCreateInfo->TemplateType = templateType; marshalledCreateInfo->DescriptorSetLayout = descriptorSetLayout?.handle ?? default(SharpVk.Interop.DescriptorSetLayout); if (pipelineBindPoint != null) { marshalledCreateInfo->PipelineBindPoint = pipelineBindPoint.Value; } else { marshalledCreateInfo->PipelineBindPoint = default(SharpVk.PipelineBindPoint); } marshalledCreateInfo->PipelineLayout = pipelineLayout?.handle ?? default(SharpVk.Interop.PipelineLayout); if (set != null) { marshalledCreateInfo->Set = set.Value; } else { marshalledCreateInfo->Set = default(uint); } if (allocator != null) { marshalledAllocator = (SharpVk.Interop.AllocationCallbacks *)(Interop.HeapUtil.Allocate <SharpVk.Interop.AllocationCallbacks>()); allocator.Value.MarshalTo(marshalledAllocator); } else { marshalledAllocator = default(SharpVk.Interop.AllocationCallbacks *); } SharpVk.Interop.Khronos.VkDeviceCreateDescriptorUpdateTemplateDelegate commandDelegate = commandCache.GetCommandDelegate <SharpVk.Interop.Khronos.VkDeviceCreateDescriptorUpdateTemplateDelegate>("vkCreateDescriptorUpdateTemplateKHR", "instance"); Result methodResult = commandDelegate(extendedHandle.handle, marshalledCreateInfo, marshalledAllocator, &marshalledDescriptorUpdateTemplate); if (SharpVkException.IsError(methodResult)) { throw SharpVkException.Create(methodResult); } result = new SharpVk.Khronos.DescriptorUpdateTemplate(extendedHandle, marshalledDescriptorUpdateTemplate); return(result); } finally { Interop.HeapUtil.FreeAll(); } }
/// <summary> /// /// </summary> public static unsafe void PushDescriptorSet(this SharpVk.CommandBuffer extendedHandle, SharpVk.PipelineBindPoint pipelineBindPoint, SharpVk.PipelineLayout layout, uint set, SharpVk.WriteDescriptorSet[] descriptorWrites) { try { CommandCache commandCache = default(CommandCache); SharpVk.Interop.WriteDescriptorSet *marshalledDescriptorWrites = default(SharpVk.Interop.WriteDescriptorSet *); commandCache = extendedHandle.commandCache; if (descriptorWrites != null) { var fieldPointer = (SharpVk.Interop.WriteDescriptorSet *)(Interop.HeapUtil.AllocateAndClear <SharpVk.Interop.WriteDescriptorSet>(descriptorWrites.Length).ToPointer()); for (int index = 0; index < (uint)(descriptorWrites.Length); index++) { descriptorWrites[index].MarshalTo(&fieldPointer[index]); } marshalledDescriptorWrites = fieldPointer; } else { marshalledDescriptorWrites = null; } SharpVk.Interop.Khronos.VkCommandBufferPushDescriptorSetDelegate commandDelegate = commandCache.GetCommandDelegate <SharpVk.Interop.Khronos.VkCommandBufferPushDescriptorSetDelegate>("vkCmdPushDescriptorSetKHR", "instance"); commandDelegate(extendedHandle.handle, pipelineBindPoint, layout?.handle ?? default(SharpVk.Interop.PipelineLayout), set, (uint)(descriptorWrites?.Length ?? 0), marshalledDescriptorWrites); } finally { Interop.HeapUtil.FreeAll(); } }
/// <summary> /// /// </summary> public unsafe void BindDescriptorSets(SharpVk.PipelineBindPoint pipelineBindPoint, SharpVk.PipelineLayout layout, uint firstSet, SharpVk.DescriptorSet[] descriptorSets, uint[] dynamicOffsets) { try { SharpVk.Interop.DescriptorSet *marshalledDescriptorSets = default(SharpVk.Interop.DescriptorSet *); uint *marshalledDynamicOffsets = default(uint *); if (descriptorSets != null) { var fieldPointer = (SharpVk.Interop.DescriptorSet *)(Interop.HeapUtil.AllocateAndClear <SharpVk.Interop.DescriptorSet>(descriptorSets.Length).ToPointer()); for (int index = 0; index < (uint)(descriptorSets.Length); index++) { fieldPointer[index] = descriptorSets[index]?.handle ?? default(SharpVk.Interop.DescriptorSet); } marshalledDescriptorSets = fieldPointer; } else { marshalledDescriptorSets = null; } if (dynamicOffsets != null) { var fieldPointer = (uint *)(Interop.HeapUtil.AllocateAndClear <uint>(dynamicOffsets.Length).ToPointer()); for (int index = 0; index < (uint)(dynamicOffsets.Length); index++) { fieldPointer[index] = dynamicOffsets[index]; } marshalledDynamicOffsets = fieldPointer; } else { marshalledDynamicOffsets = null; } Interop.Commands.vkCmdBindDescriptorSets(this.handle, pipelineBindPoint, layout?.handle ?? default(SharpVk.Interop.PipelineLayout), firstSet, (uint)(descriptorSets?.Length ?? 0), marshalledDescriptorSets, (uint)(dynamicOffsets?.Length ?? 0), marshalledDynamicOffsets); } finally { Interop.HeapUtil.FreeAll(); } }