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

Side by Side Diff: src/gpu/instanced/InstanceProcessor.cpp

Issue 2120163002: Enable blend optimizations with instanced draws (Closed) Base URL: https://skia.googlesource.com/skia.git@upload_ingorecov
Patch Set: Created 4 years, 5 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "InstanceProcessor.h" 8 #include "InstanceProcessor.h"
9 9
10 #include "GrContext.h" 10 #include "GrContext.h"
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 } 134 }
135 135
136 private: 136 private:
137 const InstanceProcessor& fInstProc; 137 const InstanceProcessor& fInstProc;
138 GrGLSLVertexBuilder* fVertexBuilder; 138 GrGLSLVertexBuilder* fVertexBuilder;
139 SamplerHandle fParamsBuffer; 139 SamplerHandle fParamsBuffer;
140 }; 140 };
141 141
142 class GLSLInstanceProcessor::Backend { 142 class GLSLInstanceProcessor::Backend {
143 public: 143 public:
144 static Backend* SK_WARN_UNUSED_RESULT Create(const GrGLSLProgramBuilder*, Ba tchInfo, 144 static Backend* SK_WARN_UNUSED_RESULT Create(const GrPipeline&, BatchInfo, c onst VertexInputs&);
145 const VertexInputs&);
146 virtual ~Backend() {} 145 virtual ~Backend() {}
147 146
148 void init(GrGLSLVaryingHandler*, GrGLSLVertexBuilder*); 147 void init(GrGLSLVaryingHandler*, GrGLSLVertexBuilder*);
149 virtual void setupRect(GrGLSLVertexBuilder*) = 0; 148 virtual void setupRect(GrGLSLVertexBuilder*) = 0;
150 virtual void setupOval(GrGLSLVertexBuilder*) = 0; 149 virtual void setupOval(GrGLSLVertexBuilder*) = 0;
151 void setupRRect(GrGLSLVertexBuilder*); 150 void setupRRect(GrGLSLVertexBuilder*);
152 151
153 void initInnerShape(GrGLSLVaryingHandler*, GrGLSLVertexBuilder*); 152 void initInnerShape(GrGLSLVaryingHandler*, GrGLSLVertexBuilder*);
154 virtual void setupInnerRect(GrGLSLVertexBuilder*) = 0; 153 virtual void setupInnerRect(GrGLSLVertexBuilder*) = 0;
155 virtual void setupInnerOval(GrGLSLVertexBuilder*) = 0; 154 virtual void setupInnerOval(GrGLSLVertexBuilder*) = 0;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 bool fNeedsNeighborRadii; 200 bool fNeedsNeighborRadii;
202 GrGLSLVertToFrag fColor; 201 GrGLSLVertToFrag fColor;
203 GrGLSLVertToFrag fTriangleIsArc; 202 GrGLSLVertToFrag fTriangleIsArc;
204 GrGLSLVertToFrag fArcCoords; 203 GrGLSLVertToFrag fArcCoords;
205 GrGLSLVertToFrag fInnerShapeCoords; 204 GrGLSLVertToFrag fInnerShapeCoords;
206 GrGLSLVertToFrag fInnerRRect; 205 GrGLSLVertToFrag fInnerRRect;
207 const char* fModifiedShapeCoords; 206 const char* fModifiedShapeCoords;
208 }; 207 };
209 208
210 void GLSLInstanceProcessor::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { 209 void GLSLInstanceProcessor::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) {
210 const GrPipeline& pipeline = args.fVertBuilder->getProgramBuilder()->pipelin e();
211 const InstanceProcessor& ip = args.fGP.cast<InstanceProcessor>(); 211 const InstanceProcessor& ip = args.fGP.cast<InstanceProcessor>();
212 GrGLSLUniformHandler* uniHandler = args.fUniformHandler; 212 GrGLSLUniformHandler* uniHandler = args.fUniformHandler;
213 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; 213 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
214 GrGLSLVertexBuilder* v = args.fVertBuilder; 214 GrGLSLVertexBuilder* v = args.fVertBuilder;
215 GrGLSLPPFragmentBuilder* f = args.fFragBuilder; 215 GrGLSLPPFragmentBuilder* f = args.fFragBuilder;
216 216
217 varyingHandler->emitAttributes(ip); 217 varyingHandler->emitAttributes(ip);
218 218
219 VertexInputs inputs(ip, v); 219 VertexInputs inputs(ip, v);
220 if (ip.batchInfo().fHasParams) { 220 if (ip.batchInfo().fHasParams) {
(...skipping 19 matching lines...) Expand all
240 int usedShapeTypes = 0; 240 int usedShapeTypes = 0;
241 241
242 bool hasSingleShapeType = SkIsPow2(ip.batchInfo().fShapeTypes); 242 bool hasSingleShapeType = SkIsPow2(ip.batchInfo().fShapeTypes);
243 if (!hasSingleShapeType) { 243 if (!hasSingleShapeType) {
244 usedShapeTypes |= ip.batchInfo().fShapeTypes; 244 usedShapeTypes |= ip.batchInfo().fShapeTypes;
245 v->define("SHAPE_TYPE_BIT", kShapeType_InfoBit); 245 v->define("SHAPE_TYPE_BIT", kShapeType_InfoBit);
246 v->codeAppendf("uint shapeType = %s >> SHAPE_TYPE_BIT;", 246 v->codeAppendf("uint shapeType = %s >> SHAPE_TYPE_BIT;",
247 inputs.attr(Attrib::kInstanceInfo)); 247 inputs.attr(Attrib::kInstanceInfo));
248 } 248 }
249 249
250 SkAutoTDelete<Backend> backend(Backend::Create(v->getProgramBuilder(), ip.ba tchInfo(), inputs)); 250 SkAutoTDelete<Backend> backend(Backend::Create(pipeline, ip.batchInfo(), inp uts));
251 backend->init(varyingHandler, v); 251 backend->init(varyingHandler, v);
252 252
253 if (hasSingleShapeType) { 253 if (hasSingleShapeType) {
254 if (kRect_ShapeFlag == ip.batchInfo().fShapeTypes) { 254 if (kRect_ShapeFlag == ip.batchInfo().fShapeTypes) {
255 backend->setupRect(v); 255 backend->setupRect(v);
256 } else if (kOval_ShapeFlag == ip.batchInfo().fShapeTypes) { 256 } else if (kOval_ShapeFlag == ip.batchInfo().fShapeTypes) {
257 backend->setupOval(v); 257 backend->setupOval(v);
258 } else { 258 } else {
259 backend->setupRRect(v); 259 backend->setupRRect(v);
260 } 260 }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 } 332 }
333 } 333 }
334 334
335 if (usedShapeTypes & kRect_ShapeFlag) { 335 if (usedShapeTypes & kRect_ShapeFlag) {
336 v->definef("RECT_SHAPE_TYPE", "%du", (int)ShapeType::kRect); 336 v->definef("RECT_SHAPE_TYPE", "%du", (int)ShapeType::kRect);
337 } 337 }
338 if (usedShapeTypes & kOval_ShapeFlag) { 338 if (usedShapeTypes & kOval_ShapeFlag) {
339 v->definef("OVAL_SHAPE_TYPE", "%du", (int)ShapeType::kOval); 339 v->definef("OVAL_SHAPE_TYPE", "%du", (int)ShapeType::kOval);
340 } 340 }
341 341
342 backend->emitCode(v, f, args.fOutputCoverage, args.fOutputColor); 342 backend->emitCode(v, f, pipeline.ignoresCoverage() ? nullptr : args.fOutputC overage,
343 args.fOutputColor);
343 344
344 const char* localCoords = nullptr; 345 const char* localCoords = nullptr;
345 if (ip.batchInfo().fUsesLocalCoords) { 346 if (ip.batchInfo().fUsesLocalCoords) {
346 localCoords = "localCoords"; 347 localCoords = "localCoords";
347 v->codeAppendf("vec2 t = 0.5 * (%s + vec2(1));", backend->outShapeCoords ()); 348 v->codeAppendf("vec2 t = 0.5 * (%s + vec2(1));", backend->outShapeCoords ());
348 v->codeAppendf("vec2 localCoords = (1.0 - t) * %s.xy + t * %s.zw;", 349 v->codeAppendf("vec2 localCoords = (1.0 - t) * %s.xy + t * %s.zw;",
349 inputs.attr(Attrib::kLocalRect), inputs.attr(Attrib::kLoc alRect)); 350 inputs.attr(Attrib::kLocalRect), inputs.attr(Attrib::kLoc alRect));
350 } 351 }
351 if (ip.batchInfo().fHasLocalMatrix && ip.batchInfo().fHasParams) { 352 if (ip.batchInfo().fHasLocalMatrix && ip.batchInfo().fHasParams) {
352 v->definef("LOCAL_MATRIX_FLAG", "0x%xu", kLocalMatrix_InfoFlag); 353 v->definef("LOCAL_MATRIX_FLAG", "0x%xu", kLocalMatrix_InfoFlag);
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 void GLSLInstanceProcessor::Backend::setupInnerRRect(GrGLSLVertexBuilder* v) { 510 void GLSLInstanceProcessor::Backend::setupInnerRRect(GrGLSLVertexBuilder* v) {
510 v->codeAppend("mat2 innerP = "); 511 v->codeAppend("mat2 innerP = ");
511 fInputs.fetchNextParam(kMat22f_GrSLType); 512 fInputs.fetchNextParam(kMat22f_GrSLType);
512 v->codeAppend(";"); 513 v->codeAppend(";");
513 v->codeAppend("vec2 innerRadii = innerP[0] * 2.0 / innerP[1];"); 514 v->codeAppend("vec2 innerRadii = innerP[0] * 2.0 / innerP[1];");
514 this->onSetupInnerRRect(v); 515 this->onSetupInnerRRect(v);
515 } 516 }
516 517
517 void GLSLInstanceProcessor::Backend::emitCode(GrGLSLVertexBuilder* v, GrGLSLPPFr agmentBuilder* f, 518 void GLSLInstanceProcessor::Backend::emitCode(GrGLSLVertexBuilder* v, GrGLSLPPFr agmentBuilder* f,
518 const char* outCoverage, const cha r* outColor) { 519 const char* outCoverage, const cha r* outColor) {
520 SkASSERT(!fModifiesCoverage || outCoverage);
519 this->onEmitCode(v, f, fModifiesCoverage ? outCoverage : nullptr, 521 this->onEmitCode(v, f, fModifiesCoverage ? outCoverage : nullptr,
520 fModifiesColor ? outColor : nullptr); 522 fModifiesColor ? outColor : nullptr);
521 if (!fModifiesCoverage) { 523 if (outCoverage && !fModifiesCoverage) {
522 // Even though the subclass doesn't use coverage, we are expected to ass ign some value. 524 // Even though the subclass doesn't use coverage, we are expected to ass ign some value.
523 f->codeAppendf("%s = vec4(1);", outCoverage); 525 f->codeAppendf("%s = vec4(1);", outCoverage);
524 } 526 }
525 if (!fModifiesColor) { 527 if (!fModifiesColor) {
526 // The subclass didn't assign a value to the output color. 528 // The subclass didn't assign a value to the output color.
527 f->codeAppendf("%s = %s;", outColor, fColor.fsIn()); 529 f->codeAppendf("%s = %s;", outColor, fColor.fsIn());
528 } 530 }
529 } 531 }
530 532
531 //////////////////////////////////////////////////////////////////////////////// //////////////////// 533 //////////////////////////////////////////////////////////////////////////////// ////////////////////
(...skipping 1122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1654 f->overrideSampleCoverage(shapeMask); 1656 f->overrideSampleCoverage(shapeMask);
1655 } 1657 }
1656 } else { 1658 } else {
1657 f->maskSampleCoverage(shapeMask, opts.fInvertCoverage); 1659 f->maskSampleCoverage(shapeMask, opts.fInvertCoverage);
1658 } 1660 }
1659 } 1661 }
1660 1662
1661 //////////////////////////////////////////////////////////////////////////////// //////////////////// 1663 //////////////////////////////////////////////////////////////////////////////// ////////////////////
1662 1664
1663 GLSLInstanceProcessor::Backend* 1665 GLSLInstanceProcessor::Backend*
1664 GLSLInstanceProcessor::Backend::Create(const GrGLSLProgramBuilder* p, BatchInfo batchInfo, 1666 GLSLInstanceProcessor::Backend::Create(const GrPipeline& pipeline, BatchInfo bat chInfo,
1665 const VertexInputs& inputs) { 1667 const VertexInputs& inputs) {
1666 switch (batchInfo.fAntialiasMode) { 1668 switch (batchInfo.fAntialiasMode) {
1667 default: 1669 default:
1668 SkFAIL("Unexpected antialias mode."); 1670 SkFAIL("Unexpected antialias mode.");
1669 case AntialiasMode::kNone: 1671 case AntialiasMode::kNone:
1670 return new BackendNonAA(batchInfo, inputs); 1672 return new BackendNonAA(batchInfo, inputs);
1671 case AntialiasMode::kCoverage: 1673 case AntialiasMode::kCoverage:
1672 return new BackendCoverage(batchInfo, inputs); 1674 return new BackendCoverage(batchInfo, inputs);
1673 case AntialiasMode::kMSAA: 1675 case AntialiasMode::kMSAA:
1674 case AntialiasMode::kMixedSamples: { 1676 case AntialiasMode::kMixedSamples: {
1675 const GrPipeline& pipeline = p->pipeline();
1676 const GrRenderTargetPriv& rtp = pipeline.getRenderTarget()->renderTa rgetPriv(); 1677 const GrRenderTargetPriv& rtp = pipeline.getRenderTarget()->renderTa rgetPriv();
1677 const GrGpu::MultisampleSpecs& specs = rtp.getMultisampleSpecs(pipel ine.getStencil()); 1678 const GrGpu::MultisampleSpecs& specs = rtp.getMultisampleSpecs(pipel ine.getStencil());
1678 return new BackendMultisample(batchInfo, inputs, specs.fEffectiveSam pleCnt); 1679 return new BackendMultisample(batchInfo, inputs, specs.fEffectiveSam pleCnt);
1679 } 1680 }
1680 } 1681 }
1681 } 1682 }
1682 1683
1683 //////////////////////////////////////////////////////////////////////////////// //////////////////// 1684 //////////////////////////////////////////////////////////////////////////////// ////////////////////
1684 1685
1685 const ShapeVertex kVertexData[] = { 1686 const ShapeVertex kVertexData[] = {
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
2093 2094
2094 case kCorneredRect_FirstIndex: return "basic_round_rect"; 2095 case kCorneredRect_FirstIndex: return "basic_round_rect";
2095 case kCorneredFramedRect_FirstIndex: return "coverage_round_rect"; 2096 case kCorneredFramedRect_FirstIndex: return "coverage_round_rect";
2096 case kCorneredRectFanned_FirstIndex: return "mixed_samples_round_rect"; 2097 case kCorneredRectFanned_FirstIndex: return "mixed_samples_round_rect";
2097 2098
2098 default: return "unknown"; 2099 default: return "unknown";
2099 } 2100 }
2100 } 2101 }
2101 2102
2102 } 2103 }
OLDNEW
« no previous file with comments | « no previous file | src/gpu/instanced/InstancedRendering.cpp » ('j') | src/gpu/instanced/InstancedRendering.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698