Fix ref leak on GrGpu.
Review URL: http://codereview.appspot.com/4323043/ git-svn-id: http://skia.googlecode.com/svn/trunk@1015 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
cf3edc9c97
commit
11f0b51976
@ -34,11 +34,14 @@ GrBufferAllocPool::GrBufferAllocPool(GrGpu* gpu,
|
|||||||
size_t blockSize,
|
size_t blockSize,
|
||||||
int preallocBufferCnt) :
|
int preallocBufferCnt) :
|
||||||
fBlocks(GrMax(8, 2*preallocBufferCnt)) {
|
fBlocks(GrMax(8, 2*preallocBufferCnt)) {
|
||||||
|
|
||||||
GrAssert(NULL != gpu);
|
GrAssert(NULL != gpu);
|
||||||
fGpu = gpu;
|
fGpu = gpu;
|
||||||
|
fGpu->ref();
|
||||||
|
fGpuIsReffed = true;
|
||||||
|
|
||||||
fBufferType = bufferType;
|
fBufferType = bufferType;
|
||||||
fFrequentResetHint = frequentResetHint;
|
fFrequentResetHint = frequentResetHint;
|
||||||
fGpu->ref();
|
|
||||||
fBufferPtr = NULL;
|
fBufferPtr = NULL;
|
||||||
fMinBlockSize = GrMax(GrBufferAllocPool_MIN_BLOCK_SIZE, blockSize);
|
fMinBlockSize = GrMax(GrBufferAllocPool_MIN_BLOCK_SIZE, blockSize);
|
||||||
|
|
||||||
@ -61,11 +64,18 @@ GrBufferAllocPool::~GrBufferAllocPool() {
|
|||||||
buffer->unlock();
|
buffer->unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fPreallocBuffers.unrefAll();
|
|
||||||
while (!fBlocks.empty()) {
|
while (!fBlocks.empty()) {
|
||||||
destroyBlock();
|
destroyBlock();
|
||||||
}
|
}
|
||||||
|
fPreallocBuffers.unrefAll();
|
||||||
|
releaseGpuRef();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GrBufferAllocPool::releaseGpuRef() {
|
||||||
|
if (fGpuIsReffed) {
|
||||||
fGpu->unref();
|
fGpu->unref();
|
||||||
|
fGpuIsReffed = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GrBufferAllocPool::reset() {
|
void GrBufferAllocPool::reset() {
|
||||||
|
@ -39,10 +39,45 @@ class GrGpu;
|
|||||||
* be allocated at the min size and kept around until the pool is destroyed.
|
* be allocated at the min size and kept around until the pool is destroyed.
|
||||||
*/
|
*/
|
||||||
class GrBufferAllocPool : GrNoncopyable {
|
class GrBufferAllocPool : GrNoncopyable {
|
||||||
protected:
|
|
||||||
|
|
||||||
// We could make the createBuffer a virtual except that we want to use it
|
public:
|
||||||
// in the cons for pre-allocated buffers.
|
/**
|
||||||
|
* Ensures all buffers are unlocked and have all data written to them.
|
||||||
|
* Call before drawing using buffers from the pool.
|
||||||
|
*/
|
||||||
|
void unlock();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invalidates all the data in the pool, unrefs non-preallocated buffers.
|
||||||
|
*/
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the number of preallocated buffers that are yet to be used.
|
||||||
|
*/
|
||||||
|
int preallocatedBuffersRemaining() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the number of preallocated buffers
|
||||||
|
*/
|
||||||
|
int preallocatedBufferCount() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees data from makeSpaces in LIFO order.
|
||||||
|
*/
|
||||||
|
void putBack(size_t bytes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the GrGpu that this pool is associated with.
|
||||||
|
*/
|
||||||
|
GrGpu* getGpu() { return fGpu; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* Used to determine what type of buffers to create. We could make the
|
||||||
|
* createBuffer a virtual except that we want to use it in the cons for
|
||||||
|
* pre-allocated buffers.
|
||||||
|
*/
|
||||||
enum BufferType {
|
enum BufferType {
|
||||||
kVertex_BufferType,
|
kVertex_BufferType,
|
||||||
kIndex_BufferType,
|
kIndex_BufferType,
|
||||||
@ -72,40 +107,6 @@ protected:
|
|||||||
|
|
||||||
virtual ~GrBufferAllocPool();
|
virtual ~GrBufferAllocPool();
|
||||||
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* Ensures all buffers are unlocked and have all data written to them.
|
|
||||||
* Call before drawing using buffers from the pool.
|
|
||||||
*/
|
|
||||||
void unlock();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invalidates all the data in the pool, unrefs non-preallocated buffers.
|
|
||||||
*/
|
|
||||||
void reset();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the number of preallocated buffers that are yet to be used.
|
|
||||||
*/
|
|
||||||
int preallocatedBuffersRemaining() const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gets the number of preallocated buffers
|
|
||||||
*/
|
|
||||||
int preallocatedBufferCount() const;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Frees data from makeSpaces in LIFO order.
|
|
||||||
*/
|
|
||||||
void putBack(size_t bytes);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the GrGpu that this pool is associated with.
|
|
||||||
*/
|
|
||||||
GrGpu* getGpu() { return fGpu; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/**
|
/**
|
||||||
* Gets the size of the preallocated buffers.
|
* Gets the size of the preallocated buffers.
|
||||||
*
|
*
|
||||||
@ -155,6 +156,10 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
// The GrGpu must be able to clear the ref of pools it creates as members
|
||||||
|
friend class GrGpu;
|
||||||
|
void releaseGpuRef();
|
||||||
|
|
||||||
struct BufferBlock {
|
struct BufferBlock {
|
||||||
size_t fBytesFree;
|
size_t fBytesFree;
|
||||||
GrGeometryBuffer* fBuffer;
|
GrGeometryBuffer* fBuffer;
|
||||||
@ -168,6 +173,7 @@ private:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
GrGpu* fGpu;
|
GrGpu* fGpu;
|
||||||
|
bool fGpuIsReffed;
|
||||||
bool fFrequentResetHint;
|
bool fFrequentResetHint;
|
||||||
GrTDArray<GrGeometryBuffer*> fPreallocBuffers;
|
GrTDArray<GrGeometryBuffer*> fPreallocBuffers;
|
||||||
size_t fMinBlockSize;
|
size_t fMinBlockSize;
|
||||||
|
@ -603,6 +603,7 @@ void GrGpu::prepareVertexPool() {
|
|||||||
fVertexPool = new GrVertexBufferAllocPool(this, true,
|
fVertexPool = new GrVertexBufferAllocPool(this, true,
|
||||||
VERTEX_POOL_VB_SIZE,
|
VERTEX_POOL_VB_SIZE,
|
||||||
VERTEX_POOL_VB_COUNT);
|
VERTEX_POOL_VB_COUNT);
|
||||||
|
fVertexPool->releaseGpuRef();
|
||||||
} else if (!fVertexPoolInUse) {
|
} else if (!fVertexPoolInUse) {
|
||||||
// the client doesn't have valid data in the pool
|
// the client doesn't have valid data in the pool
|
||||||
fVertexPool->reset();
|
fVertexPool->reset();
|
||||||
@ -612,6 +613,7 @@ void GrGpu::prepareVertexPool() {
|
|||||||
void GrGpu::prepareIndexPool() {
|
void GrGpu::prepareIndexPool() {
|
||||||
if (NULL == fIndexPool) {
|
if (NULL == fIndexPool) {
|
||||||
fIndexPool = new GrIndexBufferAllocPool(this, true, 0, 1);
|
fIndexPool = new GrIndexBufferAllocPool(this, true, 0, 1);
|
||||||
|
fIndexPool->releaseGpuRef();
|
||||||
} else if (!fIndexPoolInUse) {
|
} else if (!fIndexPoolInUse) {
|
||||||
// the client doesn't have valid data in the pool
|
// the client doesn't have valid data in the pool
|
||||||
fIndexPool->reset();
|
fIndexPool->reset();
|
||||||
|
@ -342,6 +342,13 @@ bool SampleWindow::make3DReady() {
|
|||||||
|
|
||||||
#if defined(SK_SUPPORT_GL)
|
#if defined(SK_SUPPORT_GL)
|
||||||
if (attachGL()) {
|
if (attachGL()) {
|
||||||
|
#if 0
|
||||||
|
if (NULL != fGrContext) {
|
||||||
|
GrAssert(1 == fGrContext->refcnt());
|
||||||
|
fGrContext->unref();
|
||||||
|
fGrContext = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (NULL == fGrContext) {
|
if (NULL == fGrContext) {
|
||||||
#if defined(SK_USE_SHADERS)
|
#if defined(SK_USE_SHADERS)
|
||||||
fGrContext = GrContext::Create(GrGpu::kOpenGL_Shaders_Engine, NULL);
|
fGrContext = GrContext::Create(GrGpu::kOpenGL_Shaders_Engine, NULL);
|
||||||
|
@ -91,6 +91,8 @@
|
|||||||
7D66934C132ABD8F003AC2F5 /* GrGLInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D66934B132ABD8F003AC2F5 /* GrGLInterface.h */; };
|
7D66934C132ABD8F003AC2F5 /* GrGLInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D66934B132ABD8F003AC2F5 /* GrGLInterface.h */; };
|
||||||
7D66934E132ABDA7003AC2F5 /* GrGLPlatformIncludes.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D66934D132ABDA7003AC2F5 /* GrGLPlatformIncludes.h */; };
|
7D66934E132ABDA7003AC2F5 /* GrGLPlatformIncludes.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D66934D132ABDA7003AC2F5 /* GrGLPlatformIncludes.h */; };
|
||||||
7D6EBF5A13330E8400AEAADD /* GrGLDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D6EBF5913330E8400AEAADD /* GrGLDefines.h */; };
|
7D6EBF5A13330E8400AEAADD /* GrGLDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D6EBF5913330E8400AEAADD /* GrGLDefines.h */; };
|
||||||
|
D51B4C3C1342649500718A57 /* GrPathUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D51B4C3A1342649500718A57 /* GrPathUtils.cpp */; };
|
||||||
|
D51B4C3D1342649500718A57 /* GrPathUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = D51B4C3B1342649500718A57 /* GrPathUtils.h */; };
|
||||||
D539049B12EA01E30025F3D6 /* GrContext_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = D539049A12EA01E30025F3D6 /* GrContext_impl.h */; };
|
D539049B12EA01E30025F3D6 /* GrContext_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = D539049A12EA01E30025F3D6 /* GrContext_impl.h */; };
|
||||||
D53904A112EA026E0025F3D6 /* GrPaint.h in Headers */ = {isa = PBXBuildFile; fileRef = D53904A012EA026E0025F3D6 /* GrPaint.h */; };
|
D53904A112EA026E0025F3D6 /* GrPaint.h in Headers */ = {isa = PBXBuildFile; fileRef = D53904A012EA026E0025F3D6 /* GrPaint.h */; };
|
||||||
D542EAAD131C87E90065FC9D /* GrStencil.h in Headers */ = {isa = PBXBuildFile; fileRef = D542EAAC131C87E90065FC9D /* GrStencil.h */; };
|
D542EAAD131C87E90065FC9D /* GrStencil.h in Headers */ = {isa = PBXBuildFile; fileRef = D542EAAC131C87E90065FC9D /* GrStencil.h */; };
|
||||||
@ -191,6 +193,8 @@
|
|||||||
7D66934D132ABDA7003AC2F5 /* GrGLPlatformIncludes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GrGLPlatformIncludes.h; path = ../../gpu/include/GrGLPlatformIncludes.h; sourceTree = SOURCE_ROOT; };
|
7D66934D132ABDA7003AC2F5 /* GrGLPlatformIncludes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GrGLPlatformIncludes.h; path = ../../gpu/include/GrGLPlatformIncludes.h; sourceTree = SOURCE_ROOT; };
|
||||||
7D6EBF5913330E8400AEAADD /* GrGLDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GrGLDefines.h; path = ../../gpu/include/GrGLDefines.h; sourceTree = SOURCE_ROOT; };
|
7D6EBF5913330E8400AEAADD /* GrGLDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GrGLDefines.h; path = ../../gpu/include/GrGLDefines.h; sourceTree = SOURCE_ROOT; };
|
||||||
D2AAC046055464E500DB518D /* libgpu.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgpu.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
D2AAC046055464E500DB518D /* libgpu.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgpu.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
D51B4C3A1342649500718A57 /* GrPathUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GrPathUtils.cpp; path = ../../gpu/src/GrPathUtils.cpp; sourceTree = SOURCE_ROOT; };
|
||||||
|
D51B4C3B1342649500718A57 /* GrPathUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GrPathUtils.h; path = ../../gpu/src/GrPathUtils.h; sourceTree = SOURCE_ROOT; };
|
||||||
D539049A12EA01E30025F3D6 /* GrContext_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GrContext_impl.h; path = ../../gpu/include/GrContext_impl.h; sourceTree = SOURCE_ROOT; };
|
D539049A12EA01E30025F3D6 /* GrContext_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GrContext_impl.h; path = ../../gpu/include/GrContext_impl.h; sourceTree = SOURCE_ROOT; };
|
||||||
D53904A012EA026E0025F3D6 /* GrPaint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GrPaint.h; path = ../../gpu/include/GrPaint.h; sourceTree = SOURCE_ROOT; };
|
D53904A012EA026E0025F3D6 /* GrPaint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GrPaint.h; path = ../../gpu/include/GrPaint.h; sourceTree = SOURCE_ROOT; };
|
||||||
D542EAAC131C87E90065FC9D /* GrStencil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GrStencil.h; path = ../../gpu/include/GrStencil.h; sourceTree = SOURCE_ROOT; };
|
D542EAAC131C87E90065FC9D /* GrStencil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GrStencil.h; path = ../../gpu/include/GrStencil.h; sourceTree = SOURCE_ROOT; };
|
||||||
@ -297,6 +301,8 @@
|
|||||||
08FB7795FE84155DC02AAC07 /* Source */ = {
|
08FB7795FE84155DC02AAC07 /* Source */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
D51B4C3A1342649500718A57 /* GrPathUtils.cpp */,
|
||||||
|
D51B4C3B1342649500718A57 /* GrPathUtils.h */,
|
||||||
D59BD412133BD384003B546A /* GrCreatePathRenderer_none.cpp */,
|
D59BD412133BD384003B546A /* GrCreatePathRenderer_none.cpp */,
|
||||||
7D669345132ABD5D003AC2F5 /* GrGLInterface.cpp */,
|
7D669345132ABD5D003AC2F5 /* GrGLInterface.cpp */,
|
||||||
D5ED886E1313F92C00B98D64 /* GrRedBlackTree.h */,
|
D5ED886E1313F92C00B98D64 /* GrRedBlackTree.h */,
|
||||||
@ -426,6 +432,7 @@
|
|||||||
7D66934E132ABDA7003AC2F5 /* GrGLPlatformIncludes.h in Headers */,
|
7D66934E132ABDA7003AC2F5 /* GrGLPlatformIncludes.h in Headers */,
|
||||||
7D6EBF5A13330E8400AEAADD /* GrGLDefines.h in Headers */,
|
7D6EBF5A13330E8400AEAADD /* GrGLDefines.h in Headers */,
|
||||||
D59BD3F4133BBB49003B546A /* GrPathRenderer.h in Headers */,
|
D59BD3F4133BBB49003B546A /* GrPathRenderer.h in Headers */,
|
||||||
|
D51B4C3D1342649500718A57 /* GrPathUtils.h in Headers */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@ -507,6 +514,7 @@
|
|||||||
D5558AE3131EB9BB00C71009 /* GrStencil.cpp in Sources */,
|
D5558AE3131EB9BB00C71009 /* GrStencil.cpp in Sources */,
|
||||||
7D669346132ABD5D003AC2F5 /* GrGLInterface.cpp in Sources */,
|
7D669346132ABD5D003AC2F5 /* GrGLInterface.cpp in Sources */,
|
||||||
D59BD413133BD384003B546A /* GrCreatePathRenderer_none.cpp in Sources */,
|
D59BD413133BD384003B546A /* GrCreatePathRenderer_none.cpp in Sources */,
|
||||||
|
D51B4C3C1342649500718A57 /* GrPathUtils.cpp in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user