public override Pipeline CreatePipeline(ref PipelineDescription description) { Pipeline pipeline = Factory.CreatePipeline(ref description); DisposeCollector.Add(pipeline); return(pipeline); }
public D3D11Pipeline(D3D11ResourceCache cache, ref PipelineDescription description) { BlendState = cache.GetBlendState(ref description.BlendState); DepthStencilState = cache.GetDepthStencilState(ref description.DepthStencilState); RasterizerState = cache.GetRasterizerState(ref description.RasterizerState); PrimitiveTopology = D3D11Formats.VdToD3D11PrimitiveTopology(description.PrimitiveTopology); byte[] vsBytecode = null; ShaderStageDescription[] stages = description.ShaderSet.ShaderStages; for (int i = 0; i < description.ShaderSet.ShaderStages.Length; i++) { if (stages[i].Stage == ShaderStages.Vertex) { D3D11Shader d3d11VertexShader = ((D3D11Shader)stages[i].Shader); VertexShader = (VertexShader)d3d11VertexShader.DeviceShader; vsBytecode = d3d11VertexShader.Bytecode; } if (stages[i].Stage == ShaderStages.Geometry) { GeometryShader = (GeometryShader)((D3D11Shader)stages[i].Shader).DeviceShader; } if (stages[i].Stage == ShaderStages.TessellationControl) { HullShader = (HullShader)((D3D11Shader)stages[i].Shader).DeviceShader; } if (stages[i].Stage == ShaderStages.TessellationEvaluation) { DomainShader = (DomainShader)((D3D11Shader)stages[i].Shader).DeviceShader; } if (stages[i].Stage == ShaderStages.Fragment) { PixelShader = (PixelShader)((D3D11Shader)stages[i].Shader).DeviceShader; } } ResourceLayout[] genericLayouts = description.ResourceLayouts; ResourceLayouts = new D3D11ResourceLayout[genericLayouts.Length]; for (int i = 0; i < ResourceLayouts.Length; i++) { ResourceLayouts[i] = Util.AssertSubtype <ResourceLayout, D3D11ResourceLayout>(genericLayouts[i]); } Debug.Assert(vsBytecode != null); InputLayout = cache.GetInputLayout(description.ShaderSet.VertexLayouts, vsBytecode); int numVertexBuffers = description.ShaderSet.VertexLayouts.Length; VertexStrides = new int[numVertexBuffers]; for (int i = 0; i < numVertexBuffers; i++) { VertexStrides[i] = (int)description.ShaderSet.VertexLayouts[i].Stride; } }
public OpenGLPipeline(OpenGLGraphicsDevice gd, ref PipelineDescription description) { _gd = gd; Description = description; int numVertexBuffers = description.ShaderSet.VertexLayouts.Length; VertexStrides = new int[numVertexBuffers]; for (int i = 0; i < numVertexBuffers; i++) { VertexStrides[i] = (int)description.ShaderSet.VertexLayouts[i].Stride; } }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest httpRequest, ILogger logger) { logger.LogInformation("ValidatePipeline Function triggered by HTTP request."); logger.LogInformation("Parsing body from request."); PipelineRequest request = await new BodyReader(httpRequest).GetRequestBodyAsync(); request.Validate(logger); using (var service = PipelineService.GetServiceForRequest(request, logger)) { PipelineDescription result = service.ValidatePipeline(request); logger.LogInformation("ValidatePipeline Function complete."); return(new OkObjectResult(JsonConvert.SerializeObject(result))); } }
public unsafe override void CreateDeviceObjects(GraphicsDevice gd, CommandList cl, SceneContext sc) { ResourceFactory factory = gd.ResourceFactory; _vb = factory.CreateVertexBuffer(new BufferDescription(s_vertices.SizeInBytes())); cl.UpdateBuffer(_vb, 0, s_vertices); _ib = factory.CreateIndexBuffer(new IndexBufferDescription(s_indices.SizeInBytes(), IndexFormat.UInt16)); cl.UpdateBuffer(_ib, 0, s_indices); _viewMatrixBuffer = factory.CreateUniformBuffer(new BufferDescription((ulong)Unsafe.SizeOf <Matrix4x4>())); Texture textureCube; TextureView textureView; fixed(Rgba32 *frontPin = &_front.DangerousGetPinnableReferenceToPixelBuffer()) fixed(Rgba32 * backPin = &_back.DangerousGetPinnableReferenceToPixelBuffer()) fixed(Rgba32 * leftPin = &_left.DangerousGetPinnableReferenceToPixelBuffer()) fixed(Rgba32 * rightPin = &_right.DangerousGetPinnableReferenceToPixelBuffer()) fixed(Rgba32 * topPin = &_top.DangerousGetPinnableReferenceToPixelBuffer()) fixed(Rgba32 * bottomPin = &_bottom.DangerousGetPinnableReferenceToPixelBuffer()) { uint width = (uint)_front.Width; uint height = (uint)_front.Height; textureCube = factory.CreateTexture(new TextureDescription( width, height, 1, 1, 1, PixelFormat.R8_G8_B8_A8_UNorm, TextureUsage.Sampled | TextureUsage.Cubemap)); uint faceSize = (uint)(_front.Width * _front.Height * Unsafe.SizeOf <Rgba32>()); cl.UpdateTextureCube(textureCube, (IntPtr)leftPin, faceSize, CubeFace.NegativeX, 0, 0, width, height, 0, 0); cl.UpdateTextureCube(textureCube, (IntPtr)rightPin, faceSize, CubeFace.PositiveX, 0, 0, width, height, 0, 0); cl.UpdateTextureCube(textureCube, (IntPtr)bottomPin, faceSize, CubeFace.NegativeY, 0, 0, width, height, 0, 0); cl.UpdateTextureCube(textureCube, (IntPtr)topPin, faceSize, CubeFace.PositiveY, 0, 0, width, height, 0, 0); cl.UpdateTextureCube(textureCube, (IntPtr)backPin, faceSize, CubeFace.NegativeZ, 0, 0, width, height, 0, 0); cl.UpdateTextureCube(textureCube, (IntPtr)frontPin, faceSize, CubeFace.PositiveZ, 0, 0, width, height, 0, 0); textureView = factory.CreateTextureView(new TextureViewDescription(textureCube)); } VertexLayoutDescription[] vertexLayouts = new VertexLayoutDescription[] { new VertexLayoutDescription( new VertexElementDescription("Position", VertexElementSemantic.Position, VertexElementFormat.Float3)) }; Shader vs = ShaderHelper.LoadShader(factory, "Skybox", ShaderStages.Vertex); Shader fs = ShaderHelper.LoadShader(factory, "Skybox", ShaderStages.Fragment); ShaderStageDescription[] shaderStages = new ShaderStageDescription[] { new ShaderStageDescription(ShaderStages.Vertex, vs, "VS"), new ShaderStageDescription(ShaderStages.Fragment, fs, "VS"), }; _layout = factory.CreateResourceLayout(new ResourceLayoutDescription( new ResourceLayoutElementDescription("Projection", ResourceKind.Uniform, ShaderStages.Vertex), new ResourceLayoutElementDescription("View", ResourceKind.Uniform, ShaderStages.Vertex), new ResourceLayoutElementDescription("CubeTexture", ResourceKind.Texture, ShaderStages.Fragment), new ResourceLayoutElementDescription("CubeSampler", ResourceKind.Sampler, ShaderStages.Fragment))); PipelineDescription pd = new PipelineDescription( BlendStateDescription.SingleAlphaBlend, DepthStencilStateDescription.LessEqual, new RasterizerStateDescription(FaceCullMode.None, TriangleFillMode.Solid, FrontFace.Clockwise, false, true), PrimitiveTopology.TriangleList, new ShaderSetDescription(vertexLayouts, shaderStages), new ResourceLayout[] { _layout }, gd.SwapchainFramebuffer.OutputDescription); _pipeline = factory.CreatePipeline(ref pd); _resourceSet = factory.CreateResourceSet(new ResourceSetDescription( _layout, sc.ProjectionMatrixBuffer, _viewMatrixBuffer, textureView, gd.PointSampler)); _disposeCollector.Add(_vb, _ib, _viewMatrixBuffer, textureCube, textureView, _layout, _pipeline, _resourceSet, vs, fs); }
public unsafe override void CreateDeviceObjects(GraphicsDevice gd, CommandList cl, SceneContext sc) { ResourceFactory factory = gd.ResourceFactory; _vb = factory.CreateVertexBuffer(new BufferDescription(VertexPosition.SizeInBytes * 4)); cl.UpdateBuffer(_vb, 0, new VertexPosition[] { new VertexPosition(new Vector3(-1000, 0, -1000)), new VertexPosition(new Vector3(+1000, 0, -1000)), new VertexPosition(new Vector3(+1000, 0, +1000)), new VertexPosition(new Vector3(-1000, 0, +1000)), }); _ib = factory.CreateIndexBuffer(new IndexBufferDescription(6 * 2, IndexFormat.UInt16)); cl.UpdateBuffer(_ib, 0, new ushort[] { 0, 1, 2, 0, 2, 3 }); const int gridSize = 64; RgbaByte borderColor = new RgbaByte(255, 255, 255, 150); RgbaByte[] pixels = CreateGridTexturePixels(gridSize, 1, borderColor, new RgbaByte()); Texture gridTexture = factory.CreateTexture(new TextureDescription(gridSize, gridSize, 1, 1, 1, PixelFormat.R8_G8_B8_A8_UNorm, TextureUsage.Sampled)); fixed(RgbaByte *pixelsPtr = pixels) { cl.UpdateTexture(gridTexture, (IntPtr)pixelsPtr, pixels.SizeInBytes(), 0, 0, 0, gridSize, gridSize, 1, 0, 0); } TextureView textureView = factory.CreateTextureView(new TextureViewDescription(gridTexture)); VertexLayoutDescription[] vertexLayouts = new VertexLayoutDescription[] { new VertexLayoutDescription( new VertexElementDescription("Position", VertexElementSemantic.Position, VertexElementFormat.Float3)) }; Shader gridVS = ShaderHelper.LoadShader(factory, "Grid", ShaderStages.Vertex); Shader gridFS = ShaderHelper.LoadShader(factory, "Grid", ShaderStages.Fragment); ShaderStageDescription[] shaderStages = new ShaderStageDescription[] { new ShaderStageDescription(ShaderStages.Vertex, gridVS, "VS"), new ShaderStageDescription(ShaderStages.Fragment, gridFS, "FS"), }; ResourceLayout layout = factory.CreateResourceLayout(new ResourceLayoutDescription( new ResourceLayoutElementDescription("Projection", ResourceKind.Uniform, ShaderStages.Vertex), new ResourceLayoutElementDescription("View", ResourceKind.Uniform, ShaderStages.Vertex), new ResourceLayoutElementDescription("GridTexture", ResourceKind.Texture, ShaderStages.Fragment), new ResourceLayoutElementDescription("GridSampler", ResourceKind.Sampler, ShaderStages.Fragment))); PipelineDescription pd = new PipelineDescription( BlendStateDescription.SingleAlphaBlend, DepthStencilStateDescription.LessEqual, new RasterizerStateDescription(FaceCullMode.None, TriangleFillMode.Solid, FrontFace.Clockwise, true, true), PrimitiveTopology.TriangleList, new ShaderSetDescription(vertexLayouts, shaderStages), new ResourceLayout[] { layout }, gd.SwapchainFramebuffer.OutputDescription); _pipeline = factory.CreatePipeline(ref pd); _resourceSet = factory.CreateResourceSet(new ResourceSetDescription( layout, sc.ProjectionMatrixBuffer, sc.ViewMatrixBuffer, textureView, gd.PointSampler)); _disposeCollector.Add(_vb, _ib, gridTexture, textureView, gridVS, gridFS, layout, _pipeline, _resourceSet); }
public abstract Pipeline CreatePipeline(ref PipelineDescription description);
public Pipeline CreatePipeline(PipelineDescription description) => CreatePipeline(ref description);
public VkPipeline(VkGraphicsDevice gd, ref PipelineDescription description) { _gd = gd; VkGraphicsPipelineCreateInfo pipelineCI = VkGraphicsPipelineCreateInfo.New(); // Blend State VkPipelineColorBlendStateCreateInfo blendStateCI = VkPipelineColorBlendStateCreateInfo.New(); int attachmentsCount = description.BlendState.AttachmentStates.Length; VkPipelineColorBlendAttachmentState *attachmentsPtr = stackalloc VkPipelineColorBlendAttachmentState[attachmentsCount]; for (int i = 0; i < attachmentsCount; i++) { BlendAttachmentDescription vdDesc = description.BlendState.AttachmentStates[i]; VkPipelineColorBlendAttachmentState attachmentState = new VkPipelineColorBlendAttachmentState(); attachmentState.srcColorBlendFactor = VkFormats.VdToVkBlendFactor(vdDesc.SourceColorFactor); attachmentState.dstColorBlendFactor = VkFormats.VdToVkBlendFactor(vdDesc.DestinationColorFactor); attachmentState.colorBlendOp = VkFormats.VdToVkBlendOp(vdDesc.ColorFunction); attachmentState.srcAlphaBlendFactor = VkFormats.VdToVkBlendFactor(vdDesc.SourceAlphaFactor); attachmentState.dstAlphaBlendFactor = VkFormats.VdToVkBlendFactor(vdDesc.DestinationAlphaFactor); attachmentState.alphaBlendOp = VkFormats.VdToVkBlendOp(vdDesc.AlphaFunction); attachmentState.blendEnable = vdDesc.BlendEnabled; attachmentState.colorWriteMask = VkColorComponentFlags.R | VkColorComponentFlags.G | VkColorComponentFlags.B | VkColorComponentFlags.A; attachmentsPtr[i] = attachmentState; } blendStateCI.attachmentCount = (uint)attachmentsCount; blendStateCI.pAttachments = attachmentsPtr; RgbaFloat blendFactor = description.BlendState.BlendFactor; blendStateCI.blendConstants_0 = blendFactor.R; blendStateCI.blendConstants_1 = blendFactor.G; blendStateCI.blendConstants_2 = blendFactor.B; blendStateCI.blendConstants_3 = blendFactor.A; pipelineCI.pColorBlendState = &blendStateCI; // Rasterizer State RasterizerStateDescription rsDesc = description.RasterizerState; VkPipelineRasterizationStateCreateInfo rsCI = VkPipelineRasterizationStateCreateInfo.New(); rsCI.cullMode = VkFormats.VdToVkCullMode(rsDesc.CullMode); rsCI.polygonMode = VkFormats.VdToVkPolygonMode(rsDesc.FillMode); rsCI.depthClampEnable = !rsDesc.DepthClipEnabled; rsCI.frontFace = VkFrontFace.Clockwise; rsCI.lineWidth = 1f; pipelineCI.pRasterizationState = &rsCI; // Dynamic State VkPipelineDynamicStateCreateInfo dynamicStateCI = VkPipelineDynamicStateCreateInfo.New(); VkDynamicState *dynamicStates = stackalloc VkDynamicState[2]; dynamicStates[0] = VkDynamicState.Viewport; dynamicStates[1] = VkDynamicState.Scissor; dynamicStateCI.dynamicStateCount = 2; dynamicStateCI.pDynamicStates = dynamicStates; pipelineCI.pDynamicState = &dynamicStateCI; // Depth Stencil State DepthStencilStateDescription vdDssDesc = description.DepthStencilState; VkPipelineDepthStencilStateCreateInfo dssCI = VkPipelineDepthStencilStateCreateInfo.New(); dssCI.depthWriteEnable = vdDssDesc.DepthWriteEnabled; dssCI.depthTestEnable = vdDssDesc.DepthTestEnabled; dssCI.depthCompareOp = VkFormats.VdToVkCompareOp(vdDssDesc.ComparisonKind); pipelineCI.pDepthStencilState = &dssCI; // Multisample VkPipelineMultisampleStateCreateInfo multisampleCI = VkPipelineMultisampleStateCreateInfo.New(); multisampleCI.rasterizationSamples = VkSampleCountFlags.Count1; pipelineCI.pMultisampleState = &multisampleCI; // Input Assembly VkPipelineInputAssemblyStateCreateInfo inputAssemblyCI = VkPipelineInputAssemblyStateCreateInfo.New(); inputAssemblyCI.topology = VkFormats.VdToVkPrimitiveTopology(description.PrimitiveTopology); pipelineCI.pInputAssemblyState = &inputAssemblyCI; // Vertex Input State VkPipelineVertexInputStateCreateInfo vertexInputCI = VkPipelineVertexInputStateCreateInfo.New(); VertexLayoutDescription[] inputDescriptions = description.ShaderSet.VertexLayouts; uint bindingCount = (uint)inputDescriptions.Length; uint attributeCount = 0; for (int i = 0; i < inputDescriptions.Length; i++) { attributeCount += (uint)inputDescriptions[i].Elements.Length; } VkVertexInputBindingDescription * bindingDescs = stackalloc VkVertexInputBindingDescription[(int)bindingCount]; VkVertexInputAttributeDescription *attributeDescs = stackalloc VkVertexInputAttributeDescription[(int)attributeCount]; int targetIndex = 0; int targetLocation = 0; for (int binding = 0; binding < inputDescriptions.Length; binding++) { VertexLayoutDescription inputDesc = inputDescriptions[binding]; bindingDescs[targetIndex] = new VkVertexInputBindingDescription() { binding = (uint)binding, inputRate = (inputDesc.Elements[0].InstanceStepRate != 0) ? VkVertexInputRate.Instance : VkVertexInputRate.Vertex, stride = inputDesc.Stride }; uint currentOffset = 0; for (int location = 0; location < inputDesc.Elements.Length; location++) { VertexElementDescription inputElement = inputDesc.Elements[location]; attributeDescs[targetIndex] = new VkVertexInputAttributeDescription() { format = VkFormats.VdToVkVertexElementFormat(inputElement.Format), binding = (uint)binding, location = (uint)(targetLocation + location), offset = currentOffset }; targetIndex += 1; currentOffset += FormatHelpers.GetSizeInBytes(inputElement.Format); } targetLocation += inputDesc.Elements.Length; } vertexInputCI.vertexBindingDescriptionCount = bindingCount; vertexInputCI.pVertexBindingDescriptions = bindingDescs; vertexInputCI.vertexAttributeDescriptionCount = attributeCount; vertexInputCI.pVertexAttributeDescriptions = attributeDescs; pipelineCI.pVertexInputState = &vertexInputCI; // Shader Stage ShaderStageDescription[] stageDescs = description.ShaderSet.ShaderStages; StackList <VkPipelineShaderStageCreateInfo> stages = new StackList <VkPipelineShaderStageCreateInfo>(); foreach (ShaderStageDescription stageDesc in stageDescs) { VkShader vkShader = Util.AssertSubtype <Shader, VkShader>(stageDesc.Shader); VkPipelineShaderStageCreateInfo stageCI = VkPipelineShaderStageCreateInfo.New(); stageCI.module = vkShader.ShaderModule; stageCI.stage = VkFormats.VdToVkShaderStages(stageDesc.Stage); stageCI.pName = CommonStrings.main; // Meh stages.Add(stageCI); } pipelineCI.stageCount = stages.Count; pipelineCI.pStages = (VkPipelineShaderStageCreateInfo *)stages.Data; // ViewportState VkPipelineViewportStateCreateInfo viewportStateCI = VkPipelineViewportStateCreateInfo.New(); viewportStateCI.viewportCount = 1; viewportStateCI.scissorCount = 1; pipelineCI.pViewportState = &viewportStateCI; // Pipeline Layout ResourceLayout[] resourceLayouts = description.ResourceLayouts; VkPipelineLayoutCreateInfo pipelineLayoutCI = VkPipelineLayoutCreateInfo.New(); pipelineLayoutCI.setLayoutCount = (uint)resourceLayouts.Length; VkDescriptorSetLayout *dsls = stackalloc VkDescriptorSetLayout[resourceLayouts.Length]; for (int i = 0; i < resourceLayouts.Length; i++) { dsls[i] = Util.AssertSubtype <ResourceLayout, VkResourceLayout>(resourceLayouts[i]).DescriptorSetLayout; } pipelineLayoutCI.pSetLayouts = dsls; vkCreatePipelineLayout(_gd.Device, ref pipelineLayoutCI, null, out _pipelineLayout); pipelineCI.layout = _pipelineLayout; // Create fake RenderPass for compatibility. VkRenderPassCreateInfo renderPassCI = VkRenderPassCreateInfo.New(); OutputDescription outputDesc = description.Outputs; if (outputDesc.ColorAttachments.Length > 1) { throw new NotImplementedException("Laziness"); } VkAttachmentDescription colorAttachmentDesc = new VkAttachmentDescription(); colorAttachmentDesc.format = outputDesc.ColorAttachments.Length > 0 ? VkFormats.VdToVkPixelFormat(outputDesc.ColorAttachments[0].Format) : 0; colorAttachmentDesc.samples = VkSampleCountFlags.Count1; colorAttachmentDesc.loadOp = VkAttachmentLoadOp.Clear; colorAttachmentDesc.storeOp = VkAttachmentStoreOp.Store; colorAttachmentDesc.stencilLoadOp = VkAttachmentLoadOp.DontCare; colorAttachmentDesc.stencilStoreOp = VkAttachmentStoreOp.DontCare; colorAttachmentDesc.initialLayout = VkImageLayout.Undefined; colorAttachmentDesc.finalLayout = VkImageLayout.PresentSrcKHR; VkAttachmentReference colorAttachmentRef = new VkAttachmentReference(); colorAttachmentRef.attachment = 0; colorAttachmentRef.layout = VkImageLayout.ColorAttachmentOptimal; VkAttachmentDescription depthAttachmentDesc = new VkAttachmentDescription(); VkAttachmentReference depthAttachmentRef = new VkAttachmentReference(); if (outputDesc.DepthAttachment != null) { depthAttachmentDesc.format = VkFormats.VdToVkPixelFormat(outputDesc.DepthAttachment.Value.Format, toDepthFormat: true); depthAttachmentDesc.samples = VkSampleCountFlags.Count1; depthAttachmentDesc.loadOp = VkAttachmentLoadOp.Clear; depthAttachmentDesc.storeOp = VkAttachmentStoreOp.Store; depthAttachmentDesc.stencilLoadOp = VkAttachmentLoadOp.DontCare; depthAttachmentDesc.stencilStoreOp = VkAttachmentStoreOp.DontCare; depthAttachmentDesc.initialLayout = VkImageLayout.Undefined; depthAttachmentDesc.finalLayout = VkImageLayout.DepthStencilAttachmentOptimal; depthAttachmentRef.attachment = outputDesc.ColorAttachments.Length == 0 ? 0u : 1u; depthAttachmentRef.layout = VkImageLayout.DepthStencilAttachmentOptimal; } VkSubpassDescription subpass = new VkSubpassDescription(); StackList <VkAttachmentDescription, Size512Bytes> attachments = new StackList <VkAttachmentDescription, Size512Bytes>(); subpass.pipelineBindPoint = VkPipelineBindPoint.Graphics; if (outputDesc.ColorAttachments.Length > 0) { subpass.colorAttachmentCount = 1; subpass.pColorAttachments = &colorAttachmentRef; attachments.Add(colorAttachmentDesc); } if (outputDesc.DepthAttachment != null) { subpass.pDepthStencilAttachment = &depthAttachmentRef; attachments.Add(depthAttachmentDesc); } VkSubpassDependency subpassDependency = new VkSubpassDependency(); subpassDependency.srcSubpass = SubpassExternal; subpassDependency.srcStageMask = VkPipelineStageFlags.ColorAttachmentOutput; subpassDependency.dstStageMask = VkPipelineStageFlags.ColorAttachmentOutput; subpassDependency.dstAccessMask = VkAccessFlags.ColorAttachmentRead | VkAccessFlags.ColorAttachmentWrite; if (outputDesc.DepthAttachment != null) { subpassDependency.dstAccessMask |= VkAccessFlags.DepthStencilAttachmentRead | VkAccessFlags.DepthStencilAttachmentWrite; } renderPassCI.attachmentCount = attachments.Count; renderPassCI.pAttachments = (VkAttachmentDescription *)attachments.Data; renderPassCI.subpassCount = 1; renderPassCI.pSubpasses = &subpass; renderPassCI.dependencyCount = 1; renderPassCI.pDependencies = &subpassDependency; VkResult creationResult = vkCreateRenderPass(_gd.Device, ref renderPassCI, null, out _renderPass); CheckResult(creationResult); pipelineCI.renderPass = _renderPass; VkResult result = vkCreateGraphicsPipelines(_gd.Device, VkPipelineCache.Null, 1, ref pipelineCI, null, out _devicePipeline); CheckResult(result); ResourceSetCount = (uint)description.ResourceLayouts.Length; }
public override Pipeline CreatePipeline(ref PipelineDescription description) { return(new OpenGLPipeline(_gd, ref description)); }
// Validation against pipelines internal string?CheckCompatiblity(PipelineDescription desc, Renderer renderer, uint subpassIndex) { ref readonly var subpass = ref renderer.Layout.Subpasses[subpassIndex];
public override Pipeline CreatePipeline(ref PipelineDescription description) { return(new D3D11Pipeline(_cache, ref description)); }