Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Private Member Functions | List of all members
GrMtlOpsRenderPass Class Reference

#include <GrMtlOpsRenderPass.h>

Inheritance diagram for GrMtlOpsRenderPass:
GrOpsRenderPass

Public Member Functions

 GrMtlOpsRenderPass (GrMtlGpu *gpu, GrRenderTarget *rt, sk_sp< GrMtlFramebuffer >, GrSurfaceOrigin origin, const GrOpsRenderPass::LoadAndStoreInfo &colorInfo, const GrOpsRenderPass::StencilLoadAndStoreInfo &stencilInfo)
 
 ~GrMtlOpsRenderPass () override
 
void initRenderState (GrMtlRenderCommandEncoder *)
 
void inlineUpload (GrOpFlushState *state, GrDeferredTextureUploadFn &upload) override
 
void submit ()
 
- Public Member Functions inherited from GrOpsRenderPass
virtual ~GrOpsRenderPass ()
 
void begin ()
 
void end ()
 
void bindPipeline (const GrProgramInfo &, const SkRect &drawBounds)
 
void setScissorRect (const SkIRect &)
 
void bindTextures (const GrGeometryProcessor &, const GrSurfaceProxy *const geomProcTextures[], const GrPipeline &)
 
void bindBuffers (sk_sp< const GrBuffer > indexBuffer, sk_sp< const GrBuffer > instanceBuffer, sk_sp< const GrBuffer > vertexBuffer, GrPrimitiveRestart=GrPrimitiveRestart::kNo)
 
void draw (int vertexCount, int baseVertex)
 
void drawIndexed (int indexCount, int baseIndex, uint16_t minIndexValue, uint16_t maxIndexValue, int baseVertex)
 
void drawInstanced (int instanceCount, int baseInstance, int vertexCount, int baseVertex)
 
void drawIndexedInstanced (int indexCount, int baseIndex, int instanceCount, int baseInstance, int baseVertex)
 
void drawIndirect (const GrBuffer *drawIndirectBuffer, size_t bufferOffset, int drawCount)
 
void drawIndexedIndirect (const GrBuffer *drawIndirectBuffer, size_t bufferOffset, int drawCount)
 
void drawIndexPattern (int patternIndexCount, int patternRepeatCount, int maxPatternRepetitionsInIndexBuffer, int patternVertexCount, int baseVertex)
 
void clear (const GrScissorState &scissor, std::array< float, 4 > color)
 
void clearStencilClip (const GrScissorState &scissor, bool insideStencilMask)
 
void executeDrawable (std::unique_ptr< SkDrawable::GpuDrawHandler >)
 

Private Member Functions

GrGpugpu () override
 
bool onBindPipeline (const GrProgramInfo &, const SkRect &drawBounds) override
 
void onSetScissorRect (const SkIRect &) override
 
bool onBindTextures (const GrGeometryProcessor &, const GrSurfaceProxy *const geomProcTextures[], const GrPipeline &) override
 
void onBindBuffers (sk_sp< const GrBuffer > indexBuffer, sk_sp< const GrBuffer > instanceBuffer, sk_sp< const GrBuffer > vertexBuffer, GrPrimitiveRestart) override
 
void onDraw (int vertexCount, int baseVertex) override
 
void onDrawIndexed (int indexCount, int baseIndex, uint16_t minIndexValue, uint16_t maxIndexValue, int baseVertex) override
 
void onDrawInstanced (int instanceCount, int baseInstance, int vertexCount, int baseVertex) override
 
void onDrawIndexedInstanced (int indexCount, int baseIndex, int instanceCount, int baseInstance, int baseVertex) override
 
void onDrawIndirect (const GrBuffer *drawIndirectBuffer, size_t bufferOffset, int drawCount) override
 
void onDrawIndexedIndirect (const GrBuffer *drawIndirectBuffer, size_t bufferOffset, int drawCount) override
 
