| Index: src/gpu/GrGpu.h
|
| diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h
|
| index 9139405cf5adb6c039f7a69b269bb8bb966e18c7..02fc75e5545a54595e3355bcbb232dca4c1f5d89 100644
|
| --- a/src/gpu/GrGpu.h
|
| +++ b/src/gpu/GrGpu.h
|
| @@ -22,7 +22,7 @@ class GrPathRendererChain;
|
| class GrStencilBuffer;
|
| class GrVertexBufferAllocPool;
|
|
|
| -class GrGpu : public GrClipTarget {
|
| +class GrGpu : public SkRefCnt {
|
| public:
|
|
|
| /**
|
| @@ -52,8 +52,32 @@ public:
|
| GrGpu(GrContext* context);
|
| virtual ~GrGpu();
|
|
|
| - GrContext* getContext() { return this->INHERITED::getContext(); }
|
| - const GrContext* getContext() const { return this->INHERITED::getContext(); }
|
| + GrContext* getContext() { return fContext; }
|
| + const GrContext* getContext() const { return fContext; }
|
| +
|
| + /**
|
| + * Gets the capabilities of the draw target.
|
| + */
|
| + const GrDrawTargetCaps* caps() const { return fCaps.get(); }
|
| +
|
| + /**
|
| + * Sets the draw state object for the gpu. Note that this does not
|
| + * make a copy. The GrGpu will take a reference to passed object.
|
| + * Passing NULL will cause the GrGpu to use its own internal draw
|
| + * state object rather than an externally provided one.
|
| + */
|
| + void setDrawState(GrDrawState* drawState);
|
| +
|
| + /**
|
| + * Read-only access to the GrGpu current draw state.
|
| + */
|
| + const GrDrawState& getDrawState() const { return *fDrawState; }
|
| +
|
| + /**
|
| + * Read-write access to the GrGpu current draw state. Note that
|
| + * this doesn't ref.
|
| + */
|
| + GrDrawState* drawState() { return fDrawState; }
|
|
|
| GrPathRendering* pathRendering() {
|
| return fPathRendering.get();
|
| @@ -265,10 +289,33 @@ public:
|
| GrPixelConfig config, const void* buffer,
|
| size_t rowBytes);
|
|
|
| - // GrDrawTarget overrides
|
| - virtual void clearStencilClip(const SkIRect& rect,
|
| - bool insideClip,
|
| - GrRenderTarget* renderTarget = NULL) SK_OVERRIDE;
|
| + /**
|
| + * Clear the passed in render target. Ignores the draw state and clip. Clears the whole thing if
|
| + * rect is NULL, otherwise just the rect. If canIgnoreRect is set then the entire render target
|
| + * can be optionally cleared.
|
| + */
|
| + void clear(const SkIRect* rect,
|
| + GrColor color,
|
| + bool canIgnoreRect,
|
| + GrRenderTarget* renderTarget);
|
| +
|
| +
|
| + void clearStencilClip(const SkIRect& rect,
|
| + bool insideClip,
|
| + GrRenderTarget* renderTarget = NULL);
|
| +
|
| + /**
|
| + * Discards the contents render target. NULL indicates that the current render target should
|
| + * be discarded.
|
| + **/
|
| + virtual void discard(GrRenderTarget* = NULL) = 0;
|
| +
|
| + /**
|
| + * This is can be called before allocating a texture to be a dst for copySurface. It will
|
| + * populate the origin, config, and flags fields of the desc such that copySurface is more
|
| + * likely to succeed and be efficient.
|
| + */
|
| + virtual void initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc);
|
|
|
| // After the client interacts directly with the 3D context state the GrGpu
|
| // must resync its internal state and assumptions about 3D context state.
|
| @@ -308,6 +355,99 @@ public:
|
| const GrDeviceCoordTexture* dstCopy,
|
| GrProgramDesc*) = 0;
|
|
|
| + /**
|
| + * Called at start and end of gpu trace marking
|
| + * GR_CREATE_GPU_TRACE_MARKER(marker_str, target) will automatically call these at the start
|
| + * and end of a code block respectively
|
| + */
|
| + void addGpuTraceMarker(const GrGpuTraceMarker* marker);
|
| + void removeGpuTraceMarker(const GrGpuTraceMarker* marker);
|
| +
|
| + /**
|
| + * Takes the current active set of markers and stores them for later use. Any current marker
|
| + * in the active set is removed from the active set and the targets remove function is called.
|
| + * These functions do not work as a stack so you cannot call save a second time before calling
|
| + * restore. Also, it is assumed that when restore is called the current active set of markers
|
| + * is empty. When the stored markers are added back into the active set, the targets add marker
|
| + * is called.
|
| + */
|
| + void saveActiveTraceMarkers();
|
| + void restoreActiveTraceMarkers();
|
| +
|
| + /**
|
| + * Query to find out if the vertex or index source is reserved.
|
| + */
|
| + bool hasReservedVerticesOrIndices() const {
|
| + return GrDrawTarget::kReserved_GeometrySrcType == this->getGeomSrc().fVertexSrc ||
|
| + GrDrawTarget::kReserved_GeometrySrcType == this->getGeomSrc().fIndexSrc;
|
| + }
|
| +
|
| + // Called to determine whether an onCopySurface call would succeed or not. This is useful for
|
| + // proxy subclasses to test whether the copy would succeed without executing it yet. Derived
|
| + // classes must keep this consistent with their implementation of onCopySurface(). The inputs
|
| + // are the same as onCopySurface(), i.e. srcRect and dstPoint are clipped to be inside the src
|
| + // and dst bounds.
|
| + virtual bool canCopySurface(GrSurface* dst,
|
| + GrSurface* src,
|
| + const SkIRect& srcRect,
|
| + const SkIPoint& dstPoint) = 0;
|
| +
|
| + // This method is called by copySurface The srcRect is guaranteed to be entirely within the
|
| + // src bounds. Likewise, the dst rect implied by dstPoint and srcRect's width and height falls
|
| + // entirely within the dst. The default implementation will draw a rect from the src to the
|
| + // dst if the src is a texture and the dst is a render target and fail otherwise.
|
| + virtual bool copySurface(GrSurface* dst,
|
| + GrSurface* src,
|
| + const SkIRect& srcRect,
|
| + const SkIPoint& dstPoint) = 0;
|
| +
|
| + /**
|
| + * Sets source of vertex data for the next draw. Data does not have to be
|
| + * in the buffer until drawIndexed, drawNonIndexed, or drawIndexedInstances.
|
| + *
|
| + * @param buffer vertex buffer containing vertex data. Must be
|
| + * unlocked before draw call. Vertex size is queried
|
| + * from current GrDrawState.
|
| + */
|
| + void setVertexSourceToBuffer(const GrVertexBuffer* buffer);
|
| +
|
| + /**
|
| + * Sets source of index data for the next indexed draw. Data does not have
|
| + * to be in the buffer until drawIndexed.
|
| + *
|
| + * @param buffer index buffer containing indices. Must be unlocked
|
| + * before indexed draw call.
|
| + */
|
| + void setIndexSourceToBuffer(const GrIndexBuffer* buffer);
|
| +
|
| + /**
|
| + * Resets vertex source. Drawing from reset vertices is illegal. Set vertex
|
| + * source to reserved, array, or buffer before next draw. May be able to free
|
| + * up temporary storage allocated by setVertexSourceToArray or
|
| + * reserveVertexSpace.
|
| + */
|
| + void resetVertexSource();
|
| +
|
| + /**
|
| + * Resets index source. Indexed Drawing from reset indices is illegal. Set
|
| + * index source to reserved, array, or buffer before next indexed draw. May
|
| + * be able to free up temporary storage allocated by setIndexSourceToArray
|
| + * or reserveIndexSpace.
|
| + */
|
| + void resetIndexSource();
|
| +
|
| + /**
|
| + * Pushes and resets the vertex/index sources. Any reserved vertex / index
|
| + * data is finalized (i.e. cannot be updated after the matching pop but can
|
| + * be drawn from). Must be balanced by a pop.
|
| + */
|
| + void pushGeometrySource();
|
| +
|
| + /**
|
| + * Pops the vertex / index sources from the matching push.
|
| + */
|
| + void popGeometrySource();
|
| +
|
| protected:
|
| DrawType PrimTypeToDrawType(GrPrimitiveType type) {
|
| switch (type) {
|
| @@ -337,6 +477,23 @@ protected:
|
| unsigned int* ref,
|
| unsigned int* mask);
|
|
|
| + // subclasses must call this in their destructors to ensure all vertex
|
| + // and index sources have been released (including those held by
|
| + // pushGeometrySource())
|
| + void releaseGeometry();
|
| +
|
| + // accessors for derived classes
|
| + const GrDrawTarget::GeometrySrcState& getGeomSrc() const { return fGeoSrcStateStack.back(); }
|
| +
|
| + // it is preferable to call this rather than getGeomSrc()->fVertexSize because of the assert.
|
| + size_t getVertexSize() const {
|
| + // the vertex layout is only valid if a vertex source has been specified.
|
| + SkASSERT(this->getGeomSrc().fVertexSrc != GrDrawTarget::kNone_GeometrySrcType);
|
| + return this->getGeomSrc().fVertexSize;
|
| + }
|
| +
|
| + const GrTraceMarkerSet& getActiveTraceMarkers() { return fActiveTraceMarkers; }
|
| +
|
| GrContext::GPUStats fGPUStats;
|
|
|
| struct GeometryPoolState {
|
| @@ -356,16 +513,17 @@ protected:
|
|
|
| SkAutoTDelete<GrPathRendering> fPathRendering;
|
|
|
| + // Subclass must initialize this in its constructor.
|
| + SkAutoTUnref<const GrDrawTargetCaps> fCaps;
|
| +
|
| private:
|
| // GrDrawTarget overrides
|
| - virtual bool onReserveVertexSpace(size_t vertexSize, int vertexCount, void** vertices) SK_OVERRIDE;
|
| - virtual bool onReserveIndexSpace(int indexCount, void** indices) SK_OVERRIDE;
|
| - virtual void releaseReservedVertexSpace() SK_OVERRIDE;
|
| - virtual void releaseReservedIndexSpace() SK_OVERRIDE;
|
| - virtual void geometrySourceWillPush() SK_OVERRIDE;
|
| - virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) SK_OVERRIDE;
|
| - virtual void onClear(const SkIRect* rect, GrColor color, bool canIgnoreRect,
|
| - GrRenderTarget* renderTarget) SK_OVERRIDE;
|
| + virtual bool onReserveVertexSpace(size_t vertexSize, int vertexCount, void** vertices);
|
| + virtual bool onReserveIndexSpace(int indexCount, void** indices);
|
| + virtual void releaseReservedVertexSpace();
|
| + virtual void releaseReservedIndexSpace();
|
| + virtual void geometrySourceWillPush();
|
| + virtual void geometrySourceWillPop(const GrDrawTarget::GeometrySrcState& restoredState);
|
|
|
| // called when the 3D context state is unknown. Subclass should emit any
|
| // assumed 3D context state and dirty any state cache.
|
| @@ -394,7 +552,7 @@ private:
|
| bool insideClip) = 0;
|
|
|
| // overridden by backend-specific derived class to perform the draw call.
|
| - virtual void onGpuDraw(const DrawInfo&) = 0;
|
| + virtual void onGpuDraw(const GrDrawTarget::DrawInfo&) = 0;
|
|
|
| // overridden by backend-specific derived class to perform the read pixels.
|
| virtual bool onReadPixels(GrRenderTarget* target,
|
| @@ -435,22 +593,27 @@ private:
|
| bool attachStencilBufferToRenderTarget(GrRenderTarget* target);
|
|
|
| // GrDrawTarget overrides
|
| - virtual void onDraw(const DrawInfo&, const GrClipMaskManager::ScissorState&) SK_OVERRIDE;
|
| + virtual void onDraw(const GrDrawTarget::DrawInfo&,
|
| + const GrClipMaskManager::ScissorState&);
|
| virtual void onStencilPath(const GrPath*,
|
| const GrClipMaskManager::ScissorState&,
|
| - const GrStencilSettings&) SK_OVERRIDE;
|
| + const GrStencilSettings&);
|
| virtual void onDrawPath(const GrPath*,
|
| const GrClipMaskManager::ScissorState&,
|
| const GrStencilSettings&,
|
| - const GrDeviceCoordTexture* dstCopy) SK_OVERRIDE;
|
| + const GrDeviceCoordTexture* dstCopy);
|
| virtual void onDrawPaths(const GrPathRange*,
|
| const uint32_t indices[],
|
| int count,
|
| const float transforms[],
|
| - PathTransformType,
|
| + GrDrawTarget::PathTransformType,
|
| const GrClipMaskManager::ScissorState&,
|
| const GrStencilSettings&,
|
| - const GrDeviceCoordTexture*) SK_OVERRIDE;
|
| + const GrDeviceCoordTexture*);
|
| +
|
| + virtual void didAddGpuTraceMarker() = 0;
|
| + virtual void didRemoveGpuTraceMarker() = 0;
|
| +
|
|
|
| // readies the pools to provide vertex/index data.
|
| void prepareVertexPool();
|
| @@ -468,6 +631,15 @@ private:
|
| }
|
| }
|
|
|
| + // called when setting a new vert/idx source to unref prev vb/ib
|
| + void releasePreviousVertexSource();
|
| + void releasePreviousIndexSource();
|
| +
|
| + enum {
|
| + kPreallocGeoSrcStateStackCnt = 4,
|
| + };
|
| + SkSTArray<kPreallocGeoSrcStateStackCnt, GrDrawTarget::GeometrySrcState, true> fGeoSrcStateStack;
|
| +
|
| enum {
|
| kPreallocGeomPoolStateStackCnt = 4,
|
| };
|
| @@ -481,8 +653,19 @@ private:
|
| int fIndexPoolUseCnt;
|
| // these are mutable so they can be created on-demand
|
| mutable GrIndexBuffer* fQuadIndexBuffer;
|
| -
|
| - typedef GrClipTarget INHERITED;
|
| + GrDrawState fDefaultDrawState;
|
| + GrDrawState* fDrawState;
|
| + // To keep track that we always have at least as many debug marker adds as removes
|
| + int fGpuTraceMarkerCount;
|
| + GrTraceMarkerSet fActiveTraceMarkers;
|
| + GrTraceMarkerSet fStoredTraceMarkers;
|
| + // The context owns us, not vice-versa, so this ptr is not ref'ed by Gpu.
|
| + GrContext* fContext;
|
| +
|
| + // TODO fix this
|
| + friend class GrInOrderDrawBuffer;
|
| +
|
| + typedef SkRefCnt INHERITED;
|
| };
|
|
|
| #endif
|
|
|