OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef GrBatchBuffer_DEFINED | 8 #ifndef GrBatchBuffer_DEFINED |
9 #define GrBatchBuffer_DEFINED | 9 #define GrBatchBuffer_DEFINED |
10 | 10 |
11 #include "GrBatchAtlas.h" | 11 #include "GrBatchAtlas.h" |
12 #include "GrBufferAllocPool.h" | 12 #include "GrBufferAllocPool.h" |
13 #include "GrPendingProgramElement.h" | 13 #include "GrPendingProgramElement.h" |
14 #include "GrPipeline.h" | 14 #include "GrPipeline.h" |
15 #include "GrTRecorder.h" | 15 #include "GrTRecorder.h" |
16 #include "GrVertices.h" | 16 #include "GrVertices.h" |
17 | 17 |
18 /* | 18 /* |
19 * GrBatch instances use this object to allocate space for their geometry and to issue the draws | 19 * GrBatch instances use this object to allocate space for their geometry and to issue the draws |
20 * that render their batch. | 20 * that render their batch. |
21 */ | 21 */ |
22 | |
23 class GrIndexBufferAllocPool; | |
24 class GrVertexBufferAllocPool; | |
25 | |
26 class GrBatchTarget : public SkNoncopyable { | 22 class GrBatchTarget : public SkNoncopyable { |
27 public: | 23 public: |
28 typedef GrBatchAtlas::BatchToken BatchToken; | 24 typedef GrBatchAtlas::BatchToken BatchToken; |
29 GrBatchTarget(GrGpu* gpu, | 25 GrBatchTarget(GrGpu* gpu); |
30 GrVertexBufferAllocPool* vpool, | |
31 GrIndexBufferAllocPool* ipool); | |
32 | 26 |
33 void initDraw(const GrPrimitiveProcessor* primProc, const GrPipeline* pipeli ne) { | 27 void initDraw(const GrPrimitiveProcessor* primProc, const GrPipeline* pipeli ne) { |
34 GrNEW_APPEND_TO_RECORDER(fFlushBuffer, BufferedFlush, (primProc, pipelin e)); | 28 GrNEW_APPEND_TO_RECORDER(fFlushBuffer, BufferedFlush, (primProc, pipelin e)); |
35 fNumberOfDraws++; | 29 fNumberOfDraws++; |
36 fCurrentToken++; | 30 fCurrentToken++; |
37 } | 31 } |
38 | 32 |
39 class TextureUploader { | 33 class TextureUploader { |
40 public: | 34 public: |
41 TextureUploader(GrGpu* gpu) : fGpu(gpu) { SkASSERT(gpu); } | 35 TextureUploader(GrGpu* gpu) : fGpu(gpu) { SkASSERT(gpu); } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
87 } | 81 } |
88 | 82 |
89 bool isIssued(BatchToken token) const { return fLastFlushedToken >= token; } | 83 bool isIssued(BatchToken token) const { return fLastFlushedToken >= token; } |
90 BatchToken currentToken() const { return fCurrentToken; } | 84 BatchToken currentToken() const { return fCurrentToken; } |
91 BatchToken asapToken() const { return fLastFlushedToken + 1; } | 85 BatchToken asapToken() const { return fLastFlushedToken + 1; } |
92 | 86 |
93 // TODO much of this complexity goes away when batch is everywhere | 87 // TODO much of this complexity goes away when batch is everywhere |
94 void resetNumberOfDraws() { fNumberOfDraws = 0; } | 88 void resetNumberOfDraws() { fNumberOfDraws = 0; } |
95 int numberOfDraws() const { return fNumberOfDraws; } | 89 int numberOfDraws() const { return fNumberOfDraws; } |
96 void preFlush() { | 90 void preFlush() { |
91 this->unmap(); | |
97 int updateCount = fAsapUploads.count(); | 92 int updateCount = fAsapUploads.count(); |
98 for (int i = 0; i < updateCount; i++) { | 93 for (int i = 0; i < updateCount; i++) { |
99 fAsapUploads[i]->upload(TextureUploader(fGpu)); | 94 fAsapUploads[i]->upload(TextureUploader(fGpu)); |
100 } | 95 } |
101 fInlineUpdatesIndex = 0; | 96 fInlineUpdatesIndex = 0; |
102 fIter = FlushBuffer::Iter(fFlushBuffer); | 97 fIter = FlushBuffer::Iter(fFlushBuffer); |
103 } | 98 } |
104 void flushNext(int n); | 99 void flushNext(int n); |
105 void postFlush() { | 100 void postFlush() { |
106 SkASSERT(!fIter.next()); | 101 SkASSERT(!fIter.next()); |
107 fFlushBuffer.reset(); | 102 fFlushBuffer.reset(); |
108 fAsapUploads.reset(); | 103 fAsapUploads.reset(); |
109 fInlineUploads.reset(); | 104 fInlineUploads.reset(); |
110 } | 105 } |
111 | 106 |
112 // TODO This goes away when everything uses batch | 107 // TODO This goes away when everything uses batch |
113 GrBatchTracker* currentBatchTracker() { | 108 GrBatchTracker* currentBatchTracker() { |
114 SkASSERT(!fFlushBuffer.empty()); | 109 SkASSERT(!fFlushBuffer.empty()); |
115 return &fFlushBuffer.back().fBatchTracker; | 110 return &fFlushBuffer.back().fBatchTracker; |
116 } | 111 } |
117 | 112 |
118 const GrDrawTargetCaps& caps() const { return *fGpu->caps(); } | 113 const GrDrawTargetCaps& caps() const { return *fGpu->caps(); } |
119 | 114 |
120 GrVertexBufferAllocPool* vertexPool() { return fVertexPool; } | 115 GrResourceProvider* resourceProvider() const { return fGpu->getContext()->re sourceProvider(); } |
121 GrIndexBufferAllocPool* indexPool() { return fIndexPool; } | |
122 | 116 |
123 GrResourceProvider* resourceProvider() const { return fGpu->getContext()->re sourceProvider(); } | 117 void* makeVertSpace(size_t vertexSize, int vertexCount, |
118 const GrVertexBuffer** buffer, int* startVertex); | |
119 uint16_t* makeIndexSpace(int indexCount, | |
120 const GrIndexBuffer** buffer, int* startIndex); | |
124 | 121 |
125 // A helper for draws which overallocate and then return data to the pool | 122 // A helper for draws which overallocate and then return data to the pool |
126 void putBackIndices(size_t indices) { fIndexPool->putBack(indices * sizeof(u int16_t)); } | 123 void putBackIndices(size_t indices) { fIndexPool->putBack(indices * sizeof(u int16_t)); } |
127 | 124 |
128 void putBackVertices(size_t vertices, size_t vertexStride) { | 125 void putBackVertices(size_t vertices, size_t vertexStride) { |
129 fVertexPool->putBack(vertices * vertexStride); | 126 fVertexPool->putBack(vertices * vertexStride); |
130 } | 127 } |
131 | 128 |
129 void unmap() { | |
bsalomon
2015/05/07 14:28:40
Maybe a bit more descriptive name here? unmapBuffe
robertphillips
2015/05/07 14:34:21
Done-ish. unmap has been renamed and made private.
| |
130 fVertexPool->unmap(); | |
131 fIndexPool->unmap(); | |
132 } | |
133 | |
134 void reset() { | |
135 fVertexPool->reset(); | |
136 fIndexPool->reset(); | |
137 } | |
138 | |
132 private: | 139 private: |
133 GrGpu* fGpu; | 140 GrGpu* fGpu; |
134 GrVertexBufferAllocPool* fVertexPool; | 141 SkAutoTDelete<GrVertexBufferAllocPool> fVertexPool; |
135 GrIndexBufferAllocPool* fIndexPool; | 142 SkAutoTDelete<GrIndexBufferAllocPool> fIndexPool; |
136 | 143 |
137 typedef void* TBufferAlign; // This wouldn't be enough align if a command us ed long double. | 144 typedef void* TBufferAlign; // This wouldn't be enough align if a command us ed long double. |
138 | 145 |
139 struct BufferedFlush { | 146 struct BufferedFlush { |
140 BufferedFlush(const GrPrimitiveProcessor* primProc, const GrPipeline* pi peline) | 147 BufferedFlush(const GrPrimitiveProcessor* primProc, const GrPipeline* pi peline) |
141 : fPrimitiveProcessor(primProc) | 148 : fPrimitiveProcessor(primProc) |
142 , fPipeline(pipeline) {} | 149 , fPipeline(pipeline) {} |
143 typedef GrPendingProgramElement<const GrPrimitiveProcessor> ProgramPrimi tiveProcessor; | 150 typedef GrPendingProgramElement<const GrPrimitiveProcessor> ProgramPrimi tiveProcessor; |
144 ProgramPrimitiveProcessor fPrimitiveProcessor; | 151 ProgramPrimitiveProcessor fPrimitiveProcessor; |
145 const GrPipeline* fPipeline; | 152 const GrPipeline* fPipeline; |
(...skipping 12 matching lines...) Expand all Loading... | |
158 FlushBuffer::Iter fIter; | 165 FlushBuffer::Iter fIter; |
159 int fNumberOfDraws; | 166 int fNumberOfDraws; |
160 BatchToken fCurrentToken; | 167 BatchToken fCurrentToken; |
161 BatchToken fLastFlushedToken; // The next token to be flushed | 168 BatchToken fLastFlushedToken; // The next token to be flushed |
162 SkTArray<SkAutoTUnref<Uploader>, true> fAsapUploads; | 169 SkTArray<SkAutoTUnref<Uploader>, true> fAsapUploads; |
163 SkTArray<SkAutoTUnref<Uploader>, true> fInlineUploads; | 170 SkTArray<SkAutoTUnref<Uploader>, true> fInlineUploads; |
164 int fInlineUpdatesIndex; | 171 int fInlineUpdatesIndex; |
165 }; | 172 }; |
166 | 173 |
167 #endif | 174 #endif |
OLD | NEW |