void onClear (const GrScissorState &scissor, std::array< float, 4 > color) override
 
void onClearStencilClip (const GrScissorState &scissor, bool insideStencilMask) override
 

Additional Inherited Members

- Protected Member Functions inherited from GrOpsRenderPass
 GrOpsRenderPass ()
 
 GrOpsRenderPass (GrRenderTarget *rt, GrSurfaceOrigin origin)
 
void set (GrRenderTarget *rt, GrSurfaceOrigin origin)
 
- Protected Attributes inherited from GrOpsRenderPass
GrSurfaceOrigin fOrigin
 
GrRenderTargetfRenderTarget
 
sk_sp< const GrBufferfActiveIndexBuffer
 
sk_sp< const GrBufferfActiveVertexBuffer
 
sk_sp< const GrBufferfActiveInstanceBuffer
 

Detailed Description

Definition at line 24 of file GrMtlOpsRenderPass.h.

Constructor & Destructor Documentation

◆ GrMtlOpsRenderPass()

GR_NORETAIN_BEGIN GrMtlOpsRenderPass::GrMtlOpsRenderPass ( GrMtlGpu gpu,
GrRenderTarget rt,
sk_sp< GrMtlFramebuffer framebuffer,
GrSurfaceOrigin  origin,
const GrOpsRenderPass::LoadAndStoreInfo colorInfo,
const GrOpsRenderPass::StencilLoadAndStoreInfo stencilInfo 
)

Definition at line 27 of file GrMtlOpsRenderPass.mm.

31 : INHERITED(rt, origin)
32 , fGpu(gpu)
33 , fFramebuffer(std::move(framebuffer)) {
34 this->setupRenderPass(colorInfo, stencilInfo);
35}
GrGpu * gpu() override

◆ ~GrMtlOpsRenderPass()

GrMtlOpsRenderPass::~GrMtlOpsRenderPass ( )
override

Definition at line 37 of file GrMtlOpsRenderPass.mm.

37 {
38}

Member Function Documentation

◆ gpu()

GrGpu * GrMtlOpsRenderPass::gpu ( )
inlineoverrideprivatevirtual

Implements GrOpsRenderPass.

Definition at line 38 of file GrMtlOpsRenderPass.h.

38{ return fGpu; }

◆ initRenderState()

void GrMtlOpsRenderPass::initRenderState ( GrMtlRenderCommandEncoder encoder)

Definition at line 202 of file GrMtlOpsRenderPass.mm.

202 {
203 if (!encoder) {
204 return;
205 }
206#ifdef SK_ENABLE_MTL_DEBUG_INFO
207 encoder->pushDebugGroup(@"initRenderState");
208#endif
209 encoder->setFrontFacingWinding(MTLWindingCounterClockwise);
210 SkISize colorAttachmentDimensions = fFramebuffer->colorAttachment()->dimensions();
211 // Strictly speaking we shouldn't have to set this, as the default viewport is the size of
212 // the drawable used to generate the renderCommandEncoder -- but just in case.
213 MTLViewport viewport = { 0.0, 0.0,
214 (double) colorAttachmentDimensions.width(),
215 (double) colorAttachmentDimensions.height(),
216 0.0, 1.0 };
217 encoder->setViewport(viewport);
218#ifdef SK_ENABLE_MTL_DEBUG_INFO
219 encoder->popDebugGroup();
220#endif
221}
GrMtlAttachment * colorAttachment()
SkISize dimensions() const
Definition GrSurface.h:27
constexpr int32_t width() const
Definition SkSize.h:36
constexpr int32_t height() const
Definition SkSize.h:37

◆ inlineUpload()

void GrMtlOpsRenderPass::inlineUpload ( GrOpFlushState state,
GrDeferredTextureUploadFn upload 
)
overridevirtual

Implements GrOpsRenderPass.

Definition at line 189 of file GrMtlOpsRenderPass.mm.

