public void TearDown() { commandQ?.Dispose(); commandQ = null; commandBuffer?.Dispose(); commandBuffer = null; encoder?.EndEncoding(); encoder?.Dispose(); encoder = null; }
public void Draw(MTKView view) { // Create a new command buffer for each renderpass to the current drawable IMTLCommandBuffer commandBuffer = commandQueue.CommandBuffer(); // Compute commands IMTLComputeCommandEncoder computeCommandEncoder = commandBuffer.ComputeCommandEncoder; computeCommandEncoder.SetComputePipelineState(computePipelineState); computeCommandEncoder.SetBuffer(tessellationFactorsBuffer, 0, 2); computeCommandEncoder.DispatchThreadgroups(new MTLSize(1, 1, 1), new MTLSize(1, 1, 1)); computeCommandEncoder.EndEncoding(); // Render commands // Call the view's completion handler which is required by the view since it will signal its semaphore and set up the next buffer var drawable = view.CurrentDrawable; // Obtain a renderPassDescriptor generated from the view's drawable textures MTLRenderPassDescriptor renderPassDescriptor = view.CurrentRenderPassDescriptor; // Create a render command encoder so we can render into something IMTLRenderCommandEncoder renderCommandEncoder = commandBuffer.CreateRenderCommandEncoder(renderPassDescriptor); // Set context state renderCommandEncoder.SetTriangleFillMode(MTLTriangleFillMode.Lines); renderCommandEncoder.SetDepthStencilState(depthState); renderCommandEncoder.SetRenderPipelineState(renderPipelineState); renderCommandEncoder.SetVertexBuffer(controlPointsBuffer, 0, 0); renderCommandEncoder.SetTessellationFactorBuffer(tessellationFactorsBuffer, 0, 0); // Tell the render context we want to draw our primitives renderCommandEncoder.DrawPatches(3, 0, 1, null, 0, 1, 0); // We're done encoding commands renderCommandEncoder.EndEncoding(); // Schedule a present once the framebuffer is complete using the current drawable commandBuffer.PresentDrawable(drawable); // Finalize rendering here & push the command buffer to the GPU commandBuffer.Commit(); }