private unsafe VkPipelineShaderStageCreateInfo[] CreateShaderStages(PipelineStateDescription pipelineStateDescription, out Dictionary <int, string> inputAttributeNames) { var stages = pipelineStateDescription.EffectBytecode.Stages; var nativeStages = new VkPipelineShaderStageCreateInfo[stages.Length]; inputAttributeNames = null; for (int i = 0; i < stages.Length; i++) { var shaderBytecode = BinarySerialization.Read <ShaderInputBytecode>(stages[i].Data); if (stages[i].Stage == ShaderStage.Vertex) inputAttributeNames = shaderBytecode.InputAttributeNames; fixed(byte *entryPointPointer = &defaultEntryPoint[0]) { // Create stage nativeStages[i] = new VkPipelineShaderStageCreateInfo { sType = VkStructureType.PipelineShaderStageCreateInfo, stage = VulkanConvertExtensions.Convert(stages[i].Stage), pName = entryPointPointer, }; vkCreateShaderModule(GraphicsDevice.NativeDevice, shaderBytecode.Data, null, out nativeStages[i].module); } } ; return(nativeStages); }
private unsafe PipelineShaderStageCreateInfo[] CreateShaderStages(PipelineStateDescription pipelineStateDescription, out Dictionary <int, string> inputAttributeNames) { var stages = pipelineStateDescription.EffectBytecode.Stages; var nativeStages = new PipelineShaderStageCreateInfo[stages.Length]; inputAttributeNames = null; // GLSL converter always outputs entry point main() var entryPoint = Encoding.UTF8.GetBytes("main\0"); for (int i = 0; i < stages.Length; i++) { var shaderBytecode = BinarySerialization.Read <ShaderInputBytecode>(stages[i].Data); if (stages[i].Stage == ShaderStage.Vertex) inputAttributeNames = shaderBytecode.InputAttributeNames; fixed(byte *entryPointPointer = &entryPoint[0]) fixed(byte *codePointer = &shaderBytecode.Data[0]) { // Create shader module var moduleCreateInfo = new ShaderModuleCreateInfo { StructureType = StructureType.ShaderModuleCreateInfo, Code = new IntPtr(codePointer), CodeSize = shaderBytecode.Data.Length }; // Create stage nativeStages[i] = new PipelineShaderStageCreateInfo { StructureType = StructureType.PipelineShaderStageCreateInfo, Stage = VulkanConvertExtensions.Convert(stages[i].Stage), Name = new IntPtr(entryPointPointer), Module = GraphicsDevice.NativeDevice.CreateShaderModule(ref moduleCreateInfo) }; } } ; return(nativeStages); }