Index: src/gpu/GrDrawTarget.h |
diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h |
index 75a2f258f29416d068ac68ef93c3d85233107a30..a41fc43ea4675d36f5a8e4b59a710b0cfccd62eb 100644 |
--- a/src/gpu/GrDrawTarget.h |
+++ b/src/gpu/GrDrawTarget.h |
@@ -67,34 +67,6 @@ public: |
const GrClipData* getClip() const; |
/** |
- * Sets the draw state object for the draw target. Note that this does not |
- * make a copy. The GrDrawTarget will take a reference to passed object. |
- * Passing NULL will cause the GrDrawTarget to use its own internal draw |
- * state object rather than an externally provided one. |
- */ |
- void setDrawState(GrDrawState* drawState); |
- |
- /** |
- * Read-only access to the GrDrawTarget's current draw state. |
- */ |
- const GrDrawState& getDrawState() const { return *fDrawState; } |
- |
- /** |
- * Read-write access to the GrDrawTarget's current draw state. Note that |
- * this doesn't ref. |
- */ |
- GrDrawState* drawState() { return fDrawState; } |
- |
- /** When we're using coverage AA but the blend is incompatible (given gpu |
- * limitations) we should disable AA. */ |
- bool shouldDisableCoverageAAForBlend() const { |
- // Enable below if we should draw with AA even when it produces |
- // incorrect blending. |
- // return false; |
- return !this->getDrawState().couldApplyCoverage(*this->caps()); |
- } |
- |
- /** |
* There are three types of "sources" of geometry (vertices and indices) for |
* draw calls made on the target. When performing an indexed draw, the |
* indices and vertices can use different source types. Once a source is |
@@ -168,6 +140,7 @@ public: |
* non-zero. Illegal to pass NULL if indexCount > 0. |
*/ |
bool reserveVertexAndIndexSpace(int vertexCount, |
+ size_t vertexStride, |
int indexCount, |
void** vertices, |
void** indices); |
@@ -194,8 +167,7 @@ public: |
* |
* @return true if target should be flushed based on the input values. |
*/ |
- virtual bool geometryHints(int* vertexCount, |
- int* indexCount) const; |
+ virtual bool geometryHints(size_t vertexStride, int* vertexCount, int* indexCount) const; |
/** |
* Sets source of vertex data for the next draw. Data does not have to be |
@@ -205,7 +177,7 @@ public: |
* unlocked before draw call. Vertex size is queried |
* from current GrDrawState. |
*/ |
- void setVertexSourceToBuffer(const GrVertexBuffer* buffer); |
+ void setVertexSourceToBuffer(const GrVertexBuffer* buffer, size_t vertexStride); |
/** |
* Sets source of index data for the next indexed draw. Data does not have |
@@ -267,7 +239,8 @@ public: |
* @param devBounds optional bounds hint. This is a promise from the caller, |
* not a request for clipping. |
*/ |
- void drawIndexed(GrPrimitiveType type, |
+ void drawIndexed(GrDrawState*, |
+ GrPrimitiveType type, |
int startVertex, |
int startIndex, |
int vertexCount, |
@@ -285,7 +258,8 @@ public: |
* @param devBounds optional bounds hint. This is a promise from the caller, |
* not a request for clipping. |
*/ |
- void drawNonIndexed(GrPrimitiveType type, |
+ void drawNonIndexed(GrDrawState*, |
+ GrPrimitiveType type, |
int startVertex, |
int vertexCount, |
const SkRect* devBounds = NULL); |
@@ -296,13 +270,13 @@ public: |
* on the draw state (if possible in the 3D API). Note, we will never have an inverse fill |
* with stencil path |
*/ |
- void stencilPath(const GrPath*, GrPathRendering::FillType fill); |
+ void stencilPath(GrDrawState*, const GrPath*, GrPathRendering::FillType fill); |
/** |
* Draws a path. Fill must not be a hairline. It will respect the HW |
* antialias flag on the draw state (if possible in the 3D API). |
*/ |
- void drawPath(const GrPath*, GrPathRendering::FillType fill); |
+ void drawPath(GrDrawState*, const GrPath*, GrPathRendering::FillType fill); |
/** |
* Draws many paths. It will respect the HW |
@@ -316,9 +290,11 @@ public: |
PathTransformSize(transformsType) * count elements |
* @param fill Fill type for drawing all the paths |
*/ |
- void drawPaths(const GrPathRange* pathRange, |
- const uint32_t indices[], int count, |
- const float transforms[], PathTransformType transformsType, |
+ void drawPaths(GrDrawState*, const GrPathRange* pathRange, |
+ const uint32_t indices[], |
+ int count, |
+ const float transforms[], |
+ PathTransformType transformsType, |
GrPathRendering::FillType fill); |
/** |
@@ -333,22 +309,23 @@ public: |
* then srcRect will be transformed by srcMatrix. |
* srcMatrix can be NULL when no srcMatrix is desired. |
*/ |
- void drawRect(const SkRect& rect, |
+ void drawRect(GrDrawState* ds, |
+ const SkRect& rect, |
const SkRect* localRect, |
const SkMatrix* localMatrix) { |
AutoGeometryPush agp(this); |
- this->onDrawRect(rect, localRect, localMatrix); |
+ this->onDrawRect(ds, rect, localRect, localMatrix); |
} |
/** |
* Helper for drawRect when the caller doesn't need separate local rects or matrices. |
*/ |
- void drawSimpleRect(const SkRect& rect) { |
- this->drawRect(rect, NULL, NULL); |
+ void drawSimpleRect(GrDrawState* ds, const SkRect& rect) { |
+ this->drawRect(ds, rect, NULL, NULL); |
} |
- void drawSimpleRect(const SkIRect& irect) { |
+ void drawSimpleRect(GrDrawState* ds, const SkIRect& irect) { |
SkRect rect = SkRect::Make(irect); |
- this->drawRect(rect, NULL, NULL); |
+ this->drawRect(ds, rect, NULL, NULL); |
} |
/** |
@@ -381,7 +358,8 @@ public: |
* @param devBounds optional bounds hint. This is a promise from the caller, |
* not a request for clipping. |
*/ |
- void drawIndexedInstances(GrPrimitiveType type, |
+ void drawIndexedInstances(GrDrawState*, |
+ GrPrimitiveType type, |
int instanceCount, |
int verticesPerInstance, |
int indicesPerInstance, |
@@ -392,7 +370,9 @@ public: |
* 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, |
+ void clear(const SkIRect* rect, |
+ GrColor color, |
+ bool canIgnoreRect, |
GrRenderTarget* renderTarget); |
/** |
@@ -438,8 +418,8 @@ public: |
* Function that determines whether a copySurface call would succeed without |
* performing the copy. |
*/ |
- virtual bool canCopySurface(GrSurface* dst, |
- GrSurface* src, |
+ virtual bool canCopySurface(const GrSurface* dst, |
+ const GrSurface* src, |
const SkIRect& srcRect, |
const SkIPoint& dstPoint); |
@@ -457,136 +437,19 @@ public: |
*/ |
virtual void purgeResources() {}; |
- class DrawInfo; |
- /** |
- * For subclass internal use to invoke a call to onDraw(). See DrawInfo below. |
- */ |
- void executeDraw(const DrawInfo& info, |
- const GrClipMaskManager::ScissorState& scissorState) { |
- this->onDraw(info, scissorState); |
- } |
- |
- /** |
- * For subclass internal use to invoke a call to onStencilPath(). |
- */ |
- void executeStencilPath(const GrPath* path, |
- const GrClipMaskManager::ScissorState& scissorState, |
- const GrStencilSettings& stencilSettings) { |
- this->onStencilPath(path, scissorState, stencilSettings); |
- } |
- |
- /** |
- * For subclass internal use to invoke a call to onDrawPath(). |
- */ |
- void executeDrawPath(const GrPath* path, |
- const GrClipMaskManager::ScissorState& scissorState, |
- const GrStencilSettings& stencilSettings, |
- const GrDeviceCoordTexture* dstCopy) { |
- this->onDrawPath(path, scissorState, stencilSettings, dstCopy); |
- } |
- |
- /** |
- * For subclass internal use to invoke a call to onDrawPaths(). |
- */ |
- void executeDrawPaths(const GrPathRange* pathRange, |
- const uint32_t indices[], |
- int count, |
- const float transforms[], |
- PathTransformType transformsType, |
- const GrClipMaskManager::ScissorState& scissorState, |
- const GrStencilSettings& stencilSettings, |
- const GrDeviceCoordTexture* dstCopy) { |
- this->onDrawPaths(pathRange, indices, count, transforms, transformsType, |
- scissorState, stencilSettings, dstCopy); |
- } |
- |
- //////////////////////////////////////////////////////////////////////////// |
- |
- /** |
- * See AutoStateRestore below. |
- */ |
- enum ASRInit { |
- kPreserve_ASRInit, |
- kReset_ASRInit |
- }; |
- |
- /** |
- * Saves off the current state and restores it in the destructor. It will |
- * install a new GrDrawState object on the target (setDrawState) and restore |
- * the previous one in the destructor. The caller should call drawState() to |
- * get the new draw state after the ASR is installed. |
- * |
- * GrDrawState* state = target->drawState(); |
- * AutoStateRestore asr(target, GrDrawTarget::kReset_ASRInit). |
- * state->setRenderTarget(rt); // state refers to the GrDrawState set on |
- * // target before asr was initialized. |
- * // Therefore, rt is set on the GrDrawState |
- * // that will be restored after asr's |
- * // destructor rather than target's current |
- * // GrDrawState. |
- */ |
- class AutoStateRestore : public ::SkNoncopyable { |
- public: |
- /** |
- * Default ASR will have no effect unless set() is subsequently called. |
- */ |
- AutoStateRestore(); |
- |
- /** |
- * Saves the state on target. The state will be restored when the ASR |
- * is destroyed. If this constructor is used do not call set(). |
- * |
- * @param init Should the newly installed GrDrawState be a copy of the |
- * previous state or a default-initialized GrDrawState. |
- * @param viewMatrix Optional view matrix. If init = kPreserve then the draw state's |
- * matrix will be preconcat'ed with the param. All stages will be |
- updated to compensate for the matrix change. If init == kReset |
- then the draw state's matrix will be this matrix. |
- */ |
- AutoStateRestore(GrDrawTarget* target, ASRInit init, const SkMatrix* viewMatrix = NULL); |
- |
- ~AutoStateRestore(); |
- |
- /** |
- * Saves the state on target. The state will be restored when the ASR |
- * is destroyed. This should only be called once per ASR object and only |
- * when the default constructor was used. For nested saves use multiple |
- * ASR objects. |
- * |
- * @param init Should the newly installed GrDrawState be a copy of the |
- * previous state or a default-initialized GrDrawState. |
- * @param viewMatrix Optional view matrix. If init = kPreserve then the draw state's |
- * matrix will be preconcat'ed with the param. All stages will be |
- updated to compensate for the matrix change. If init == kReset |
- then the draw state's matrix will be this matrix. |
- */ |
- void set(GrDrawTarget* target, ASRInit init, const SkMatrix* viewMatrix = NULL); |
- |
- /** |
- * Like set() but makes the view matrix identity. When init is kReset it is as though |
- * NULL was passed to set's viewMatrix param. When init is kPreserve it is as though |
- * the inverse view matrix was passed. If kPreserve is passed and the draw state's matrix |
- * is not invertible then this may fail. |
- */ |
- bool setIdentity(GrDrawTarget* target, ASRInit init); |
- |
- private: |
- GrDrawTarget* fDrawTarget; |
- SkTLazy<GrDrawState> fTempState; |
- GrDrawState* fSavedState; |
- }; |
- |
//////////////////////////////////////////////////////////////////////////// |
class AutoReleaseGeometry : public ::SkNoncopyable { |
public: |
AutoReleaseGeometry(GrDrawTarget* target, |
int vertexCount, |
+ size_t vertexStride, |
int indexCount); |
AutoReleaseGeometry(); |
~AutoReleaseGeometry(); |
bool set(GrDrawTarget* target, |
int vertexCount, |
+ size_t vertexStride, |
int indexCount); |
bool succeeded() const { return SkToBool(fTarget); } |
void* vertices() const { SkASSERT(this->succeeded()); return fVertices; } |
@@ -632,8 +495,7 @@ public: |
*/ |
class AutoGeometryPush : public ::SkNoncopyable { |
public: |
- AutoGeometryPush(GrDrawTarget* target) |
- : fAttribRestore(target->drawState()) { |
+ AutoGeometryPush(GrDrawTarget* target) { |
SkASSERT(target); |
fTarget = target; |
target->pushGeometrySource(); |
@@ -643,32 +505,6 @@ public: |
private: |
GrDrawTarget* fTarget; |
- GrDrawState::AutoVertexAttribRestore fAttribRestore; |
- }; |
- |
- /** |
- * Combination of AutoGeometryPush and AutoStateRestore. The vertex attribs will be in default |
- * state regardless of ASRInit value. |
- */ |
- class AutoGeometryAndStatePush : public ::SkNoncopyable { |
- public: |
- AutoGeometryAndStatePush(GrDrawTarget* target, |
- ASRInit init, |
- const SkMatrix* viewMatrix = NULL) |
- : fState(target, init, viewMatrix) { |
- SkASSERT(target); |
- fTarget = target; |
- target->pushGeometrySource(); |
- if (kPreserve_ASRInit == init) { |
- target->drawState()->setDefaultVertexAttribs(); |
- } |
- } |
- |
- ~AutoGeometryAndStatePush() { fTarget->popGeometrySource(); } |
- |
- private: |
- AutoStateRestore fState; |
- GrDrawTarget* fTarget; |
}; |
/////////////////////////////////////////////////////////////////////////// |
@@ -830,15 +666,19 @@ protected: |
// Makes a copy of the dst if it is necessary for the draw. Returns false if a copy is required |
// but couldn't be made. Otherwise, returns true. This method needs to be protected because it |
// needs to be accessed by GLPrograms to setup a correct drawstate |
- bool setupDstReadIfNecessary(DrawInfo* info) { |
- return this->setupDstReadIfNecessary(&info->fDstCopy, info->getDevBounds()); |
+ bool setupDstReadIfNecessary(GrDrawState* ds, DrawInfo* info) { |
+ return this->setupDstReadIfNecessary(ds, &info->fDstCopy, info->getDevBounds()); |
} |
- bool setupDstReadIfNecessary(GrDeviceCoordTexture* dstCopy, const SkRect* drawBounds); |
+ bool setupDstReadIfNecessary(GrDrawState*, |
+ GrDeviceCoordTexture* dstCopy, |
+ const SkRect* drawBounds); |
private: |
// A subclass can optionally overload this function to be notified before |
// vertex and index space is reserved. |
- virtual void willReserveVertexAndIndexSpace(int vertexCount, int indexCount) {} |
+ virtual void willReserveVertexAndIndexSpace(int vertexCount, |
+ size_t vertexStride, |
+ int indexCount) {} |
// implemented by subclass to allocate space for reserved geom |
virtual bool onReserveVertexSpace(size_t vertexSize, int vertexCount, void** vertices) = 0; |
@@ -850,20 +690,26 @@ private: |
virtual void geometrySourceWillPush() = 0; |
virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) = 0; |
// subclass called to perform drawing |
- virtual void onDraw(const DrawInfo&, const GrClipMaskManager::ScissorState&) = 0; |
+ virtual void onDraw(const GrDrawState&, |
+ const DrawInfo&, |
+ const GrClipMaskManager::ScissorState&) = 0; |
// TODO copy in order drawbuffer onDrawRect to here |
- virtual void onDrawRect(const SkRect& rect, |
+ virtual void onDrawRect(GrDrawState*, |
+ const SkRect& rect, |
const SkRect* localRect, |
const SkMatrix* localMatrix) = 0; |
- virtual void onStencilPath(const GrPath*, |
+ virtual void onStencilPath(const GrDrawState&, |
+ const GrPath*, |
const GrClipMaskManager::ScissorState&, |
const GrStencilSettings&) = 0; |
- virtual void onDrawPath(const GrPath*, |
+ virtual void onDrawPath(const GrDrawState&, |
+ const GrPath*, |
const GrClipMaskManager::ScissorState&, |
const GrStencilSettings&, |
const GrDeviceCoordTexture* dstCopy) = 0; |
- virtual void onDrawPaths(const GrPathRange*, |
+ virtual void onDrawPaths(const GrDrawState&, |
+ const GrPathRange*, |
const uint32_t indices[], |
int count, |
const float transforms[], |
@@ -884,8 +730,11 @@ private: |
// called by drawIndexed and drawNonIndexed. Use a negative indexCount to |
// indicate non-indexed drawing. |
- bool checkDraw(GrPrimitiveType type, int startVertex, |
- int startIndex, int vertexCount, |
+ bool checkDraw(const GrDrawState&, |
+ GrPrimitiveType type, |
+ int startVertex, |
+ int startIndex, |
+ int vertexCount, |
int indexCount) const; |
// called when setting a new vert/idx source to unref prev vb/ib |
void releasePreviousVertexSource(); |
@@ -893,11 +742,14 @@ private: |
// Check to see if this set of draw commands has been sent out |
virtual bool isIssued(uint32_t drawID) { return true; } |
- void getPathStencilSettingsForFilltype(GrPathRendering::FillType, GrStencilSettings*); |
+ void getPathStencilSettingsForFilltype(GrPathRendering::FillType, |
+ const GrStencilBuffer*, |
+ GrStencilSettings*); |
virtual GrClipMaskManager* clipMaskManager() = 0; |
virtual bool setupClip(const SkRect* devBounds, |
GrDrawState::AutoRestoreEffects* are, |
GrDrawState::AutoRestoreStencil* ars, |
+ GrDrawState*, |
GrClipMaskManager::ScissorState* scissorState) = 0; |
enum { |
@@ -905,8 +757,6 @@ private: |
}; |
SkSTArray<kPreallocGeoSrcStateStackCnt, GeometrySrcState, true> fGeoSrcStateStack; |
const GrClipData* fClip; |
- GrDrawState* fDrawState; |
- GrDrawState fDefaultDrawState; |
// The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTarget. |
GrContext* fContext; |
// To keep track that we always have at least as many debug marker adds as removes |
@@ -959,6 +809,7 @@ private: |
virtual bool setupClip(const SkRect* devBounds, |
GrDrawState::AutoRestoreEffects* are, |
GrDrawState::AutoRestoreStencil* ars, |
+ GrDrawState*, |
GrClipMaskManager::ScissorState* scissorState) SK_OVERRIDE; |
typedef GrDrawTarget INHERITED; |