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

Unified Diff: src/gpu/GrGpu.h

Issue 705593002: Refactor DrawTarget and GPU to be independent (Closed) Base URL: https://skia.googlesource.com/skia.git@early_clip
Patch Set: rebase on master Created 6 years, 1 month 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/GrDrawTarget.h ('k') | src/gpu/GrGpu.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « src/gpu/GrDrawTarget.h ('k') | src/gpu/GrGpu.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698