blob: b1c423aef7d0723aa831c86feb0cacad4bc91fb1 [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
bungeman06ca8ec2016-06-09 08:01:03 -070010#include "SkRefCnt.h"
Brian Osmanfa6d8652017-05-31 09:37:27 -040011#include "glsl/GrGLSLColorSpaceXformHelper.h"
egdaniel2d721d32015-11-11 13:06:05 -080012#include "glsl/GrGLSLFragmentShaderBuilder.h"
egdaniele659a582015-11-13 09:55:43 -080013#include "glsl/GrGLSLGeometryProcessor.h"
Chris Daltonc17bf322017-10-24 10:59:03 -060014#include "glsl/GrGLSLVertexGeoBuilder.h"
egdaniel0eafe792015-11-20 14:01:22 -080015#include "glsl/GrGLSLVarying.h"
egdaniel7ea439b2015-12-03 09:20:44 -080016#include "glsl/GrGLSLUniformHandler.h"
egdaniel64c47282015-11-13 06:54:19 -080017#include "glsl/GrGLSLUtil.h"
joshualitt4973d9d2014-11-08 09:24:25 -080018
19/*
20 * The default Geometry Processor simply takes position and multiplies it by the uniform view
21 * matrix. It also leaves coverage untouched. Behind the scenes, we may add per vertex color or
22 * local coords.
23 */
joshualittb2aa7cb2015-08-05 11:05:22 -070024
25enum GPFlag {
Brian Salomon3de0aee2017-01-29 09:34:17 -050026 kColorAttribute_GPFlag = 0x1,
27 kColorAttributeIsSkColor_GPFlag = 0x2,
28 kLocalCoordAttribute_GPFlag = 0x4,
29 kCoverageAttribute_GPFlag = 0x8,
Ruiqi Mao4ec72f72018-07-10 17:21:07 -040030 kBonesAttribute_GPFlag = 0x10,
joshualittb2aa7cb2015-08-05 11:05:22 -070031};
32
Ruiqi Mao4ec72f72018-07-10 17:21:07 -040033static constexpr int kMaxBones = 100; // Due to GPU memory limitations, only up to 100 bone
34 // matrices are accepted.
35
joshualitt4973d9d2014-11-08 09:24:25 -080036class DefaultGeoProc : public GrGeometryProcessor {
37public:
bungeman06ca8ec2016-06-09 08:01:03 -070038 static sk_sp<GrGeometryProcessor> Make(uint32_t gpTypeFlags,
Brian Salomon3de0aee2017-01-29 09:34:17 -050039 GrColor color,
Brian Osmanfa6d8652017-05-31 09:37:27 -040040 sk_sp<GrColorSpaceXform> colorSpaceXform,
Brian Salomon3de0aee2017-01-29 09:34:17 -050041 const SkMatrix& viewMatrix,
42 const SkMatrix& localMatrix,
43 bool localCoordsWillBeRead,
Ruiqi Mao4ec72f72018-07-10 17:21:07 -040044 uint8_t coverage,
45 const float* bones,
46 int boneCount) {
bungeman06ca8ec2016-06-09 08:01:03 -070047 return sk_sp<GrGeometryProcessor>(new DefaultGeoProc(
Brian Osmanfa6d8652017-05-31 09:37:27 -040048 gpTypeFlags, color, std::move(colorSpaceXform), viewMatrix, localMatrix, coverage,
Ruiqi Mao4ec72f72018-07-10 17:21:07 -040049 localCoordsWillBeRead, bones, boneCount));
joshualitt4973d9d2014-11-08 09:24:25 -080050 }
51
mtklein36352bf2015-03-25 18:17:31 -070052 const char* name() const override { return "DefaultGeometryProcessor"; }
joshualitt4973d9d2014-11-08 09:24:25 -080053
joshualitt88c23fc2015-05-13 14:18:07 -070054 GrColor color() const { return fColor; }
Brian Salomon92be2f72018-06-19 14:33:47 -040055 bool hasVertexColor() const { return fInColor.isInitialized(); }
joshualitte578a952015-05-14 10:09:13 -070056 const SkMatrix& viewMatrix() const { return fViewMatrix; }
joshualitte3ababe2015-05-15 07:56:07 -070057 const SkMatrix& localMatrix() const { return fLocalMatrix; }
bsalomon7765a472015-07-08 11:26:37 -070058 bool localCoordsWillBeRead() const { return fLocalCoordsWillBeRead; }
joshualitt9b989322014-12-15 14:16:27 -080059 uint8_t coverage() const { return fCoverage; }
Brian Salomon92be2f72018-06-19 14:33:47 -040060 bool hasVertexCoverage() const { return fInCoverage.isInitialized(); }
Ruiqi Mao4ec72f72018-07-10 17:21:07 -040061 const float* bones() const { return fBones; }
62 int boneCount() const { return fBoneCount; }
63 bool hasBones() const { return SkToBool(fBones); }
joshualitt9b989322014-12-15 14:16:27 -080064
egdaniel57d3b032015-11-13 11:57:27 -080065 class GLSLProcessor : public GrGLSLGeometryProcessor {
joshualitt4973d9d2014-11-08 09:24:25 -080066 public:
egdaniel57d3b032015-11-13 11:57:27 -080067 GLSLProcessor()
joshualitt5559ca22015-05-21 15:50:36 -070068 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage(0xff) {}
joshualitt4973d9d2014-11-08 09:24:25 -080069
mtklein36352bf2015-03-25 18:17:31 -070070 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override {
joshualitt2dd1ae02014-12-03 06:24:10 -080071 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>();
egdaniel4ca2e602015-11-18 08:01:26 -080072 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
Chris Dalton60283612018-02-14 13:38:14 -070073 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
egdaniel0eafe792015-11-20 14:01:22 -080074 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -080075 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt4973d9d2014-11-08 09:24:25 -080076
joshualittabb52a12015-01-13 15:02:10 -080077 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -080078 varyingHandler->emitAttributes(gp);
joshualitt2dd1ae02014-12-03 06:24:10 -080079
80 // Setup pass through color
Brian Salomonbfd51832017-01-04 13:22:08 -050081 if (gp.hasVertexColor()) {
Chris Dalton27372882017-12-08 13:34:21 -070082 GrGLSLVarying varying(kHalf4_GrSLType);
Brian Salomon3de0aee2017-01-29 09:34:17 -050083 varyingHandler->addVarying("color", &varying);
Brian Osmanfa6d8652017-05-31 09:37:27 -040084
85 // There are several optional steps to process the color. Start with the attribute:
Brian Salomon92be2f72018-06-19 14:33:47 -040086 vertBuilder->codeAppendf("half4 color = %s;", gp.fInColor.name());
Brian Osmanfa6d8652017-05-31 09:37:27 -040087
Brian Osman08a50e02018-06-15 15:06:48 -040088 // For SkColor, do a red/blue swap, possible color space conversion, and premul
Brian Osmanfa6d8652017-05-31 09:37:27 -040089 if (gp.fFlags & kColorAttributeIsSkColor_GPFlag) {
Brian Osman08a50e02018-06-15 15:06:48 -040090 vertBuilder->codeAppend("color = color.bgra;");
91
92 if (gp.fColorSpaceXform) {
93 fColorSpaceHelper.emitCode(uniformHandler, gp.fColorSpaceXform.get(),
94 kVertex_GrShaderFlag);
95 SkString xformedColor;
96 vertBuilder->appendColorGamutXform(&xformedColor, "color",
97 &fColorSpaceHelper);
98 vertBuilder->codeAppendf("color = %s;", xformedColor.c_str());
99 }
100
101 vertBuilder->codeAppend("color = half4(color.rgb * color.a, color.a);");
Brian Osmanfa6d8652017-05-31 09:37:27 -0400102 }
103
Brian Osmanfa6d8652017-05-31 09:37:27 -0400104 vertBuilder->codeAppendf("%s = color;\n", varying.vsOut());
Brian Salomon3de0aee2017-01-29 09:34:17 -0500105 fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, varying.fsIn());
Brian Salomonbfd51832017-01-04 13:22:08 -0500106 } else {
107 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor,
108 &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -0700109 }
110
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400111 // Setup bone transforms
112 const char* transformedPositionName = gp.fInPosition.name();
113 if (gp.hasBones()) {
114 const char* vertBonesUniformName;
115 fBonesUniform = uniformHandler->addUniformArray(kVertex_GrShaderFlag,
116 kFloat3x3_GrSLType,
117 "Bones",
118 kMaxBones,
119 &vertBonesUniformName);
120 vertBuilder->codeAppendf(
121 "float2 transformedPosition = (%s[0] * float3(%s, 1)).xy;"
122 "float3x3 influence = float3x3(0);"
123 "for (int i = 0; i < 4; i++) {"
124 " int index = %s[i];"
125 " float weight = %s[i];"
126 " influence += %s[index] * weight;"
127 "}"
128 "transformedPosition = (influence * float3(transformedPosition, 1)).xy;",
129 vertBonesUniformName,
130 gp.fInPosition.name(),
131 gp.fInBoneIndices.name(),
132 gp.fInBoneWeights.name(),
133 vertBonesUniformName);
134 transformedPositionName = "transformedPosition";
135 }
136
joshualittabb52a12015-01-13 15:02:10 -0800137 // Setup position
Brian Salomon7f235432017-08-16 09:41:48 -0400138 this->writeOutputPosition(vertBuilder,
139 uniformHandler,
140 gpArgs,
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400141 transformedPositionName,
Brian Salomon7f235432017-08-16 09:41:48 -0400142 gp.viewMatrix(),
143 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800144
Brian Salomon92be2f72018-06-19 14:33:47 -0400145 if (gp.fInLocalCoords.isInitialized()) {
joshualittabb52a12015-01-13 15:02:10 -0800146 // emit transforms with explicit local coords
egdaniel7ea439b2015-12-03 09:20:44 -0800147 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800148 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800149 uniformHandler,
Brian Salomon92be2f72018-06-19 14:33:47 -0400150 gp.fInLocalCoords.asShaderVar(),
egdaniel4ca2e602015-11-18 08:01:26 -0800151 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700152 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800153 } else {
154 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800155 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800156 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800157 uniformHandler,
Brian Salomon92be2f72018-06-19 14:33:47 -0400158 gp.fInPosition.asShaderVar(),
egdaniel4ca2e602015-11-18 08:01:26 -0800159 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700160 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800161 }
162
joshualitt2dd1ae02014-12-03 06:24:10 -0800163 // Setup coverage as pass through
Brian Salomon8c852be2017-01-04 10:44:42 -0500164 if (gp.hasVertexCoverage()) {
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400165 fragBuilder->codeAppendf("half alpha = 1.0;");
Brian Salomon92be2f72018-06-19 14:33:47 -0400166 varyingHandler->addPassThroughAttribute(gp.fInCoverage, "alpha");
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400167 fragBuilder->codeAppendf("%s = half4(alpha);", args.fOutputCoverage);
Brian Salomon8c852be2017-01-04 10:44:42 -0500168 } else if (gp.coverage() == 0xff) {
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400169 fragBuilder->codeAppendf("%s = half4(1);", args.fOutputCoverage);
Brian Salomon8c852be2017-01-04 10:44:42 -0500170 } else {
171 const char* fragCoverage;
172 fCoverageUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400173 kHalf_GrSLType,
Brian Salomon8c852be2017-01-04 10:44:42 -0500174 "Coverage",
175 &fragCoverage);
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400176 fragBuilder->codeAppendf("%s = half4(%s);", args.fOutputCoverage, fragCoverage);
joshualitt2dd1ae02014-12-03 06:24:10 -0800177 }
joshualitt4973d9d2014-11-08 09:24:25 -0800178 }
179
joshualitt87f48d92014-12-04 10:41:40 -0800180 static inline void GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500181 const GrShaderCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800182 GrProcessorKeyBuilder* b) {
joshualitt2dd1ae02014-12-03 06:24:10 -0800183 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>();
joshualitt8fc6c2d2014-12-22 15:27:05 -0800184 uint32_t key = def.fFlags;
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400185 key |= (def.coverage() == 0xff) ? 0x20 : 0;
186 key |= (def.localCoordsWillBeRead() && def.localMatrix().hasPerspective()) ? 0x40 : 0x0;
Brian Salomon3de0aee2017-01-29 09:34:17 -0500187 key |= ComputePosKey(def.viewMatrix()) << 20;
joshualitt8fc6c2d2014-12-22 15:27:05 -0800188 b->add32(key);
Brian Osman08a50e02018-06-15 15:06:48 -0400189 b->add32(GrColorSpaceXform::XformKey(def.fColorSpaceXform.get()));
joshualitt2dd1ae02014-12-03 06:24:10 -0800190 }
joshualitt4973d9d2014-11-08 09:24:25 -0800191
egdaniel018fb622015-10-28 07:26:40 -0700192 void setData(const GrGLSLProgramDataManager& pdman,
bsalomona624bf32016-09-20 09:12:47 -0700193 const GrPrimitiveProcessor& gp,
194 FPCoordTransformIter&& transformIter) override {
joshualitte578a952015-05-14 10:09:13 -0700195 const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>();
joshualitt5559ca22015-05-21 15:50:36 -0700196
197 if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) {
198 fViewMatrix = dgp.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700199 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800200 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700201 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
202 }
joshualittee2af952014-12-30 09:04:15 -0800203
joshualittb8c241a2015-05-19 08:23:30 -0700204 if (dgp.color() != fColor && !dgp.hasVertexColor()) {
egdaniel018fb622015-10-28 07:26:40 -0700205 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700206 GrColorToRGBAFloat(dgp.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800207 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700208 fColor = dgp.color();
joshualitt9b989322014-12-15 14:16:27 -0800209 }
joshualittb8c241a2015-05-19 08:23:30 -0700210
Brian Salomon8c852be2017-01-04 10:44:42 -0500211 if (dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) {
joshualittb8c241a2015-05-19 08:23:30 -0700212 pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage()));
213 fCoverage = dgp.coverage();
joshualitt9b989322014-12-15 14:16:27 -0800214 }
bsalomona624bf32016-09-20 09:12:47 -0700215 this->setTransformDataHelper(dgp.fLocalMatrix, pdman, &transformIter);
Brian Osmanfa6d8652017-05-31 09:37:27 -0400216
Brian Osman08a50e02018-06-15 15:06:48 -0400217 fColorSpaceHelper.setData(pdman, dgp.fColorSpaceXform.get());
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400218
219 if (dgp.hasBones()) {
220 pdman.setMatrix3fv(fBonesUniform, dgp.boneCount(), dgp.bones());
221 }
joshualitte3ababe2015-05-15 07:56:07 -0700222 }
223
joshualitt4973d9d2014-11-08 09:24:25 -0800224 private:
joshualitt5559ca22015-05-21 15:50:36 -0700225 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800226 GrColor fColor;
227 uint8_t fCoverage;
joshualitt5559ca22015-05-21 15:50:36 -0700228 UniformHandle fViewMatrixUniform;
joshualitt9b989322014-12-15 14:16:27 -0800229 UniformHandle fColorUniform;
230 UniformHandle fCoverageUniform;
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400231 UniformHandle fBonesUniform;
Brian Osmanfa6d8652017-05-31 09:37:27 -0400232 GrGLSLColorSpaceXformHelper fColorSpaceHelper;
joshualitt9b989322014-12-15 14:16:27 -0800233
egdaniele659a582015-11-13 09:55:43 -0800234 typedef GrGLSLGeometryProcessor INHERITED;
joshualitt4973d9d2014-11-08 09:24:25 -0800235 };
236
Brian Salomon94efbf52016-11-29 13:43:05 -0500237 void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override {
egdaniel57d3b032015-11-13 11:57:27 -0800238 GLSLProcessor::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800239 }
240
Brian Salomon94efbf52016-11-29 13:43:05 -0500241 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override {
egdaniel57d3b032015-11-13 11:57:27 -0800242 return new GLSLProcessor();
joshualitteb2a6762014-12-04 11:35:33 -0800243 }
244
joshualitt4973d9d2014-11-08 09:24:25 -0800245private:
joshualitt8059eb92014-12-29 15:10:07 -0800246 DefaultGeoProc(uint32_t gpTypeFlags,
247 GrColor color,
Brian Osmanfa6d8652017-05-31 09:37:27 -0400248 sk_sp<GrColorSpaceXform> colorSpaceXform,
joshualitt8059eb92014-12-29 15:10:07 -0800249 const SkMatrix& viewMatrix,
250 const SkMatrix& localMatrix,
joshualittb8c241a2015-05-19 08:23:30 -0700251 uint8_t coverage,
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400252 bool localCoordsWillBeRead,
253 const float* bones,
254 int boneCount)
Ethan Nicholasabff9562017-10-09 10:54:08 -0400255 : INHERITED(kDefaultGeoProc_ClassID)
256 , fColor(color)
Brian Salomon8c852be2017-01-04 10:44:42 -0500257 , fViewMatrix(viewMatrix)
258 , fLocalMatrix(localMatrix)
259 , fCoverage(coverage)
260 , fFlags(gpTypeFlags)
Brian Osmanfa6d8652017-05-31 09:37:27 -0400261 , fLocalCoordsWillBeRead(localCoordsWillBeRead)
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400262 , fColorSpaceXform(std::move(colorSpaceXform))
263 , fBones(bones)
264 , fBoneCount(boneCount) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400265 fInPosition = {"inPosition", kFloat2_GrVertexAttribType};
266 int cnt = 1;
Brian Salomon3de0aee2017-01-29 09:34:17 -0500267 if (fFlags & kColorAttribute_GPFlag) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400268 fInColor = {"inColor", kUByte4_norm_GrVertexAttribType};
269 ++cnt;
joshualitt2dd1ae02014-12-03 06:24:10 -0800270 }
Brian Salomon3de0aee2017-01-29 09:34:17 -0500271 if (fFlags & kLocalCoordAttribute_GPFlag) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400272 fInLocalCoords = {"inLocalCoord", kFloat2_GrVertexAttribType};
273 ++cnt;
joshualitt2dd1ae02014-12-03 06:24:10 -0800274 }
Brian Salomon3de0aee2017-01-29 09:34:17 -0500275 if (fFlags & kCoverageAttribute_GPFlag) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400276 fInCoverage = {"inCoverage", kHalf_GrVertexAttribType};
277 ++cnt;
joshualitt2dd1ae02014-12-03 06:24:10 -0800278 }
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400279 if (fFlags & kBonesAttribute_GPFlag) {
280 SkASSERT(bones && (boneCount > 0));
281 fInBoneIndices = {"inBoneIndices", kInt4_GrVertexAttribType};
282 ++cnt;
283 fInBoneWeights = {"inBoneWeights", kFloat4_GrVertexAttribType};
284 ++cnt;
285 }
Brian Salomon92be2f72018-06-19 14:33:47 -0400286 this->setVertexAttributeCnt(cnt);
joshualitt2dd1ae02014-12-03 06:24:10 -0800287 }
joshualitt4973d9d2014-11-08 09:24:25 -0800288
Brian Salomon92be2f72018-06-19 14:33:47 -0400289 const Attribute& onVertexAttribute(int i) const override {
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400290 return IthInitializedAttribute(i,
291 fInPosition,
292 fInColor,
293 fInLocalCoords,
294 fInCoverage,
295 fInBoneIndices,
296 fInBoneWeights);
Brian Salomon92be2f72018-06-19 14:33:47 -0400297 }
298
299 Attribute fInPosition;
300 Attribute fInColor;
301 Attribute fInLocalCoords;
302 Attribute fInCoverage;
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400303 Attribute fInBoneIndices;
304 Attribute fInBoneWeights;
joshualitt88c23fc2015-05-13 14:18:07 -0700305 GrColor fColor;
joshualitte578a952015-05-14 10:09:13 -0700306 SkMatrix fViewMatrix;
joshualitte3ababe2015-05-15 07:56:07 -0700307 SkMatrix fLocalMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800308 uint8_t fCoverage;
joshualitt2dd1ae02014-12-03 06:24:10 -0800309 uint32_t fFlags;
bsalomon7765a472015-07-08 11:26:37 -0700310 bool fLocalCoordsWillBeRead;
Brian Osmanfa6d8652017-05-31 09:37:27 -0400311 sk_sp<GrColorSpaceXform> fColorSpaceXform;
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400312 const float* fBones;
313 int fBoneCount;
joshualitt4973d9d2014-11-08 09:24:25 -0800314
Brian Salomon0c26a9d2017-07-06 10:09:38 -0400315 GR_DECLARE_GEOMETRY_PROCESSOR_TEST
joshualitt5478d422014-11-14 16:00:38 -0800316
joshualitt2e3b3e32014-12-09 13:31:14 -0800317 typedef GrGeometryProcessor INHERITED;
joshualitt4973d9d2014-11-08 09:24:25 -0800318};
319
320GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc);
321
Hal Canary6f6961e2017-01-31 13:50:44 -0500322#if GR_TEST_UTILS
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400323static constexpr int kNumFloatsPerSkMatrix = 9;
324static constexpr int kTestBoneCount = 4;
325static constexpr float kTestBones[kTestBoneCount * kNumFloatsPerSkMatrix] = {
326 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
327 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
328 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
329 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
330};
331
bungeman06ca8ec2016-06-09 08:01:03 -0700332sk_sp<GrGeometryProcessor> DefaultGeoProc::TestCreate(GrProcessorTestData* d) {
joshualitt2dd1ae02014-12-03 06:24:10 -0800333 uint32_t flags = 0;
joshualitt0067ff52015-07-08 14:26:19 -0700334 if (d->fRandom->nextBool()) {
Brian Salomon3de0aee2017-01-29 09:34:17 -0500335 flags |= kColorAttribute_GPFlag;
joshualitt4973d9d2014-11-08 09:24:25 -0800336 }
joshualitt0067ff52015-07-08 14:26:19 -0700337 if (d->fRandom->nextBool()) {
Brian Salomon3de0aee2017-01-29 09:34:17 -0500338 flags |= kColorAttributeIsSkColor_GPFlag;
joshualitt4973d9d2014-11-08 09:24:25 -0800339 }
joshualitt0067ff52015-07-08 14:26:19 -0700340 if (d->fRandom->nextBool()) {
Brian Salomon3de0aee2017-01-29 09:34:17 -0500341 flags |= kCoverageAttribute_GPFlag;
342 }
343 if (d->fRandom->nextBool()) {
344 flags |= kLocalCoordAttribute_GPFlag;
joshualittb2aa7cb2015-08-05 11:05:22 -0700345 }
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400346 if (d->fRandom->nextBool()) {
347 flags |= kBonesAttribute_GPFlag;
348 }
joshualitt2dd1ae02014-12-03 06:24:10 -0800349
bungeman06ca8ec2016-06-09 08:01:03 -0700350 return DefaultGeoProc::Make(flags,
351 GrRandomColor(d->fRandom),
Brian Osmanfa6d8652017-05-31 09:37:27 -0400352 GrTest::TestColorXform(d->fRandom),
bungeman06ca8ec2016-06-09 08:01:03 -0700353 GrTest::TestMatrix(d->fRandom),
354 GrTest::TestMatrix(d->fRandom),
355 d->fRandom->nextBool(),
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400356 GrRandomCoverage(d->fRandom),
357 kTestBones,
358 kTestBoneCount);
joshualitt4973d9d2014-11-08 09:24:25 -0800359}
Hal Canary6f6961e2017-01-31 13:50:44 -0500360#endif
joshualitt4973d9d2014-11-08 09:24:25 -0800361
bungeman06ca8ec2016-06-09 08:01:03 -0700362sk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::Make(const Color& color,
363 const Coverage& coverage,
364 const LocalCoords& localCoords,
365 const SkMatrix& viewMatrix) {
joshualitte9d60952015-07-27 12:13:14 -0700366 uint32_t flags = 0;
Brian Salomon3de0aee2017-01-29 09:34:17 -0500367 if (Color::kPremulGrColorAttribute_Type == color.fType) {
368 flags |= kColorAttribute_GPFlag;
369 } else if (Color::kUnpremulSkColorAttribute_Type == color.fType) {
370 flags |= kColorAttribute_GPFlag | kColorAttributeIsSkColor_GPFlag;
371 }
372 flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverageAttribute_GPFlag : 0;
373 flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoordAttribute_GPFlag : 0;
joshualitte9d60952015-07-27 12:13:14 -0700374
375 uint8_t inCoverage = coverage.fCoverage;
joshualitt0d986d82015-07-28 10:01:18 -0700376 bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type;
joshualitte9d60952015-07-27 12:13:14 -0700377
378 GrColor inColor = color.fColor;
bungeman06ca8ec2016-06-09 08:01:03 -0700379 return DefaultGeoProc::Make(flags,
380 inColor,
Brian Osmanfa6d8652017-05-31 09:37:27 -0400381 color.fColorSpaceXform,
bungeman06ca8ec2016-06-09 08:01:03 -0700382 viewMatrix,
383 localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(),
384 localCoordsWillBeRead,
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400385 inCoverage,
386 nullptr,
387 0);
joshualitte9d60952015-07-27 12:13:14 -0700388}
joshualitt0d986d82015-07-28 10:01:18 -0700389
bungeman06ca8ec2016-06-09 08:01:03 -0700390sk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::MakeForDeviceSpace(
joshualitt0d986d82015-07-28 10:01:18 -0700391 const Color& color,
392 const Coverage& coverage,
393 const LocalCoords& localCoords,
394 const SkMatrix& viewMatrix) {
joshualitt0d986d82015-07-28 10:01:18 -0700395 SkMatrix invert = SkMatrix::I();
joshualittdf0c5572015-08-03 11:35:28 -0700396 if (LocalCoords::kUnused_Type != localCoords.fType) {
397 SkASSERT(LocalCoords::kUsePosition_Type == localCoords.fType);
398 if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) {
halcanary96fcdcc2015-08-27 07:41:13 -0700399 return nullptr;
joshualittdf0c5572015-08-03 11:35:28 -0700400 }
joshualitt0d986d82015-07-28 10:01:18 -0700401
joshualittdf0c5572015-08-03 11:35:28 -0700402 if (localCoords.hasLocalMatrix()) {
403 invert.preConcat(*localCoords.fMatrix);
404 }
joshualitt0d986d82015-07-28 10:01:18 -0700405 }
406
407 LocalCoords inverted(LocalCoords::kUsePosition_Type, &invert);
bungeman06ca8ec2016-06-09 08:01:03 -0700408 return Make(color, coverage, inverted, SkMatrix::I());
joshualitt0d986d82015-07-28 10:01:18 -0700409}
Ruiqi Mao4ec72f72018-07-10 17:21:07 -0400410
411sk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::MakeWithBones(const Color& color,
412 const Coverage& coverage,
413 const LocalCoords& localCoords,
414 const Bones& bones,
415 const SkMatrix& viewMatrix) {
416 uint32_t flags = 0;
417 if (Color::kPremulGrColorAttribute_Type == color.fType) {
418 flags |= kColorAttribute_GPFlag;
419 } else if (Color::kUnpremulSkColorAttribute_Type == color.fType) {
420 flags |= kColorAttribute_GPFlag | kColorAttributeIsSkColor_GPFlag;
421 }
422 flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverageAttribute_GPFlag : 0;
423 flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoordAttribute_GPFlag : 0;
424 flags |= kBonesAttribute_GPFlag;
425
426 uint8_t inCoverage = coverage.fCoverage;
427 bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type;
428
429 GrColor inColor = color.fColor;
430 return DefaultGeoProc::Make(flags,
431 inColor,
432 color.fColorSpaceXform,
433 viewMatrix,
434 localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(),
435 localCoordsWillBeRead,
436 inCoverage,
437 bones.fBones,
438 bones.fBoneCount);
439}