Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(369)

Unified Diff: src/gpu/GrBatchTarget.h

Issue 975303005: Creation of GrBatchAtlas and Distancefieldpathrenderer batch (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: nit Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrBatchAtlas.cpp ('k') | src/gpu/GrBatchTarget.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrBatchTarget.h
diff --git a/src/gpu/GrBatchTarget.h b/src/gpu/GrBatchTarget.h
index ae046c1ee1e2cb44e406d1603187682d9e3330c7..9bd6b9409c41c2355e4246e42527e80b5fe1c053 100644
--- a/src/gpu/GrBatchTarget.h
+++ b/src/gpu/GrBatchTarget.h
@@ -8,6 +8,7 @@
#ifndef GrBatchBuffer_DEFINED
#define GrBatchBuffer_DEFINED
+#include "GrBatchAtlas.h"
#include "GrBufferAllocPool.h"
#include "GrPendingProgramElement.h"
#include "GrPipeline.h"
@@ -24,51 +25,90 @@ class GrVertexBufferAllocPool;
class GrBatchTarget : public SkNoncopyable {
public:
+ typedef GrBatchAtlas::BatchToken BatchToken;
GrBatchTarget(GrGpu* gpu,
GrVertexBufferAllocPool* vpool,
- GrIndexBufferAllocPool* ipool)
- : fGpu(gpu)
- , fVertexPool(vpool)
- , fIndexPool(ipool)
- , fFlushBuffer(kFlushBufferInitialSizeInBytes)
- , fIter(fFlushBuffer)
- , fNumberOfDraws(0) {}
+ GrIndexBufferAllocPool* ipool);
typedef GrDrawTarget::DrawInfo DrawInfo;
void initDraw(const GrPrimitiveProcessor* primProc, const GrPipeline* pipeline) {
GrNEW_APPEND_TO_RECORDER(fFlushBuffer, BufferedFlush, (primProc, pipeline));
fNumberOfDraws++;
+ fCurrentToken++;
+ }
+
+ class TextureUploader {
+ public:
+ TextureUploader(GrGpu* gpu) : fGpu(gpu) { SkASSERT(gpu); }
+
+ /**
+ * Updates the pixels in a rectangle of a texture.
+ *
+ * @param left left edge of the rectangle to write (inclusive)
+ * @param top top edge of the rectangle to write (inclusive)
+ * @param width width of rectangle to write in pixels.
+ * @param height height of rectangle to write in pixels.
+ * @param config the pixel config of the source buffer
+ * @param buffer memory to read pixels from
+ * @param rowBytes number of bytes between consecutive rows. Zero
+ * means rows are tightly packed.
+ */
+ bool writeTexturePixels(GrTexture* texture,
+ int left, int top, int width, int height,
+ GrPixelConfig config, const void* buffer,
+ size_t rowBytes) {
+ return fGpu->writeTexturePixels(texture, left, top, width, height, config, buffer,
+ rowBytes);
+ }
+
+ private:
+ GrGpu* fGpu;
+ };
+
+ class Uploader : public SkRefCnt {
+ public:
+ Uploader(BatchToken lastUploadToken) : fLastUploadToken(lastUploadToken) {}
+ BatchToken lastUploadToken() const { return fLastUploadToken; }
+ virtual void upload(TextureUploader)=0;
+
+ private:
+ BatchToken fLastUploadToken;
+ };
+
+ void upload(Uploader* upload) {
+ if (this->asapToken() == upload->lastUploadToken()) {
+ fAsapUploads.push_back().reset(SkRef(upload));
+ } else {
+ fInlineUploads.push_back().reset(SkRef(upload));
+ }
}
void draw(const GrDrawTarget::DrawInfo& draw) {
fFlushBuffer.back().fDraws.push_back(draw);
}
- // TODO this is temporary until batch is everywhere
- //void flush();
+ bool isIssued(BatchToken token) const { return fLastFlushedToken >= token; }
+ BatchToken currentToken() const { return fCurrentToken; }
+ BatchToken asapToken() const { return fLastFlushedToken + 1; }
+
+ // TODO much of this complexity goes away when batch is everywhere
void resetNumberOfDraws() { fNumberOfDraws = 0; }
int numberOfDraws() const { return fNumberOfDraws; }
- void preFlush() { fIter = FlushBuffer::Iter(fFlushBuffer); }
- void flushNext(int n) {
- for (; n > 0; n--) {
- SkDEBUGCODE(bool verify =) fIter.next();
- SkASSERT(verify);
- GrProgramDesc desc;
- BufferedFlush* bf = fIter.get();
- const GrPipeline* pipeline = bf->fPipeline;
- const GrPrimitiveProcessor* primProc = bf->fPrimitiveProcessor.get();
- fGpu->buildProgramDesc(&desc, *primProc, *pipeline, bf->fBatchTracker);
-
- GrGpu::DrawArgs args(primProc, pipeline, &desc, &bf->fBatchTracker);
-
- int drawCount = bf->fDraws.count();
- const SkSTArray<1, DrawInfo, true>& draws = bf->fDraws;
- for (int i = 0; i < drawCount; i++) {
- fGpu->draw(args, draws[i]);
- }
+ void preFlush() {
+ int updateCount = fAsapUploads.count();
+ for (int i = 0; i < updateCount; i++) {
+ fAsapUploads[i]->upload(TextureUploader(fGpu));
}
+ fInlineUpdatesIndex = 0;
+ fIter = FlushBuffer::Iter(fFlushBuffer);
+ }
+ void flushNext(int n);
+ void postFlush() {
+ SkASSERT(!fIter.next());
+ fFlushBuffer.reset();
+ fAsapUploads.reset();
+ fInlineUploads.reset();
}
- void postFlush() { SkASSERT(!fIter.next()); fFlushBuffer.reset(); }
// TODO This goes away when everything uses batch
GrBatchTracker* currentBatchTracker() {
@@ -81,6 +121,8 @@ public:
GrVertexBufferAllocPool* vertexPool() { return fVertexPool; }
GrIndexBufferAllocPool* indexPool() { return fIndexPool; }
+ const static int kVertsPerRect = 4;
+ const static int kIndicesPerRect = 6;
const GrIndexBuffer* quadIndexBuffer() const { return fGpu->getQuadIndexBuffer(); }
// A helper for draws which overallocate and then return data to the pool
@@ -118,6 +160,11 @@ private:
// TODO this is temporary
FlushBuffer::Iter fIter;
int fNumberOfDraws;
+ BatchToken fCurrentToken;
+ BatchToken fLastFlushedToken; // The next token to be flushed
+ SkTArray<SkAutoTUnref<Uploader>, true> fAsapUploads;
+ SkTArray<SkAutoTUnref<Uploader>, true> fInlineUploads;
+ int fInlineUpdatesIndex;
};
#endif
« no previous file with comments | « src/gpu/GrBatchAtlas.cpp ('k') | src/gpu/GrBatchTarget.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698