189 {
190 state->doUpload(upload);
191
192 // If the previous renderCommandEncoder did a resolve without an MSAA store
193 // (e.g., if the color attachment is memoryless) we need to copy the contents of
194 // the resolve attachment to the MSAA attachment at this point.
195 if (!this->setupResolve()) {
196 // If setting up for the resolve didn't create an encoder, it's probably reasonable to
197 // create a new encoder at this point, though maybe not necessary.
198 this->setupRenderCommandEncoder(nullptr);
199 }
200}
AtkStateType state

◆ onBindBuffers()

void GrMtlOpsRenderPass::onBindBuffers ( sk_sp< const GrBuffer indexBuffer,
sk_sp< const GrBuffer instanceBuffer,
sk_sp< const GrBuffer vertexBuffer,
GrPrimitiveRestart  primRestart 
)
overrideprivatevirtual

Implements GrOpsRenderPass.

Definition at line 316 of file GrMtlOpsRenderPass.mm.

319 {
320#ifdef SK_ENABLE_MTL_DEBUG_INFO
321 if (!fDebugGroupActive) {
322 fActiveRenderCmdEncoder->pushDebugGroup(@"bindAndDraw");
323 fDebugGroupActive = true;
324 }
325#endif
326 SkASSERT(GrPrimitiveRestart::kNo == primRestart);
327 int inputBufferIndex = 0;
328 if (vertexBuffer) {
329 SkASSERT(!vertexBuffer->isCpuBuffer());
330 SkASSERT(!static_cast<const GrGpuBuffer*>(vertexBuffer.get())->isMapped());
331 fActiveVertexBuffer = std::move(vertexBuffer);
333 ++inputBufferIndex;
334 }
335 if (instanceBuffer) {
336 SkASSERT(!instanceBuffer->isCpuBuffer());
337 SkASSERT(!static_cast<const GrGpuBuffer*>(instanceBuffer.get())->isMapped());
338 this->setVertexBuffer(fActiveRenderCmdEncoder, instanceBuffer.get(), 0, inputBufferIndex++);
339 fActiveInstanceBuffer = std::move(instanceBuffer);
341 }
342 if (indexBuffer) {
343 SkASSERT(!indexBuffer->isCpuBuffer());
344 SkASSERT(!static_cast<const GrGpuBuffer*>(indexBuffer.get())->isMapped());
345 fActiveIndexBuffer = std::move(indexBuffer);
347 }
348}
#define SkASSERT(cond)
Definition SkAssert.h:116
virtual bool isCpuBuffer() const =0
bool isMapped() const
void addGrBuffer(sk_sp< const GrBuffer > buffer)
GrMtlCommandBuffer * commandBuffer()
Definition GrMtlGpu.mm:187
void pushDebugGroup(NSString *string)
sk_sp< const GrBuffer > fActiveIndexBuffer
sk_sp< const GrBuffer > fActiveInstanceBuffer
sk_sp< const GrBuffer > fActiveVertexBuffer
T * get() const
Definition SkRefCnt.h:303

◆ onBindPipeline()

bool GrMtlOpsRenderPass::onBindPipeline ( const GrProgramInfo programInfo,
const SkRect drawBounds 
)
overrideprivatevirtual

Implements GrOpsRenderPass.

Definition at line 68 of file GrMtlOpsRenderPass.mm.

