/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrSimpleMesh_DEFINED #define GrSimpleMesh_DEFINED #include "include/core/SkRefCnt.h" #include "include/private/base/SkAssert.h" #include "include/private/base/SkDebug.h" #include "include/private/gpu/ganesh/GrTypesPriv.h" #include "src/gpu/ganesh/GrBuffer.h" #include #include /** * Used to communicate simple (non-instanced, direct) draws from GrOp to GrOpsRenderPass. * TODO: Consider migrating every Op to make the appropriate draw directly on GrOpsRenderPass. */ struct GrSimpleMesh { void set(sk_sp vertexBuffer, int vertexCount, int baseVertex); void setIndexed(sk_sp indexBuffer, int indexCount, int baseIndex, uint16_t minIndexValue, uint16_t maxIndexValue, GrPrimitiveRestart, sk_sp vertexBuffer, int baseVertex); void setIndexedPatterned(sk_sp indexBuffer, int indexCount, int patternRepeatCount, int maxPatternRepetitionsInIndexBuffer, sk_sp vertexBuffer, int patternVertexCount, int baseVertex); sk_sp fIndexBuffer; int fIndexCount; int fPatternRepeatCount; int fMaxPatternRepetitionsInIndexBuffer; int fBaseIndex; uint16_t fMinIndexValue; uint16_t fMaxIndexValue; GrPrimitiveRestart fPrimitiveRestart = GrPrimitiveRestart::kNo; sk_sp fVertexBuffer; int fVertexCount; int fBaseVertex = 0; SkDEBUGCODE(bool fIsInitialized = false;) }; inline void GrSimpleMesh::set(sk_sp vertexBuffer, int vertexCount, int baseVertex) { SkASSERT(baseVertex >= 0); fIndexBuffer.reset(); fVertexBuffer = std::move(vertexBuffer); fVertexCount = vertexCount; fBaseVertex = baseVertex; SkDEBUGCODE(fIsInitialized = true;) } inline void GrSimpleMesh::setIndexed(sk_sp indexBuffer, int indexCount, int baseIndex, uint16_t minIndexValue, uint16_t maxIndexValue, GrPrimitiveRestart primitiveRestart, sk_sp vertexBuffer, int baseVertex) { SkASSERT(indexBuffer); SkASSERT(indexCount >= 1); SkASSERT(baseIndex >= 0); SkASSERT(maxIndexValue >= minIndexValue); SkASSERT(baseVertex >= 0); fIndexBuffer = std::move(indexBuffer); fIndexCount = indexCount; fPatternRepeatCount = 0; fBaseIndex = baseIndex; fMinIndexValue = minIndexValue; fMaxIndexValue = maxIndexValue; fPrimitiveRestart = primitiveRestart; fVertexBuffer = std::move(vertexBuffer); fBaseVertex = baseVertex; SkDEBUGCODE(fIsInitialized = true;) } inline void GrSimpleMesh::setIndexedPatterned( sk_sp indexBuffer, int indexCount, int patternRepeatCount, int maxPatternRepetitionsInIndexBuffer, sk_sp vertexBuffer, int patternVertexCount, int baseVertex) { SkASSERT(indexBuffer); SkASSERT(indexCount >= 1); SkASSERT(patternVertexCount >= 1); SkASSERT(patternRepeatCount >= 1); SkASSERT(maxPatternRepetitionsInIndexBuffer >= 1); SkASSERT(baseVertex >= 0); fIndexBuffer = std::move(indexBuffer); fIndexCount = indexCount; fPatternRepeatCount = patternRepeatCount; fVertexCount = patternVertexCount; fMaxPatternRepetitionsInIndexBuffer = maxPatternRepetitionsInIndexBuffer; fPrimitiveRestart = GrPrimitiveRestart::kNo; fVertexBuffer = std::move(vertexBuffer); fBaseVertex = baseVertex; SkDEBUGCODE(fIsInitialized = true;) } #endif