Index: src/gpu/GrDrawContext.cpp |
diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp |
index 2e4b13f03ee0e87f5f1e75b2d2e8758d96660801..cc404a9c5615ac686d61276eae1ff4596afaf59f 100644 |
--- a/src/gpu/GrDrawContext.cpp |
+++ b/src/gpu/GrDrawContext.cpp |
@@ -15,6 +15,7 @@ |
#include "GrRenderTarget.h" |
#include "GrRenderTargetPriv.h" |
#include "GrResourceProvider.h" |
+#include "GrInstancedRendering.h" |
#include "SkSurfacePriv.h" |
#include "batches/GrBatch.h" |
@@ -71,6 +72,13 @@ GrDrawContext::GrDrawContext(GrContext* context, |
, fSingleOwner(singleOwner) |
#endif |
{ |
+ fInstancedRenderingFlags = GrInstancedRendering::kColorWrite_Flag; |
+ if (fRenderTarget->isStencilBufferMultisampled()) { |
+ fInstancedRenderingFlags |= GrInstancedRendering::kStencilBufferMSAA_Flag; |
+ } |
+ if (fRenderTarget->isUnifiedMultisampled()) { |
+ fInstancedRenderingFlags |= GrInstancedRendering::kColorBufferMSAA_Flag; |
+ } |
SkDEBUGCODE(this->validate();) |
} |
@@ -255,24 +263,32 @@ static bool should_apply_coverage_aa(const GrPaint& paint, GrRenderTarget* rt) { |
GrDrawBatch* GrDrawContext::getFillRectBatch(const GrPaint& paint, |
const SkMatrix& viewMatrix, |
- const SkRect& rect) { |
- |
- GrDrawBatch* batch = nullptr; |
+ const SkRect& rect, |
+ uint32_t extraInstRenderFlags, |
+ bool* requireHWAA) { |
+ if (GrInstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { |
+ if (GrDrawBatch* batch = ir->recordRect(rect, viewMatrix, paint.getColor(), |
+ paint.isAntiAlias(), |
+ fInstancedRenderingFlags | extraInstRenderFlags, |
+ requireHWAA)) { |
+ return batch; |
+ } |
+ } |
if (should_apply_coverage_aa(paint, fRenderTarget)) { |
// The fill path can handle rotation but not skew. |
if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
SkRect devBoundRect; |
viewMatrix.mapRect(&devBoundRect, rect); |
- batch = GrRectBatchFactory::CreateAAFill(paint.getColor(), viewMatrix, |
- rect, devBoundRect); |
+ return GrRectBatchFactory::CreateAAFill(paint.getColor(), viewMatrix, rect, |
+ devBoundRect); |
} |
} else { |
// filled BW rect |
- batch = GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix, rect, |
- nullptr, nullptr); |
+ return GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix, rect, nullptr, |
+ nullptr); |
} |
- return batch; |
+ return nullptr; |
} |
void GrDrawContext::drawRect(const GrClip& clip, |
@@ -327,9 +343,10 @@ void GrDrawContext::drawRect(const GrClip& clip, |
} |
bool snapToPixelCenters = false; |
+ bool requireHWAA = false; |
SkAutoTUnref<GrDrawBatch> batch; |
if (width < 0) { |
- batch.reset(this->getFillRectBatch(paint, viewMatrix, rect)); |
+ batch.reset(this->getFillRectBatch(paint, viewMatrix, rect, 0, &requireHWAA)); |
} else { |
GrColor color = paint.getColor(); |
@@ -353,7 +370,7 @@ void GrDrawContext::drawRect(const GrClip& clip, |
} |
if (batch) { |
- GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip, requireHWAA); |
if (snapToPixelCenters) { |
pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCenters_Flag, |
@@ -389,9 +406,13 @@ bool GrDrawContextPriv::drawAndStencilRect(const SkIRect* scissorRect, |
paint.setAntiAlias(doAA); |
paint.setCoverageSetOpXPFactory(op, invert); |
- SkAutoTUnref<GrDrawBatch> batch(fDrawContext->getFillRectBatch(paint, viewMatrix, rect)); |
+ bool requireHWAA = false; |
+ SkAutoTUnref<GrDrawBatch> batch( |
+ fDrawContext->getFillRectBatch(paint, viewMatrix, rect, |
+ GrInstancedRendering::kStencilWrite_Flag, &requireHWAA)); |
if (batch) { |
- GrPipelineBuilder pipelineBuilder(paint, fDrawContext->fRenderTarget, GrClip::WideOpen()); |
+ GrPipelineBuilder pipelineBuilder(paint, fDrawContext->fRenderTarget, GrClip::WideOpen(), |
+ requireHWAA); |
pipelineBuilder.setStencil(ss); |
fDrawContext->getDrawTarget()->drawBatch(pipelineBuilder, batch, scissorRect); |
@@ -417,6 +438,17 @@ void GrDrawContext::fillRectToRect(const GrClip& clip, |
AutoCheckFlush acf(fDrawingManager); |
SkAutoTUnref<GrDrawBatch> batch; |
+ if (GrInstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { |
+ bool requireHWAA = false; |
+ batch.reset(ir->recordRect(rectToDraw, viewMatrix, paint.getColor(), localRect, |
+ paint.isAntiAlias(), fInstancedRenderingFlags, &requireHWAA)); |
+ if (batch) { |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip, requireHWAA); |
+ this->drawBatch(&pipelineBuilder, batch); |
+ return; |
+ } |
+ } |
+ |
if (should_apply_coverage_aa(paint, fRenderTarget) && |
view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
batch.reset(GrAAFillRectBatch::CreateWithLocalRect(paint.getColor(), viewMatrix, rectToDraw, |
@@ -445,6 +477,17 @@ void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, |
AutoCheckFlush acf(fDrawingManager); |
SkAutoTUnref<GrDrawBatch> batch; |
+ if (GrInstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { |
+ bool requireHWAA = false; |
+ batch.reset(ir->recordRect(rectToDraw, viewMatrix, paint.getColor(), localMatrix, |
+ paint.isAntiAlias(), fInstancedRenderingFlags, &requireHWAA)); |
+ if (batch) { |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip, requireHWAA); |
+ this->drawBatch(&pipelineBuilder, batch); |
+ return; |
+ } |
+ } |
+ |
if (should_apply_coverage_aa(paint, fRenderTarget) && |
view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
batch.reset(GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, localMatrix, |
@@ -548,6 +591,19 @@ void GrDrawContext::drawRRect(const GrClip& clip, |
AutoCheckFlush acf(fDrawingManager); |
+ if (this->getDrawTarget()->instancedRendering() && strokeInfo.isFillStyle()) { |
+ GrInstancedRendering* ir = this->getDrawTarget()->instancedRendering(); |
+ bool requireHWAA = false; |
+ SkAutoTUnref<GrDrawBatch> batch(ir->recordRRect(rrect, viewMatrix, paint.getColor(), |
+ paint.isAntiAlias(), |
+ fInstancedRenderingFlags, &requireHWAA)); |
+ if (batch) { |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip, requireHWAA); |
+ this->drawBatch(&pipelineBuilder, batch); |
+ return; |
+ } |
+ } |
+ |
if (should_apply_coverage_aa(paint, fRenderTarget)) { |
GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); |
@@ -577,6 +633,18 @@ bool GrDrawContext::drawFilledDRRect(const GrClip& clip, |
SkASSERT(!origInner.isEmpty()); |
SkASSERT(!origOuter.isEmpty()); |
+ if (GrInstancedRendering* ir = this->getDrawTarget()->instancedRendering()) { |
+ bool requireHWAA = false; |
+ SkAutoTUnref<GrDrawBatch> batch(ir->recordDRRect(origOuter, origInner, viewMatrix, |
+ paintIn.getColor(), paintIn.isAntiAlias(), |
+ fInstancedRenderingFlags, &requireHWAA)); |
+ if (batch) { |
+ GrPipelineBuilder pipelineBuilder(paintIn, fRenderTarget, clip, requireHWAA); |
+ this->drawBatch(&pipelineBuilder, batch); |
+ return true; |
+ } |
+ } |
+ |
bool applyAA = paintIn.isAntiAlias() && !fRenderTarget->isUnifiedMultisampled(); |
GrPrimitiveEdgeType innerEdgeType = applyAA ? kInverseFillAA_GrProcessorEdgeType : |
@@ -675,6 +743,19 @@ void GrDrawContext::drawOval(const GrClip& clip, |
AutoCheckFlush acf(fDrawingManager); |
+ if (this->getDrawTarget()->instancedRendering() && strokeInfo.isFillStyle()) { |
+ GrInstancedRendering* ir = this->getDrawTarget()->instancedRendering(); |
+ bool requireHWAA = false; |
+ SkAutoTUnref<GrDrawBatch> batch(ir->recordOval(oval, viewMatrix, paint.getColor(), |
+ paint.isAntiAlias(), |
+ fInstancedRenderingFlags, &requireHWAA)); |
+ if (batch) { |
+ GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip, requireHWAA); |
+ this->drawBatch(&pipelineBuilder, batch); |
+ return; |
+ } |
+ } |
+ |
if (should_apply_coverage_aa(paint, fRenderTarget)) { |
GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps(); |
SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(paint.getColor(), |