69 {
70 const GrMtlCaps& caps = fGpu->mtlCaps();
71 GrProgramDesc programDesc = caps.makeDesc(fRenderTarget, programInfo,
73 if (!programDesc.isValid()) {
74 return false;
75 }
76
77 fActivePipelineState = fGpu->resourceProvider().findOrCreateCompatiblePipelineState(
78 programDesc, programInfo);
79 if (!fActivePipelineState) {
80 return false;
81 }
82
83 fActivePipelineState->setData(fFramebuffer.get(), programInfo);
84 fCurrentVertexStride = programInfo.geomProc().vertexStride();
85
86 if (!fActiveRenderCmdEncoder) {
87 this->setupRenderCommandEncoder(fActivePipelineState);
88 if (!fActiveRenderCmdEncoder) {
89 return false;
90 }
92 sk_ref_sp<GrMtlAttachment>(fFramebuffer->colorAttachment()));
93 }
94
95 fActiveRenderCmdEncoder->setRenderPipelineState(
96 fActivePipelineState->pipeline()->mtlPipelineState());
97#ifdef SK_ENABLE_MTL_DEBUG_INFO
98 if (!fDebugGroupActive) {
99 fActiveRenderCmdEncoder->pushDebugGroup(@"bindAndDraw");
100 fDebugGroupActive = true;
101 }
102#endif
103 fActivePipelineState->setDrawState(fActiveRenderCmdEncoder,
104 programInfo.pipeline().writeSwizzle(),
105 programInfo.pipeline().getXferProcessor());
106 if (this->gpu()->caps()->wireframeMode() || programInfo.pipeline().isWireframe()) {
107 fActiveRenderCmdEncoder->setTriangleFillMode(MTLTriangleFillModeLines);
108 } else {
109 fActiveRenderCmdEncoder->setTriangleFillMode(MTLTriangleFillModeFill);
110 }
111
112 if (!programInfo.pipeline().isScissorTestEnabled()) {
113 // "Disable" scissor by setting it to the full pipeline bounds.
114 SkISize dimensions = fFramebuffer->colorAttachment()->dimensions();
116 dimensions, fOrigin,
117 SkIRect::MakeWH(dimensions.width(),
118 dimensions.height()));
119 }
120
121 fActivePrimitiveType = gr_to_mtl_primitive(programInfo.primitiveType());
122 fBounds.join(drawBounds);
123 return true;
124}
static MTLPrimitiveType gr_to_mtl_primitive(GrPrimitiveType primitiveType)
GrProgramDesc makeDesc(GrRenderTarget *, const GrProgramInfo &, ProgramDescOverrideFlags) const override
void addGrSurface(sk_sp< const GrSurface > surface)
const GrMtlCaps & mtlCaps() const
Definition GrMtlGpu.h:47
GrMtlResourceProvider & resourceProvider()
Definition GrMtlGpu.h:51
void setDrawState(GrMtlRenderCommandEncoder *, const skgpu::Swizzle &writeSwizzle, const GrXferProcessor &)
static void SetDynamicScissorRectState(GrMtlRenderCommandEncoder *renderCmdEncoder, SkISize colorAttachmentDimensions, GrSurfaceOrigin rtOrigin, SkIRect scissorRect)
void setData(GrMtlFramebuffer *, const GrProgramInfo &)
const sk_sp< GrMtlRenderPipeline > & pipeline() const
void setTriangleFillMode(MTLTriangleFillMode fillMode)
void setRenderPipelineState(id< MTLRenderPipelineState > pso)
id< MTLRenderPipelineState > mtlPipelineState() const
GrMtlPipelineState * findOrCreateCompatiblePipelineState(const GrProgramDesc &, const GrProgramInfo &, GrThreadSafePipelineBuilder::Stats::ProgramCacheResult *stat=nullptr)
GrSurfaceOrigin fOrigin
GrRenderTarget * fRenderTarget
const skgpu::Swizzle & writeSwizzle() const
Definition GrPipeline.h:197
bool isScissorTestEnabled() const
Definition GrPipeline.h:163
bool isWireframe() const
Definition GrPipeline.h:170
const GrXferProcessor & getXferProcessor() const
Definition GrPipeline.h:116
bool isValid() const
GrPrimitiveType primitiveType() const
const GrPipeline & pipeline() const
const GrGeometryProcessor & geomProc() const
static constexpr SkIRect MakeWH(int32_t w, int32_t h)
Definition SkRect.h:56
void join(const SkRect &r)
Definition SkRect.cpp:126

