*/
SkGpuDevice(GrContext*, GrRenderTarget*);
+ /**
+ * New device that will render to the texture (as a rendertarget).
+ * The GrTexture's asRenderTarget() must be non-NULL or device will not
+ * function.
+ */
+ SkGpuDevice(GrContext*, GrTexture*);
+
/**
* Magic value that can be passed to constructor. Causes
* the device to infer rendertarget from underlying 3D API (e.g. GL or D3D).
virtual void makeRenderTargetCurrent();
protected:
- // override
- virtual SkDeviceFactory* onNewDeviceFactory();
class TexCache;
enum TexType {
bool fNeedClear;
bool fNeedPrepareRenderTarget;
+ // called from rt and tex cons
+ void initFromRenderTarget(GrContext*, GrRenderTarget*);
+
// doesn't set the texture/sampler/matrix state
// caller needs to null out GrPaint's texture if
// non-textured drawing is desired.
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;
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);
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 = {
#endif
if (NULL != fTexture) {
fRenderTarget = fTexture->asRenderTarget();
+ fRenderTarget->ref();
GrAssert(NULL != fRenderTarget);
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();
}
}
}
-SkDeviceFactory* SkGpuDevice::onNewDeviceFactory() {
- return SkNEW_ARGS(SkGpuDeviceFactory, (fContext, fRenderTarget));
-}
-
///////////////////////////////////////////////////////////////////////////////
void SkGpuDevice::makeRenderTargetCurrent() {