Index: src/gpu/GrTargetCommands.h |
diff --git a/src/gpu/GrInOrderDrawBuffer.h b/src/gpu/GrTargetCommands.h |
similarity index 61% |
copy from src/gpu/GrInOrderDrawBuffer.h |
copy to src/gpu/GrTargetCommands.h |
index 1100d95a9c04fbb0fcf00c602e30e6804dca10c2..b89f581b4a77993c4884b2014c46077bfa2f96b3 100644 |
--- a/src/gpu/GrInOrderDrawBuffer.h |
+++ b/src/gpu/GrTargetCommands.h |
@@ -1,23 +1,26 @@ |
/* |
- * Copyright 2011 Google Inc. |
+ * 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 GrInOrderDrawBuffer_DEFINED |
-#define GrInOrderDrawBuffer_DEFINED |
+#ifndef GrTargetCommands_DEFINED |
+#define GrTargetCommands_DEFINED |
-#include "GrFlushToGpuDrawTarget.h" |
- |
-#include "GrBatch.h" |
#include "GrBatchTarget.h" |
-#include "SkChunkAlloc.h" |
-#include "GrPipeline.h" |
+#include "GrDrawTarget.h" |
+#include "GrGpu.h" |
#include "GrPath.h" |
+#include "GrPendingProgramElement.h" |
+#include "GrRenderTarget.h" |
#include "GrTRecorder.h" |
+#include "SkRect.h" |
+#include "SkTypes.h" |
class GrInOrderDrawBuffer; |
+class GrVertexBufferAllocPool; |
+class GrIndexBufferAllocPool; |
class GrTargetCommands : ::SkNoncopyable { |
struct SetState; |
@@ -302,155 +305,5 @@ private: |
void closeBatch(); |
}; |
-/** |
- * GrInOrderDrawBuffer is an implementation of GrDrawTarget that queues up draws for eventual |
- * playback into a GrGpu. In theory one draw buffer could playback into another. When index or |
- * vertex buffers are used as geometry sources it is the callers the draw buffer only holds |
- * references to the buffers. It is the callers responsibility to ensure that the data is still |
- * valid when the draw buffer is played back into a GrGpu. Similarly, it is the caller's |
- * responsibility to ensure that all referenced textures, buffers, and render-targets are associated |
- * in the GrGpu object that the buffer is played back into. The buffer requires VB and IB pools to |
- * store geometry. |
- */ |
-class GrInOrderDrawBuffer : public GrFlushToGpuDrawTarget { |
-public: |
- |
- /** |
- * Creates a GrInOrderDrawBuffer |
- * |
- * @param gpu the gpu object that this draw buffer flushes to. |
- * @param vertexPool pool where vertices for queued draws will be saved when |
- * the vertex source is either reserved or array. |
- * @param indexPool pool where indices for queued draws will be saved when |
- * the index source is either reserved or array. |
- */ |
- GrInOrderDrawBuffer(GrGpu* gpu, |
- GrVertexBufferAllocPool* vertexPool, |
- GrIndexBufferAllocPool* indexPool); |
- |
- ~GrInOrderDrawBuffer() SK_OVERRIDE; |
- |
- // tracking for draws |
- DrawToken getCurrentDrawToken() SK_OVERRIDE { return DrawToken(this, fDrawID); } |
- |
- void clearStencilClip(const SkIRect& rect, |
- bool insideClip, |
- GrRenderTarget* renderTarget) SK_OVERRIDE; |
- |
- void discard(GrRenderTarget*) SK_OVERRIDE; |
- |
-protected: |
- void willReserveVertexAndIndexSpace(int vertexCount, |
- size_t vertexStride, |
- int indexCount) SK_OVERRIDE; |
- |
- void appendIndicesAndTransforms(const void* indexValues, PathIndexType indexType, |
- const float* transformValues, PathTransformType transformType, |
- int count, char** indicesLocation, float** xformsLocation) { |
- int indexBytes = GrPathRange::PathIndexSizeInBytes(indexType); |
- *indicesLocation = (char*) fPathIndexBuffer.alloc(count * indexBytes, |
- SkChunkAlloc::kThrow_AllocFailType); |
- SkASSERT(SkIsAlign4((uintptr_t)*indicesLocation)); |
- memcpy(*indicesLocation, reinterpret_cast<const char*>(indexValues), count * indexBytes); |
- |
- const int xformBytes = GrPathRendering::PathTransformSize(transformType) * sizeof(float); |
- *xformsLocation = NULL; |
- |
- if (0 != xformBytes) { |
- *xformsLocation = (float*) fPathTransformBuffer.alloc(count * xformBytes, |
- SkChunkAlloc::kThrow_AllocFailType); |
- SkASSERT(SkIsAlign4((uintptr_t)*xformsLocation)); |
- memcpy(*xformsLocation, transformValues, count * xformBytes); |
- } |
- } |
- |
- bool canConcatToIndexBuffer(const GrIndexBuffer** ib) { |
- const GrDrawTarget::GeometrySrcState& geomSrc = this->getGeomSrc(); |
- |
- // we only attempt to concat when reserved verts are used with a client-specified |
- // index buffer. To make this work with client-specified VBs we'd need to know if the VB |
- // was updated between draws. |
- if (kReserved_GeometrySrcType != geomSrc.fVertexSrc || |
- kBuffer_GeometrySrcType != geomSrc.fIndexSrc) { |
- return false; |
- } |
- |
- *ib = geomSrc.fIndexBuffer; |
- return true; |
- } |
- |
-private: |
- friend class GrTargetCommands; |
- |
- typedef GrGpu::DrawArgs DrawArgs; |
- |
- void onReset() SK_OVERRIDE; |
- void onFlush() SK_OVERRIDE; |
- |
- // overrides from GrDrawTarget |
- void onDraw(const GrGeometryProcessor*, const DrawInfo&, const PipelineInfo&) SK_OVERRIDE; |
- void onDrawBatch(GrBatch*, const PipelineInfo&) SK_OVERRIDE; |
- void onDrawRect(GrPipelineBuilder*, |
- GrColor, |
- const SkMatrix& viewMatrix, |
- const SkRect& rect, |
- const SkRect* localRect, |
- const SkMatrix* localMatrix) SK_OVERRIDE; |
- |
- void onStencilPath(const GrPipelineBuilder&, |
- const GrPathProcessor*, |
- const GrPath*, |
- const GrScissorState&, |
- const GrStencilSettings&) SK_OVERRIDE; |
- void onDrawPath(const GrPathProcessor*, |
- const GrPath*, |
- const GrStencilSettings&, |
- const PipelineInfo&) SK_OVERRIDE; |
- void onDrawPaths(const GrPathProcessor*, |
- const GrPathRange*, |
- const void* indices, |
- PathIndexType, |
- const float transformValues[], |
- PathTransformType, |
- int count, |
- const GrStencilSettings&, |
- const PipelineInfo&) SK_OVERRIDE; |
- void onClear(const SkIRect* rect, |
- GrColor color, |
- bool canIgnoreRect, |
- GrRenderTarget* renderTarget) SK_OVERRIDE; |
- bool onCopySurface(GrSurface* dst, |
- GrSurface* src, |
- const SkIRect& srcRect, |
- const SkIPoint& dstPoint) SK_OVERRIDE; |
- |
- // Attempts to concat instances from info onto the previous draw. info must represent an |
- // instanced draw. The caller must have already recorded a new draw state and clip if necessary. |
- int concatInstancedDraw(const DrawInfo&); |
- |
- // We lazily record clip changes in order to skip clips that have no effect. |
- void recordClipIfNecessary(); |
- // Records any trace markers for a command |
- void recordTraceMarkersIfNecessary(GrTargetCommands::Cmd*); |
- SkString getCmdString(int index) const { |
- SkASSERT(index < fGpuCmdMarkers.count()); |
- return fGpuCmdMarkers[index].toString(); |
- } |
- bool isIssued(uint32_t drawID) SK_OVERRIDE { return drawID != fDrawID; } |
- |
- // TODO: Use a single allocator for commands and records |
- enum { |
- kPathIdxBufferMinReserve = 2 * 64, // 64 uint16_t's |
- kPathXformBufferMinReserve = 2 * 64, // 64 two-float transforms |
- }; |
- |
- GrTargetCommands fCommands; |
- SkTArray<GrTraceMarkerSet, false> fGpuCmdMarkers; |
- SkChunkAlloc fPathIndexBuffer; |
- SkChunkAlloc fPathTransformBuffer; |
- uint32_t fDrawID; |
- |
- typedef GrFlushToGpuDrawTarget INHERITED; |
-}; |
- |
#endif |
+ |