Example #1
0
 /// <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();
     }
 }
Example #2
0
 /// <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();
     }
 }