/// <summary> /// /// </summary> public unsafe void BindPipeline(SharpVk.PipelineBindPoint pipelineBindPoint, SharpVk.Pipeline pipeline) { try { Interop.Commands.vkCmdBindPipeline(this.handle, pipelineBindPoint, pipeline?.handle ?? default(SharpVk.Interop.Pipeline)); } finally { Interop.HeapUtil.FreeAll(); } }
/// <summary> /// /// </summary> /// <param name="extendedHandle"> /// The Pipeline handle to extend. /// </param> public static unsafe void CompileDeferred(this SharpVk.Pipeline extendedHandle, uint shader) { try { CommandCache commandCache = default(CommandCache); commandCache = extendedHandle.commandCache; SharpVk.Interop.NVidia.VkPipelineCompileDeferredDelegate commandDelegate = commandCache.Cache.vkCompileDeferredNV; Result methodResult = commandDelegate(extendedHandle.parent.handle, extendedHandle.handle, shader); if (SharpVkException.IsError(methodResult)) { throw SharpVkException.Create(methodResult); } } finally { Interop.HeapUtil.FreeAll(); } }
/// <summary> /// /// </summary> /// <param name="extendedHandle"> /// The Pipeline handle to extend. /// </param> public static unsafe byte[] GetShaderInfo(this SharpVk.Pipeline extendedHandle, SharpVk.ShaderStageFlags shaderStage, SharpVk.Amd.ShaderInfoType infoType) { try { byte[] result = default(byte[]); HostSize infoSize = default(HostSize); CommandCache commandCache = default(CommandCache); byte * marshalledInfo = default(byte *); commandCache = extendedHandle.commandCache; SharpVk.Interop.Amd.VkPipelineGetShaderInfoDelegate commandDelegate = commandCache.Cache.vkGetShaderInfoAMD; Result methodResult = commandDelegate(extendedHandle.parent.handle, extendedHandle.handle, shaderStage, infoType, &infoSize, marshalledInfo); if (SharpVkException.IsError(methodResult)) { throw SharpVkException.Create(methodResult); } marshalledInfo = (byte *)(Interop.HeapUtil.Allocate <byte>((uint)(infoSize))); commandDelegate(extendedHandle.parent.handle, extendedHandle.handle, shaderStage, infoType, &infoSize, marshalledInfo); if (marshalledInfo != null) { var fieldPointer = new byte[(uint)(infoSize)]; for (int index = 0; index < (uint)(infoSize); index++) { fieldPointer[index] = marshalledInfo[index]; } result = fieldPointer; } else { result = null; } return(result); } finally { Interop.HeapUtil.FreeAll(); } }
/// <summary> /// /// </summary> /// <param name="extendedHandle"> /// The Pipeline handle to extend. /// </param> public static unsafe byte[] GetRayTracingShaderGroupHandles(this SharpVk.Pipeline extendedHandle, uint firstGroup, uint groupCount, HostSize dataSize) { try { byte[] result = default(byte[]); CommandCache commandCache = default(CommandCache); HostSize marshalledDataSize = default(HostSize); byte * marshalledData = default(byte *); commandCache = extendedHandle.commandCache; marshalledDataSize = dataSize; marshalledData = (byte *)(Interop.HeapUtil.Allocate <byte>(dataSize)); SharpVk.Interop.NVidia.VkPipelineGetRayTracingShaderGroupHandlesDelegate commandDelegate = commandCache.Cache.vkGetRayTracingShaderGroupHandlesNV; Result methodResult = commandDelegate(extendedHandle.parent.handle, extendedHandle.handle, firstGroup, groupCount, marshalledDataSize, marshalledData); if (SharpVkException.IsError(methodResult)) { throw SharpVkException.Create(methodResult); } if (marshalledData != null) { var fieldPointer = new byte[(uint)(dataSize)]; for (int index = 0; index < (uint)(dataSize); index++) { fieldPointer[index] = marshalledData[index]; } result = fieldPointer; } else { result = null; } return(result); } 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> /// <param name="extendedHandle"> /// The Device handle to extend. /// </param> /// <param name="pipelineCache"> /// </param> /// <param name="createInfos"> /// </param> /// <param name="allocator"> /// </param> public static unsafe SharpVk.Pipeline[] CreateRayTracingPipelines(this SharpVk.Device extendedHandle, SharpVk.PipelineCache pipelineCache, ArrayProxy <SharpVk.NVidia.RayTracingPipelineCreateInfo>?createInfos, 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 *); SharpVk.Interop.AllocationCallbacks *marshalledAllocator = default(SharpVk.Interop.AllocationCallbacks *); SharpVk.Interop.Pipeline * marshalledPipelines = default(SharpVk.Interop.Pipeline *); commandCache = extendedHandle.commandCache; marshalledCreateInfoCount = (uint)(Interop.HeapUtil.GetLength(createInfos)); if (createInfos.IsNull()) { marshalledCreateInfos = null; } else { if (createInfos.Value.Contents == ProxyContents.Single) { marshalledCreateInfos = (SharpVk.Interop.NVidia.RayTracingPipelineCreateInfo *)(Interop.HeapUtil.Allocate <SharpVk.Interop.NVidia.RayTracingPipelineCreateInfo>()); createInfos.Value.GetSingleValue().MarshalTo(&*(SharpVk.Interop.NVidia.RayTracingPipelineCreateInfo *)(marshalledCreateInfos)); } else { var fieldPointer = (SharpVk.Interop.NVidia.RayTracingPipelineCreateInfo *)(Interop.HeapUtil.AllocateAndClear <SharpVk.Interop.NVidia.RayTracingPipelineCreateInfo>(Interop.HeapUtil.GetLength(createInfos.Value)).ToPointer()); for (int index = 0; index < (uint)(Interop.HeapUtil.GetLength(createInfos.Value)); index++) { createInfos.Value[index].MarshalTo(&fieldPointer[index]); } marshalledCreateInfos = fieldPointer; } } 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>(marshalledCreateInfoCount)); 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); } if (marshalledPipelines != null) { var fieldPointer = new SharpVk.Pipeline[(uint)(marshalledCreateInfoCount)]; for (int index = 0; index < (uint)(marshalledCreateInfoCount); index++) { fieldPointer[index] = new SharpVk.Pipeline(extendedHandle, marshalledPipelines[index]); } result = fieldPointer; } else { result = null; } return(result); } finally { Interop.HeapUtil.FreeAll(); } }