From b609e6dc6a02336aed04caaddcdd5ccfbe7ba9ec Mon Sep 17 00:00:00 2001 From: Ruiqi Mao Date: Tue, 17 Jul 2018 10:19:38 -0400 Subject: added byte and ubyte types to SKSL created new GMs for skinning Bug: skia: Change-Id: I15fb2bd02fba8beb6dd2dd3f3716da016ea92192 Reviewed-on: https://skia-review.googlesource.com/140241 Commit-Queue: Ruiqi Mao Reviewed-by: Brian Osman Reviewed-by: Ethan Nicholas --- src/gpu/ops/GrAAConvexPathRenderer.cpp | 11 +++++--- src/gpu/ops/GrAAFillRectOp.cpp | 3 ++- src/gpu/ops/GrAAHairLinePathRenderer.cpp | 3 ++- src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp | 11 +++++--- src/gpu/ops/GrAAStrokeRectOp.cpp | 11 +++++--- src/gpu/ops/GrDashOp.cpp | 5 +++- src/gpu/ops/GrDefaultPathRenderer.cpp | 6 ++++- src/gpu/ops/GrDrawAtlasOp.cpp | 10 ++++--- src/gpu/ops/GrDrawVerticesOp.cpp | 32 ++++++++++++++--------- src/gpu/ops/GrDrawVerticesOp.h | 3 ++- src/gpu/ops/GrNonAAFillRectOp.cpp | 26 +++++++++++------- src/gpu/ops/GrNonAAStrokeRectOp.cpp | 3 ++- src/gpu/ops/GrRegionOp.cpp | 10 ++++--- src/gpu/ops/GrTessellatingPathRenderer.cpp | 6 +++-- 14 files changed, 94 insertions(+), 46 deletions(-) (limited to 'src/gpu/ops') diff --git a/src/gpu/ops/GrAAConvexPathRenderer.cpp b/src/gpu/ops/GrAAConvexPathRenderer.cpp index 7f54357cc4..3d475b947a 100644 --- a/src/gpu/ops/GrAAConvexPathRenderer.cpp +++ b/src/gpu/ops/GrAAConvexPathRenderer.cpp @@ -723,7 +723,8 @@ static void extract_lines_only_verts(const GrAAConvexTessellator& tess, } } -static sk_sp make_lines_only_gp(bool tweakAlphaForCoverage, +static sk_sp make_lines_only_gp(const GrShaderCaps* shaderCaps, + bool tweakAlphaForCoverage, const SkMatrix& viewMatrix, bool usesLocalCoords) { using namespace GrDefaultGeoProcFactory; @@ -736,7 +737,10 @@ static sk_sp make_lines_only_gp(bool tweakAlphaForCoverage, } LocalCoords::Type localCoordsType = usesLocalCoords ? LocalCoords::kUsePosition_Type : LocalCoords::kUnused_Type; - return MakeForDeviceSpace(Color::kPremulGrColorAttribute_Type, coverageType, localCoordsType, + return MakeForDeviceSpace(shaderCaps, + Color::kPremulGrColorAttribute_Type, + coverageType, + localCoordsType, viewMatrix); } @@ -790,7 +794,8 @@ public: private: void prepareLinesOnlyDraws(Target* target) { // Setup GrGeometryProcessor - sk_sp gp(make_lines_only_gp(fHelper.compatibleWithAlphaAsCoverage(), + sk_sp gp(make_lines_only_gp(target->caps().shaderCaps(), + fHelper.compatibleWithAlphaAsCoverage(), fPaths.back().fViewMatrix, fHelper.usesLocalCoords())); if (!gp) { diff --git a/src/gpu/ops/GrAAFillRectOp.cpp b/src/gpu/ops/GrAAFillRectOp.cpp index 0d97de493a..592c0b2774 100644 --- a/src/gpu/ops/GrAAFillRectOp.cpp +++ b/src/gpu/ops/GrAAFillRectOp.cpp @@ -255,7 +255,8 @@ private: } sk_sp gp = - GrDefaultGeoProcFactory::Make(color, coverageType, lc, SkMatrix::I()); + GrDefaultGeoProcFactory::Make(target->caps().shaderCaps(), color, coverageType, + lc, SkMatrix::I()); if (!gp) { SkDebugf("Couldn't create GrGeometryProcessor\n"); return; diff --git a/src/gpu/ops/GrAAHairLinePathRenderer.cpp b/src/gpu/ops/GrAAHairLinePathRenderer.cpp index bed8cbfd34..d6f3c0664e 100644 --- a/src/gpu/ops/GrAAHairLinePathRenderer.cpp +++ b/src/gpu/ops/GrAAHairLinePathRenderer.cpp @@ -951,7 +951,8 @@ void AAHairlineOp::onPrepareDraws(Target* target) { LocalCoords localCoords(fHelper.usesLocalCoords() ? LocalCoords::kUsePosition_Type : LocalCoords::kUnused_Type); localCoords.fMatrix = geometryProcessorLocalM; - lineGP = GrDefaultGeoProcFactory::Make(color, Coverage::kAttribute_Type, localCoords, + lineGP = GrDefaultGeoProcFactory::Make(target->caps().shaderCaps(), + color, Coverage::kAttribute_Type, localCoords, *geometryProcessorViewM); } diff --git a/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp b/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp index 958f0f991e..75662d35fe 100644 --- a/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp +++ b/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp @@ -112,7 +112,8 @@ static void extract_verts(const GrAAConvexTessellator& tess, } } -static sk_sp create_lines_only_gp(bool tweakAlphaForCoverage, +static sk_sp create_lines_only_gp(const GrShaderCaps* shaderCaps, + bool tweakAlphaForCoverage, const SkMatrix& viewMatrix, bool usesLocalCoords) { using namespace GrDefaultGeoProcFactory; @@ -125,7 +126,10 @@ static sk_sp create_lines_only_gp(bool tweakAlphaForCoverag } LocalCoords::Type localCoordsType = usesLocalCoords ? LocalCoords::kUsePosition_Type : LocalCoords::kUnused_Type; - return MakeForDeviceSpace(Color::kPremulGrColorAttribute_Type, coverageType, localCoordsType, + return MakeForDeviceSpace(shaderCaps, + Color::kPremulGrColorAttribute_Type, + coverageType, + localCoordsType, viewMatrix); } @@ -240,7 +244,8 @@ private: void onPrepareDraws(Target* target) override { auto pipe = fHelper.makePipeline(target); // Setup GrGeometryProcessor - sk_sp gp(create_lines_only_gp(fHelper.compatibleWithAlphaAsCoverage(), + sk_sp gp(create_lines_only_gp(target->caps().shaderCaps(), + fHelper.compatibleWithAlphaAsCoverage(), this->viewMatrix(), fHelper.usesLocalCoords())); if (!gp) { diff --git a/src/gpu/ops/GrAAStrokeRectOp.cpp b/src/gpu/ops/GrAAStrokeRectOp.cpp index 1b2ab8e2a6..92d1c01a3d 100644 --- a/src/gpu/ops/GrAAStrokeRectOp.cpp +++ b/src/gpu/ops/GrAAStrokeRectOp.cpp @@ -94,7 +94,8 @@ static void compute_rects(SkRect* devOutside, SkRect* devOutsideAssist, SkRect* } } -static sk_sp create_stroke_rect_gp(bool tweakAlphaForCoverage, +static sk_sp create_stroke_rect_gp(const GrShaderCaps* shaderCaps, + bool tweakAlphaForCoverage, const SkMatrix& viewMatrix, bool usesLocalCoords) { using namespace GrDefaultGeoProcFactory; @@ -107,7 +108,10 @@ static sk_sp create_stroke_rect_gp(bool tweakAlphaForCovera } LocalCoords::Type localCoordsType = usesLocalCoords ? LocalCoords::kUsePosition_Type : LocalCoords::kUnused_Type; - return MakeForDeviceSpace(Color::kPremulGrColorAttribute_Type, coverageType, localCoordsType, + return MakeForDeviceSpace(shaderCaps, + Color::kPremulGrColorAttribute_Type, + coverageType, + localCoordsType, viewMatrix); } @@ -258,7 +262,8 @@ private: } // anonymous namespace void AAStrokeRectOp::onPrepareDraws(Target* target) { - sk_sp gp(create_stroke_rect_gp(fHelper.compatibleWithAlphaAsCoverage(), + sk_sp gp(create_stroke_rect_gp(target->caps().shaderCaps(), + fHelper.compatibleWithAlphaAsCoverage(), this->viewMatrix(), fHelper.usesLocalCoords())); if (!gp) { diff --git a/src/gpu/ops/GrDashOp.cpp b/src/gpu/ops/GrDashOp.cpp index 76203e521a..61fad24bcd 100644 --- a/src/gpu/ops/GrDashOp.cpp +++ b/src/gpu/ops/GrDashOp.cpp @@ -392,7 +392,10 @@ private: Color color(this->color()); LocalCoords::Type localCoordsType = fUsesLocalCoords ? LocalCoords::kUsePosition_Type : LocalCoords::kUnused_Type; - gp = MakeForDeviceSpace(color, Coverage::kSolid_Type, localCoordsType, + gp = MakeForDeviceSpace(target->caps().shaderCaps(), + color, + Coverage::kSolid_Type, + localCoordsType, this->viewMatrix()); } diff --git a/src/gpu/ops/GrDefaultPathRenderer.cpp b/src/gpu/ops/GrDefaultPathRenderer.cpp index 9fb1027375..07e40f0454 100644 --- a/src/gpu/ops/GrDefaultPathRenderer.cpp +++ b/src/gpu/ops/GrDefaultPathRenderer.cpp @@ -405,7 +405,11 @@ private: Coverage coverage(this->coverage()); LocalCoords localCoords(fHelper.usesLocalCoords() ? LocalCoords::kUsePosition_Type : LocalCoords::kUnused_Type); - gp = GrDefaultGeoProcFactory::Make(color, coverage, localCoords, this->viewMatrix()); + gp = GrDefaultGeoProcFactory::Make(target->caps().shaderCaps(), + color, + coverage, + localCoords, + this->viewMatrix()); } SkASSERT(gp->debugOnly_vertexStride() == sizeof(SkPoint)); diff --git a/src/gpu/ops/GrDrawAtlasOp.cpp b/src/gpu/ops/GrDrawAtlasOp.cpp index 0f94d7e548..d280ad9dff 100644 --- a/src/gpu/ops/GrDrawAtlasOp.cpp +++ b/src/gpu/ops/GrDrawAtlasOp.cpp @@ -13,7 +13,8 @@ #include "SkRandom.h" #include "SkRectPriv.h" -static sk_sp make_gp(bool hasColors, +static sk_sp make_gp(const GrShaderCaps* shaderCaps, + bool hasColors, GrColor color, const SkMatrix& viewMatrix) { using namespace GrDefaultGeoProcFactory; @@ -22,7 +23,7 @@ static sk_sp make_gp(bool hasColors, gpColor.fType = Color::kPremulGrColorAttribute_Type; } - return GrDefaultGeoProcFactory::Make(gpColor, Coverage::kSolid_Type, + return GrDefaultGeoProcFactory::Make(shaderCaps, gpColor, Coverage::kSolid_Type, LocalCoords::kHasExplicit_Type, viewMatrix); } @@ -119,7 +120,10 @@ SkString GrDrawAtlasOp::dumpInfo() const { void GrDrawAtlasOp::onPrepareDraws(Target* target) { // Setup geometry processor - sk_sp gp(make_gp(this->hasColors(), this->color(), this->viewMatrix())); + sk_sp gp(make_gp(target->caps().shaderCaps(), + this->hasColors(), + this->color(), + this->viewMatrix())); int instanceCount = fGeoData.count(); size_t vertexStride = diff --git a/src/gpu/ops/GrDrawVerticesOp.cpp b/src/gpu/ops/GrDrawVerticesOp.cpp index 83a703fb54..b5d16ea83a 100644 --- a/src/gpu/ops/GrDrawVerticesOp.cpp +++ b/src/gpu/ops/GrDrawVerticesOp.cpp @@ -152,7 +152,8 @@ GrDrawOp::RequiresDstTexture GrDrawVerticesOp::finalize(const GrCaps& caps, return result; } -sk_sp GrDrawVerticesOp::makeGP(bool* hasColorAttribute, +sk_sp GrDrawVerticesOp::makeGP(const GrShaderCaps* shaderCaps, + bool* hasColorAttribute, bool* hasLocalCoordAttribute, bool* hasBoneAttribute) const { using namespace GrDefaultGeoProcFactory; @@ -191,13 +192,15 @@ sk_sp GrDrawVerticesOp::makeGP(bool* hasColorAttribute, *hasBoneAttribute = this->hasBones(); if (this->hasBones()) { - return GrDefaultGeoProcFactory::MakeWithBones(color, + return GrDefaultGeoProcFactory::MakeWithBones(shaderCaps, + color, Coverage::kSolid_Type, localCoordsType, bones, vm); } else { - return GrDefaultGeoProcFactory::Make(color, + return GrDefaultGeoProcFactory::Make(shaderCaps, + color, Coverage::kSolid_Type, localCoordsType, vm); @@ -205,7 +208,8 @@ sk_sp GrDrawVerticesOp::makeGP(bool* hasColorAttribute, } void GrDrawVerticesOp::onPrepareDraws(Target* target) { - if (fMeshes[0].fVertices->isVolatile()) { + bool hasMapBufferSupport = GrCaps::kNone_MapFlags != target->caps().mapBufferFlags(); + if (fMeshes[0].fVertices->isVolatile() || !hasMapBufferSupport) { this->drawVolatile(target); } else { this->drawNonVolatile(target); @@ -216,7 +220,8 @@ void GrDrawVerticesOp::drawVolatile(Target* target) { bool hasColorAttribute; bool hasLocalCoordsAttribute; bool hasBoneAttribute; - sk_sp gp = this->makeGP(&hasColorAttribute, + sk_sp gp = this->makeGP(target->caps().shaderCaps(), + &hasColorAttribute, &hasLocalCoordsAttribute, &hasBoneAttribute); @@ -224,7 +229,7 @@ void GrDrawVerticesOp::drawVolatile(Target* target) { size_t vertexStride = sizeof(SkPoint) + (hasColorAttribute ? sizeof(uint32_t) : 0) + (hasLocalCoordsAttribute ? sizeof(SkPoint) : 0) + - (hasBoneAttribute ? 4 * (sizeof(uint32_t) + sizeof(float)) : 0); + (hasBoneAttribute ? 4 * (sizeof(int8_t) + sizeof(uint8_t)) : 0); SkASSERT(vertexStride == gp->debugOnly_vertexStride()); // Allocate buffers. @@ -265,7 +270,8 @@ void GrDrawVerticesOp::drawNonVolatile(Target* target) { bool hasColorAttribute; bool hasLocalCoordsAttribute; bool hasBoneAttribute; - sk_sp gp = this->makeGP(&hasColorAttribute, + sk_sp gp = this->makeGP(target->caps().shaderCaps(), + &hasColorAttribute, &hasLocalCoordsAttribute, &hasBoneAttribute); @@ -300,7 +306,7 @@ void GrDrawVerticesOp::drawNonVolatile(Target* target) { size_t vertexStride = sizeof(SkPoint) + (hasColorAttribute ? sizeof(uint32_t) : 0) + (hasLocalCoordsAttribute ? sizeof(SkPoint) : 0) + - (hasBoneAttribute ? 4 * (sizeof(uint32_t) + sizeof(float)) : 0); + (hasBoneAttribute ? 4 * (sizeof(int8_t) + sizeof(uint8_t)) : 0); SkASSERT(vertexStride == gp->debugOnly_vertexStride()); // Allocate vertex buffer. @@ -417,7 +423,7 @@ void GrDrawVerticesOp::fillBuffers(bool hasColorAttribute, } size_t boneIndexOffset = offset; if (hasBoneAttribute) { - offset += 4 * sizeof(uint32_t); + offset += 4 * sizeof(int8_t); } size_t boneWeightOffset = offset; @@ -445,10 +451,10 @@ void GrDrawVerticesOp::fillBuffers(bool hasColorAttribute, const SkVertices::BoneIndices& indices = boneIndices[j]; const SkVertices::BoneWeights& weights = boneWeights[j]; for (int k = 0; k < 4; k++) { - size_t indexOffset = boneIndexOffset + sizeof(uint32_t) * k; - size_t weightOffset = boneWeightOffset + sizeof(float) * k; - *(uint32_t*)((intptr_t)verts + indexOffset) = indices.indices[k]; - *(float*)((intptr_t)verts + weightOffset) = weights.weights[k]; + size_t indexOffset = boneIndexOffset + sizeof(int8_t) * k; + size_t weightOffset = boneWeightOffset + sizeof(uint8_t) * k; + *(int8_t*)((intptr_t)verts + indexOffset) = indices.indices[k]; + *(uint8_t*)((intptr_t)verts + weightOffset) = weights.weights[k] * 255.0f; } } verts = (void*)((intptr_t)verts + vertexStride); diff --git a/src/gpu/ops/GrDrawVerticesOp.h b/src/gpu/ops/GrDrawVerticesOp.h index 9b638b8172..7695dd9f87 100644 --- a/src/gpu/ops/GrDrawVerticesOp.h +++ b/src/gpu/ops/GrDrawVerticesOp.h @@ -86,7 +86,8 @@ private: const GrBuffer* indexBuffer, int firstIndex); - sk_sp makeGP(bool* hasColorAttribute, + sk_sp makeGP(const GrShaderCaps* shaderCaps, + bool* hasColorAttribute, bool* hasLocalCoordAttribute, bool* hasBoneAttribute) const; diff --git a/src/gpu/ops/GrNonAAFillRectOp.cpp b/src/gpu/ops/GrNonAAFillRectOp.cpp index 1b76d4abfe..c5542328c7 100644 --- a/src/gpu/ops/GrNonAAFillRectOp.cpp +++ b/src/gpu/ops/GrNonAAFillRectOp.cpp @@ -29,13 +29,17 @@ static const int kIndicesPerRect = 6; The vertex attrib order is always pos, color, [local coords]. */ -static sk_sp make_gp() { +static sk_sp make_gp(const GrShaderCaps* shaderCaps) { using namespace GrDefaultGeoProcFactory; - return GrDefaultGeoProcFactory::Make(Color::kPremulGrColorAttribute_Type, Coverage::kSolid_Type, - LocalCoords::kHasExplicit_Type, SkMatrix::I()); + return GrDefaultGeoProcFactory::Make(shaderCaps, + Color::kPremulGrColorAttribute_Type, + Coverage::kSolid_Type, + LocalCoords::kHasExplicit_Type, + SkMatrix::I()); } -static sk_sp make_perspective_gp(const SkMatrix& viewMatrix, +static sk_sp make_perspective_gp(const GrShaderCaps* shaderCaps, + const SkMatrix& viewMatrix, bool hasExplicitLocalCoords, const SkMatrix* localMatrix) { SkASSERT(viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPerspective())); @@ -50,15 +54,16 @@ static sk_sp make_perspective_gp(const SkMatrix& viewMatrix LocalCoords localCoords(hasExplicitLocalCoords ? LocalCoords::kHasExplicit_Type : LocalCoords::kUsePosition_Type, localMatrix); - return GrDefaultGeoProcFactory::Make(Color::kPremulGrColorAttribute_Type, + return GrDefaultGeoProcFactory::Make(shaderCaps, Color::kPremulGrColorAttribute_Type, Coverage::kSolid_Type, localCoords, viewMatrix); } else if (hasExplicitLocalCoords) { LocalCoords localCoords(LocalCoords::kHasExplicit_Type, localMatrix); - return GrDefaultGeoProcFactory::Make(Color::kPremulGrColorAttribute_Type, + return GrDefaultGeoProcFactory::Make(shaderCaps, Color::kPremulGrColorAttribute_Type, Coverage::kSolid_Type, localCoords, SkMatrix::I()); } else { LocalCoords localCoords(LocalCoords::kUsePosition_Type, localMatrix); - return GrDefaultGeoProcFactory::MakeForDeviceSpace(Color::kPremulGrColorAttribute_Type, + return GrDefaultGeoProcFactory::MakeForDeviceSpace(shaderCaps, + Color::kPremulGrColorAttribute_Type, Coverage::kSolid_Type, localCoords, viewMatrix); } @@ -174,7 +179,7 @@ public: private: void onPrepareDraws(Target* target) override { - sk_sp gp = make_gp(); + sk_sp gp = make_gp(target->caps().shaderCaps()); if (!gp) { SkDebugf("Couldn't create GrGeometryProcessor\n"); return; @@ -304,7 +309,10 @@ public: private: void onPrepareDraws(Target* target) override { sk_sp gp = make_perspective_gp( - fViewMatrix, fHasLocalRect, fHasLocalMatrix ? &fLocalMatrix : nullptr); + target->caps().shaderCaps(), + fViewMatrix, + fHasLocalRect, + fHasLocalMatrix ? &fLocalMatrix : nullptr); if (!gp) { SkDebugf("Couldn't create GrGeometryProcessor\n"); return; diff --git a/src/gpu/ops/GrNonAAStrokeRectOp.cpp b/src/gpu/ops/GrNonAAStrokeRectOp.cpp index 357d9232ff..21636b26dc 100644 --- a/src/gpu/ops/GrNonAAStrokeRectOp.cpp +++ b/src/gpu/ops/GrNonAAStrokeRectOp.cpp @@ -147,7 +147,8 @@ private: LocalCoords::Type localCoordsType = fHelper.usesLocalCoords() ? LocalCoords::kUsePosition_Type : LocalCoords::kUnused_Type; - gp = GrDefaultGeoProcFactory::Make(color, Coverage::kSolid_Type, localCoordsType, + gp = GrDefaultGeoProcFactory::Make(target->caps().shaderCaps(), color, + Coverage::kSolid_Type, localCoordsType, fViewMatrix); } diff --git a/src/gpu/ops/GrRegionOp.cpp b/src/gpu/ops/GrRegionOp.cpp index 852cd46c70..d0c24e6e73 100644 --- a/src/gpu/ops/GrRegionOp.cpp +++ b/src/gpu/ops/GrRegionOp.cpp @@ -19,10 +19,12 @@ static const int kVertsPerInstance = 4; static const int kIndicesPerInstance = 6; -static sk_sp make_gp(const SkMatrix& viewMatrix) { +static sk_sp make_gp(const GrShaderCaps* shaderCaps, + const SkMatrix& viewMatrix) { using namespace GrDefaultGeoProcFactory; - return GrDefaultGeoProcFactory::Make(Color::kPremulGrColorAttribute_Type, Coverage::kSolid_Type, - LocalCoords::kUsePosition_Type, viewMatrix); + return GrDefaultGeoProcFactory::Make(shaderCaps, Color::kPremulGrColorAttribute_Type, + Coverage::kSolid_Type, LocalCoords::kUsePosition_Type, + viewMatrix); } static void tesselate_region(intptr_t vertices, @@ -109,7 +111,7 @@ public: private: void onPrepareDraws(Target* target) override { - sk_sp gp = make_gp(fViewMatrix); + sk_sp gp = make_gp(target->caps().shaderCaps(), fViewMatrix); if (!gp) { SkDebugf("Couldn't create GrGeometryProcessor\n"); return; diff --git a/src/gpu/ops/GrTessellatingPathRenderer.cpp b/src/gpu/ops/GrTessellatingPathRenderer.cpp index 475197e197..2fea9cb053 100644 --- a/src/gpu/ops/GrTessellatingPathRenderer.cpp +++ b/src/gpu/ops/GrTessellatingPathRenderer.cpp @@ -335,10 +335,12 @@ private: coverageType = Coverage::kSolid_Type; } if (fAntiAlias) { - gp = GrDefaultGeoProcFactory::MakeForDeviceSpace(color, coverageType, + gp = GrDefaultGeoProcFactory::MakeForDeviceSpace(target->caps().shaderCaps(), + color, coverageType, localCoordsType, fViewMatrix); } else { - gp = GrDefaultGeoProcFactory::Make(color, coverageType, localCoordsType, + gp = GrDefaultGeoProcFactory::Make(target->caps().shaderCaps(), + color, coverageType, localCoordsType, fViewMatrix); } } -- cgit v1.2.3