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

Unified Diff: src/gpu/GrDrawTarget.h

Issue 732693002: Drawstate on stack (Closed) Base URL: https://skia.googlesource.com/skia.git@real_def_gp
Patch Set: tiny fix 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/GrDrawState.h ('k') | src/gpu/GrDrawTarget.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « src/gpu/GrDrawState.h ('k') | src/gpu/GrDrawTarget.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698