diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gpu/GrRenderTargetContext.cpp | 43 | ||||
-rw-r--r-- | src/gpu/GrRenderTargetContext.h | 45 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 33 | ||||
-rw-r--r-- | src/gpu/ops/GrDrawVerticesOp.cpp | 61 | ||||
-rw-r--r-- | src/gpu/ops/GrDrawVerticesOp.h | 42 |
5 files changed, 65 insertions, 159 deletions
diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp index fa1e0b3d00..37de07e3f0 100644 --- a/src/gpu/GrRenderTargetContext.cpp +++ b/src/gpu/GrRenderTargetContext.cpp @@ -836,42 +836,8 @@ void GrRenderTargetContext::fillRectWithLocalMatrix(const GrClip& clip, void GrRenderTargetContext::drawVertices(const GrClip& clip, GrPaint&& paint, const SkMatrix& viewMatrix, - GrPrimitiveType primitiveType, - int vertexCount, - const SkPoint positions[], - const SkPoint texCoords[], - const uint32_t colors[], - const uint16_t indices[], - int indexCount, - ColorArrayType colorArrayType) { - ASSERT_SINGLE_OWNER - RETURN_IF_ABANDONED - SkDEBUGCODE(this->validate();) - GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrRenderTargetContext::drawVertices"); - - AutoCheckFlush acf(this->drawingManager()); - - // TODO clients should give us bounds - SkRect bounds; - if (!bounds.setBoundsCheck(positions, vertexCount)) { - SkDebugf("drawVertices call empty bounds\n"); - return; - } - - std::unique_ptr<GrLegacyMeshDrawOp> op = GrDrawVerticesOp::Make( - paint.getColor(), primitiveType, viewMatrix, positions, vertexCount, indices, - indexCount, colors, texCoords, bounds, colorArrayType); - if (!op) { - return; - } - GrPipelineBuilder pipelineBuilder(std::move(paint), GrAAType::kNone); - this->addLegacyMeshDrawOp(std::move(pipelineBuilder), clip, std::move(op)); -} - -void GrRenderTargetContext::drawVertices(const GrClip& clip, - GrPaint&& paint, - const SkMatrix& viewMatrix, - sk_sp<SkVertices> vertices) { + sk_sp<SkVertices> vertices, + GrPrimitiveType* overridePrimType) { ASSERT_SINGLE_OWNER RETURN_IF_ABANDONED SkDEBUGCODE(this->validate();) @@ -880,8 +846,9 @@ void GrRenderTargetContext::drawVertices(const GrClip& clip, AutoCheckFlush acf(this->drawingManager()); SkASSERT(vertices); - std::unique_ptr<GrLegacyMeshDrawOp> op = - GrDrawVerticesOp::Make(paint.getColor(), std::move(vertices), viewMatrix); + std::unique_ptr<GrLegacyMeshDrawOp> op = GrDrawVerticesOp::Make(paint.getColor(), + std::move(vertices), viewMatrix, + overridePrimType); if (!op) { return; } diff --git a/src/gpu/GrRenderTargetContext.h b/src/gpu/GrRenderTargetContext.h index fe20a6dbcc..20df4c5f55 100644 --- a/src/gpu/GrRenderTargetContext.h +++ b/src/gpu/GrRenderTargetContext.h @@ -201,52 +201,19 @@ public: const SkPath&, const GrStyle& style); - enum class ColorArrayType { - kPremulGrColor, - kSkColor, - }; /** * Draws vertices with a paint. * - * @param paint describes how to color pixels. - * @param viewMatrix transformation matrix - * @param primitiveType primitives type to draw. - * @param vertexCount number of vertices. - * @param positions array of vertex positions, required. - * @param texCoords optional array of texture coordinates used - * to access the paint. - * @param colors optional array of per-vertex colors, supercedes - * the paint's color field. - * @param indices optional array of indices. If NULL vertices - * are drawn non-indexed. - * @param indexCount if indices is non-null then this is the - * number of indices. - * @param ColorArrayType Determines how the color array should be interpreted. - */ - void drawVertices(const GrClip&, - GrPaint&& paint, - const SkMatrix& viewMatrix, - GrPrimitiveType primitiveType, - int vertexCount, - const SkPoint positions[], - const SkPoint texs[], - const uint32_t colors[], - const uint16_t indices[], - int indexCount, - ColorArrayType = ColorArrayType::kPremulGrColor); - - /** - * Draws vertices with a paint. - * - * @param paint describes how to color pixels. - * @param viewMatrix transformation matrix - * @param veritces specifies the mesh to draw. - * @param flags A bitfield of options specified by SkCanvas::VerticesFlags. + * @param paint describes how to color pixels. + * @param viewMatrix transformation matrix + * @param vertices specifies the mesh to draw. + * @param overridePrimType primitive type to draw. If NULL, derive prim type from vertices. */ void drawVertices(const GrClip&, GrPaint&& paint, const SkMatrix& viewMatrix, - sk_sp<SkVertices> vertices); + sk_sp<SkVertices> vertices, + GrPrimitiveType* overridePrimType = nullptr); /** * Draws textured sprites from an atlas with a paint. This currently does not support AA for the diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index c48e8d59dd..56dc4cc80d 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -389,16 +389,12 @@ void SkGpuDevice::drawPoints(SkCanvas::PointMode mode, return; } - fRenderTargetContext->drawVertices(this->clip(), - std::move(grPaint), - *viewMatrix, - primitiveType, - SkToS32(count), - (SkPoint*)pts, - nullptr, - nullptr, - nullptr, - 0); + static constexpr SkVertices::VertexMode kIgnoredMode = SkVertices::kTriangles_VertexMode; + sk_sp<SkVertices> vertices = SkVertices::MakeCopy(kIgnoredMode, SkToS32(count), pts, nullptr, + nullptr); + + fRenderTargetContext->drawVertices(this->clip(), std::move(grPaint), *viewMatrix, + std::move(vertices), &primitiveType); } /////////////////////////////////////////////////////////////////////////////// @@ -1614,7 +1610,11 @@ void SkGpuDevice::wireframeVertices(SkVertices::VertexMode vmode, int vertexCoun //number of indices for lines per triangle with kLines indexCount = triangleCount * 6; - std::unique_ptr<uint16_t[]> lineIndices(new uint16_t[indexCount]); + static constexpr SkVertices::VertexMode kIgnoredMode = SkVertices::kTriangles_VertexMode; + SkVertices::Builder builder(kIgnoredMode, vertexCount, indexCount, 0); + memcpy(builder.positions(), vertices, vertexCount * sizeof(SkPoint)); + + uint16_t* lineIndices = builder.indices(); int i = 0; while (vertProc(&state)) { lineIndices[i] = state.f0; @@ -1625,16 +1625,13 @@ void SkGpuDevice::wireframeVertices(SkVertices::VertexMode vmode, int vertexCoun lineIndices[i + 5] = state.f0; i += 6; } + + GrPrimitiveType primitiveType = kLines_GrPrimitiveType; fRenderTargetContext->drawVertices(this->clip(), std::move(grPaint), this->ctm(), - kLines_GrPrimitiveType, - vertexCount, - vertices, - nullptr, - nullptr, - lineIndices.get(), - indexCount); + builder.detach(), + &primitiveType); } void SkGpuDevice::drawVertices(const SkVertices* vertices, SkBlendMode mode, diff --git a/src/gpu/ops/GrDrawVerticesOp.cpp b/src/gpu/ops/GrDrawVerticesOp.cpp index 73d29ea81f..2a61f3c853 100644 --- a/src/gpu/ops/GrDrawVerticesOp.cpp +++ b/src/gpu/ops/GrDrawVerticesOp.cpp @@ -10,48 +10,26 @@ #include "GrOpFlushState.h" #include "SkGr.h" -std::unique_ptr<GrLegacyMeshDrawOp> GrDrawVerticesOp::Make( - GrColor color, GrPrimitiveType primitiveType, const SkMatrix& viewMatrix, - const SkPoint* positions, int vertexCount, const uint16_t* indices, int indexCount, - const uint32_t* colors, const SkPoint* localCoords, const SkRect& bounds, - GrRenderTargetContext::ColorArrayType colorArrayType) { - static constexpr SkVertices::VertexMode kIgnoredMode = SkVertices::kTriangles_VertexMode; - SkASSERT(positions); - if (!colors) { - // When we tessellate we will fill a color array with the GrColor value passed above as - // 'color'. - colorArrayType = GrRenderTargetContext::ColorArrayType::kPremulGrColor; - } - sk_sp<SkVertices> vertices = SkVertices::MakeCopy(kIgnoredMode, vertexCount, positions, - localCoords, colors, indexCount, indices); - if (!vertices) { - return nullptr; - } - return std::unique_ptr<GrLegacyMeshDrawOp>(new GrDrawVerticesOp( - std::move(vertices), primitiveType, color, colorArrayType, viewMatrix)); -} - std::unique_ptr<GrLegacyMeshDrawOp> GrDrawVerticesOp::Make(GrColor color, sk_sp<SkVertices> vertices, - const SkMatrix& viewMatrix) { + const SkMatrix& viewMatrix, + GrPrimitiveType* overridePrimType) { SkASSERT(vertices); - GrPrimitiveType primType = SkVertexModeToGrPrimitiveType(vertices->mode()); - GrRenderTargetContext::ColorArrayType colorArrayType = - vertices->hasColors() ? GrRenderTargetContext::ColorArrayType::kSkColor - : GrRenderTargetContext::ColorArrayType::kPremulGrColor; + GrPrimitiveType primType = overridePrimType ? *overridePrimType + : SkVertexModeToGrPrimitiveType(vertices->mode()); return std::unique_ptr<GrLegacyMeshDrawOp>( - new GrDrawVerticesOp(std::move(vertices), primType, color, colorArrayType, viewMatrix)); + new GrDrawVerticesOp(std::move(vertices), primType, color, viewMatrix)); } GrDrawVerticesOp::GrDrawVerticesOp(sk_sp<SkVertices> vertices, GrPrimitiveType primitiveType, - GrColor color, - GrRenderTargetContext::ColorArrayType colorArrayType, - const SkMatrix& viewMatrix) - : INHERITED(ClassID()), fColorArrayType(colorArrayType) { + GrColor color, const SkMatrix& viewMatrix) + : INHERITED(ClassID()) { SkASSERT(vertices); fVertexCount = vertices->vertexCount(); fIndexCount = vertices->indexCount(); + fColorArrayType = vertices->hasColors() ? ColorArrayType::kSkColor + : ColorArrayType::kPremulGrColor; fPrimitiveType = primitiveType; Mesh& mesh = fMeshes.push_back(); @@ -95,7 +73,7 @@ void GrDrawVerticesOp::applyPipelineOptimizations(const PipelineOptimizations& o fMeshes[0].fColor = overrideColor; fMeshes[0].fIgnoreColors = true; fFlags &= ~kRequiresPerVertexColors_Flag; - fColorArrayType = GrRenderTargetContext::ColorArrayType::kPremulGrColor; + fColorArrayType = ColorArrayType::kPremulGrColor; } if (optimizations.readsLocalCoords()) { fFlags |= kPipelineRequiresLocalCoords_Flag; @@ -126,7 +104,7 @@ sk_sp<GrGeometryProcessor> GrDrawVerticesOp::makeGP(bool* hasColorAttribute, Color color(fMeshes[0].fColor); if (this->requiresPerVertexColors()) { - color.fType = (fColorArrayType == GrRenderTargetContext::ColorArrayType::kPremulGrColor) + color.fType = (fColorArrayType == ColorArrayType::kPremulGrColor) ? Color::kPremulGrColorAttribute_Type : Color::kUnpremulSkColorAttribute_Type; *hasColorAttribute = true; @@ -384,18 +362,17 @@ GR_LEGACY_MESH_DRAW_OP_TEST_DEFINE(VerticesOp) { hasIndices); } - GrRenderTargetContext::ColorArrayType colorArrayType = - random->nextBool() ? GrRenderTargetContext::ColorArrayType::kPremulGrColor - : GrRenderTargetContext::ColorArrayType::kSkColor; SkMatrix viewMatrix = GrTest::TestMatrix(random); - SkRect bounds; - SkDEBUGCODE(bool result =) bounds.setBoundsCheck(positions.begin(), vertexCount); - SkASSERT(result); GrColor color = GrRandomColor(random); - return GrDrawVerticesOp::Make(color, type, viewMatrix, positions.begin(), vertexCount, - indices.begin(), hasIndices ? indices.count() : 0, colors.begin(), - texCoords.begin(), bounds, colorArrayType); + + static constexpr SkVertices::VertexMode kIgnoredMode = SkVertices::kTriangles_VertexMode; + sk_sp<SkVertices> vertices = SkVertices::MakeCopy(kIgnoredMode, vertexCount, positions.begin(), + texCoords.begin(), colors.begin(), + hasIndices ? indices.count() : 0, + indices.begin()); + return std::unique_ptr<GrLegacyMeshDrawOp>( + new GrDrawVerticesOp(std::move(vertices), type, color, viewMatrix)); } #endif diff --git a/src/gpu/ops/GrDrawVerticesOp.h b/src/gpu/ops/GrDrawVerticesOp.h index 009c5e0415..0c75dcfc84 100644 --- a/src/gpu/ops/GrDrawVerticesOp.h +++ b/src/gpu/ops/GrDrawVerticesOp.h @@ -17,6 +17,10 @@ #include "SkTDArray.h" #include "SkVertices.h" +#if GR_TEST_UTILS +#include "GrDrawOpTest.h" +#endif + class GrOpFlushState; class SkVertices; struct GrInitInvariantOutput; @@ -26,27 +30,13 @@ public: DEFINE_OP_CLASS_ID /** - * The 'color' param is used if the 'colors' array is null. 'bounds' is the bounds of the - * 'positions' array (in local space prior to application of 'viewMatrix'). If 'indices' is null - * then 'indexCnt' must be zero and vice versa. In this case the vertices are indexed as 0, 1, - * ..., 'vertexCount' - 1. 'localCoords' are optional and if null the vertex positions are used - * as local coords. 'colorArrayType' specifies whether the colors are premul GrColors or - * unpremul SkColors. - */ - static std::unique_ptr<GrLegacyMeshDrawOp> Make( - GrColor color, GrPrimitiveType primitiveType, const SkMatrix& viewMatrix, - const SkPoint* positions, int vertexCount, const uint16_t* indices, int indexCount, - const uint32_t* colors, const SkPoint* localCoords, const SkRect& bounds, - GrRenderTargetContext::ColorArrayType colorArrayType); - - /** - * Draw a SkVertices. The GrColor param is used if the vertices lack per-vertex color or 'flags' - * indicates that the per-vertex color should be ignored. The 'flags' options are those - * specified by SkCanvas::VerticesFlags. If the vertices lack local coords or 'flags' indicates - * that they should be ignored then the vertex positions are used as local coords. + * Draw a SkVertices. The GrColor param is used if the vertices lack per-vertex color. If the + * vertices lack local coords then the vertex positions are used as local coords. The primitive + * type drawn is derived from the SkVertices object, unless overridePrimType is specified. */ static std::unique_ptr<GrLegacyMeshDrawOp> Make(GrColor color, sk_sp<SkVertices>, - const SkMatrix& viewMatrix); + const SkMatrix& viewMatrix, + GrPrimitiveType* overridePrimType = nullptr); const char* name() const override { return "DrawVerticesOp"; } @@ -60,8 +50,12 @@ public: } private: - GrDrawVerticesOp(sk_sp<SkVertices>, GrPrimitiveType, GrColor, - GrRenderTargetContext::ColorArrayType, const SkMatrix& viewMatrix); + enum class ColorArrayType { + kPremulGrColor, + kSkColor, + }; + + GrDrawVerticesOp(sk_sp<SkVertices>, GrPrimitiveType, GrColor, const SkMatrix& viewMatrix); void getProcessorAnalysisInputs(GrProcessorAnalysisColor* color, GrProcessorAnalysisCoverage* coverage) const override; @@ -130,10 +124,14 @@ private: uint32_t fFlags; int fVertexCount; int fIndexCount; - GrRenderTargetContext::ColorArrayType fColorArrayType; + ColorArrayType fColorArrayType; SkSTArray<1, Mesh, true> fMeshes; typedef GrLegacyMeshDrawOp INHERITED; + +#if GR_TEST_UTILS + GR_LEGACY_MESH_DRAW_OP_TEST_FRIEND(VerticesOp); +#endif }; #endif |