OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |