Delay half-float vertex color determination until Op::finalize
Bug: skia:8871
Change-Id: I873e80e2d97a32e4524c177a9b6e07b0566a02ce
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/201682
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/src/gpu/ops/GrAAConvexPathRenderer.cpp b/src/gpu/ops/GrAAConvexPathRenderer.cpp
index 12a6bc3..2be279f 100644
--- a/src/gpu/ops/GrAAConvexPathRenderer.cpp
+++ b/src/gpu/ops/GrAAConvexPathRenderer.cpp
@@ -685,7 +685,6 @@
: INHERITED(ClassID()), fHelper(helperArgs, GrAAType::kCoverage, stencilSettings) {
fPaths.emplace_back(PathData{viewMatrix, path, color});
this->setTransformedBounds(path.getBounds(), viewMatrix, HasAABloat::kYes, IsZeroArea::kNo);
- fWideColor = !SkPMColor4fFitsInBytes(color);
}
const char* name() const override { return "AAConvexPathOp"; }
@@ -710,7 +709,7 @@
GrFSAAType fsaaType, GrClampType clampType) override {
return fHelper.finalizeProcessors(
caps, clip, fsaaType, clampType, GrProcessorAnalysisCoverage::kSingleChannel,
- &fPaths.back().fColor);
+ &fPaths.back().fColor, &fWideColor);
}
private:
diff --git a/src/gpu/ops/GrAAHairLinePathRenderer.cpp b/src/gpu/ops/GrAAHairLinePathRenderer.cpp
index c6bef41..c06e86a 100644
--- a/src/gpu/ops/GrAAHairLinePathRenderer.cpp
+++ b/src/gpu/ops/GrAAHairLinePathRenderer.cpp
@@ -840,8 +840,10 @@
GrProcessorSet::Analysis finalize(const GrCaps& caps, const GrAppliedClip* clip,
GrFSAAType fsaaType, GrClampType clampType) override {
+ // This Op uses uniform (not vertex) color, so doesn't need to track wide color.
return fHelper.finalizeProcessors(caps, clip, fsaaType, clampType,
- GrProcessorAnalysisCoverage::kSingleChannel, &fColor);
+ GrProcessorAnalysisCoverage::kSingleChannel, &fColor,
+ nullptr);
}
private:
diff --git a/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp b/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp
index 4cc72ac..92e77cc 100644
--- a/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp
+++ b/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp
@@ -160,7 +160,6 @@
bounds.outset(w, w);
}
this->setTransformedBounds(bounds, viewMatrix, HasAABloat::kYes, IsZeroArea::kNo);
- fWideColor = !SkPMColor4fFitsInBytes(color);
}
const char* name() const override { return "AAFlatteningConvexPathOp"; }
@@ -191,7 +190,7 @@
GrFSAAType fsaaType, GrClampType clampType) override {
return fHelper.finalizeProcessors(
caps, clip, fsaaType, clampType, GrProcessorAnalysisCoverage::kSingleChannel,
- &fPaths.back().fColor);
+ &fPaths.back().fColor, &fWideColor);
}
private:
diff --git a/src/gpu/ops/GrDefaultPathRenderer.cpp b/src/gpu/ops/GrDefaultPathRenderer.cpp
index 57bada6..8ea4bbf 100644
--- a/src/gpu/ops/GrDefaultPathRenderer.cpp
+++ b/src/gpu/ops/GrDefaultPathRenderer.cpp
@@ -392,7 +392,9 @@
GrProcessorAnalysisCoverage gpCoverage =
this->coverage() == 0xFF ? GrProcessorAnalysisCoverage::kNone
: GrProcessorAnalysisCoverage::kSingleChannel;
- return fHelper.finalizeProcessors(caps, clip, fsaaType, clampType, gpCoverage, &fColor);
+ // This Op uses uniform (not vertex) color, so doesn't need to track wide color.
+ return fHelper.finalizeProcessors(
+ caps, clip, fsaaType, clampType, gpCoverage, &fColor, nullptr);
}
private:
diff --git a/src/gpu/ops/GrFillRectOp.cpp b/src/gpu/ops/GrFillRectOp.cpp
index 3371062..84dda90 100644
--- a/src/gpu/ops/GrFillRectOp.cpp
+++ b/src/gpu/ops/GrFillRectOp.cpp
@@ -14,6 +14,7 @@
#include "GrQuad.h"
#include "GrQuadPerEdgeAA.h"
#include "GrSimpleMeshDrawOpHelper.h"
+#include "SkGr.h"
#include "SkMatrix.h"
#include "SkRect.h"
#include "glsl/GrGLSLColorSpaceXformHelper.h"
@@ -79,8 +80,7 @@
const GrPerspQuad& deviceQuad, GrQuadType deviceQuadType,
const GrPerspQuad& localQuad, GrQuadType localQuadType)
: INHERITED(ClassID())
- , fHelper(args, aaType, stencil)
- , fColorType(GrQuadPerEdgeAA::MinColorType(paintColor)) {
+ , fHelper(args, aaType, stencil) {
// The color stored with the quad is the clear color if a scissor-clear is decided upon
// when executing the op.
fDeviceQuads.push_back(deviceQuad, deviceQuadType, { paintColor, edgeFlags });
@@ -149,19 +149,18 @@
// to the same color (even if they started out with different colors).
SkPMColor4f colorOverride;
if (quadColors.isConstant(&colorOverride)) {
- // TODO: Unified strategy for handling wide color outputs from processor analysis.
- // skbug.com/8871
- fColorType = GrQuadPerEdgeAA::MinColorType(colorOverride);
- if (fColorType == ColorType::kHalf && !caps.halfFloatVertexAttributeSupport()) {
- fColorType = ColorType::kByte;
- colorOverride = {SkTPin(colorOverride.fR, 0.0f, 1.0f),
- SkTPin(colorOverride.fG, 0.0f, 1.0f),
- SkTPin(colorOverride.fB, 0.0f, 1.0f),
- colorOverride.fA};
- }
+ fColorType = GrQuadPerEdgeAA::MinColorType(colorOverride, clampType, caps);
for (int i = 0; i < this->quadCount(); ++i) {
fDeviceQuads.metadata(i).fColor = colorOverride;
}
+ } else {
+ // Otherwise compute the color type needed as the max over all quads.
+ fColorType = ColorType::kNone;
+ for (int i = 0; i < this->quadCount(); ++i) {
+ SkPMColor4f* color = &fDeviceQuads.metadata(i).fColor;
+ fColorType = SkTMax(fColorType,
+ GrQuadPerEdgeAA::MinColorType(*color, clampType, caps));
+ }
}
return result;
@@ -307,10 +306,6 @@
// reset the op's accumulated aa type.
}
- // clear compatible won't need to be updated, since device quad type and paint is the same,
- // but this quad has a new color, so maybe update color type
- fColorType = SkTMax(fColorType, GrQuadPerEdgeAA::MinColorType(color));
-
// Update the bounds and add the quad to this op's storage
SkRect newBounds = this->bounds();
newBounds.joinPossiblyEmptyRect(deviceQuad.bounds(fDeviceQuads.quadType()));
diff --git a/src/gpu/ops/GrLatticeOp.cpp b/src/gpu/ops/GrLatticeOp.cpp
index 51dd6ad..677e301 100644
--- a/src/gpu/ops/GrLatticeOp.cpp
+++ b/src/gpu/ops/GrLatticeOp.cpp
@@ -16,6 +16,7 @@
#include "GrSimpleMeshDrawOpHelper.h"
#include "GrVertexWriter.h"
#include "SkBitmap.h"
+#include "SkGr.h"
#include "SkLatticeIter.h"
#include "SkMatrixPriv.h"
#include "SkRect.h"
@@ -165,7 +166,6 @@
// setup bounds
this->setTransformedBounds(patch.fDst, viewMatrix, HasAABloat::kNo, IsZeroArea::kNo);
- fWideColor = !SkPMColor4fFitsInBytes(color);
}
const char* name() const override { return "NonAALatticeOp"; }
@@ -203,6 +203,7 @@
GrProcessorAnalysisCoverage::kNone,
&analysisColor);
analysisColor.isConstant(&fPatches[0].fColor);
+ fWideColor = SkPMColor4fNeedsWideColor(fPatches[0].fColor, clampType, caps);
return result;
}
diff --git a/src/gpu/ops/GrOvalOpFactory.cpp b/src/gpu/ops/GrOvalOpFactory.cpp
index 1288417..e6f5cf5 100644
--- a/src/gpu/ops/GrOvalOpFactory.cpp
+++ b/src/gpu/ops/GrOvalOpFactory.cpp
@@ -953,7 +953,6 @@
SkStrokeRec::Style recStyle = stroke.getStyle();
fRoundCaps = false;
- fWideColor = !SkPMColor4fFitsInBytes(color);
viewMatrix.mapPoints(¢er, 1);
radius = viewMatrix.mapRadius(radius);
@@ -1153,7 +1152,8 @@
GrFSAAType fsaaType, GrClampType clampType) override {
SkPMColor4f* color = &fCircles.front().fColor;
return fHelper.finalizeProcessors(caps, clip, fsaaType, clampType,
- GrProcessorAnalysisCoverage::kSingleChannel, color);
+ GrProcessorAnalysisCoverage::kSingleChannel, color,
+ &fWideColor);
}
FixedFunctionFlags fixedFunctionFlags() const override { return fHelper.fixedFunctionFlags(); }
@@ -1450,7 +1450,6 @@
HasAABloat::kYes, IsZeroArea::kNo);
fVertCount = circle_type_to_vert_count(true);
fIndexCount = circle_type_to_index_count(true);
- fWideColor = !SkPMColor4fFitsInBytes(color);
}
const char* name() const override { return "ButtCappedDashedCircleOp"; }
@@ -1483,7 +1482,8 @@
GrFSAAType fsaaType, GrClampType clampType) override {
SkPMColor4f* color = &fCircles.front().fColor;
return fHelper.finalizeProcessors(caps, clip, fsaaType, clampType,
- GrProcessorAnalysisCoverage::kSingleChannel, color);
+ GrProcessorAnalysisCoverage::kSingleChannel, color,
+ &fWideColor);
}
FixedFunctionFlags fixedFunctionFlags() const override { return fHelper.fixedFunctionFlags(); }
@@ -1735,7 +1735,6 @@
fStroked = isStrokeOnly && params.fInnerXRadius > 0 && params.fInnerYRadius > 0;
fViewMatrixIfUsingLocalCoords = viewMatrix;
- fWideColor = !SkPMColor4fFitsInBytes(color);
}
const char* name() const override { return "EllipseOp"; }
@@ -1766,7 +1765,8 @@
GrFSAAType fsaaType, GrClampType clampType) override {
SkPMColor4f* color = &fEllipses.front().fColor;
return fHelper.finalizeProcessors(caps, clip, fsaaType, clampType,
- GrProcessorAnalysisCoverage::kSingleChannel, color);
+ GrProcessorAnalysisCoverage::kSingleChannel, color,
+ &fWideColor);
}
FixedFunctionFlags fixedFunctionFlags() const override { return fHelper.fixedFunctionFlags(); }
@@ -1960,7 +1960,6 @@
params.fCenter.fY + params.fYRadius + geoDy)});
this->setTransformedBounds(fEllipses[0].fBounds, viewMatrix, HasAABloat::kYes,
IsZeroArea::kNo);
- fWideColor = !SkPMColor4fFitsInBytes(color);
}
const char* name() const override { return "DIEllipseOp"; }
@@ -1991,7 +1990,8 @@
GrFSAAType fsaaType, GrClampType clampType) override {
SkPMColor4f* color = &fEllipses.front().fColor;
return fHelper.finalizeProcessors(caps, clip, fsaaType, clampType,
- GrProcessorAnalysisCoverage::kSingleChannel, color);
+ GrProcessorAnalysisCoverage::kSingleChannel, color,
+ &fWideColor);
}
FixedFunctionFlags fixedFunctionFlags() const override { return fHelper.fixedFunctionFlags(); }
@@ -2279,7 +2279,6 @@
fVertCount = rrect_type_to_vert_count(type);
fIndexCount = rrect_type_to_index_count(type);
fAllFill = (kFill_RRectType == type);
- fWideColor = !SkPMColor4fFitsInBytes(color);
}
const char* name() const override { return "CircularRRectOp"; }
@@ -2310,7 +2309,8 @@
GrFSAAType fsaaType, GrClampType clampType) override {
SkPMColor4f* color = &fRRects.front().fColor;
return fHelper.finalizeProcessors(caps, clip, fsaaType, clampType,
- GrProcessorAnalysisCoverage::kSingleChannel, color);
+ GrProcessorAnalysisCoverage::kSingleChannel, color,
+ &fWideColor);
}
FixedFunctionFlags fixedFunctionFlags() const override { return fHelper.fixedFunctionFlags(); }
@@ -2616,7 +2616,6 @@
this->setBounds(bounds, HasAABloat::kYes, IsZeroArea::kNo);
// Expand the rect for aa in order to generate the correct vertices.
bounds.outset(SK_ScalarHalf, SK_ScalarHalf);
- fWideColor = !SkPMColor4fFitsInBytes(color);
fRRects.emplace_back(
RRect{color, devXRadius, devYRadius, innerXRadius, innerYRadius, bounds});
}
@@ -2649,7 +2648,8 @@
GrFSAAType fsaaType, GrClampType clampType) override {
SkPMColor4f* color = &fRRects.front().fColor;
return fHelper.finalizeProcessors(caps, clip, fsaaType, clampType,
- GrProcessorAnalysisCoverage::kSingleChannel, color);
+ GrProcessorAnalysisCoverage::kSingleChannel, color,
+ &fWideColor);
}
FixedFunctionFlags fixedFunctionFlags() const override { return fHelper.fixedFunctionFlags(); }
diff --git a/src/gpu/ops/GrQuadPerEdgeAA.cpp b/src/gpu/ops/GrQuadPerEdgeAA.cpp
index 9716e31..2a53dd9 100644
--- a/src/gpu/ops/GrQuadPerEdgeAA.cpp
+++ b/src/gpu/ops/GrQuadPerEdgeAA.cpp
@@ -14,6 +14,7 @@
#include "glsl/GrGLSLFragmentShaderBuilder.h"
#include "glsl/GrGLSLVarying.h"
#include "glsl/GrGLSLVertexGeoBuilder.h"
+#include "SkGr.h"
#include "SkNx.h"
#define AI SK_ALWAYS_INLINE
@@ -688,13 +689,13 @@
namespace GrQuadPerEdgeAA {
-ColorType MinColorType(SkPMColor4f color) {
+// This is a more elaborate version of SkPMColor4fNeedsWideColor that allows "no color" for white
+ColorType MinColorType(SkPMColor4f color, GrClampType clampType, const GrCaps& caps) {
if (color == SK_PMColor4fWHITE) {
return ColorType::kNone;
- } else if (color.fitsInBytes()) {
- return ColorType::kByte;
} else {
- return ColorType::kHalf;
+ return SkPMColor4fNeedsWideColor(color, clampType, caps) ? ColorType::kHalf
+ : ColorType::kByte;
}
}
diff --git a/src/gpu/ops/GrQuadPerEdgeAA.h b/src/gpu/ops/GrQuadPerEdgeAA.h
index ee89d37..314253c 100644
--- a/src/gpu/ops/GrQuadPerEdgeAA.h
+++ b/src/gpu/ops/GrQuadPerEdgeAA.h
@@ -17,6 +17,7 @@
#include "SkPoint.h"
#include "SkPoint3.h"
+class GrCaps;
class GrColorSpaceXform;
class GrShaderCaps;
@@ -27,7 +28,7 @@
static const int kColorTypeCount = static_cast<int>(ColorType::kLast) + 1;
// Gets the minimum ColorType that can represent a color.
- ColorType MinColorType(SkPMColor4f);
+ ColorType MinColorType(SkPMColor4f, GrClampType, const GrCaps&);
// Specifies the vertex configuration for an op that renders per-edge AA quads. The vertex
// order (when enabled) is device position, color, local position, domain, aa edge equations.
diff --git a/src/gpu/ops/GrRegionOp.cpp b/src/gpu/ops/GrRegionOp.cpp
index 3b1c39a..e34bb32 100644
--- a/src/gpu/ops/GrRegionOp.cpp
+++ b/src/gpu/ops/GrRegionOp.cpp
@@ -62,7 +62,6 @@
SkRect bounds = SkRect::Make(region.getBounds());
this->setTransformedBounds(bounds, viewMatrix, HasAABloat::kNo, IsZeroArea::kNo);
- fWideColor = !SkPMColor4fFitsInBytes(color);
}
const char* name() const override { return "GrRegionOp"; }
@@ -91,7 +90,8 @@
GrProcessorSet::Analysis finalize(const GrCaps& caps, const GrAppliedClip* clip,
GrFSAAType fsaaType, GrClampType clampType) override {
return fHelper.finalizeProcessors(caps, clip, fsaaType, clampType,
- GrProcessorAnalysisCoverage::kNone, &fRegions[0].fColor);
+ GrProcessorAnalysisCoverage::kNone, &fRegions[0].fColor,
+ &fWideColor);
}
private:
diff --git a/src/gpu/ops/GrSimpleMeshDrawOpHelper.cpp b/src/gpu/ops/GrSimpleMeshDrawOpHelper.cpp
index 9b2b6f2..2863870 100644
--- a/src/gpu/ops/GrSimpleMeshDrawOpHelper.cpp
+++ b/src/gpu/ops/GrSimpleMeshDrawOpHelper.cpp
@@ -10,6 +10,7 @@
#include "GrProcessorSet.h"
#include "GrRect.h"
#include "GrUserStencilSettings.h"
+#include "SkGr.h"
GrSimpleMeshDrawOpHelper::GrSimpleMeshDrawOpHelper(const MakeArgs& args, GrAAType aaType,
Flags flags)
@@ -64,11 +65,14 @@
GrProcessorSet::Analysis GrSimpleMeshDrawOpHelper::finalizeProcessors(
const GrCaps& caps, const GrAppliedClip* clip, GrFSAAType fsaaType, GrClampType clampType,
- GrProcessorAnalysisCoverage geometryCoverage, SkPMColor4f* geometryColor) {
+ GrProcessorAnalysisCoverage geometryCoverage, SkPMColor4f* geometryColor, bool* wideColor) {
GrProcessorAnalysisColor color = *geometryColor;
auto result = this->finalizeProcessors(
caps, clip, fsaaType, clampType, geometryCoverage, &color);
color.isConstant(geometryColor);
+ if (wideColor) {
+ *wideColor = SkPMColor4fNeedsWideColor(*geometryColor, clampType, caps);
+ }
return result;
}
@@ -150,11 +154,14 @@
GrProcessorSet::Analysis GrSimpleMeshDrawOpHelperWithStencil::finalizeProcessors(
const GrCaps& caps, const GrAppliedClip* clip, GrFSAAType fsaaType, GrClampType clampType,
- GrProcessorAnalysisCoverage geometryCoverage, SkPMColor4f* geometryColor) {
+ GrProcessorAnalysisCoverage geometryCoverage, SkPMColor4f* geometryColor, bool* wideColor) {
GrProcessorAnalysisColor color = *geometryColor;
auto result = this->finalizeProcessors(
caps, clip, fsaaType, clampType, geometryCoverage, &color);
color.isConstant(geometryColor);
+ if (wideColor) {
+ *wideColor = SkPMColor4fNeedsWideColor(*geometryColor, clampType, caps);
+ }
return result;
}
diff --git a/src/gpu/ops/GrSimpleMeshDrawOpHelper.h b/src/gpu/ops/GrSimpleMeshDrawOpHelper.h
index a9a408b..b2708ff 100644
--- a/src/gpu/ops/GrSimpleMeshDrawOpHelper.h
+++ b/src/gpu/ops/GrSimpleMeshDrawOpHelper.h
@@ -83,7 +83,8 @@
*/
GrProcessorSet::Analysis finalizeProcessors(
const GrCaps&, const GrAppliedClip*, GrFSAAType, GrClampType,
- GrProcessorAnalysisCoverage geometryCoverage, SkPMColor4f* geometryColor);
+ GrProcessorAnalysisCoverage geometryCoverage, SkPMColor4f* geometryColor,
+ bool* wideColor);
bool isTrivial() const {
return fProcessors == nullptr;
@@ -174,7 +175,8 @@
GrProcessorSet::Analysis finalizeProcessors(
const GrCaps&, const GrAppliedClip*, GrFSAAType, GrClampType,
- GrProcessorAnalysisCoverage geometryCoverage, SkPMColor4f* geometryColor);
+ GrProcessorAnalysisCoverage geometryCoverage, SkPMColor4f* geometryColor,
+ bool* wideColor);
using GrSimpleMeshDrawOpHelper::aaType;
using GrSimpleMeshDrawOpHelper::setAAType;
diff --git a/src/gpu/ops/GrSmallPathRenderer.cpp b/src/gpu/ops/GrSmallPathRenderer.cpp
index cc1a368..6737ba5 100644
--- a/src/gpu/ops/GrSmallPathRenderer.cpp
+++ b/src/gpu/ops/GrSmallPathRenderer.cpp
@@ -268,8 +268,6 @@
fShapeCache = shapeCache;
fShapeList = shapeList;
fGammaCorrect = gammaCorrect;
- fWideColor = !SkPMColor4fFitsInBytes(color);
-
}
const char* name() const override { return "SmallPathOp"; }
@@ -302,7 +300,7 @@
GrFSAAType fsaaType, GrClampType clampType) override {
return fHelper.finalizeProcessors(
caps, clip, fsaaType, clampType, GrProcessorAnalysisCoverage::kSingleChannel,
- &fShapes.front().fColor);
+ &fShapes.front().fColor, &fWideColor);
}
private:
diff --git a/src/gpu/ops/GrStrokeRectOp.cpp b/src/gpu/ops/GrStrokeRectOp.cpp
index 5619c41..4aac66d 100644
--- a/src/gpu/ops/GrStrokeRectOp.cpp
+++ b/src/gpu/ops/GrStrokeRectOp.cpp
@@ -165,8 +165,9 @@
GrProcessorSet::Analysis finalize(const GrCaps& caps, const GrAppliedClip* clip,
GrFSAAType fsaaType, GrClampType clampType) override {
- return fHelper.finalizeProcessors(
- caps, clip, fsaaType, clampType, GrProcessorAnalysisCoverage::kNone, &fColor);
+ // This Op uses uniform (not vertex) color, so doesn't need to track wide color.
+ return fHelper.finalizeProcessors(caps, clip, fsaaType, clampType,
+ GrProcessorAnalysisCoverage::kNone, &fColor, nullptr);
}
private:
@@ -343,7 +344,6 @@
fRects.emplace_back(RectInfo{color, devOutside, devOutside, devInside, false});
this->setBounds(devOutside, HasAABloat::kYes, IsZeroArea::kNo);
fMiterStroke = true;
- fWideColor = !SkPMColor4fFitsInBytes(color);
}
static std::unique_ptr<GrDrawOp> Make(GrRecordingContext* context,
@@ -366,7 +366,6 @@
, fHelper(helperArgs, GrAAType::kCoverage)
, fViewMatrix(viewMatrix) {
fMiterStroke = isMiter;
- fWideColor = !SkPMColor4fFitsInBytes(color);
RectInfo& info = fRects.push_back();
compute_aa_rects(&info.fDevOutside, &info.fDevOutsideAssist, &info.fDevInside,
&info.fDegenerate, viewMatrix, rect, stroke.getWidth(), isMiter);
@@ -414,7 +413,7 @@
GrFSAAType fsaaType, GrClampType clampType) override {
return fHelper.finalizeProcessors(
caps, clip, fsaaType, clampType, GrProcessorAnalysisCoverage::kSingleChannel,
- &fRects.back().fColor);
+ &fRects.back().fColor, &fWideColor);
}
private:
diff --git a/src/gpu/ops/GrTessellatingPathRenderer.cpp b/src/gpu/ops/GrTessellatingPathRenderer.cpp
index a7460f7..a091eaf 100644
--- a/src/gpu/ops/GrTessellatingPathRenderer.cpp
+++ b/src/gpu/ops/GrTessellatingPathRenderer.cpp
@@ -236,7 +236,9 @@
GrProcessorAnalysisCoverage coverage = fAntiAlias
? GrProcessorAnalysisCoverage::kSingleChannel
: GrProcessorAnalysisCoverage::kNone;
- return fHelper.finalizeProcessors(caps, clip, fsaaType, clampType, coverage, &fColor);
+ // This Op uses uniform (not vertex) color, so doesn't need to track wide color.
+ return fHelper.finalizeProcessors(
+ caps, clip, fsaaType, clampType, coverage, &fColor, nullptr);
}
private:
diff --git a/src/gpu/ops/GrTextureOp.cpp b/src/gpu/ops/GrTextureOp.cpp
index 91ea5fd..73158fb 100644
--- a/src/gpu/ops/GrTextureOp.cpp
+++ b/src/gpu/ops/GrTextureOp.cpp
@@ -229,13 +229,19 @@
#endif
GrProcessorSet::Analysis finalize(
- const GrCaps&, const GrAppliedClip*, GrFSAAType, GrClampType) override {
+ const GrCaps& caps, const GrAppliedClip*, GrFSAAType, GrClampType clampType) override {
SkASSERT(!fFinalized);
fFinalized = true;
for (unsigned p = 0; p < fProxyCnt; ++p) {
fProxies[p].fProxy->addPendingRead();
fProxies[p].fProxy->unref();
}
+ fColorType = static_cast<unsigned>(ColorType::kNone);
+ for (int q = 0; q < fQuads.count(); ++q) {
+ const ColorDomainAndAA& info = fQuads.metadata(q);
+ auto colorType = GrQuadPerEdgeAA::MinColorType(info.fColor, clampType, caps);
+ fColorType = SkTMax(fColorType, static_cast<unsigned>(colorType));
+ }
return GrProcessorSet::EmptySetAnalysis();
}
@@ -292,7 +298,6 @@
auto bounds = dstQuad.bounds(dstQuadType);
this->setBounds(bounds, HasAABloat(aaType == GrAAType::kCoverage), IsZeroArea::kNo);
fDomain = static_cast<unsigned>(domain);
- fColorType = static_cast<unsigned>(GrQuadPerEdgeAA::MinColorType(color));
fCanSkipAllocatorGather =
static_cast<unsigned>(fProxies[0].fProxy->canSkipResourceAllocator());
}
@@ -373,7 +378,6 @@
}
this->setBounds(bounds, HasAABloat(this->aaType() == GrAAType::kCoverage), IsZeroArea::kNo);
fDomain = static_cast<unsigned>(false);
- fColorType = static_cast<unsigned>(allOpaque ? ColorType::kNone : ColorType::kByte);
}
void tess(void* v, const VertexSpec& spec, const GrTextureProxy* proxy, int start,