| 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 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 | 100 |
| 101 class GLSLInstanceProcessor::VertexInputs { | 101 class GLSLInstanceProcessor::VertexInputs { |
| 102 public: | 102 public: |
| 103 VertexInputs(const InstanceProcessor& instProc, GrGLSLVertexBuilder* vertexB
uilder) | 103 VertexInputs(const InstanceProcessor& instProc, GrGLSLVertexBuilder* vertexB
uilder) |
| 104 : fInstProc(instProc), | 104 : fInstProc(instProc), |
| 105 fVertexBuilder(vertexBuilder) { | 105 fVertexBuilder(vertexBuilder) { |
| 106 } | 106 } |
| 107 | 107 |
| 108 void initParams(const SamplerHandle paramsBuffer) { | 108 void initParams(const SamplerHandle paramsBuffer) { |
| 109 fParamsBuffer = paramsBuffer; | 109 fParamsBuffer = paramsBuffer; |
| 110 fVertexBuilder->definef("PARAMS_IDX_MASK", "0x%xu", kParamsIdx_InfoMask)
; |
| 110 fVertexBuilder->appendPrecisionModifier(kHigh_GrSLPrecision); | 111 fVertexBuilder->appendPrecisionModifier(kHigh_GrSLPrecision); |
| 111 fVertexBuilder->codeAppendf("int paramsIdx = int(%s & 0x%x);", | 112 fVertexBuilder->codeAppendf("int paramsIdx = int(%s & PARAMS_IDX_MASK);"
, |
| 112 this->attr(Attrib::kInstanceInfo), | 113 this->attr(Attrib::kInstanceInfo)); |
| 113 kParamsIdx_InfoMask); | |
| 114 } | 114 } |
| 115 | 115 |
| 116 const char* attr(Attrib attr) const { return fInstProc.getAttrib((int)attr).
fName; } | 116 const char* attr(Attrib attr) const { return fInstProc.getAttrib((int)attr).
fName; } |
| 117 | 117 |
| 118 void fetchNextParam(GrSLType type = kVec4f_GrSLType) const { | 118 void fetchNextParam(GrSLType type = kVec4f_GrSLType) const { |
| 119 SkASSERT(fParamsBuffer.isValid()); | 119 SkASSERT(fParamsBuffer.isValid()); |
| 120 if (type != kVec4f_GrSLType) { | 120 if (type != kVec4f_GrSLType) { |
| 121 fVertexBuilder->codeAppendf("%s(", GrGLSLTypeString(type)); | 121 fVertexBuilder->codeAppendf("%s(", GrGLSLTypeString(type)); |
| 122 } | 122 } |
| 123 fVertexBuilder->appendTexelFetch(fParamsBuffer, "paramsIdx++"); | 123 fVertexBuilder->appendTexelFetch(fParamsBuffer, "paramsIdx++"); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 VertexInputs inputs(ip, v); | 217 VertexInputs inputs(ip, v); |
| 218 if (ip.batchInfo().fHasParams) { | 218 if (ip.batchInfo().fHasParams) { |
| 219 SkASSERT(1 == ip.numBuffers()); | 219 SkASSERT(1 == ip.numBuffers()); |
| 220 inputs.initParams(args.fBufferSamplers[0]); | 220 inputs.initParams(args.fBufferSamplers[0]); |
| 221 } | 221 } |
| 222 | 222 |
| 223 if (!ip.batchInfo().fHasPerspective) { | 223 if (!ip.batchInfo().fHasPerspective) { |
| 224 v->codeAppendf("mat2x3 shapeMatrix = mat2x3(%s, %s);", | 224 v->codeAppendf("mat2x3 shapeMatrix = mat2x3(%s, %s);", |
| 225 inputs.attr(Attrib::kShapeMatrixX), inputs.attr(Attrib::k
ShapeMatrixY)); | 225 inputs.attr(Attrib::kShapeMatrixX), inputs.attr(Attrib::k
ShapeMatrixY)); |
| 226 } else { | 226 } else { |
| 227 v->defineConstantf("int", "PERSPECTIVE_FLAG", "0x%x", kPerspective_InfoF
lag); | 227 v->definef("PERSPECTIVE_FLAG", "0x%xu", kPerspective_InfoFlag); |
| 228 v->codeAppendf("mat3 shapeMatrix = mat3(%s, %s, vec3(0, 0, 1));", | 228 v->codeAppendf("mat3 shapeMatrix = mat3(%s, %s, vec3(0, 0, 1));", |
| 229 inputs.attr(Attrib::kShapeMatrixX), inputs.attr(Attrib::k
ShapeMatrixY)); | 229 inputs.attr(Attrib::kShapeMatrixX), inputs.attr(Attrib::k
ShapeMatrixY)); |
| 230 v->codeAppendf("if (0 != (%s & PERSPECTIVE_FLAG)) {", | 230 v->codeAppendf("if (0u != (%s & PERSPECTIVE_FLAG)) {", |
| 231 inputs.attr(Attrib::kInstanceInfo)); | 231 inputs.attr(Attrib::kInstanceInfo)); |
| 232 v->codeAppend ( "shapeMatrix[2] = "); | 232 v->codeAppend ( "shapeMatrix[2] = "); |
| 233 inputs.fetchNextParam(kVec3f_GrSLType); | 233 inputs.fetchNextParam(kVec3f_GrSLType); |
| 234 v->codeAppend ( ";"); | 234 v->codeAppend ( ";"); |
| 235 v->codeAppend ("}"); | 235 v->codeAppend ("}"); |
| 236 } | 236 } |
| 237 | 237 |
| 238 bool hasSingleShapeType = SkIsPow2(ip.batchInfo().fShapeTypes); | 238 bool hasSingleShapeType = SkIsPow2(ip.batchInfo().fShapeTypes); |
| 239 if (!hasSingleShapeType) { | 239 if (!hasSingleShapeType) { |
| 240 v->defineConstant("SHAPE_TYPE_BIT", kShapeType_InfoBit); | 240 v->define("SHAPE_TYPE_BIT", kShapeType_InfoBit); |
| 241 v->codeAppendf("uint shapeType = %s >> SHAPE_TYPE_BIT;", | 241 v->codeAppendf("uint shapeType = %s >> SHAPE_TYPE_BIT;", |
| 242 inputs.attr(Attrib::kInstanceInfo)); | 242 inputs.attr(Attrib::kInstanceInfo)); |
| 243 } | 243 } |
| 244 | 244 |
| 245 SkAutoTDelete<Backend> backend(Backend::Create(pipeline, ip.batchInfo(), inp
uts)); | 245 SkAutoTDelete<Backend> backend(Backend::Create(pipeline, ip.batchInfo(), inp
uts)); |
| 246 backend->init(varyingHandler, v); | 246 backend->init(varyingHandler, v); |
| 247 | 247 |
| 248 int usedShapeDefinitions = 0; | 248 int usedShapeDefinitions = 0; |
| 249 | 249 |
| 250 if (hasSingleShapeType || !(ip.batchInfo().fShapeTypes & ~kRRect_ShapesMask)
) { | 250 if (hasSingleShapeType || !(ip.batchInfo().fShapeTypes & ~kRRect_ShapesMask)
) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 278 if (ip.batchInfo().fShapeTypes & kRect_ShapeFlag) { | 278 if (ip.batchInfo().fShapeTypes & kRect_ShapeFlag) { |
| 279 v->codeAppend ("else {"); | 279 v->codeAppend ("else {"); |
| 280 backend->setupRect(v); | 280 backend->setupRect(v); |
| 281 v->codeAppend ("}"); | 281 v->codeAppend ("}"); |
| 282 } | 282 } |
| 283 } | 283 } |
| 284 | 284 |
| 285 if (ip.batchInfo().fInnerShapeTypes) { | 285 if (ip.batchInfo().fInnerShapeTypes) { |
| 286 bool hasSingleInnerShapeType = SkIsPow2(ip.batchInfo().fInnerShapeTypes)
; | 286 bool hasSingleInnerShapeType = SkIsPow2(ip.batchInfo().fInnerShapeTypes)
; |
| 287 if (!hasSingleInnerShapeType) { | 287 if (!hasSingleInnerShapeType) { |
| 288 v->defineConstantf("int", "INNER_SHAPE_TYPE_MASK", "0x%x", kInnerSha
peType_InfoMask); | 288 v->definef("INNER_SHAPE_TYPE_MASK", "0x%xu", kInnerShapeType_InfoMas
k); |
| 289 v->defineConstant("INNER_SHAPE_TYPE_BIT", kInnerShapeType_InfoBit); | 289 v->define("INNER_SHAPE_TYPE_BIT", kInnerShapeType_InfoBit); |
| 290 v->codeAppendf("uint innerShapeType = ((%s & INNER_SHAPE_TYPE_MASK)
>> " | 290 v->codeAppendf("uint innerShapeType = ((%s & INNER_SHAPE_TYPE_MASK)
>> " |
| 291 "INNER_SHAPE_TYPE_BIT);", | 291 "INNER_SHAPE_TYPE_BIT);", |
| 292 inputs.attr(Attrib::kInstanceInfo)); | 292 inputs.attr(Attrib::kInstanceInfo)); |
| 293 } | 293 } |
| 294 // Here we take advantage of the fact that outerRect == localRect in rec
ordDRRect. | 294 // Here we take advantage of the fact that outerRect == localRect in rec
ordDRRect. |
| 295 v->codeAppendf("vec4 outer = %s;", inputs.attr(Attrib::kLocalRect)); | 295 v->codeAppendf("vec4 outer = %s;", inputs.attr(Attrib::kLocalRect)); |
| 296 v->codeAppend ("vec4 inner = "); | 296 v->codeAppend ("vec4 inner = "); |
| 297 inputs.fetchNextParam(); | 297 inputs.fetchNextParam(); |
| 298 v->codeAppend (";"); | 298 v->codeAppend (";"); |
| 299 // outer2Inner is a transform from shape coords to inner shape coords: | 299 // outer2Inner is a transform from shape coords to inner shape coords: |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 } | 339 } |
| 340 if (ip.batchInfo().fInnerShapeTypes & kRect_ShapeFlag) { | 340 if (ip.batchInfo().fInnerShapeTypes & kRect_ShapeFlag) { |
| 341 v->codeAppend("else {"); | 341 v->codeAppend("else {"); |
| 342 backend->setupInnerRect(v); | 342 backend->setupInnerRect(v); |
| 343 v->codeAppend("}"); | 343 v->codeAppend("}"); |
| 344 } | 344 } |
| 345 } | 345 } |
| 346 } | 346 } |
| 347 | 347 |
| 348 if (usedShapeDefinitions & kOval_ShapeFlag) { | 348 if (usedShapeDefinitions & kOval_ShapeFlag) { |
| 349 v->defineConstant("OVAL_SHAPE_TYPE", (int)ShapeType::kOval); | 349 v->definef("OVAL_SHAPE_TYPE", "%du", (int)ShapeType::kOval); |
| 350 } | 350 } |
| 351 if (usedShapeDefinitions & kSimpleRRect_ShapeFlag) { | 351 if (usedShapeDefinitions & kSimpleRRect_ShapeFlag) { |
| 352 v->defineConstant("SIMPLE_R_RECT_SHAPE_TYPE", (int)ShapeType::kSimpleRRe
ct); | 352 v->definef("SIMPLE_R_RECT_SHAPE_TYPE", "%du", (int)ShapeType::kSimpleRRe
ct); |
| 353 } | 353 } |
| 354 if (usedShapeDefinitions & kNinePatch_ShapeFlag) { | 354 if (usedShapeDefinitions & kNinePatch_ShapeFlag) { |
| 355 v->defineConstant("NINE_PATCH_SHAPE_TYPE", (int)ShapeType::kNinePatch); | 355 v->definef("NINE_PATCH_SHAPE_TYPE", "%du", (int)ShapeType::kNinePatch); |
| 356 } | 356 } |
| 357 SkASSERT(!(usedShapeDefinitions & (kRect_ShapeFlag | kComplexRRect_ShapeFlag
))); | 357 SkASSERT(!(usedShapeDefinitions & (kRect_ShapeFlag | kComplexRRect_ShapeFlag
))); |
| 358 | 358 |
| 359 backend->emitCode(v, f, pipeline.ignoresCoverage() ? nullptr : args.fOutputC
overage, | 359 backend->emitCode(v, f, pipeline.ignoresCoverage() ? nullptr : args.fOutputC
overage, |
| 360 args.fOutputColor); | 360 args.fOutputColor); |
| 361 | 361 |
| 362 const char* localCoords = nullptr; | 362 const char* localCoords = nullptr; |
| 363 if (ip.batchInfo().fUsesLocalCoords) { | 363 if (ip.batchInfo().fUsesLocalCoords) { |
| 364 localCoords = "localCoords"; | 364 localCoords = "localCoords"; |
| 365 v->codeAppendf("vec2 t = 0.5 * (%s + vec2(1));", backend->outShapeCoords
()); | 365 v->codeAppendf("vec2 t = 0.5 * (%s + vec2(1));", backend->outShapeCoords
()); |
| 366 v->codeAppendf("vec2 localCoords = (1.0 - t) * %s.xy + t * %s.zw;", | 366 v->codeAppendf("vec2 localCoords = (1.0 - t) * %s.xy + t * %s.zw;", |
| 367 inputs.attr(Attrib::kLocalRect), inputs.attr(Attrib::kLoc
alRect)); | 367 inputs.attr(Attrib::kLocalRect), inputs.attr(Attrib::kLoc
alRect)); |
| 368 } | 368 } |
| 369 if (ip.batchInfo().fHasLocalMatrix && ip.batchInfo().fHasParams) { | 369 if (ip.batchInfo().fHasLocalMatrix && ip.batchInfo().fHasParams) { |
| 370 v->defineConstantf("int", "LOCAL_MATRIX_FLAG", "0x%x", kLocalMatrix_Info
Flag); | 370 v->definef("LOCAL_MATRIX_FLAG", "0x%xu", kLocalMatrix_InfoFlag); |
| 371 v->codeAppendf("if (0 != (%s & LOCAL_MATRIX_FLAG)) {", | 371 v->codeAppendf("if (0u != (%s & LOCAL_MATRIX_FLAG)) {", |
| 372 inputs.attr(Attrib::kInstanceInfo)); | 372 inputs.attr(Attrib::kInstanceInfo)); |
| 373 if (!ip.batchInfo().fUsesLocalCoords) { | 373 if (!ip.batchInfo().fUsesLocalCoords) { |
| 374 inputs.skipParams(2); | 374 inputs.skipParams(2); |
| 375 } else { | 375 } else { |
| 376 v->codeAppendf( "mat2x3 localMatrix;"); | 376 v->codeAppendf( "mat2x3 localMatrix;"); |
| 377 v->codeAppend ( "localMatrix[0] = "); | 377 v->codeAppend ( "localMatrix[0] = "); |
| 378 inputs.fetchNextParam(kVec3f_GrSLType); | 378 inputs.fetchNextParam(kVec3f_GrSLType); |
| 379 v->codeAppend ( ";"); | 379 v->codeAppend ( ";"); |
| 380 v->codeAppend ( "localMatrix[1] = "); | 380 v->codeAppend ( "localMatrix[1] = "); |
| 381 inputs.fetchNextParam(kVec3f_GrSLType); | 381 inputs.fetchNextParam(kVec3f_GrSLType); |
| (...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1172 } else if (fBatchInfo.fShapeTypes & kOval_ShapeFlag) { | 1172 } else if (fBatchInfo.fShapeTypes & kOval_ShapeFlag) { |
| 1173 fArcCoords = fShapeCoords; | 1173 fArcCoords = fShapeCoords; |
| 1174 fArcInverseMatrix = fShapeInverseMatrix; | 1174 fArcInverseMatrix = fShapeInverseMatrix; |
| 1175 fFragArcHalfSpan = fFragShapeHalfSpan; | 1175 fFragArcHalfSpan = fFragShapeHalfSpan; |
| 1176 if (fBatchInfo.fShapeTypes & kRect_ShapeFlag) { | 1176 if (fBatchInfo.fShapeTypes & kRect_ShapeFlag) { |
| 1177 varyingHandler->addFlatVarying("triangleIsArc", &fTriangleIsArc, | 1177 varyingHandler->addFlatVarying("triangleIsArc", &fTriangleIsArc, |
| 1178 kLow_GrSLPrecision); | 1178 kLow_GrSLPrecision); |
| 1179 } | 1179 } |
| 1180 } | 1180 } |
| 1181 if (kRect_ShapeFlag != fBatchInfo.fShapeTypes) { | 1181 if (kRect_ShapeFlag != fBatchInfo.fShapeTypes) { |
| 1182 v->defineConstantf("int", "SAMPLE_MASK_ALL", "0x%x", (1 << fEffective
SampleCnt) - 1); | 1182 v->definef("SAMPLE_MASK_ALL", "0x%x", (1 << fEffectiveSampleCnt) - 1)
; |
| 1183 varyingHandler->addFlatVarying("earlyAccept", &fEarlyAccept, kHigh_Gr
SLPrecision); | 1183 varyingHandler->addFlatVarying("earlyAccept", &fEarlyAccept, kHigh_Gr
SLPrecision); |
| 1184 } | 1184 } |
| 1185 } | 1185 } |
| 1186 if (!fBatchInfo.fHasPerspective) { | 1186 if (!fBatchInfo.fHasPerspective) { |
| 1187 v->codeAppend("mat2 shapeInverseMatrix = inverse(mat2(shapeMatrix));"); | 1187 v->codeAppend("mat2 shapeInverseMatrix = inverse(mat2(shapeMatrix));"); |
| 1188 v->codeAppend("vec2 fragShapeSpan = abs(vec4(shapeInverseMatrix).xz) + " | 1188 v->codeAppend("vec2 fragShapeSpan = abs(vec4(shapeInverseMatrix).xz) + " |
| 1189 "abs(vec4(shapeInverseMatrix).yw);"); | 1189 "abs(vec4(shapeInverseMatrix).yw);"); |
| 1190 } | 1190 } |
| 1191 } | 1191 } |
| 1192 | 1192 |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1353 v->codeAppendf("innerRadii = max(innerRadii, 2e-1 * %s);", fFragInnerSha
peHalfSpan.vsOut()); | 1353 v->codeAppendf("innerRadii = max(innerRadii, 2e-1 * %s);", fFragInnerSha
peHalfSpan.vsOut()); |
| 1354 } else { | 1354 } else { |
| 1355 v->codeAppend ("innerRadii = max(innerRadii, vec2(1e-4));"); | 1355 v->codeAppend ("innerRadii = max(innerRadii, vec2(1e-4));"); |
| 1356 } | 1356 } |
| 1357 v->codeAppendf("%s = vec4(1.0 - innerRadii, 1.0 / innerRadii);", fInnerRRect
.vsOut()); | 1357 v->codeAppendf("%s = vec4(1.0 - innerRadii, 1.0 / innerRadii);", fInnerRRect
.vsOut()); |
| 1358 } | 1358 } |
| 1359 | 1359 |
| 1360 void GLSLInstanceProcessor::BackendMultisample::onEmitCode(GrGLSLVertexBuilder*, | 1360 void GLSLInstanceProcessor::BackendMultisample::onEmitCode(GrGLSLVertexBuilder*, |
| 1361 GrGLSLPPFragmentBuild
er* f, | 1361 GrGLSLPPFragmentBuild
er* f, |
| 1362 const char*, const ch
ar*) { | 1362 const char*, const ch
ar*) { |
| 1363 f->defineConstant("SAMPLE_COUNT", fEffectiveSampleCnt); | 1363 f->define("SAMPLE_COUNT", fEffectiveSampleCnt); |
| 1364 if (this->isMixedSampled()) { | 1364 if (this->isMixedSampled()) { |
| 1365 f->defineConstantf("int", "SAMPLE_MASK_ALL", "0x%x", (1 << fEffectiveSam
pleCnt) - 1); | 1365 f->definef("SAMPLE_MASK_ALL", "0x%x", (1 << fEffectiveSampleCnt) - 1); |
| 1366 f->defineConstantf("int", "SAMPLE_MASK_MSB", "0x%x", 1 << (fEffectiveSam
pleCnt - 1)); | 1366 f->definef("SAMPLE_MASK_MSB", "0x%x", 1 << (fEffectiveSampleCnt - 1)); |
| 1367 } | 1367 } |
| 1368 | 1368 |
| 1369 if (kRect_ShapeFlag != (fBatchInfo.fShapeTypes | fBatchInfo.fInnerShapeTypes
)) { | 1369 if (kRect_ShapeFlag != (fBatchInfo.fShapeTypes | fBatchInfo.fInnerShapeTypes
)) { |
| 1370 GrGLSLShaderVar x("x", kVec2f_GrSLType, GrGLSLShaderVar::kNonArray, kHig
h_GrSLPrecision); | 1370 GrGLSLShaderVar x("x", kVec2f_GrSLType, GrGLSLShaderVar::kNonArray, kHig
h_GrSLPrecision); |
| 1371 f->emitFunction(kFloat_GrSLType, "square", 1, &x, "return dot(x, x);", &
fSquareFun); | 1371 f->emitFunction(kFloat_GrSLType, "square", 1, &x, "return dot(x, x);", &
fSquareFun); |
| 1372 } | 1372 } |
| 1373 | 1373 |
| 1374 EmitShapeCoords shapeCoords; | 1374 EmitShapeCoords shapeCoords; |
| 1375 shapeCoords.fVarying = &fShapeCoords; | 1375 shapeCoords.fVarying = &fShapeCoords; |
| 1376 shapeCoords.fInverseMatrix = fShapeInverseMatrix.fsIn(); | 1376 shapeCoords.fInverseMatrix = fShapeInverseMatrix.fsIn(); |
| (...skipping 737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2114 | 2114 |
| 2115 case kCorneredRect_FirstIndex: return "basic_round_rect"; | 2115 case kCorneredRect_FirstIndex: return "basic_round_rect"; |
| 2116 case kCorneredFramedRect_FirstIndex: return "coverage_round_rect"; | 2116 case kCorneredFramedRect_FirstIndex: return "coverage_round_rect"; |
| 2117 case kCorneredRectFanned_FirstIndex: return "mixed_samples_round_rect"; | 2117 case kCorneredRectFanned_FirstIndex: return "mixed_samples_round_rect"; |
| 2118 | 2118 |
| 2119 default: return "unknown"; | 2119 default: return "unknown"; |
| 2120 } | 2120 } |
| 2121 } | 2121 } |
| 2122 | 2122 |
| 2123 } | 2123 } |
| OLD | NEW |