xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrSimpleMesh.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2015 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef GrSimpleMesh_DEFINED
9 #define GrSimpleMesh_DEFINED
10 
11 #include "include/core/SkRefCnt.h"
12 #include "include/private/base/SkAssert.h"
13 #include "include/private/base/SkDebug.h"
14 #include "include/private/gpu/ganesh/GrTypesPriv.h"
15 #include "src/gpu/ganesh/GrBuffer.h"
16 
17 #include <cstdint>
18 #include <utility>
19 
20 /**
21  * Used to communicate simple (non-instanced, direct) draws from GrOp to GrOpsRenderPass.
22  * TODO: Consider migrating every Op to make the appropriate draw directly on GrOpsRenderPass.
23  */
24 struct GrSimpleMesh {
25     void set(sk_sp<const GrBuffer> vertexBuffer, int vertexCount, int baseVertex);
26     void setIndexed(sk_sp<const GrBuffer> indexBuffer, int indexCount, int baseIndex,
27                     uint16_t minIndexValue, uint16_t maxIndexValue, GrPrimitiveRestart,
28                     sk_sp<const GrBuffer> vertexBuffer, int baseVertex);
29     void setIndexedPatterned(sk_sp<const GrBuffer> indexBuffer, int indexCount,
30                              int patternRepeatCount, int maxPatternRepetitionsInIndexBuffer,
31                              sk_sp<const GrBuffer> vertexBuffer, int patternVertexCount,
32                              int baseVertex);
33 
34     sk_sp<const GrBuffer> fIndexBuffer;
35     int fIndexCount;
36     int fPatternRepeatCount;
37     int fMaxPatternRepetitionsInIndexBuffer;
38     int fBaseIndex;
39     uint16_t fMinIndexValue;
40     uint16_t fMaxIndexValue;
41     GrPrimitiveRestart fPrimitiveRestart = GrPrimitiveRestart::kNo;
42 
43     sk_sp<const GrBuffer> fVertexBuffer;
44     int fVertexCount;
45     int fBaseVertex = 0;
46 
47     SkDEBUGCODE(bool fIsInitialized = false;)
48 };
49 
set(sk_sp<const GrBuffer> vertexBuffer,int vertexCount,int baseVertex)50 inline void GrSimpleMesh::set(sk_sp<const GrBuffer> vertexBuffer, int vertexCount, int baseVertex) {
51     SkASSERT(baseVertex >= 0);
52     fIndexBuffer.reset();
53     fVertexBuffer = std::move(vertexBuffer);
54     fVertexCount = vertexCount;
55     fBaseVertex = baseVertex;
56     SkDEBUGCODE(fIsInitialized = true;)
57 }
58 
setIndexed(sk_sp<const GrBuffer> indexBuffer,int indexCount,int baseIndex,uint16_t minIndexValue,uint16_t maxIndexValue,GrPrimitiveRestart primitiveRestart,sk_sp<const GrBuffer> vertexBuffer,int baseVertex)59 inline void GrSimpleMesh::setIndexed(sk_sp<const GrBuffer> indexBuffer, int indexCount,
60                                      int baseIndex, uint16_t minIndexValue, uint16_t maxIndexValue,
61                                      GrPrimitiveRestart primitiveRestart,
62                                      sk_sp<const GrBuffer> vertexBuffer, int baseVertex) {
63     SkASSERT(indexBuffer);
64     SkASSERT(indexCount >= 1);
65     SkASSERT(baseIndex >= 0);
66     SkASSERT(maxIndexValue >= minIndexValue);
67     SkASSERT(baseVertex >= 0);
68     fIndexBuffer = std::move(indexBuffer);
69     fIndexCount = indexCount;
70     fPatternRepeatCount = 0;
71     fBaseIndex = baseIndex;
72     fMinIndexValue = minIndexValue;
73     fMaxIndexValue = maxIndexValue;
74     fPrimitiveRestart = primitiveRestart;
75     fVertexBuffer = std::move(vertexBuffer);
76     fBaseVertex = baseVertex;
77     SkDEBUGCODE(fIsInitialized = true;)
78 }
79 
setIndexedPatterned(sk_sp<const GrBuffer> indexBuffer,int indexCount,int patternRepeatCount,int maxPatternRepetitionsInIndexBuffer,sk_sp<const GrBuffer> vertexBuffer,int patternVertexCount,int baseVertex)80 inline void GrSimpleMesh::setIndexedPatterned(
81         sk_sp<const GrBuffer> indexBuffer, int indexCount, int patternRepeatCount,
82         int maxPatternRepetitionsInIndexBuffer, sk_sp<const GrBuffer> vertexBuffer,
83         int patternVertexCount, int baseVertex) {
84     SkASSERT(indexBuffer);
85     SkASSERT(indexCount >= 1);
86     SkASSERT(patternVertexCount >= 1);
87     SkASSERT(patternRepeatCount >= 1);
88     SkASSERT(maxPatternRepetitionsInIndexBuffer >= 1);
89     SkASSERT(baseVertex >= 0);
90     fIndexBuffer = std::move(indexBuffer);
91     fIndexCount = indexCount;
92     fPatternRepeatCount = patternRepeatCount;
93     fVertexCount = patternVertexCount;
94     fMaxPatternRepetitionsInIndexBuffer = maxPatternRepetitionsInIndexBuffer;
95     fPrimitiveRestart = GrPrimitiveRestart::kNo;
96     fVertexBuffer = std::move(vertexBuffer);
97     fBaseVertex = baseVertex;
98     SkDEBUGCODE(fIsInitialized = true;)
99 }
100 
101 #endif
102