Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Unified Diff: src/gpu/GrDrawContext.cpp

Issue 1897203002: Implement instanced rendering for simple shapes (Closed) Base URL: https://skia.googlesource.com/skia.git@upload2_requireHWAA
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(),

Powered by Google App Engine
This is Rietveld 408576698