blob: 027296c7ac008c18e91196a420cf3760c844769a [file] [log] [blame]
joshualitt4973d9d2014-11-08 09:24:25 -08001/*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "GrDefaultGeoProcFactory.h"
9
Ruiqi Maob609e6d2018-07-17 10:19:38 -040010#include "GrCaps.h"
bungeman06ca8ec2016-06-09 08:01:03 -070011#include "SkRefCnt.h"
Brian Osmanfa6d8652017-05-31 09:37:27 -040012#include "glsl/GrGLSLColorSpaceXformHelper.h"
egdaniel2d721d32015-11-11 13:06:05 -080013#include "glsl/GrGLSLFragmentShaderBuilder.h"
egdaniele659a582015-11-13 09:55:43 -080014#include "glsl/GrGLSLGeometryProcessor.h"
Chris Daltonc17bf322017-10-24 10:59:03 -060015#include "glsl/GrGLSLVertexGeoBuilder.h"
egdaniel0eafe792015-11-20 14:01:22 -080016#include "glsl/GrGLSLVarying.h"
egdaniel7ea439b2015-12-03 09:20:44 -080017#include "glsl/GrGLSLUniformHandler.h"
egdaniel64c47282015-11-13 06:54:19 -080018#include "glsl/GrGLSLUtil.h"
joshualitt4973d9d2014-11-08 09:24:25 -080019
20/*
21 * The default Geometry Processor simply takes position and multiplies it by the uniform view
22 * matrix. It also leaves coverage untouched. Behind the scenes, we may add per vertex color or
23 * local coords.
24 */
joshualittb2aa7cb2015-08-05 11:05:22 -070025
26enum GPFlag {
Brian Salomon3de0aee2017-01-29 09:34:17 -050027 kColorAttribute_GPFlag = 0x1,
28 kColorAttributeIsSkColor_GPFlag = 0x2,
29 kLocalCoordAttribute_GPFlag = 0x4,
30 kCoverageAttribute_GPFlag = 0x8,
Ruiqi Mao4ec72f72018-07-10 17:21:07 -040031 kBonesAttribute_GPFlag = 0x10,
joshualittb2aa7cb2015-08-05 11:05:22 -070032};
33
Ruiqi Maob609e6d2018-07-17 10:19:38 -040034static constexpr int kMaxBones = 80; // Due to GPU memory limitations, only up to 80 bone
35 // matrices are accepted.
Ruiqi Mao4ec72f72018-07-10 17:21:07 -040036
joshualitt4973d9d2014-11-08 09:24:25 -080037class DefaultGeoProc : public GrGeometryProcessor {
38public:
Ruiqi Maob609e6d2018-07-17 10:19:38 -040039 static sk_sp<GrGeometryProcessor> Make(const GrShaderCaps* shaderCaps,
40 uint32_t gpTypeFlags,
Brian Salomon3de0aee2017-01-29 09:34:17 -050041 GrColor color,
Brian Osmanfa6d8652017-05-31 09:37:27 -040042 sk_sp<GrColorSpaceXform> colorSpaceXform,
Brian Salomon3de0aee2017-01-29 09:34:17 -050043 const SkMatrix& viewMatrix,
44 const SkMatrix& localMatrix,
45 bool localCoordsWillBeRead,
Ruiqi Mao4ec72f72018-07-10 17:21:07 -040046 uint8_t coverage,
47 const float* bones,
48 int boneCount) {
bungeman06ca8ec2016-06-09 08:01:03 -070049 return sk_sp<GrGeometryProcessor>(new DefaultGeoProc(
Ruiqi Maob609e6d2018-07-17 10:19:38 -040050 shaderCaps, gpTypeFlags, color, std::move(colorSpaceXform), viewMatrix, localMatrix,
51 coverage, localCoordsWillBeRead, bones, boneCount));
joshualitt4973d9d2014-11-08 09:24:25 -080052 }
53
mtklein36352bf2015-03-25 18:17:31 -070054 const char* name() const override { return "DefaultGeometryProcessor"; }
joshualitt4973d9d2014-11-08 09:24:25 -080055
joshualitt88c23fc2015-05-13 14:18:07 -070056 GrColor color() const { return fColor; }
Brian Salomon92be2f72018-06-19 14:33:47 -040057 bool hasVertexColor() const { return fInColor.isInitialized(); }
joshualitte578a952015-05-14 10:09:13 -070058 const SkMatrix& viewMatrix() const { return fViewMatrix; }
joshualitte3ababe2015-05-15 07:56:07 -070059 const SkMatrix& localMatrix() const { return fLocalMatrix; }
bsalomon7765a472015-07-08 11:26:37 -070060 bool localCoordsWillBeRead() const { return fLocalCoordsWillBeRead; }
joshualitt9b989322014-12-15 14:16:27 -080061 uint8_t coverage() const { return fCoverage; }
Brian Salomon92be2f72018-06-19 14:33:47 -040062 bool hasVertexCoverage() const { return fInCoverage.isInitialized(); }
Ruiqi Mao4ec72f72018-07-10 17:21:07 -040063 const float* bones() const { return fBones; }
64 int boneCount() const { return fBoneCount; }
65 bool hasBones() const { return SkToBool(fBones); }
joshualitt9b989322014-12-15 14:16:27 -080066
egdaniel57d3b032015-11-13 11:57:27 -080067 class GLSLProcessor : public GrGLSLGeometryProcessor {
joshualitt4973d9d2014-11-08 09:24:25 -080068 public:
egdaniel57d3b032015-11-13 11:57:27 -080069 GLSLProcessor()
joshualitt5559ca22015-05-21 15:50:36 -070070 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage(0xff) {}
joshualitt4973d9d2014-11-08 09:24:25 -080071
mtklein36352bf2015-03-25 18:17:31 -070072 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override {
joshualitt2dd1ae02014-12-03 06:24:10 -080073 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>();
egdaniel4ca2e602015-11-18 08:01:26 -080074 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
Chris Dalton60283612018-02-14 13:38:14 -070075 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
egdaniel0eafe792015-11-20 14:01:22 -080076 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -080077 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt4973d9d2014-11-08 09:24:25 -080078
joshualittabb52a12015-01-13 15:02:10 -080079 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -080080 varyingHandler->emitAttributes(gp);
joshualitt2dd1ae02014-12-03 06:24:10 -080081
82 // Setup pass through color
Brian Salomonbfd51832017-01-04 13:22:08 -050083 if (gp.hasVertexColor()) {
Chris Dalton27372882017-12-08 13:34:21 -070084 GrGLSLVarying varying(kHalf4_GrSLType);
Brian Salomon3de0aee2017-01-29 09:34:17 -050085 varyingHandler->addVarying("color", &varying);
Brian Osmanfa6d8652017-05-31 09:37:27 -040086
87 // There are several optional steps to process the color. Start with the attribute:
Brian Salomon92be2f72018-06-19 14:33:47 -040088 vertBuilder->codeAppendf("half4 color = %s;", gp.fInColor.name());
Brian Osmanfa6d8652017-05-31 09:37:27 -040089
Brian Osman08a50e02018-06-15 15:06:48 -040090 // For SkColor, do a red/blue swap, possible color space conversion, and premul
Brian Osmanfa6d8652017-05-31 09:37:27 -040091 if (gp.fFlags & kColorAttributeIsSkColor_GPFlag) {
Brian Osman08a50e02018-06-15 15:06:48 -040092 vertBuilder->codeAppend("color = color.bgra;");
93
94 if (gp.fColorSpaceXform) {
95 fColorSpaceHelper.emitCode(uniformHandler, gp.fColorSpaceXform.get(),
96 kVertex_GrShaderFlag);
97 SkString xformedColor;
98 vertBuilder->appendColorGamutXform(&xformedColor, "color",
99 &fColorSpaceHelper);
100 vertBuilder->codeAppendf("color = %s;", xformedColor.c_str());
101 }
102
103 vertBuilder->codeAppend("color = half4(color.rgb * color.a, color.a);");
Brian Osmanfa6d8652017-05-31 09:37:27 -0400104 }
105
Brian Osmanfa6d8652017-05-31 09:37:27 -0400106 vertBuilder->codeAppendf("%s = color;\n", varying.vsOut());
Brian Salomon3de0aee2017-01-29 09:34:17 -0500107 fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, varying.fsIn());
Brian Salomonbfd51832017-01-04 13:22:08 -0500108 } else {
109 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor,
110 &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -0700111 }
112
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400113 // Setup bone transforms
114 const char* transformedPositionName = gp.fInPosition.name();
115 if (gp.hasBones()) {
116 const char* vertBonesUniformName;
117 fBonesUniform = uniformHandler->addUniformArray(kVertex_GrShaderFlag,
118 kFloat3x3_GrSLType,
119 "Bones",
120 kMaxBones,
121 &vertBonesUniformName);
122 vertBuilder->codeAppendf(
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400123 "float3 originalPosition = %s[0] * float3(%s, 1);"
124 "float2 transformedPosition = float2(0);"
125 "for (int i = 0; i < 4; i++) {",
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400126 vertBonesUniformName,
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400127 gp.fInPosition.name());
128
129 if (args.fShaderCaps->unsignedSupport()) {
130 vertBuilder->codeAppendf(
131 " byte index = %s[i];",
132 gp.fInBoneIndices.name());
133 } else {
134 vertBuilder->codeAppendf(
135 " byte index = byte(floor(%s[i] * 255 + 0.5));",
136 gp.fInBoneIndices.name());
137 }
138
139 vertBuilder->codeAppendf(
140 " float weight = %s[i];"
141 " transformedPosition += (%s[index] * originalPosition * weight).xy;"
142 "}",
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400143 gp.fInBoneWeights.name(),
144 vertBonesUniformName);
145 transformedPositionName = "transformedPosition";
146 }
147
joshualittabb52a12015-01-13 15:02:10 -0800148 // Setup position
Brian Salomon7f235432017-08-16 09:41:48 -0400149 this->writeOutputPosition(vertBuilder,
150 uniformHandler,
151 gpArgs,
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400152 transformedPositionName,
Brian Salomon7f235432017-08-16 09:41:48 -0400153 gp.viewMatrix(),
154 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800155
Brian Salomon92be2f72018-06-19 14:33:47 -0400156 if (gp.fInLocalCoords.isInitialized()) {
joshualittabb52a12015-01-13 15:02:10 -0800157 // emit transforms with explicit local coords
egdaniel7ea439b2015-12-03 09:20:44 -0800158 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800159 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800160 uniformHandler,
Brian Salomon92be2f72018-06-19 14:33:47 -0400161 gp.fInLocalCoords.asShaderVar(),
egdaniel4ca2e602015-11-18 08:01:26 -0800162 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700163 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800164 } else {
165 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800166 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800167 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800168 uniformHandler,
Brian Salomon92be2f72018-06-19 14:33:47 -0400169 gp.fInPosition.asShaderVar(),
egdaniel4ca2e602015-11-18 08:01:26 -0800170 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700171 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800172 }
173
joshualitt2dd1ae02014-12-03 06:24:10 -0800174 // Setup coverage as pass through
Brian Salomon8c852be2017-01-04 10:44:42 -0500175 if (gp.hasVertexCoverage()) {
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400176 fragBuilder->codeAppendf("half alpha = 1.0;");
Brian Salomon92be2f72018-06-19 14:33:47 -0400177 varyingHandler->addPassThroughAttribute(gp.fInCoverage, "alpha");
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400178 fragBuilder->codeAppendf("%s = half4(alpha);", args.fOutputCoverage);
Brian Salomon8c852be2017-01-04 10:44:42 -0500179 } else if (gp.coverage() == 0xff) {
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400180 fragBuilder->codeAppendf("%s = half4(1);", args.fOutputCoverage);
Brian Salomon8c852be2017-01-04 10:44:42 -0500181 } else {
182 const char* fragCoverage;
183 fCoverageUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400184 kHalf_GrSLType,
Brian Salomon8c852be2017-01-04 10:44:42 -0500185 "Coverage",
186 &fragCoverage);
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400187 fragBuilder->codeAppendf("%s = half4(%s);", args.fOutputCoverage, fragCoverage);
joshualitt2dd1ae02014-12-03 06:24:10 -0800188 }
joshualitt4973d9d2014-11-08 09:24:25 -0800189 }
190
joshualitt87f48d92014-12-04 10:41:40 -0800191 static inline void GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500192 const GrShaderCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800193 GrProcessorKeyBuilder* b) {
joshualitt2dd1ae02014-12-03 06:24:10 -0800194 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>();
joshualitt8fc6c2d2014-12-22 15:27:05 -0800195 uint32_t key = def.fFlags;
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400196 key |= (def.coverage() == 0xff) ? 0x20 : 0;
197 key |= (def.localCoordsWillBeRead() && def.localMatrix().hasPerspective()) ? 0x40 : 0x0;
Brian Salomon3de0aee2017-01-29 09:34:17 -0500198 key |= ComputePosKey(def.viewMatrix()) << 20;
joshualitt8fc6c2d2014-12-22 15:27:05 -0800199 b->add32(key);
Brian Osman08a50e02018-06-15 15:06:48 -0400200 b->add32(GrColorSpaceXform::XformKey(def.fColorSpaceXform.get()));
joshualitt2dd1ae02014-12-03 06:24:10 -0800201 }
joshualitt4973d9d2014-11-08 09:24:25 -0800202
egdaniel018fb622015-10-28 07:26:40 -0700203 void setData(const GrGLSLProgramDataManager& pdman,
bsalomona624bf32016-09-20 09:12:47 -0700204 const GrPrimitiveProcessor& gp,
205 FPCoordTransformIter&& transformIter) override {
joshualitte578a952015-05-14 10:09:13 -0700206 const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>();
joshualitt5559ca22015-05-21 15:50:36 -0700207
208 if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) {
209 fViewMatrix = dgp.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700210 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800211 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700212 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
213 }
joshualittee2af952014-12-30 09:04:15 -0800214
joshualittb8c241a2015-05-19 08:23:30 -0700215 if (dgp.color() != fColor && !dgp.hasVertexColor()) {
egdaniel018fb622015-10-28 07:26:40 -0700216 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700217 GrColorToRGBAFloat(dgp.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800218 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700219 fColor = dgp.color();
joshualitt9b989322014-12-15 14:16:27 -0800220 }
joshualittb8c241a2015-05-19 08:23:30 -0700221
Brian Salomon8c852be2017-01-04 10:44:42 -0500222 if (dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) {
joshualittb8c241a2015-05-19 08:23:30 -0700223 pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage()));
224 fCoverage = dgp.coverage();
joshualitt9b989322014-12-15 14:16:27 -0800225 }
bsalomona624bf32016-09-20 09:12:47 -0700226 this->setTransformDataHelper(dgp.fLocalMatrix, pdman, &transformIter);
Brian Osmanfa6d8652017-05-31 09:37:27 -0400227
Brian Osman08a50e02018-06-15 15:06:48 -0400228 fColorSpaceHelper.setData(pdman, dgp.fColorSpaceXform.get());
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400229
230 if (dgp.hasBones()) {
231 pdman.setMatrix3fv(fBonesUniform, dgp.boneCount(), dgp.bones());
232 }
joshualitte3ababe2015-05-15 07:56:07 -0700233 }
234
joshualitt4973d9d2014-11-08 09:24:25 -0800235 private:
joshualitt5559ca22015-05-21 15:50:36 -0700236 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800237 GrColor fColor;
238 uint8_t fCoverage;
joshualitt5559ca22015-05-21 15:50:36 -0700239 UniformHandle fViewMatrixUniform;
joshualitt9b989322014-12-15 14:16:27 -0800240 UniformHandle fColorUniform;
241 UniformHandle fCoverageUniform;
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400242 UniformHandle fBonesUniform;
Brian Osmanfa6d8652017-05-31 09:37:27 -0400243 GrGLSLColorSpaceXformHelper fColorSpaceHelper;
joshualitt9b989322014-12-15 14:16:27 -0800244
egdaniele659a582015-11-13 09:55:43 -0800245 typedef GrGLSLGeometryProcessor INHERITED;
joshualitt4973d9d2014-11-08 09:24:25 -0800246 };
247
Brian Salomon94efbf52016-11-29 13:43:05 -0500248 void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override {
egdaniel57d3b032015-11-13 11:57:27 -0800249 GLSLProcessor::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800250 }
251
Brian Salomon94efbf52016-11-29 13:43:05 -0500252 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override {
egdaniel57d3b032015-11-13 11:57:27 -0800253 return new GLSLProcessor();
joshualitteb2a6762014-12-04 11:35:33 -0800254 }
255
joshualitt4973d9d2014-11-08 09:24:25 -0800256private:
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400257 DefaultGeoProc(const GrShaderCaps* shaderCaps,
258 uint32_t gpTypeFlags,
joshualitt8059eb92014-12-29 15:10:07 -0800259 GrColor color,
Brian Osmanfa6d8652017-05-31 09:37:27 -0400260 sk_sp<GrColorSpaceXform> colorSpaceXform,
joshualitt8059eb92014-12-29 15:10:07 -0800261 const SkMatrix& viewMatrix,
262 const SkMatrix& localMatrix,
joshualittb8c241a2015-05-19 08:23:30 -0700263 uint8_t coverage,
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400264 bool localCoordsWillBeRead,
265 const float* bones,
266 int boneCount)
Ethan Nicholasabff9562017-10-09 10:54:08 -0400267 : INHERITED(kDefaultGeoProc_ClassID)
268 , fColor(color)
Brian Salomon8c852be2017-01-04 10:44:42 -0500269 , fViewMatrix(viewMatrix)
270 , fLocalMatrix(localMatrix)
271 , fCoverage(coverage)
272 , fFlags(gpTypeFlags)
Brian Osmanfa6d8652017-05-31 09:37:27 -0400273 , fLocalCoordsWillBeRead(localCoordsWillBeRead)
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400274 , fColorSpaceXform(std::move(colorSpaceXform))
275 , fBones(bones)
276 , fBoneCount(boneCount) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400277 fInPosition = {"inPosition", kFloat2_GrVertexAttribType};
278 int cnt = 1;
Brian Salomon3de0aee2017-01-29 09:34:17 -0500279 if (fFlags & kColorAttribute_GPFlag) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400280 fInColor = {"inColor", kUByte4_norm_GrVertexAttribType};
281 ++cnt;
joshualitt2dd1ae02014-12-03 06:24:10 -0800282 }
Brian Salomon3de0aee2017-01-29 09:34:17 -0500283 if (fFlags & kLocalCoordAttribute_GPFlag) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400284 fInLocalCoords = {"inLocalCoord", kFloat2_GrVertexAttribType};
285 ++cnt;
joshualitt2dd1ae02014-12-03 06:24:10 -0800286 }
Brian Salomon3de0aee2017-01-29 09:34:17 -0500287 if (fFlags & kCoverageAttribute_GPFlag) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400288 fInCoverage = {"inCoverage", kHalf_GrVertexAttribType};
289 ++cnt;
joshualitt2dd1ae02014-12-03 06:24:10 -0800290 }
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400291 if (fFlags & kBonesAttribute_GPFlag) {
292 SkASSERT(bones && (boneCount > 0));
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400293 // GLSL 1.10 and 1.20 don't support integer attributes.
294 GrVertexAttribType indicesAttribType =
295 shaderCaps->unsignedSupport() ? kByte4_GrVertexAttribType :
296 kUByte4_norm_GrVertexAttribType;
297 fInBoneIndices = {"inBoneIndices", indicesAttribType};
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400298 ++cnt;
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400299 fInBoneWeights = {"inBoneWeights", kUByte4_norm_GrVertexAttribType};
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400300 ++cnt;
301 }
Brian Salomon92be2f72018-06-19 14:33:47 -0400302 this->setVertexAttributeCnt(cnt);
joshualitt2dd1ae02014-12-03 06:24:10 -0800303 }
joshualitt4973d9d2014-11-08 09:24:25 -0800304
Brian Salomon92be2f72018-06-19 14:33:47 -0400305 const Attribute& onVertexAttribute(int i) const override {
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400306 return IthInitializedAttribute(i,
307 fInPosition,
308 fInColor,
309 fInLocalCoords,
310 fInCoverage,
311 fInBoneIndices,
312 fInBoneWeights);
Brian Salomon92be2f72018-06-19 14:33:47 -0400313 }
314
315 Attribute fInPosition;
316 Attribute fInColor;
317 Attribute fInLocalCoords;
318 Attribute fInCoverage;
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400319 Attribute fInBoneIndices;
320 Attribute fInBoneWeights;
joshualitt88c23fc2015-05-13 14:18:07 -0700321 GrColor fColor;
joshualitte578a952015-05-14 10:09:13 -0700322 SkMatrix fViewMatrix;
joshualitte3ababe2015-05-15 07:56:07 -0700323 SkMatrix fLocalMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800324 uint8_t fCoverage;
joshualitt2dd1ae02014-12-03 06:24:10 -0800325 uint32_t fFlags;
bsalomon7765a472015-07-08 11:26:37 -0700326 bool fLocalCoordsWillBeRead;
Brian Osmanfa6d8652017-05-31 09:37:27 -0400327 sk_sp<GrColorSpaceXform> fColorSpaceXform;
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400328 const float* fBones;
329 int fBoneCount;
joshualitt4973d9d2014-11-08 09:24:25 -0800330
Brian Salomon0c26a9d2017-07-06 10:09:38 -0400331 GR_DECLARE_GEOMETRY_PROCESSOR_TEST
joshualitt5478d422014-11-14 16:00:38 -0800332
joshualitt2e3b3e32014-12-09 13:31:14 -0800333 typedef GrGeometryProcessor INHERITED;
joshualitt4973d9d2014-11-08 09:24:25 -0800334};
335
336GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc);
337
Hal Canary6f6961e2017-01-31 13:50:44 -0500338#if GR_TEST_UTILS
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400339static constexpr int kNumFloatsPerSkMatrix = 9;
340static constexpr int kTestBoneCount = 4;
341static constexpr float kTestBones[kTestBoneCount * kNumFloatsPerSkMatrix] = {
342 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
343 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
344 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
345 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
346};
347
bungeman06ca8ec2016-06-09 08:01:03 -0700348sk_sp<GrGeometryProcessor> DefaultGeoProc::TestCreate(GrProcessorTestData* d) {
joshualitt2dd1ae02014-12-03 06:24:10 -0800349 uint32_t flags = 0;
joshualitt0067ff52015-07-08 14:26:19 -0700350 if (d->fRandom->nextBool()) {
Brian Salomon3de0aee2017-01-29 09:34:17 -0500351 flags |= kColorAttribute_GPFlag;
joshualitt4973d9d2014-11-08 09:24:25 -0800352 }
joshualitt0067ff52015-07-08 14:26:19 -0700353 if (d->fRandom->nextBool()) {
Brian Salomon3de0aee2017-01-29 09:34:17 -0500354 flags |= kColorAttributeIsSkColor_GPFlag;
joshualitt4973d9d2014-11-08 09:24:25 -0800355 }
joshualitt0067ff52015-07-08 14:26:19 -0700356 if (d->fRandom->nextBool()) {
Brian Salomon3de0aee2017-01-29 09:34:17 -0500357 flags |= kCoverageAttribute_GPFlag;
358 }
359 if (d->fRandom->nextBool()) {
360 flags |= kLocalCoordAttribute_GPFlag;
joshualittb2aa7cb2015-08-05 11:05:22 -0700361 }
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400362 if (d->fRandom->nextBool()) {
363 flags |= kBonesAttribute_GPFlag;
364 }
joshualitt2dd1ae02014-12-03 06:24:10 -0800365
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400366 return DefaultGeoProc::Make(d->caps()->shaderCaps(),
367 flags,
bungeman06ca8ec2016-06-09 08:01:03 -0700368 GrRandomColor(d->fRandom),
Brian Osmanfa6d8652017-05-31 09:37:27 -0400369 GrTest::TestColorXform(d->fRandom),
bungeman06ca8ec2016-06-09 08:01:03 -0700370 GrTest::TestMatrix(d->fRandom),
371 GrTest::TestMatrix(d->fRandom),
372 d->fRandom->nextBool(),
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400373 GrRandomCoverage(d->fRandom),
374 kTestBones,
375 kTestBoneCount);
joshualitt4973d9d2014-11-08 09:24:25 -0800376}
Hal Canary6f6961e2017-01-31 13:50:44 -0500377#endif
joshualitt4973d9d2014-11-08 09:24:25 -0800378
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400379sk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::Make(const GrShaderCaps* shaderCaps,
380 const Color& color,
bungeman06ca8ec2016-06-09 08:01:03 -0700381 const Coverage& coverage,
382 const LocalCoords& localCoords,
383 const SkMatrix& viewMatrix) {
joshualitte9d60952015-07-27 12:13:14 -0700384 uint32_t flags = 0;
Brian Salomon3de0aee2017-01-29 09:34:17 -0500385 if (Color::kPremulGrColorAttribute_Type == color.fType) {
386 flags |= kColorAttribute_GPFlag;
387 } else if (Color::kUnpremulSkColorAttribute_Type == color.fType) {
388 flags |= kColorAttribute_GPFlag | kColorAttributeIsSkColor_GPFlag;
389 }
390 flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverageAttribute_GPFlag : 0;
391 flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoordAttribute_GPFlag : 0;
joshualitte9d60952015-07-27 12:13:14 -0700392
393 uint8_t inCoverage = coverage.fCoverage;
joshualitt0d986d82015-07-28 10:01:18 -0700394 bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type;
joshualitte9d60952015-07-27 12:13:14 -0700395
396 GrColor inColor = color.fColor;
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400397 return DefaultGeoProc::Make(shaderCaps,
398 flags,
bungeman06ca8ec2016-06-09 08:01:03 -0700399 inColor,
Brian Osmanfa6d8652017-05-31 09:37:27 -0400400 color.fColorSpaceXform,
bungeman06ca8ec2016-06-09 08:01:03 -0700401 viewMatrix,
402 localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(),
403 localCoordsWillBeRead,
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400404 inCoverage,
405 nullptr,
406 0);
joshualitte9d60952015-07-27 12:13:14 -0700407}
joshualitt0d986d82015-07-28 10:01:18 -0700408
bungeman06ca8ec2016-06-09 08:01:03 -0700409sk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::MakeForDeviceSpace(
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400410 const GrShaderCaps* shaderCaps,
joshualitt0d986d82015-07-28 10:01:18 -0700411 const Color& color,
412 const Coverage& coverage,
413 const LocalCoords& localCoords,
414 const SkMatrix& viewMatrix) {
joshualitt0d986d82015-07-28 10:01:18 -0700415 SkMatrix invert = SkMatrix::I();
joshualittdf0c5572015-08-03 11:35:28 -0700416 if (LocalCoords::kUnused_Type != localCoords.fType) {
417 SkASSERT(LocalCoords::kUsePosition_Type == localCoords.fType);
418 if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) {
halcanary96fcdcc2015-08-27 07:41:13 -0700419 return nullptr;
joshualittdf0c5572015-08-03 11:35:28 -0700420 }
joshualitt0d986d82015-07-28 10:01:18 -0700421
joshualittdf0c5572015-08-03 11:35:28 -0700422 if (localCoords.hasLocalMatrix()) {
423 invert.preConcat(*localCoords.fMatrix);
424 }
joshualitt0d986d82015-07-28 10:01:18 -0700425 }
426
427 LocalCoords inverted(LocalCoords::kUsePosition_Type, &invert);
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400428 return Make(shaderCaps, color, coverage, inverted, SkMatrix::I());
joshualitt0d986d82015-07-28 10:01:18 -0700429}
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400430
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400431sk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::MakeWithBones(const GrShaderCaps* shaderCaps,
432 const Color& color,
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400433 const Coverage& coverage,
434 const LocalCoords& localCoords,
435 const Bones& bones,
436 const SkMatrix& viewMatrix) {
437 uint32_t flags = 0;
438 if (Color::kPremulGrColorAttribute_Type == color.fType) {
439 flags |= kColorAttribute_GPFlag;
440 } else if (Color::kUnpremulSkColorAttribute_Type == color.fType) {
441 flags |= kColorAttribute_GPFlag | kColorAttributeIsSkColor_GPFlag;
442 }
443 flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverageAttribute_GPFlag : 0;
444 flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoordAttribute_GPFlag : 0;
445 flags |= kBonesAttribute_GPFlag;
446
447 uint8_t inCoverage = coverage.fCoverage;
448 bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type;
449
450 GrColor inColor = color.fColor;
Ruiqi Maob609e6d2018-07-17 10:19:38 -0400451 return DefaultGeoProc::Make(shaderCaps,
452 flags,
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400453 inColor,
454 color.fColorSpaceXform,
455 viewMatrix,
456 localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(),
457 localCoordsWillBeRead,
458 inCoverage,
459 bones.fBones,
460 bones.fBoneCount);
461}