◆ onBindTextures()

bool GrMtlOpsRenderPass::onBindTextures ( const GrGeometryProcessor geomProc,
const GrSurfaceProxy *const  geomProcTextures[],
const GrPipeline pipeline 
)
overrideprivatevirtual

Implements GrOpsRenderPass.

Definition at line 134 of file GrMtlOpsRenderPass.mm.

136 {
137 SkASSERT(fActivePipelineState);
138 SkASSERT(fActiveRenderCmdEncoder);
139#ifdef SK_ENABLE_MTL_DEBUG_INFO
140 if (!fDebugGroupActive) {
141 fActiveRenderCmdEncoder->pushDebugGroup(@"bindAndDraw");
142 fDebugGroupActive = true;
143 }
144#endif
145 fActivePipelineState->setTextures(geomProc, pipeline, geomProcTextures);
146 fActivePipelineState->bindTextures(fActiveRenderCmdEncoder);
147 return true;
148}
void bindTextures(GrMtlRenderCommandEncoder *renderCmdEncoder)
void setTextures(const GrGeometryProcessor &, const GrPipeline &, const GrSurfaceProxy *const geomProcTextures[])

◆ onClear()

void GrMtlOpsRenderPass::onClear ( const GrScissorState scissor,
std::array< float, 4 >  color 
)
overrideprivatevirtual

Implements GrOpsRenderPass.

Definition at line 150 of file GrMtlOpsRenderPass.mm.

150 {
151 // Partial clears are not supported
152 SkASSERT(!scissor.enabled());
153
154 // Ideally we should never end up here since all clears should either be done as draws or
155 // load ops in metal. However, if a client inserts a wait op we need to handle it.
156 auto colorAttachment = fRenderPassDesc.colorAttachments[0];
157 colorAttachment.clearColor = MTLClearColorMake(color[0], color[1], color[2], color[3]);
158 colorAttachment.loadAction = MTLLoadActionClear;
159 if (!this->setupResolve()) {
160 this->setupRenderCommandEncoder(nullptr);
161 }
162}
SkColor4f color
bool enabled() const

◆ onClearStencilClip()

void GrMtlOpsRenderPass::onClearStencilClip ( const GrScissorState scissor,
bool  insideStencilMask 
)
overrideprivatevirtual

Implements GrOpsRenderPass.

Definition at line 164 of file GrMtlOpsRenderPass.mm.

164 {
165 // Partial clears are not supported
166 SkASSERT(!scissor.enabled());
167
168 GrAttachment* sb = fFramebuffer->stencilAttachment();
169 // this should only be called internally when we know we have a
170 // stencil buffer.
171 SkASSERT(sb);
172 int stencilBitCount = GrBackendFormatStencilBits(sb->backendFormat());
173
174 // The contract with the callers does not guarantee that we preserve all bits in the stencil
175 // during this clear. Thus we will clear the entire stencil to the desired value.
176 auto stencilAttachment = fRenderPassDesc.stencilAttachment;
177 if (insideStencilMask) {
178 stencilAttachment.clearStencil = (1 << (stencilBitCount - 1));
179 } else {
180 stencilAttachment.clearStencil = 0;
181 }
182
183 stencilAttachment.loadAction = MTLLoadActionClear;
184 if (!this->setupResolve()) {
185 this->setupRenderCommandEncoder(nullptr);
186 }
187}
int GrBackendFormatStencilBits(const GrBackendFormat &format)
GrMtlAttachment * stencilAttachment()
virtual GrBackendFormat backendFormat() const =0

◆ onDraw()

void GrMtlOpsRenderPass::onDraw ( int  vertexCount,
int  baseVertex 
)
overrideprivatevirtual

Implements GrOpsRenderPass.

Definition at line 350 of file GrMtlOpsRenderPass.mm.

