Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }