aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/effects/GrDistanceFieldGeoProc.cpp
diff options
context:
space:
mode:
authorGravatar Brian Salomon <bsalomon@google.com>2018-06-18 12:52:47 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-06-18 17:13:58 +0000
commit19c1233c447f625c2522e7ecd0a0adecc629bb2f (patch)
tree891e06143986ade3aae8d4176ec8b426f70b896f /src/gpu/effects/GrDistanceFieldGeoProc.cpp
parent146cf3ce7935019ecc63ce9e93450a8c122880d8 (diff)
Change how vertex/instance attributes are handled in geometry processors.
* No longer register vertex/instance attributes on base class, just counts * Separate instance and vertex attributes and remove InputRate and offset * Make attributes constexpr where possible Change-Id: I1f1d5e772fa177a96d2aeb805aab7b69f35bfae6 Reviewed-on: https://skia-review.googlesource.com/132405 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Chris Dalton <csmartdalton@google.com>
Diffstat (limited to 'src/gpu/effects/GrDistanceFieldGeoProc.cpp')
-rw-r--r--src/gpu/effects/GrDistanceFieldGeoProc.cpp120
1 files changed, 67 insertions, 53 deletions
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
index 5ac73989ee..4d5d50b8db 100644
--- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp
+++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
@@ -54,13 +54,13 @@ public:
varyingHandler->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputColor);
// Setup position
- gpArgs->fPositionVar = dfTexEffect.inPosition()->asShaderVar();
+ gpArgs->fPositionVar = dfTexEffect.inPosition().asShaderVar();
// emit transforms
this->emitTransforms(vertBuilder,
varyingHandler,
uniformHandler,
- dfTexEffect.inPosition()->asShaderVar(),
+ dfTexEffect.inPosition().asShaderVar(),
dfTexEffect.localMatrix(),
args.fFPCoordTransformHandler);
@@ -69,7 +69,7 @@ public:
GrSLType texIdxType = args.fShaderCaps->integerSupport() ? kInt_GrSLType : kFloat_GrSLType;
GrGLSLVarying texIdx(texIdxType);
GrGLSLVarying st(kFloat2_GrSLType);
- append_index_uv_varyings(args, dfTexEffect.inTextureCoords()->name(), atlasSizeInvName, &uv,
+ append_index_uv_varyings(args, dfTexEffect.inTextureCoords().name(), atlasSizeInvName, &uv,
&texIdx, &st);
bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFieldEffectMask) ==
@@ -206,32 +206,34 @@ private:
///////////////////////////////////////////////////////////////////////////////
-GrDistanceFieldA8TextGeoProc::GrDistanceFieldA8TextGeoProc(
- const sk_sp<GrTextureProxy>* proxies,
- int numProxies,
- const GrSamplerState& params,
+constexpr GrPrimitiveProcessor::Attribute GrDistanceFieldA8TextGeoProc::kInColor;
+constexpr GrPrimitiveProcessor::Attribute GrDistanceFieldA8TextGeoProc::kInTextureCoords;
+
+GrDistanceFieldA8TextGeoProc::GrDistanceFieldA8TextGeoProc(const sk_sp<GrTextureProxy>* proxies,
+ int numProxies,
+ const GrSamplerState& params,
#ifdef SK_GAMMA_APPLY_TO_A8
- float distanceAdjust,
+ float distanceAdjust,
#endif
- uint32_t flags,
- const SkMatrix& localMatrix)
+ uint32_t flags,
+ const SkMatrix& localMatrix)
: INHERITED(kGrDistanceFieldA8TextGeoProc_ClassID)
+ , fLocalMatrix(localMatrix)
+ , fFlags(flags & kNonLCD_DistanceFieldEffectMask)
#ifdef SK_GAMMA_APPLY_TO_A8
, fDistanceAdjust(distanceAdjust)
#endif
- , fFlags(flags & kNonLCD_DistanceFieldEffectMask)
- , fInColor(nullptr)
- , fLocalMatrix(localMatrix) {
+{
SkASSERT(numProxies <= kMaxTextures);
-
SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask));
+
if (flags & kPerspective_DistanceFieldEffectFlag) {
- fInPosition = &this->addVertexAttrib("inPosition", kFloat3_GrVertexAttribType);
+ fInPosition = {"inPosition", kFloat3_GrVertexAttribType};
} else {
- fInPosition = &this->addVertexAttrib("inPosition", kFloat2_GrVertexAttribType);
+ fInPosition = {"inPosition", kFloat2_GrVertexAttribType};
}
- fInColor = &this->addVertexAttrib("inColor", kUByte4_norm_GrVertexAttribType);
- fInTextureCoords = &this->addVertexAttrib("inTextureCoords", kUShort2_GrVertexAttribType);
+ this->setVertexAttributeCnt(3);
+
for (int i = 0; i < numProxies; ++i) {
SkASSERT(proxies[i]);
@@ -337,8 +339,8 @@ public:
GrSLType texIdxType = args.fShaderCaps->integerSupport() ? kInt_GrSLType : kFloat_GrSLType;
GrGLSLVarying texIdx(texIdxType);
GrGLSLVarying st(kFloat2_GrSLType);
- append_index_uv_varyings(args, dfPathEffect.inTextureCoords()->name(), atlasSizeInvName,
- &uv, &texIdx, &st);
+ append_index_uv_varyings(args, dfPathEffect.inTextureCoords().name(), atlasSizeInvName, &uv,
+ &texIdx, &st);
// setup pass through color
varyingHandler->addPassThroughAttribute(dfPathEffect.inColor(), args.fOutputColor);
@@ -348,7 +350,7 @@ public:
this->writeOutputPosition(vertBuilder,
uniformHandler,
gpArgs,
- dfPathEffect.inPosition()->name(),
+ dfPathEffect.inPosition().name(),
dfPathEffect.matrix(),
&fMatrixUniform);
@@ -356,17 +358,17 @@ public:
this->emitTransforms(vertBuilder,
varyingHandler,
uniformHandler,
- dfPathEffect.inPosition()->asShaderVar(),
+ dfPathEffect.inPosition().asShaderVar(),
args.fFPCoordTransformHandler);
} else {
// Setup position
- this->writeOutputPosition(vertBuilder, gpArgs, dfPathEffect.inPosition()->name());
+ this->writeOutputPosition(vertBuilder, gpArgs, dfPathEffect.inPosition().name());
// emit transforms
this->emitTransforms(vertBuilder,
varyingHandler,
uniformHandler,
- dfPathEffect.inPosition()->asShaderVar(),
+ dfPathEffect.inPosition().asShaderVar(),
dfPathEffect.matrix(),
args.fFPCoordTransformHandler);
}
@@ -499,22 +501,22 @@ private:
};
///////////////////////////////////////////////////////////////////////////////
-GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc(
- const SkMatrix& matrix,
- const sk_sp<GrTextureProxy>* proxies,
- int numProxies,
- const GrSamplerState& params,
- uint32_t flags)
+constexpr GrPrimitiveProcessor::Attribute GrDistanceFieldPathGeoProc::kInPosition;
+constexpr GrPrimitiveProcessor::Attribute GrDistanceFieldPathGeoProc::kInColor;
+constexpr GrPrimitiveProcessor::Attribute GrDistanceFieldPathGeoProc::kInTextureCoords;
+
+GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc(const SkMatrix& matrix,
+ const sk_sp<GrTextureProxy>* proxies,
+ int numProxies,
+ const GrSamplerState& params,
+ uint32_t flags)
: INHERITED(kGrDistanceFieldPathGeoProc_ClassID)
, fMatrix(matrix)
- , fFlags(flags & kNonLCD_DistanceFieldEffectMask)
- , fInColor(nullptr) {
+ , fFlags(flags & kNonLCD_DistanceFieldEffectMask) {
SkASSERT(numProxies <= kMaxTextures);
-
SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask));
- fInPosition = &this->addVertexAttrib("inPosition", kFloat2_GrVertexAttribType);
- fInColor = &this->addVertexAttrib("inColor", kUByte4_norm_GrVertexAttribType);
- fInTextureCoords = &this->addVertexAttrib("inTextureCoords", kUShort2_GrVertexAttribType);
+
+ this->setVertexAttributeCnt(3);
for (int i = 0; i < numProxies; ++i) {
SkASSERT(proxies[i]);
@@ -548,6 +550,10 @@ GrDistanceFieldPathGeoProc::createGLSLInstance(const GrShaderCaps&) const {
return new GrGLDistanceFieldPathGeoProc();
}
+const GrPrimitiveProcessor::Attribute& GrDistanceFieldPathGeoProc::onVertexAttribute(int i) const {
+ return IthAttribute(i, kInPosition, kInColor, kInTextureCoords);
+}
+
///////////////////////////////////////////////////////////////////////////////
GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldPathGeoProc);
@@ -614,13 +620,13 @@ public:
varyingHandler->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputColor);
// Setup position
- gpArgs->fPositionVar = dfTexEffect.inPosition()->asShaderVar();
+ gpArgs->fPositionVar = dfTexEffect.inPosition().asShaderVar();
// emit transforms
this->emitTransforms(vertBuilder,
varyingHandler,
uniformHandler,
- dfTexEffect.inPosition()->asShaderVar(),
+ dfTexEffect.inPosition().asShaderVar(),
dfTexEffect.localMatrix(),
args.fFPCoordTransformHandler);
@@ -629,7 +635,7 @@ public:
GrSLType texIdxType = args.fShaderCaps->integerSupport() ? kInt_GrSLType : kFloat_GrSLType;
GrGLSLVarying texIdx(texIdxType);
GrGLSLVarying st(kFloat2_GrSLType);
- append_index_uv_varyings(args, dfTexEffect.inTextureCoords()->name(), atlasSizeInvName, &uv,
+ append_index_uv_varyings(args, dfTexEffect.inTextureCoords().name(), atlasSizeInvName, &uv,
&texIdx, &st);
GrGLSLVarying delta(kFloat_GrSLType);
@@ -802,27 +808,30 @@ private:
};
///////////////////////////////////////////////////////////////////////////////
-GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc(
- const sk_sp<GrTextureProxy>* proxies,
- int numProxies,
- const GrSamplerState& params,
- DistanceAdjust distanceAdjust,
- uint32_t flags,
- const SkMatrix& localMatrix)
+
+constexpr GrPrimitiveProcessor::Attribute GrDistanceFieldLCDTextGeoProc::kInColor;
+constexpr GrPrimitiveProcessor::Attribute GrDistanceFieldLCDTextGeoProc::kInTextureCoords;
+
+GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc(const sk_sp<GrTextureProxy>* proxies,
+ int numProxies,
+ const GrSamplerState& params,
+ DistanceAdjust distanceAdjust,
+ uint32_t flags,
+ const SkMatrix& localMatrix)
: INHERITED(kGrDistanceFieldLCDTextGeoProc_ClassID)
+ , fLocalMatrix(localMatrix)
, fDistanceAdjust(distanceAdjust)
- , fFlags(flags & kLCD_DistanceFieldEffectMask)
- , fLocalMatrix(localMatrix) {
+ , fFlags(flags & kLCD_DistanceFieldEffectMask) {
SkASSERT(numProxies <= kMaxTextures);
-
SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_DistanceFieldEffectFlag));
+
if (fFlags & kPerspective_DistanceFieldEffectFlag) {
- fInPosition = &this->addVertexAttrib("inPosition", kFloat3_GrVertexAttribType);
+ fInPosition = {"inPosition", kFloat3_GrVertexAttribType};
} else {
- fInPosition = &this->addVertexAttrib("inPosition", kFloat2_GrVertexAttribType);
+ fInPosition = {"inPosition", kFloat2_GrVertexAttribType};
}
- fInColor = &this->addVertexAttrib("inColor", kUByte4_norm_GrVertexAttribType);
- fInTextureCoords = &this->addVertexAttrib("inTextureCoords", kUShort2_GrVertexAttribType);
+ this->setVertexAttributeCnt(3);
+
for (int i = 0; i < numProxies; ++i) {
SkASSERT(proxies[i]);
@@ -855,6 +864,11 @@ GrGLSLPrimitiveProcessor* GrDistanceFieldLCDTextGeoProc::createGLSLInstance(cons
return new GrGLDistanceFieldLCDTextGeoProc();
}
+const GrPrimitiveProcessor::Attribute& GrDistanceFieldLCDTextGeoProc::onVertexAttribute(
+ int i) const {
+ return IthAttribute(i, fInPosition, kInColor, kInTextureCoords);
+}
+
///////////////////////////////////////////////////////////////////////////////
GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextGeoProc);