Chromium Code Reviews| 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 |