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

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

Issue 2182783004: Add test configs for instanced rendering (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Add test configs for instanced rendering Created 4 years, 4 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
« no previous file with comments | « src/gpu/instanced/InstanceProcessor.h ('k') | src/gpu/instanced/InstancedRendering.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
11 #include "GrRenderTargetPriv.h" 11 #include "GrRenderTargetPriv.h"
12 #include "GrResourceCache.h" 12 #include "GrResourceCache.h"
13 #include "GrResourceProvider.h" 13 #include "GrResourceProvider.h"
14 #include "glsl/GrGLSLGeometryProcessor.h" 14 #include "glsl/GrGLSLGeometryProcessor.h"
15 #include "glsl/GrGLSLFragmentShaderBuilder.h" 15 #include "glsl/GrGLSLFragmentShaderBuilder.h"
16 #include "glsl/GrGLSLProgramBuilder.h" 16 #include "glsl/GrGLSLProgramBuilder.h"
17 #include "glsl/GrGLSLVarying.h" 17 #include "glsl/GrGLSLVarying.h"
18 18
19 namespace gr_instanced { 19 namespace gr_instanced {
20 20
21 bool InstanceProcessor::IsSupported(const GrGLSLCaps& glslCaps, const GrCaps& ca ps, 21 GrCaps::InstancedSupport InstanceProcessor::CheckSupport(const GrGLSLCaps& glslC aps,
22 AntialiasMode* lastSupportedAAMode) { 22 const GrCaps& caps) {
23 if (!glslCaps.canUseAnyFunctionInShader() || 23 if (!glslCaps.canUseAnyFunctionInShader() ||
24 !glslCaps.flatInterpolationSupport() || 24 !glslCaps.flatInterpolationSupport() ||
25 !glslCaps.integerSupport() || 25 !glslCaps.integerSupport() ||
26 0 == glslCaps.maxVertexSamplers() || 26 0 == glslCaps.maxVertexSamplers() ||
27 !caps.shaderCaps()->texelBufferSupport() || 27 !caps.shaderCaps()->texelBufferSupport() ||
28 caps.maxVertexAttributes() < kNumAttribs) { 28 caps.maxVertexAttributes() < kNumAttribs) {
29 return false; 29 return GrCaps::InstancedSupport::kNone;
30 } 30 }
31 if (caps.sampleLocationsSupport() && 31 if (!caps.sampleLocationsSupport() ||
32 glslCaps.sampleVariablesSupport() && 32 !glslCaps.sampleVariablesSupport() ||
33 glslCaps.shaderDerivativeSupport()) { 33 !glslCaps.shaderDerivativeSupport()) {
34 if (0 != caps.maxRasterSamples() && 34 return GrCaps::InstancedSupport::kBasic;
35 glslCaps.sampleMaskOverrideCoverageSupport()) {
36 *lastSupportedAAMode = AntialiasMode::kMixedSamples;
37 } else {
38 *lastSupportedAAMode = AntialiasMode::kMSAA;
39 }
40 } else {
41 *lastSupportedAAMode = AntialiasMode::kCoverage;
42 } 35 }
43 return true; 36 if (0 == caps.maxRasterSamples() ||
37 !glslCaps.sampleMaskOverrideCoverageSupport()) {
38 return GrCaps::InstancedSupport::kMultisampled;
39 }
40 return GrCaps::InstancedSupport::kMixedSampled;
44 } 41 }
45 42
46 InstanceProcessor::InstanceProcessor(BatchInfo batchInfo, GrBuffer* paramsBuffer ) 43 InstanceProcessor::InstanceProcessor(BatchInfo batchInfo, GrBuffer* paramsBuffer )
47 : fBatchInfo(batchInfo) { 44 : fBatchInfo(batchInfo) {
48 this->initClassID<InstanceProcessor>(); 45 this->initClassID<InstanceProcessor>();
49 46
50 this->addVertexAttrib(Attribute("shapeCoords", kVec2f_GrVertexAttribType, kH igh_GrSLPrecision)); 47 this->addVertexAttrib(Attribute("shapeCoords", kVec2f_GrVertexAttribType, kH igh_GrSLPrecision));
51 this->addVertexAttrib(Attribute("vertexAttrs", kInt_GrVertexAttribType)); 48 this->addVertexAttrib(Attribute("vertexAttrs", kInt_GrVertexAttribType));
52 this->addVertexAttrib(Attribute("instanceInfo", kUint_GrVertexAttribType)); 49 this->addVertexAttrib(Attribute("instanceInfo", kUint_GrVertexAttribType));
53 this->addVertexAttrib(Attribute("shapeMatrixX", kVec3f_GrVertexAttribType, 50 this->addVertexAttrib(Attribute("shapeMatrixX", kVec3f_GrVertexAttribType,
(...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after
760 varyingHandler->addVarying("rectCoverage", &fRectCoverage, kLow_GrSL Precision); 757 varyingHandler->addVarying("rectCoverage", &fRectCoverage, kLow_GrSL Precision);
761 } 758 }
762 v->codeAppend("float rectCoverage = 0.0;"); 759 v->codeAppend("float rectCoverage = 0.0;");
763 } 760 }
764 if (kRect_ShapeFlag != fBatchInfo.fShapeTypes) { 761 if (kRect_ShapeFlag != fBatchInfo.fShapeTypes) {
765 varyingHandler->addFlatVarying("triangleIsArc", &fTriangleIsArc, kLow_Gr SLPrecision); 762 varyingHandler->addFlatVarying("triangleIsArc", &fTriangleIsArc, kLow_Gr SLPrecision);
766 if (!fShapeIsCircle) { 763 if (!fShapeIsCircle) {
767 varyingHandler->addVarying("ellipseCoords", &fEllipseCoords, kMedium _GrSLPrecision); 764 varyingHandler->addVarying("ellipseCoords", &fEllipseCoords, kMedium _GrSLPrecision);
768 varyingHandler->addFlatVarying("ellipseName", &fEllipseName, kHigh_G rSLPrecision); 765 varyingHandler->addFlatVarying("ellipseName", &fEllipseName, kHigh_G rSLPrecision);
769 } else { 766 } else {
770 varyingHandler->addVarying("circleCoords", &fEllipseCoords, kMedium_ GrSLPrecision); 767 varyingHandler->addVarying("circleCoords", &fEllipseCoords, kHigh_Gr SLPrecision);
771 varyingHandler->addFlatVarying("bloatedRadius", &fBloatedRadius, kMe dium_GrSLPrecision); 768 varyingHandler->addFlatVarying("bloatedRadius", &fBloatedRadius, kHi gh_GrSLPrecision);
772 } 769 }
773 } 770 }
774 } 771 }
775 772
776 void GLSLInstanceProcessor::BackendCoverage::setupRect(GrGLSLVertexBuilder* v) { 773 void GLSLInstanceProcessor::BackendCoverage::setupRect(GrGLSLVertexBuilder* v) {
777 // Make the border one pixel wide. Inner vs outer is indicated by coordAttrs . 774 // Make the border one pixel wide. Inner vs outer is indicated by coordAttrs .
778 v->codeAppendf("vec2 rectBloat = (%s != 0) ? bloat : -bloat;", 775 v->codeAppendf("vec2 rectBloat = (%s != 0) ? bloat : -bloat;",
779 fInputs.attr(Attrib::kVertexAttrs)); 776 fInputs.attr(Attrib::kVertexAttrs));
780 // Here we use the absolute value, because when the rect is thinner than a p ixel, this makes it 777 // Here we use the absolute value, because when the rect is thinner than a p ixel, this makes it
781 // mark the spot where pixel center is within half a pixel of the *opposite* edge. This, 778 // mark the spot where pixel center is within half a pixel of the *opposite* edge. This,
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
1009 f->codeAppendf("%s = %s;", outCoverage, fRectCoverage.fsIn()); 1006 f->codeAppendf("%s = %s;", outCoverage, fRectCoverage.fsIn());
1010 } else { 1007 } else {
1011 f->codeAppendf("%s = 1.0;", outCoverage); 1008 f->codeAppendf("%s = 1.0;", outCoverage);
1012 } 1009 }
1013 } 1010 }
1014 1011
1015 void GLSLInstanceProcessor::BackendCoverage::emitCircle(GrGLSLPPFragmentBuilder* f, 1012 void GLSLInstanceProcessor::BackendCoverage::emitCircle(GrGLSLPPFragmentBuilder* f,
1016 const char* outCoverage) { 1013 const char* outCoverage) {
1017 // TODO: circleCoords = max(circleCoords, 0) if we decide to do this optimiz ation on rrects. 1014 // TODO: circleCoords = max(circleCoords, 0) if we decide to do this optimiz ation on rrects.
1018 SkASSERT(!(kRRect_ShapesMask & fBatchInfo.fShapeTypes)); 1015 SkASSERT(!(kRRect_ShapesMask & fBatchInfo.fShapeTypes));
1019 f->appendPrecisionModifier(kLow_GrSLPrecision); 1016 f->appendPrecisionModifier(kMedium_GrSLPrecision);
1020 f->codeAppendf("float distanceToEdge = %s - length(%s);", 1017 f->codeAppendf("float distanceToEdge = %s - length(%s);",
1021 fBloatedRadius.fsIn(), fEllipseCoords.fsIn()); 1018 fBloatedRadius.fsIn(), fEllipseCoords.fsIn());
1022 f->codeAppendf("%s = clamp(distanceToEdge, 0.0, 1.0);", outCoverage); 1019 f->codeAppendf("%s = clamp(distanceToEdge, 0.0, 1.0);", outCoverage);
1023 } 1020 }
1024 1021
1025 void GLSLInstanceProcessor::BackendCoverage::emitArc(GrGLSLPPFragmentBuilder* f, 1022 void GLSLInstanceProcessor::BackendCoverage::emitArc(GrGLSLPPFragmentBuilder* f,
1026 const char* ellipseCoords, 1023 const char* ellipseCoords,
1027 const char* ellipseName, 1024 const char* ellipseName,
1028 bool ellipseCoordsNeedClamp , 1025 bool ellipseCoordsNeedClamp ,
1029 bool ellipseCoordsMayBeNega tive, 1026 bool ellipseCoordsMayBeNega tive,
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
1400 if (!this->isMixedSampled()) { 1397 if (!this->isMixedSampled()) {
1401 SkASSERT(!fArcTest.fsIn()); 1398 SkASSERT(!fArcTest.fsIn());
1402 if (fTriangleIsArc.fsIn()) { 1399 if (fTriangleIsArc.fsIn()) {
1403 f->codeAppendf("if (%s != 0) {", fTriangleIsArc.fsIn()); 1400 f->codeAppendf("if (%s != 0) {", fTriangleIsArc.fsIn());
1404 this->emitArc(f, arcCoords, false, clampArcCoords, opts); 1401 this->emitArc(f, arcCoords, false, clampArcCoords, opts);
1405 1402
1406 f->codeAppend ("}"); 1403 f->codeAppend ("}");
1407 } 1404 }
1408 } else { 1405 } else {
1409 const char* arcTest = fArcTest.fsIn(); 1406 const char* arcTest = fArcTest.fsIn();
1410 SkASSERT(arcTest); 1407 if (arcTest && fBatchInfo.fHasPerspective) {
1411 if (fBatchInfo.fHasPerspective) { 1408 // The non-perspective version accounts for fwidth() in the vertex s hader.
1412 // The non-perspective version accounts for fwith() in the vertex sh ader.
1413 // We make sure to take the derivative here, before a neighbor pixel may early accept. 1409 // We make sure to take the derivative here, before a neighbor pixel may early accept.
1414 f->enableFeature(GrGLSLPPFragmentBuilder::kStandardDerivatives_GLSLF eature); 1410 f->enableFeature(GrGLSLPPFragmentBuilder::kStandardDerivatives_GLSLF eature);
1415 f->appendPrecisionModifier(kHigh_GrSLPrecision); 1411 f->appendPrecisionModifier(kHigh_GrSLPrecision);
1416 f->codeAppendf("vec2 arcTest = %s - 0.5 * fwidth(%s);", 1412 f->codeAppendf("vec2 arcTest = %s - 0.5 * fwidth(%s);",
1417 fArcTest.fsIn(), fArcTest.fsIn()); 1413 fArcTest.fsIn(), fArcTest.fsIn());
1418 arcTest = "arcTest"; 1414 arcTest = "arcTest";
1419 } 1415 }
1420 const char* earlyAccept = fEarlyAccept.fsIn() ? fEarlyAccept.fsIn() : "S AMPLE_MASK_ALL"; 1416 const char* earlyAccept = fEarlyAccept.fsIn() ? fEarlyAccept.fsIn() : "S AMPLE_MASK_ALL";
1421 f->codeAppendf("if (gl_SampleMaskIn[0] == %s) {", earlyAccept); 1417 f->codeAppendf("if (gl_SampleMaskIn[0] == %s) {", earlyAccept);
1422 f->overrideSampleCoverage(earlyAccept); 1418 f->overrideSampleCoverage(earlyAccept);
(...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after
2117 2113
2118 case kCorneredRect_FirstIndex: return "basic_round_rect"; 2114 case kCorneredRect_FirstIndex: return "basic_round_rect";
2119 case kCorneredFramedRect_FirstIndex: return "coverage_round_rect"; 2115 case kCorneredFramedRect_FirstIndex: return "coverage_round_rect";
2120 case kCorneredRectFanned_FirstIndex: return "mixed_samples_round_rect"; 2116 case kCorneredRectFanned_FirstIndex: return "mixed_samples_round_rect";
2121 2117
2122 default: return "unknown"; 2118 default: return "unknown";
2123 } 2119 }
2124 } 2120 }
2125 2121
2126 } 2122 }
OLDNEW
« no previous file with comments | « src/gpu/instanced/InstanceProcessor.h ('k') | src/gpu/instanced/InstancedRendering.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698