350 {
351 SkASSERT(fActivePipelineState);
352 SkASSERT(nil != fActiveRenderCmdEncoder);
353#ifdef SK_ENABLE_MTL_DEBUG_INFO
354 if (!fDebugGroupActive) {
355 fActiveRenderCmdEncoder->pushDebugGroup(@"bindAndDraw");
356 fDebugGroupActive = true;
357 }
358#endif
359 this->setVertexBuffer(fActiveRenderCmdEncoder, fActiveVertexBuffer.get(), 0, 0);
360
361 fActiveRenderCmdEncoder->drawPrimitives(fActivePrimitiveType, baseVertex, vertexCount);
362 fGpu->stats()->incNumDraws();
363#ifdef SK_ENABLE_MTL_DEBUG_INFO
364 SkASSERT(fDebugGroupActive);
365 fActiveRenderCmdEncoder->popDebugGroup();
366 fDebugGroupActive = false;
367#endif
368}
void incNumDraws()
Definition GrGpu.h:541
Stats * stats()
Definition GrGpu.h:551
void drawPrimitives(MTLPrimitiveType primitiveType, NSUInteger vertexStart, NSUInteger vertexCount)

◆ onDrawIndexed()

void GrMtlOpsRenderPass::onDrawIndexed ( int  indexCount,
int  baseIndex,
uint16_t  minIndexValue,
uint16_t  maxIndexValue,
int  baseVertex 
)
overrideprivatevirtual

Implements GrOpsRenderPass.

Definition at line 370 of file GrMtlOpsRenderPass.mm.

371 {
372 SkASSERT(fActivePipelineState);
373 SkASSERT(nil != fActiveRenderCmdEncoder);
375#ifdef SK_ENABLE_MTL_DEBUG_INFO
376 if (!fDebugGroupActive) {
377 fActiveRenderCmdEncoder->pushDebugGroup(@"bindAndDraw");
378 fDebugGroupActive = true;
379 }
380#endif
381 this->setVertexBuffer(fActiveRenderCmdEncoder, fActiveVertexBuffer.get(),
382 fCurrentVertexStride * baseVertex, 0);
383
384 auto mtlIndexBuffer = static_cast<const GrMtlBuffer*>(fActiveIndexBuffer.get());
385 size_t indexOffset = sizeof(uint16_t) * baseIndex;
386 id<MTLBuffer> indexBuffer = mtlIndexBuffer->mtlBuffer();
387 fActiveRenderCmdEncoder->drawIndexedPrimitives(fActivePrimitiveType, indexCount,
388 MTLIndexTypeUInt16, indexBuffer, indexOffset);
389 fGpu->stats()->incNumDraws();
390#ifdef SK_ENABLE_MTL_DEBUG_INFO
391 SkASSERT(fDebugGroupActive);
392 fActiveRenderCmdEncoder->popDebugGroup();
393 fDebugGroupActive = false;
394#endif
395}
id< MTLBuffer > mtlBuffer() const
Definition GrMtlBuffer.h:28
void drawIndexedPrimitives(MTLPrimitiveType primitiveType, NSUInteger indexCount, MTLIndexType indexType, id< MTLBuffer > indexBuffer, NSUInteger indexBufferOffset)

◆ onDrawIndexedIndirect()

void GrMtlOpsRenderPass::onDrawIndexedIndirect ( const GrBuffer drawIndirectBuffer,
size_t  bufferOffset,
int  drawCount 
)
overrideprivatevirtual

Reimplemented from GrOpsRenderPass.

Definition at line 488 of file GrMtlOpsRenderPass.mm.

490 {
492 SkASSERT(fActivePipelineState);
493 SkASSERT(nil != fActiveRenderCmdEncoder);
495#ifdef SK_ENABLE_MTL_DEBUG_INFO
496 if (!fDebugGroupActive) {
497 fActiveRenderCmdEncoder->pushDebugGroup(@"bindAndDraw");
498 fDebugGroupActive = true;
499 }
500#endif
501 this->setVertexBuffer(fActiveRenderCmdEncoder, fActiveVertexBuffer.get(), 0, 0);
502
503 auto mtlIndexBuffer = static_cast<const GrMtlBuffer*>(fActiveIndexBuffer.get());
504 auto mtlIndirectBuffer = static_cast<const GrMtlBuffer*>(drawIndirectBuffer);
505 size_t indexOffset = 0;
506
507 const size_t stride = sizeof(GrDrawIndexedIndirectCommand);
508 while (drawCount >= 1) {
509 if (@available(macOS 10.11, iOS 9.0, tvOS 9.0, *)) {
510 fActiveRenderCmdEncoder->drawIndexedPrimitives(fActivePrimitiveType,
511 MTLIndexTypeUInt16,
512 mtlIndexBuffer->mtlBuffer(),
513 indexOffset,
514 mtlIndirectBuffer->mtlBuffer(),
515 bufferOffset);
516 } else {
517 SkASSERT(false);
518 }
519 drawCount--;
520 bufferOffset += stride;
521 fGpu->stats()->incNumDraws();
522 }
523#ifdef SK_ENABLE_MTL_DEBUG_INFO
524 SkASSERT(fDebugGroupActive);
525 fActiveRenderCmdEncoder->popDebugGroup();
526 fDebugGroupActive = false;
527#endif
528}
bool nativeDrawIndirectSupport() const
Definition GrCaps.h:84
const GrCaps * caps() const
Definition GrGpu.h:73

◆ onDrawIndexedInstanced()

void GrMtlOpsRenderPass::onDrawIndexedInstanced ( int  indexCount,
int  baseIndex,
int  instanceCount,
int  baseInstance,
int  baseVertex 
)
overrideprivatevirtual

Implements GrOpsRenderPass.

Definition at line 423 of file GrMtlOpsRenderPass.mm.

424 {
425 SkASSERT(fActivePipelineState);
426 SkASSERT(nil != fActiveRenderCmdEncoder);
428#ifdef SK_ENABLE_MTL_DEBUG_INFO
429 if (!fDebugGroupActive) {
430 fActiveRenderCmdEncoder->pushDebugGroup(@"bindAndDraw");
431 fDebugGroupActive = true;
432 }
433#endif
434 this->setVertexBuffer(fActiveRenderCmdEncoder, fActiveVertexBuffer.get(), 0, 0);
435
436 auto mtlIndexBuffer = static_cast<const GrMtlBuffer*>(fActiveIndexBuffer.get());
437 size_t indexOffset = sizeof(uint16_t) * baseIndex;
438 if (@available(macOS 10.11, iOS 9.0, tvOS 9.0, *)) {
439 fActiveRenderCmdEncoder->drawIndexedPrimitives(fActivePrimitiveType, indexCount,
440 MTLIndexTypeUInt16,
441 mtlIndexBuffer->mtlBuffer(), indexOffset,
442 instanceCount, baseVertex, baseInstance);
443 } else {
444 SkASSERT(false);
445 }
446 fGpu->stats()->incNumDraws();
447#ifdef SK_ENABLE_MTL_DEBUG_INFO
448 SkASSERT(fDebugGroupActive);
449 fActiveRenderCmdEncoder->popDebugGroup();
450 fDebugGroupActive = false;
451#endif
452}

◆ onDrawIndirect()

void GrMtlOpsRenderPass::onDrawIndirect ( const GrBuffer drawIndirectBuffer,
size_t  bufferOffset,
int  drawCount 
)
overrideprivatevirtual

Reimplemented from GrOpsRenderPass.

Definition at line 454 of file GrMtlOpsRenderPass.mm.

