|
26 | 26 | } |
27 | 27 |
|
28 | 28 | Result CommandBufferMTL::Begin(const DescriptorPool* descriptorPool) { |
29 | | - |
| 29 | + [m_Handle computeCommandEncoderWithDescriptor: NULL]; |
30 | 30 | } |
31 | 31 | Result CommandBufferMTL::End() { |
| 32 | + m_ComputeEncoder = nil; |
| 33 | + m_RendererEncoder = nil; |
32 | 34 |
|
33 | 35 | } |
34 | 36 | void CommandBufferMTL::SetPipeline(const Pipeline& pipeline) { |
35 | 37 | if (m_CurrentPipeline == (PipelineMTL*)&pipeline) |
36 | 38 | return; |
37 | 39 | PipelineMTL& pipelineImpl = (PipelineMTL&)pipeline; |
38 | 40 | m_CurrentPipeline = &pipelineImpl; |
39 | | - |
| 41 | + |
| 42 | + switch(m_CurrentPipeline->m_pipelineType) { |
| 43 | + case nri::PipelineMTL::Compute: |
| 44 | + m_ComputeEncoder = [m_Handle computeCommandEncoderWithDescriptor: NULL]; |
| 45 | + break; |
| 46 | + default: |
| 47 | + break; |
| 48 | + } |
40 | 49 |
|
41 | 50 | } |
42 | 51 | void CommandBufferMTL::SetPipelineLayout(const PipelineLayout& pipelineLayout) {} |
|
45 | 54 | void CommandBufferMTL::SetDescriptorPool(const DescriptorPool& descriptorPool) {} |
46 | 55 | void CommandBufferMTL::Barrier(const BarrierGroupDesc& barrierGroupDesc) {} |
47 | 56 | void CommandBufferMTL::BeginRendering(const AttachmentsDesc& attachmentsDesc) { |
48 | | - m_encoder = [m_Handle renderCommandEncoderWithDescriptor: NULL]; |
| 57 | + m_RendererEncoder = [m_Handle renderCommandEncoderWithDescriptor: NULL]; |
49 | 58 | } |
50 | 59 | void CommandBufferMTL::EndRendering() { |
51 | | - [m_encoder endEncoding]; |
| 60 | + [m_RendererEncoder endEncoding]; |
| 61 | + m_RendererEncoder = nil; |
| 62 | + m_ComputeEncoder = nil; |
52 | 63 | } |
53 | 64 | void CommandBufferMTL::SetViewports(const Viewport* viewports, uint32_t viewportNum) {} |
54 | | -void CommandBufferMTL::SetScissors(const Rect* rects, uint32_t rectNum) {} |
55 | | -void CommandBufferMTL::SetDepthBounds(float boundsMin, float boundsMax) {} |
56 | | -void CommandBufferMTL::SetStencilReference(uint8_t frontRef, uint8_t backRef) {} |
57 | | -void CommandBufferMTL::SetSamplePositions(const SamplePosition* positions, Sample_t positionNum, Sample_t sampleNum) {} |
58 | | -void CommandBufferMTL::SetBlendConstants(const Color32f& color) {} |
59 | | -void CommandBufferMTL::SetShadingRate(const ShadingRateDesc& shadingRateDesc) {} |
60 | | -void CommandBufferMTL::ClearAttachments(const ClearDesc* clearDescs, uint32_t clearDescNum, const Rect* rects, uint32_t rectNum) {} |
| 65 | +void CommandBufferMTL::SetScissors(const Rect* rects, uint32_t rectNum) { |
| 66 | + NSCAssert(m_RendererEncoder, @"encoder set"); |
| 67 | + MTLScissorRect rect; |
| 68 | + rect.x = rects[rectNum].x; |
| 69 | + rect.y = rects[rectNum].y; |
| 70 | + rect.width = rects[rectNum].width; |
| 71 | + rect.height = rects[rectNum].height; |
| 72 | + [m_RendererEncoder setScissorRect:rect]; |
| 73 | +} |
| 74 | +void CommandBufferMTL::SetDepthBounds(float boundsMin, float boundsMax) { |
| 75 | +} |
| 76 | +void CommandBufferMTL::SetStencilReference(uint8_t frontRef, uint8_t backRef) { |
| 77 | + [m_RendererEncoder setStencilFrontReferenceValue: frontRef backReferenceValue:backRef]; |
| 78 | +} |
| 79 | +void CommandBufferMTL::SetSamplePositions(const SamplePosition* positions, Sample_t positionNum, Sample_t sampleNum) { |
| 80 | + |
| 81 | +} |
| 82 | +void CommandBufferMTL::SetBlendConstants(const Color32f& color) { |
| 83 | + [m_RendererEncoder |
| 84 | + setBlendColorRed:color.x |
| 85 | + green:color.y |
| 86 | + blue:color.z |
| 87 | + alpha:color.w |
| 88 | + ]; |
| 89 | +} |
| 90 | +void CommandBufferMTL::SetShadingRate(const ShadingRateDesc& shadingRateDesc) { |
| 91 | + |
| 92 | +} |
| 93 | + |
| 94 | +void CommandBufferMTL::ClearAttachments(const ClearDesc* clearDescs, uint32_t clearDescNum, const Rect* rects, uint32_t rectNum) { |
| 95 | +} |
| 96 | + |
61 | 97 | void CommandBufferMTL::SetIndexBuffer(const Buffer& buffer, uint64_t offset, IndexType indexType) { |
62 | 98 | m_CurrentIndexCmd.m_Buffer = &(BufferMTL&)buffer; |
63 | 99 | switch(indexType) { |
|
71 | 107 | } |
72 | 108 | m_CurrentIndexCmd.m_Offset = offset; |
73 | 109 | } |
| 110 | + |
74 | 111 | void CommandBufferMTL::SetVertexBuffers(uint32_t baseSlot, uint32_t bufferNum, const Buffer* const* buffers, const uint64_t* offsets) { |
| 112 | + for(size_t i = 0; i < bufferNum; i++) { |
| 113 | + BufferMTL* mtlBuffer = (BufferMTL*)buffers[i]; |
| 114 | + [m_RendererEncoder setVertexBuffer: mtlBuffer->GetHandle() |
| 115 | + offset: offsets[i] |
| 116 | + atIndex: i + baseSlot]; |
| 117 | + } |
75 | 118 |
|
76 | 119 | } |
| 120 | + |
77 | 121 | void CommandBufferMTL::Draw(const DrawDesc& drawDesc) { |
78 | | - [m_encoder drawPrimitives: m_CurrentPipeline->m_primitiveType |
| 122 | + [m_RendererEncoder drawPrimitives: m_CurrentPipeline->m_primitiveType |
79 | 123 | vertexStart:drawDesc.baseVertex |
80 | 124 | vertexCount:drawDesc.vertexNum |
81 | 125 | instanceCount:drawDesc.instanceNum |
82 | 126 | baseInstance:0]; |
83 | 127 | } |
| 128 | + |
84 | 129 | void CommandBufferMTL::DrawIndexed(const DrawIndexedDesc& drawIndexedDesc) { |
85 | 130 | id<MTLBuffer> indexBuffer = m_CurrentIndexCmd.m_Buffer->GetHandle(); |
86 | | - [m_encoder drawIndexedPrimitives: m_CurrentPipeline->m_primitiveType |
| 131 | + [m_RendererEncoder drawIndexedPrimitives: m_CurrentPipeline->m_primitiveType |
87 | 132 | indexCount:drawIndexedDesc.indexNum |
88 | 133 | indexType: m_CurrentIndexCmd.m_Type |
89 | 134 | indexBuffer: indexBuffer |
90 | 135 | indexBufferOffset: m_CurrentIndexCmd.m_Offset]; |
91 | 136 | } |
92 | 137 |
|
93 | 138 | void CommandBufferMTL::DrawIndirect(const Buffer& buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, const Buffer* countBuffer, uint64_t countBufferOffset) { |
| 139 | + // TODO: implement count Buffer |
94 | 140 | NSCAssert(!countBuffer, @"count buffer not supported"); |
95 | | - [m_encoder |
| 141 | + [m_RendererEncoder |
96 | 142 | drawPrimitives: m_CurrentPipeline->m_primitiveType |
97 | 143 | indirectBuffer:((BufferMTL&)buffer).GetHandle() |
98 | 144 | indirectBufferOffset: offset]; |
|
101 | 147 | void CommandBufferMTL::DrawIndexedIndirect(const Buffer& buffer, uint64_t offset, uint32_t drawNum, uint32_t stride, const Buffer* countBuffer, uint64_t countBufferOffset) { |
102 | 148 |
|
103 | 149 | } |
104 | | -void CommandBufferMTL::Dispatch(const DispatchDesc& dispatchDesc) {} |
| 150 | +void CommandBufferMTL::Dispatch(const DispatchDesc& dispatchDesc) { |
| 151 | + |
| 152 | +} |
105 | 153 | void CommandBufferMTL::DispatchIndirect(const Buffer& buffer, uint64_t offset) {} |
106 | 154 | void CommandBufferMTL::BeginQuery(const QueryPool& queryPool, uint32_t offset) {} |
107 | 155 | void CommandBufferMTL::EndQuery(const QueryPool& queryPool, uint32_t offset) {} |
|
124 | 172 | void CommandBufferMTL::DispatchRays(const DispatchRaysDesc& dispatchRaysDesc) {} |
125 | 173 | void CommandBufferMTL::DispatchRaysIndirect(const Buffer& buffer, uint64_t offset) {} |
126 | 174 | void CommandBufferMTL::DrawMeshTasks(const DrawMeshTasksDesc& drawMeshTasksDesc) {} |
127 | | -void CommandBufferMTL::DrawMeshTasksIndirect(const Buffer& buffer, uint64_t offset, uint32_t drawNum, uint32_t stride) {} |
| 175 | +void CommandBufferMTL::DrawMeshTasksIndirect(const Buffer& buffer, uint64_t offset, uint32_t drawNum, uint32_t stride) { |
| 176 | + |
| 177 | +} |
| 178 | + |
| 179 | +void Create(id<MTLCommandBuffer> cmd); |
| 180 | + |
| 181 | + |
128 | 182 |
|
129 | 183 | #include "CommandBufferMTL.hpp" |
130 | 184 |
|
0 commit comments