Make GrEffectStage copy constructor work correctly with pending execution refs.
R=egdaniel@google.com Author: bsalomon@google.com Review URL: https://codereview.chromium.org/551083002
This commit is contained in:
parent
46625e06e2
commit
655ad128d0
@ -17,6 +17,11 @@
|
|||||||
#include "SkMatrix.h"
|
#include "SkMatrix.h"
|
||||||
#include "SkShader.h"
|
#include "SkShader.h"
|
||||||
|
|
||||||
|
// TODO: Make two variations on this class: One for GrDrawState that only owns regular refs
|
||||||
|
// and supports compatibility checks and changing local coords. The second is for GrOptDrawState,
|
||||||
|
// is immutable, and only owns pending execution refs. This requries removing the common base
|
||||||
|
// class from GrDrawState and GrOptDrawState called GrRODrawState and converting to GrOptDrawState
|
||||||
|
// when draws are enqueued in the GrInOrderDrawBuffer.
|
||||||
class GrEffectStage {
|
class GrEffectStage {
|
||||||
public:
|
public:
|
||||||
explicit GrEffectStage(const GrEffect* effect, int attrIndex0 = -1, int attrIndex1 = -1)
|
explicit GrEffectStage(const GrEffect* effect, int attrIndex0 = -1, int attrIndex1 = -1)
|
||||||
@ -27,17 +32,12 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
GrEffectStage(const GrEffectStage& other) {
|
GrEffectStage(const GrEffectStage& other) {
|
||||||
*this = other;
|
|
||||||
}
|
|
||||||
|
|
||||||
GrEffectStage& operator= (const GrEffectStage& other) {
|
|
||||||
fCoordChangeMatrixSet = other.fCoordChangeMatrixSet;
|
fCoordChangeMatrixSet = other.fCoordChangeMatrixSet;
|
||||||
if (other.fCoordChangeMatrixSet) {
|
if (other.fCoordChangeMatrixSet) {
|
||||||
fCoordChangeMatrix = other.fCoordChangeMatrix;
|
fCoordChangeMatrix = other.fCoordChangeMatrix;
|
||||||
}
|
}
|
||||||
fEffect.reset(SkRef(other.fEffect.get()));
|
fEffect.initAndRef(other.fEffect);
|
||||||
memcpy(fVertexAttribIndices, other.fVertexAttribIndices, sizeof(fVertexAttribIndices));
|
memcpy(fVertexAttribIndices, other.fVertexAttribIndices, sizeof(fVertexAttribIndices));
|
||||||
return *this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool AreCompatible(const GrEffectStage& a, const GrEffectStage& b,
|
static bool AreCompatible(const GrEffectStage& a, const GrEffectStage& b,
|
||||||
|
@ -38,6 +38,26 @@ public:
|
|||||||
fOwnPendingExec = true;
|
fOwnPendingExec = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// In the short term we need to support copying a GrEffectStage and making the copy own
|
||||||
|
// the same type of ref as the source. This function exists to support this. TODO: Once
|
||||||
|
// GrDrawState and GrOptDrawState no longer share a base class they won't have to share
|
||||||
|
// GrEffectStage and we can have GrOptDrawState always own pending executions rather than
|
||||||
|
// refs on GrProgramElements. At that point we should be able to delete this function.
|
||||||
|
// This function makes assumptions that are valid in the GrEffectStage use case and should
|
||||||
|
// not be used elsewhere.
|
||||||
|
void initAndRef(const GrProgramElementRef& that) {
|
||||||
|
SkASSERT(!fObj);
|
||||||
|
SkASSERT(that.fObj);
|
||||||
|
if (that.fOwnPendingExec) {
|
||||||
|
SkASSERT(that.fObj->fPendingExecutions > 0);
|
||||||
|
that.fObj->fPendingExecutions++;
|
||||||
|
} else {
|
||||||
|
that.fObj->ref();
|
||||||
|
}
|
||||||
|
this->fOwnPendingExec = that.fOwnPendingExec;
|
||||||
|
this->fObj = that.fObj;
|
||||||
|
}
|
||||||
|
|
||||||
T* get() const { return fObj; }
|
T* get() const { return fObj; }
|
||||||
operator T*() { return fObj; }
|
operator T*() { return fObj; }
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user