456 {
458 SkASSERT(fActivePipelineState);
459 SkASSERT(nil != fActiveRenderCmdEncoder);
460#ifdef SK_ENABLE_MTL_DEBUG_INFO
461 if (!fDebugGroupActive) {
462 fActiveRenderCmdEncoder->pushDebugGroup(@"bindAndDraw");
463 fDebugGroupActive = true;
464 }
465#endif
466 this->setVertexBuffer(fActiveRenderCmdEncoder, fActiveVertexBuffer.get(), 0, 0);
467
468 auto mtlIndirectBuffer = static_cast<const GrMtlBuffer*>(drawIndirectBuffer);
469 const size_t stride = sizeof(GrDrawIndirectCommand);
470 while (drawCount >= 1) {
471 if (@available(macOS 10.11, iOS 9.0, tvOS 9.0, *)) {
472 fActiveRenderCmdEncoder->drawPrimitives(fActivePrimitiveType,
473 mtlIndirectBuffer->mtlBuffer(), bufferOffset);
474 } else {
475 SkASSERT(false);
476 }
477 drawCount--;
478 bufferOffset += stride;
479 fGpu->stats()->incNumDraws();
480 }
481#ifdef SK_ENABLE_MTL_DEBUG_INFO
482 SkASSERT(fDebugGroupActive);
483 fActiveRenderCmdEncoder->popDebugGroup();
484 fDebugGroupActive = false;
485#endif
486}

◆ onDrawInstanced()

void GrMtlOpsRenderPass::onDrawInstanced ( int  instanceCount,
int  baseInstance,
int  vertexCount,
int  baseVertex 
)
overrideprivatevirtual

Implements GrOpsRenderPass.

Definition at line 397 of file GrMtlOpsRenderPass.mm.

398 {
399 SkASSERT(fActivePipelineState);
400 SkASSERT(nil != fActiveRenderCmdEncoder);
401#ifdef SK_ENABLE_MTL_DEBUG_INFO
402 if (!fDebugGroupActive) {
403 fActiveRenderCmdEncoder->pushDebugGroup(@"bindAndDraw");
404 fDebugGroupActive = true;
405 }
406#endif
407 this->setVertexBuffer(fActiveRenderCmdEncoder, fActiveVertexBuffer.get(), 0, 0);
408
409 if (@available(macOS 10.11, iOS 9.0, tvOS 9.0, *)) {
410 fActiveRenderCmdEncoder->drawPrimitives(fActivePrimitiveType, baseVertex, vertexCount,
411 instanceCount, baseInstance);
412 } else {
413 SkASSERT(false);
414 }
415 fGpu->stats()->incNumDraws();
416#ifdef SK_ENABLE_MTL_DEBUG_INFO
417 SkASSERT(fDebugGroupActive);
418 fActiveRenderCmdEncoder->popDebugGroup();
419 fDebugGroupActive = false;
420#endif
421}

◆ onSetScissorRect()

void GrMtlOpsRenderPass::onSetScissorRect ( const SkIRect scissor)
overrideprivatevirtual

Implements GrOpsRenderPass.

Definition at line 126 of file GrMtlOpsRenderPass.mm.

126 {
127 SkASSERT(fActivePipelineState);
128 SkASSERT(fActiveRenderCmdEncoder);
130 fFramebuffer->colorAttachment()->dimensions(),
131 fOrigin, scissor);
132}

◆ submit()

void GrMtlOpsRenderPass::submit ( )

Definition at line 40 of file GrMtlOpsRenderPass.mm.

40 {
41 if (!fFramebuffer) {
42 return;
43 }
44 SkIRect iBounds;
45 fBounds.roundOut(&iBounds);
47 fActiveRenderCmdEncoder = nullptr;
48}
void submitIndirectCommandBuffer(GrSurface *surface, GrSurfaceOrigin origin, const SkIRect *bounds)
Definition GrMtlGpu.h:113
void roundOut(SkIRect *dst) const
Definition SkRect.h:1241

The documentation for this class was generated from the following files: