25 id<MTLCommandBuffer> commandBuffer,
26 MTLRenderPassDescriptor* descriptor) {
31 sk_cfp<id<MTLRenderCommandEncoder>>
encoder =
32 sk_ret_cfp([commandBuffer renderCommandEncoderWithDescriptor:descriptor]);
38 const char*
getResourceType()
const override {
return "Metal Render Command Encoder"; }
55 if (fCurrentRenderPipelineState != pso) {
57 fCurrentRenderPipelineState = pso;
62 if (fCurrentTriangleFillMode != fillMode) {
64 fCurrentTriangleFillMode = fillMode;
78 SkASSERT(index < kMaxExpectedBuffers);
79 if (@available(macOS 10.11, iOS 8.3, tvOS 9.0, *)) {
80 if (fCurrentVertexBuffer[index] ==
buffer) {
85 if (fCurrentVertexBuffer[index] !=
buffer || fCurrentVertexOffset[index] !=
offset) {
89 fCurrentVertexBuffer[index] =
buffer;
90 fCurrentVertexOffset[index] =
offset;
95 SkASSERT(index < kMaxExpectedBuffers);
96 if (fCurrentVertexOffset[index] !=
offset) {
99 fCurrentVertexOffset[index] =
offset;
105 SkASSERT(index < kMaxExpectedBuffers);
106 if (@available(macOS 10.11, iOS 8.3, tvOS 9.0, *)) {
107 if (fCurrentFragmentBuffer[index] ==
buffer) {
112 if (fCurrentFragmentBuffer[index] !=
buffer || fCurrentFragmentOffset[index] !=
offset) {
116 fCurrentFragmentBuffer[index] =
buffer;
117 fCurrentFragmentOffset[index] =
offset;
122 SkASSERT(index < kMaxExpectedBuffers);
123 if (fCurrentFragmentOffset[index] !=
offset) {
126 fCurrentFragmentOffset[index] =
offset;
144 SkASSERT(index < kMaxExpectedTextures);
145 if (fCurrentTexture[index] !=
texture) {
148 fCurrentTexture[index] =
texture;
152 SkASSERT(index < kMaxExpectedTextures);
153 if (fCurrentSampler[index] != sampler) {
156 fCurrentSampler[index] = sampler;
161 [(*fCommandEncoder) setBlendColorRed: blendConst[0]
164 alpha: blendConst[3]];
168 if (referenceValue != fCurrentStencilReferenceValue) {
170 fCurrentStencilReferenceValue = referenceValue;
174 if (depthStencilState != fCurrentDepthStencilState) {
176 fCurrentDepthStencilState = depthStencilState;
181 if (fCurrentScissorRect.x != scissorRect.x ||
182 fCurrentScissorRect.y != scissorRect.y ||
183 fCurrentScissorRect.width != scissorRect.width ||
184 fCurrentScissorRect.height != scissorRect.height) {
186 fCurrentScissorRect = scissorRect;
191 NSUInteger vertexCount) {
193 vertexStart:vertexStart
194 vertexCount:vertexCount];
197 NSUInteger vertexCount, NSUInteger instanceCount,
198 NSUInteger baseInstance)
201 vertexStart:vertexStart
202 vertexCount:vertexCount
203 instanceCount:instanceCount
204 baseInstance:baseInstance];
206 void drawPrimitives(MTLPrimitiveType primitiveType, id<MTLBuffer> indirectBuffer,
207 NSUInteger indirectBufferOffset)
210 indirectBuffer:indirectBuffer
211 indirectBufferOffset:indirectBufferOffset];
215 MTLIndexType indexType, id<MTLBuffer> indexBuffer,
216 NSUInteger indexBufferOffset) {
218 indexCount:indexCount
220 indexBuffer:indexBuffer
221 indexBufferOffset:indexBufferOffset];
224 MTLIndexType indexType, id<MTLBuffer> indexBuffer,
225 NSUInteger indexBufferOffset,
226 NSUInteger instanceCount,
227 NSInteger baseVertex,
228 NSUInteger baseInstance)
231 indexCount:indexCount
233 indexBuffer:indexBuffer
234 indexBufferOffset:indexBufferOffset
235 instanceCount:instanceCount
236 baseVertex:baseVertex
237 baseInstance:baseInstance];
240 MTLIndexType indexType, id<MTLBuffer> indexBuffer,
241 NSUInteger indexBufferOffset, id<MTLBuffer> indirectBuffer,
242 NSUInteger indirectBufferOffset)
246 indexBuffer:indexBuffer
247 indexBufferOffset:indexBufferOffset
248 indirectBuffer:indirectBuffer
249 indirectBufferOffset:indirectBufferOffset];
257 inline static constexpr int kMaxExpectedBuffers = 5;
258 inline static constexpr int kMaxExpectedTextures = 16;
261 sk_cfp<id<MTLRenderCommandEncoder>>
encoder)
266 "MtlRenderCommandEncoder")
268 for (
int i = 0; i < kMaxExpectedBuffers; i++) {
269 fCurrentVertexBuffer[i] = nil;
270 fCurrentFragmentBuffer[i] = nil;
277 for (
int i = 0; i < kMaxExpectedTextures; i++) {
278 fCurrentTexture[i] = nil;
279 fCurrentSampler[i] = nil;
284 fCommandEncoder.reset();
287 sk_cfp<id<MTLRenderCommandEncoder>> fCommandEncoder;
289 id<MTLRenderPipelineState> fCurrentRenderPipelineState = nil;
290 id<MTLDepthStencilState> fCurrentDepthStencilState = nil;
291 uint32_t fCurrentStencilReferenceValue = 0;
293 id<MTLBuffer> fCurrentVertexBuffer[kMaxExpectedBuffers];
294 NSUInteger fCurrentVertexOffset[kMaxExpectedBuffers];
295 id<MTLBuffer> fCurrentFragmentBuffer[kMaxExpectedBuffers];
296 NSUInteger fCurrentFragmentOffset[kMaxExpectedBuffers];
298 id<MTLTexture> fCurrentTexture[kMaxExpectedTextures];
299 id<MTLSamplerState> fCurrentSampler[kMaxExpectedTextures];
301 MTLScissorRect fCurrentScissorRect = { 0, 0, 0, 0 };
302 MTLTriangleFillMode fCurrentTriangleFillMode = (MTLTriangleFillMode)-1;
void drawIndexedPrimitives(MTLPrimitiveType primitiveType, NSUInteger indexCount, MTLIndexType indexType, id< MTLBuffer > indexBuffer, NSUInteger indexBufferOffset, NSUInteger instanceCount, NSInteger baseVertex, NSUInteger baseInstance) SK_API_AVAILABLE(macos(10.11)
static const uint8_t buffer[]