Add GrRenderTexture cons for gpu dev. Remove factory from gpu device.
Review URL: http://codereview.appspot.com/4631046/
git-svn-id: http://skia.googlecode.com/svn/trunk@1634 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index cda10d2..5f08847 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -140,9 +140,18 @@
return bitmap;
}
+SkGpuDevice::SkGpuDevice(GrContext* context, GrTexture* texture)
+: SkDevice(make_bitmap(context, texture->asRenderTarget())) {
+ this->initFromRenderTarget(context, texture->asRenderTarget());
+}
+
SkGpuDevice::SkGpuDevice(GrContext* context, GrRenderTarget* renderTarget)
: SkDevice(make_bitmap(context, renderTarget)) {
-
+ this->initFromRenderTarget(context, renderTarget);
+}
+
+void SkGpuDevice::initFromRenderTarget(GrContext* context,
+ GrRenderTarget* renderTarget) {
fNeedPrepareRenderTarget = false;
fDrawProcs = NULL;
@@ -157,8 +166,12 @@
if (Current3DApiRenderTarget() == renderTarget) {
fRenderTarget = fContext->createRenderTargetFrom3DApiState();
} else {
+ GrAssert(NULL != renderTarget);
fRenderTarget = renderTarget;
fRenderTarget->ref();
+ // if this RT is also a texture, hold a ref on it
+ fTexture = fRenderTarget->asTexture();
+ SkSafeRef(fTexture);
}
SkGrRenderTargetPixelRef* pr = new SkGrRenderTargetPixelRef(fRenderTarget);
@@ -194,6 +207,9 @@
if (fCache) {
SkASSERT(NULL != fTexture);
SkASSERT(NULL != fTexture->asRenderTarget());
+ // hold a ref directly on fTexture (even though fCache has one) to match
+ // other constructor paths. Simplifies cleanup.
+ fTexture->ref();
}
#else
const GrTextureDesc desc = {
@@ -208,6 +224,7 @@
#endif
if (NULL != fTexture) {
fRenderTarget = fTexture->asRenderTarget();
+ fRenderTarget->ref();
GrAssert(NULL != fRenderTarget);
@@ -229,17 +246,13 @@
delete fDrawProcs;
}
+ SkSafeUnref(fTexture);
+ SkSafeUnref(fRenderTarget);
if (fCache) {
GrAssert(NULL != fTexture);
GrAssert(fRenderTarget == fTexture->asRenderTarget());
fContext->unlockTexture((GrTextureEntry*)fCache);
- } else if (NULL != fTexture) {
- GrAssert(!CACHE_LAYER_TEXTURES);
- GrAssert(fRenderTarget == fTexture->asRenderTarget());
- fTexture->unref();
- } else if (NULL != fRenderTarget) {
- fRenderTarget->unref();
- }
+ }
fContext->unref();
}
@@ -251,10 +264,6 @@
}
}
-SkDeviceFactory* SkGpuDevice::onNewDeviceFactory() {
- return SkNEW_ARGS(SkGpuDeviceFactory, (fContext, fRenderTarget));
-}
-
///////////////////////////////////////////////////////////////////////////////
void SkGpuDevice::makeRenderTargetCurrent() {