public void Set(params VkPipelineShaderStageCreateInfo[] value) { IntPtr ptr = (IntPtr)this.pointer; value.Set(ref ptr, ref this.count); this.pointer = (VkPipelineShaderStageCreateInfo *)ptr; }
public VkPipelineShaderStageCreateInfoGroup(params VkPipelineShaderStageCreateInfo[] value) { this.count = 0; this.pointer = null; if (value != null) { IntPtr ptr = IntPtr.Zero; value.Set(ref ptr, ref this.count); this.pointer = (VkPipelineShaderStageCreateInfo *)ptr; } }
private void CreateGraphicsPipeline() { byte[] vertShaderCode = File.ReadAllBytes("Shaders/vert.spv"); byte[] fragShaderCode = File.ReadAllBytes("Shaders/frag.spv"); VkShaderModule vertShaderModule = this.CreateShaderModule(vertShaderCode); VkShaderModule fragShaderModule = this.CreateShaderModule(fragShaderCode); VkPipelineShaderStageCreateInfo vertShaderStageInfo = new VkPipelineShaderStageCreateInfo() { sType = VkStructureType.VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, stage = VkShaderStageFlags.VK_SHADER_STAGE_VERTEX_BIT, module = vertShaderModule, pName = "main".ToPointer(), }; VkPipelineShaderStageCreateInfo fragShaderStageInfo = new VkPipelineShaderStageCreateInfo() { sType = VkStructureType.VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, stage = VkShaderStageFlags.VK_SHADER_STAGE_FRAGMENT_BIT, module = fragShaderModule, pName = "main".ToPointer(), }; VkPipelineShaderStageCreateInfo *shaderStages = stackalloc VkPipelineShaderStageCreateInfo[] { vertShaderStageInfo, fragShaderStageInfo }; // Vertex Input VkPipelineVertexInputStateCreateInfo vertexInputInfo = new VkPipelineVertexInputStateCreateInfo() { sType = VkStructureType.VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, vertexBindingDescriptionCount = 0, pVertexBindingDescriptions = null, // Optional vertexAttributeDescriptionCount = 0, pVertexAttributeDescriptions = null, // Optional }; // Input assembly VkPipelineInputAssemblyStateCreateInfo inputAssembly = new VkPipelineInputAssemblyStateCreateInfo() { sType = VkStructureType.VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, topology = VkPrimitiveTopology.VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, primitiveRestartEnable = false, }; // Viewports and scissors VkViewport viewport = new VkViewport() { x = 0.0f, y = 0.0f, width = (float)swapChainExtent.width, height = (float)swapChainExtent.height, minDepth = 0.0f, maxDepth = 1.0f, }; VkRect2D scissor = new VkRect2D() { offset = new VkOffset2D(0, 0), extent = swapChainExtent, }; VkPipelineViewportStateCreateInfo viewportState = new VkPipelineViewportStateCreateInfo() { sType = VkStructureType.VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, viewportCount = 1, pViewports = &viewport, scissorCount = 1, pScissors = &scissor, }; // Rasterizer VkPipelineRasterizationStateCreateInfo rasterizer = new VkPipelineRasterizationStateCreateInfo() { sType = VkStructureType.VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, depthClampEnable = false, rasterizerDiscardEnable = false, polygonMode = VkPolygonMode.VK_POLYGON_MODE_FILL, lineWidth = 1.0f, cullMode = VkCullModeFlags.VK_CULL_MODE_BACK_BIT, frontFace = VkFrontFace.VK_FRONT_FACE_CLOCKWISE, depthBiasEnable = false, depthBiasConstantFactor = 0.0f, // Optional depthBiasClamp = 0.0f, // Optional depthBiasSlopeFactor = 0.0f, // Optional }; VkPipelineMultisampleStateCreateInfo multisampling = new VkPipelineMultisampleStateCreateInfo() { sType = VkStructureType.VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, sampleShadingEnable = false, rasterizationSamples = VkSampleCountFlags.VK_SAMPLE_COUNT_1_BIT, minSampleShading = 1.0f, // Optional pSampleMask = null, // Optional alphaToCoverageEnable = false, // Optional alphaToOneEnable = false, // Optional }; // Depth and Stencil testing //VkPipelineDepthStencilStateCreateInfo // Color blending VkPipelineColorBlendAttachmentState colorBlendAttachment = new VkPipelineColorBlendAttachmentState() { colorWriteMask = VkColorComponentFlags.VK_COLOR_COMPONENT_R_BIT | VkColorComponentFlags.VK_COLOR_COMPONENT_G_BIT | VkColorComponentFlags.VK_COLOR_COMPONENT_B_BIT | VkColorComponentFlags.VK_COLOR_COMPONENT_A_BIT, blendEnable = false, srcColorBlendFactor = VkBlendFactor.VK_BLEND_FACTOR_ONE, // Optional dstColorBlendFactor = VkBlendFactor.VK_BLEND_FACTOR_ZERO, // Optional colorBlendOp = VkBlendOp.VK_BLEND_OP_ADD, // Optional srcAlphaBlendFactor = VkBlendFactor.VK_BLEND_FACTOR_ONE, // Optional dstAlphaBlendFactor = VkBlendFactor.VK_BLEND_FACTOR_ZERO, // Optional alphaBlendOp = VkBlendOp.VK_BLEND_OP_ADD, // Optional }; VkPipelineColorBlendStateCreateInfo colorBlending = new VkPipelineColorBlendStateCreateInfo() { sType = VkStructureType.VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, logicOpEnable = false, logicOp = VkLogicOp.VK_LOGIC_OP_COPY, // Optional attachmentCount = 1, pAttachments = &colorBlendAttachment, blendConstants_0 = 0.0f, // Optional blendConstants_1 = 0.0f, // Optional blendConstants_2 = 0.0f, // Optional blendConstants_3 = 0.0f, // Optional }; VkPipelineLayoutCreateInfo pipelineLayoutInfo = new VkPipelineLayoutCreateInfo() { sType = VkStructureType.VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, setLayoutCount = 0, // Optional pSetLayouts = null, // Optional pushConstantRangeCount = 0, // Optional pPushConstantRanges = null, // Optional }; fixed(VkPipelineLayout *pipelineLayoutPtr = &pipelineLayout) { Helpers.CheckErrors(VulkanNative.vkCreatePipelineLayout(device, &pipelineLayoutInfo, null, pipelineLayoutPtr)); } VkGraphicsPipelineCreateInfo pipelineInfo = new VkGraphicsPipelineCreateInfo() { sType = VkStructureType.VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, stageCount = 2, pStages = shaderStages, pVertexInputState = &vertexInputInfo, pInputAssemblyState = &inputAssembly, pViewportState = &viewportState, pRasterizationState = &rasterizer, pMultisampleState = &multisampling, pDepthStencilState = null, // Optional pColorBlendState = &colorBlending, pDynamicState = null, // Optional layout = this.pipelineLayout, renderPass = this.renderPass, subpass = 0, basePipelineHandle = 0, // Optional basePipelineIndex = -1, // Optional }; fixed(VkPipeline *graphicsPipelinePtr = &this.graphicsPipeline) { Helpers.CheckErrors(VulkanNative.vkCreateGraphicsPipelines(this.device, 0, 1, &pipelineInfo, null, graphicsPipelinePtr)); } VulkanNative.vkDestroyShaderModule(device, fragShaderModule, null); VulkanNative.vkDestroyShaderModule(device, vertShaderModule, null); }
public void CreateGraphicsPipeline(string[] fileShaders, Framebuffer framebuffer) { VkShaderModule vertexShader = NativeDevice.LoadSPIR_V_Shader(fileShaders[0], ShaderCompiler.ShaderCompiler.Stage.vertex_shader); VkShaderModule fragmentShader = NativeDevice.LoadSPIR_V_Shader(fileShaders[1], ShaderCompiler.ShaderCompiler.Stage.fragment_shader); VkPipelineShaderStageCreateInfo vertCreateInfo = new VkPipelineShaderStageCreateInfo() { sType = VkStructureType.PipelineShaderStageCreateInfo, pNext = null, stage = VkShaderStageFlags.Vertex, module = vertexShader, pName = Interop.String.ToPointer("main"), }; VkPipelineShaderStageCreateInfo fragCreateInfo = new VkPipelineShaderStageCreateInfo { sType = VkStructureType.PipelineShaderStageCreateInfo, pNext = null, flags = 0, stage = VkShaderStageFlags.Fragment, module = fragmentShader, pName = Interop.String.ToPointer("main"), }; VkPipelineShaderStageCreateInfo *shaderStageCreateInfos = stackalloc VkPipelineShaderStageCreateInfo[2]; shaderStageCreateInfos[0] = vertCreateInfo; shaderStageCreateInfos[1] = fragCreateInfo; VkPipelineVertexInputStateCreateInfo vertexInputStateCI = VkPipelineVertexInputStateCreateInfo.New(); //var vertexBindingDesc = Vertex.GetBindingDescription(); vertexInputStateCI.vertexBindingDescriptionCount = 0; //vertexInputStateCI.pVertexBindingDescriptions = Interop.Struct.AllocToPointer(ref vertexBindingDesc); vertexInputStateCI.vertexAttributeDescriptionCount = 0; //vertexInputStateCI.pVertexAttributeDescriptions = Interop.Struct.AllocToPointer(Vertex.GetAttributeDescriptions()); //vertexInputStateCI.pVertexAttributeDescriptions = Interop.Struct.AllocToPointer(Vertex.GetAttributeDescriptions().AsSpan()); VkPipelineInputAssemblyStateCreateInfo inputAssemblyCI = VkPipelineInputAssemblyStateCreateInfo.New(); inputAssemblyCI.primitiveRestartEnable = false; inputAssemblyCI.topology = VkPrimitiveTopology.TriangleList; VkPipelineRasterizationStateCreateInfo rasterizerStateCI = VkPipelineRasterizationStateCreateInfo.New(); rasterizerStateCI.cullMode = VkCullModeFlags.None; rasterizerStateCI.polygonMode = VkPolygonMode.Fill; rasterizerStateCI.lineWidth = 2.5f; rasterizerStateCI.frontFace = VkFrontFace.CounterClockwise; VkPipelineMultisampleStateCreateInfo multisampleStateCI = VkPipelineMultisampleStateCreateInfo.New(); multisampleStateCI.rasterizationSamples = VkSampleCountFlags.Count1; multisampleStateCI.minSampleShading = 1f; VkPipelineColorBlendAttachmentState colorBlendAttachementState = new VkPipelineColorBlendAttachmentState(); colorBlendAttachementState.colorWriteMask = VkColorComponentFlags.R | VkColorComponentFlags.G | VkColorComponentFlags.B | VkColorComponentFlags.A; colorBlendAttachementState.blendEnable = false; VkPipelineColorBlendStateCreateInfo colorBlendStateCI = VkPipelineColorBlendStateCreateInfo.New(); colorBlendStateCI.attachmentCount = 1; colorBlendStateCI.pAttachments = &colorBlendAttachementState; //VkDescriptorSetLayout dsl = _descriptoSetLayout; VkPipelineLayoutCreateInfo pipelineLayoutCI = VkPipelineLayoutCreateInfo.New(); pipelineLayoutCI.setLayoutCount = 0; //pipelineLayoutCI.pSetLayouts = &dsl; vkCreatePipelineLayout(NativeDevice.Device, ref pipelineLayoutCI, null, out pipelineLayout); VkGraphicsPipelineCreateInfo graphicsPipelineCI = VkGraphicsPipelineCreateInfo.New(); graphicsPipelineCI.stageCount = 2; graphicsPipelineCI.pStages = shaderStageCreateInfos; graphicsPipelineCI.pVertexInputState = &vertexInputStateCI; graphicsPipelineCI.pInputAssemblyState = &inputAssemblyCI; graphicsPipelineCI.pRasterizationState = &rasterizerStateCI; graphicsPipelineCI.pMultisampleState = &multisampleStateCI; graphicsPipelineCI.pColorBlendState = &colorBlendStateCI; graphicsPipelineCI.layout = pipelineLayout; graphicsPipelineCI.renderPass = framebuffer.NativeRenderPass; graphicsPipelineCI.subpass = 0; vkCreateGraphicsPipelines(NativeDevice.Device, VkPipelineCache.Null, 1, ref graphicsPipelineCI, null, out graphicsPipeline); }
private VkPipeline CreateGraphicsPipeline() { // Create shader modules. Shader modules are one of the objects required to create the // graphics pipeline. But after the pipeline is created, we don't need these shader // modules anymore, so we dispose them. VkShaderModule vertexShader = Content.LoadShader("Shader.vert.spv"); VkShaderModule fragmentShader = Content.LoadShader("Shader.frag.spv"); VkPipelineShaderStageCreateInfo *shaderStageCreateInfos = stackalloc VkPipelineShaderStageCreateInfo[2] { new VkPipelineShaderStageCreateInfo { sType = VkStructureType.PipelineShaderStageCreateInfo, pNext = null, stage = VkShaderStageFlags.Vertex, module = vertexShader, pName = Interop.String.ToPointer("main") }, new VkPipelineShaderStageCreateInfo { sType = VkStructureType.PipelineShaderStageCreateInfo, pNext = null, stage = VkShaderStageFlags.Fragment, module = fragmentShader, pName = Interop.String.ToPointer("main") } }; VkVertexInputBindingDescription vertexInputBindingDescription = new VkVertexInputBindingDescription { binding = 0, stride = (uint)Unsafe.SizeOf <Vertex>(), inputRate = VkVertexInputRate.Vertex }; VkVertexInputAttributeDescription *vertexInputAttributeDescription = stackalloc VkVertexInputAttributeDescription[3] { new VkVertexInputAttributeDescription { location = 0, binding = 0, format = VkFormat.R32G32B32A32SFloat, offset = 0 }, // Position. new VkVertexInputAttributeDescription { location = 1, binding = 0, format = VkFormat.R32G32B32SFloat, offset = 12 }, // Normal. new VkVertexInputAttributeDescription { location = 2, binding = 0, format = VkFormat.R32G32SFloat, offset = 24 }// TexCoord. }; var vertexInputStateCreateInfo = new VkPipelineVertexInputStateCreateInfo { sType = VkStructureType.PipelineVertexInputStateCreateInfo, pNext = null, vertexBindingDescriptionCount = 1, pVertexBindingDescriptions = &vertexInputBindingDescription, vertexAttributeDescriptionCount = 3, pVertexAttributeDescriptions = vertexInputAttributeDescription }; var inputAssemblyStateCreateInfo = new VkPipelineInputAssemblyStateCreateInfo { sType = VkStructureType.PipelineInputAssemblyStateCreateInfo, pNext = null, topology = VkPrimitiveTopology.TriangleList }; Viewport viewport = new Viewport(0, 0, Host.Width, Host.Height); Rectangle scissor = new Rectangle(0, 0, Host.Width, Host.Height); var viewportStateCreateInfo = new VkPipelineViewportStateCreateInfo { sType = VkStructureType.PipelineViewportStateCreateInfo, pNext = null, viewportCount = 1, pViewports = &viewport, scissorCount = 1, pScissors = &scissor }; var rasterizationStateCreateInfo = new VkPipelineRasterizationStateCreateInfo { sType = VkStructureType.PipelineRasterizationStateCreateInfo, polygonMode = VkPolygonMode.Fill, cullMode = VkCullModeFlags.Back, frontFace = VkFrontFace.CounterClockwise, lineWidth = 1.0f }; var multisampleStateCreateInfo = new VkPipelineMultisampleStateCreateInfo { sType = VkStructureType.PipelineMultisampleStateCreateInfo, rasterizationSamples = VkSampleCountFlags.Count1, minSampleShading = 1.0f }; var depthStencilStateCreateInfo = new VkPipelineDepthStencilStateCreateInfo { sType = VkStructureType.PipelineDepthStencilStateCreateInfo, depthTestEnable = true, depthWriteEnable = true, depthCompareOp = VkCompareOp.LessOrEqual, back = new VkStencilOpState { failOp = VkStencilOp.Keep, passOp = VkStencilOp.Keep, compareOp = VkCompareOp.Always }, front = new VkStencilOpState { failOp = VkStencilOp.Keep, passOp = VkStencilOp.Keep, compareOp = VkCompareOp.Always } }; var colorBlendAttachmentState = new VkPipelineColorBlendAttachmentState { srcColorBlendFactor = VkBlendFactor.One, dstColorBlendFactor = VkBlendFactor.Zero, colorBlendOp = VkBlendOp.Add, srcAlphaBlendFactor = VkBlendFactor.One, dstAlphaBlendFactor = VkBlendFactor.Zero, alphaBlendOp = VkBlendOp.Add, colorWriteMask = VkColorComponentFlags.All }; var colorBlendStateCreateInfo = new VkPipelineColorBlendStateCreateInfo { sType = VkStructureType.PipelineColorBlendStateCreateInfo, pNext = null, attachmentCount = 1, pAttachments = &colorBlendAttachmentState }; var pipelineCreateInfo = new VkGraphicsPipelineCreateInfo { sType = VkStructureType.GraphicsPipelineCreateInfo, pNext = null, layout = _pipelineLayout, renderPass = _renderPass, subpass = (uint)0, stageCount = 2, pStages = shaderStageCreateInfos, pInputAssemblyState = &inputAssemblyStateCreateInfo, pVertexInputState = &vertexInputStateCreateInfo, pRasterizationState = &rasterizationStateCreateInfo, pMultisampleState = &multisampleStateCreateInfo, pColorBlendState = &colorBlendStateCreateInfo, pDepthStencilState = &depthStencilStateCreateInfo, pViewportState = &viewportStateCreateInfo }; VkPipeline pipeline; VkResult result = vkCreateGraphicsPipelines(Context.Device, VkPipelineCache.Null, 1, &pipelineCreateInfo, null, &pipeline); result.CheckResult(); return(pipeline); } } }