Chromium Code Reviews| Index: src/gpu/GrDrawTarget.h |
| diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h |
| index 75a2f258f29416d068ac68ef93c3d85233107a30..0128ca5bbfdb0202cdb5151d10fba60f7c5a195f 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,7 +167,8 @@ public: |
| * |
| * @return true if target should be flushed based on the input values. |
| */ |
| - virtual bool geometryHints(int* vertexCount, |
| + virtual bool geometryHints(size_t vertexStride, |
|
bsalomon
2014/11/14 21:51:02
one line?
|
| + int* vertexCount, |
| int* indexCount) const; |
| /** |
| @@ -205,7 +179,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 +241,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 +260,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 +272,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 +292,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 +311,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 +360,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 +372,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 +420,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 +439,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 +497,7 @@ public: |
| */ |
| class AutoGeometryPush : public ::SkNoncopyable { |
| public: |
| - AutoGeometryPush(GrDrawTarget* target) |
| - : fAttribRestore(target->drawState()) { |
| + AutoGeometryPush(GrDrawTarget* target) { |
| SkASSERT(target); |
| fTarget = target; |
| target->pushGeometrySource(); |
| @@ -643,32 +507,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 +668,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 +692,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 +732,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 +744,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 +759,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 +811,7 @@ private: |
| virtual bool setupClip(const SkRect* devBounds, |
| GrDrawState::AutoRestoreEffects* are, |
| GrDrawState::AutoRestoreStencil* ars, |
| + GrDrawState*, |
| GrClipMaskManager::ScissorState* scissorState) SK_OVERRIDE; |
| typedef GrDrawTarget INHERITED; |