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

Unified Diff: src/gpu/SkGpuDevice.cpp

Issue 1930013002: (Mostly) Retract GrRenderTarget from SkGpuDevice (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: clean up Created 4 years, 7 months 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/SkGpuDevice.h ('k') | src/image/SkSurface_Gpu.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/SkGpuDevice.cpp
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 68a8518a522f7e6835e099de5cc51b10b2b7c2b3..10bcecf2ba350c3b08e002f22815835d166288bd 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -129,21 +129,34 @@ bool SkGpuDevice::CheckAlphaTypeAndGetFlags(
sk_sp<SkGpuDevice> SkGpuDevice::Make(sk_sp<GrRenderTarget> rt, const SkSurfaceProps* props,
InitContents init) {
+ if (!rt || rt->wasDestroyed() || !rt->getContext()) {
+ return nullptr;
+ }
+ unsigned flags;
+ if (!CheckAlphaTypeAndGetFlags(nullptr, init, &flags)) {
+ return nullptr;
+ }
+
const int width = rt->width();
const int height = rt->height();
- return SkGpuDevice::Make(std::move(rt), width, height, props, init);
+
+ GrContext* context = rt->getContext();
+
+ sk_sp<GrDrawContext> drawContext(context->drawContext(std::move(rt), props));
+ return sk_sp<SkGpuDevice>(new SkGpuDevice(std::move(drawContext), width, height, flags));
}
-sk_sp<SkGpuDevice> SkGpuDevice::Make(sk_sp<GrRenderTarget> rt, int width, int height,
- const SkSurfaceProps* props, InitContents init) {
- if (!rt || rt->wasDestroyed()) {
+sk_sp<SkBaseDevice> SkGpuDevice::Make(sk_sp<GrDrawContext> drawContext,
+ int width, int height,
+ InitContents init) {
+ if (!drawContext || drawContext->wasAbandoned()) {
return nullptr;
}
unsigned flags;
if (!CheckAlphaTypeAndGetFlags(nullptr, init, &flags)) {
return nullptr;
}
- return sk_sp<SkGpuDevice>(new SkGpuDevice(rt.get(), width, height, props, flags));
+ return sk_sp<SkBaseDevice>(new SkGpuDevice(std::move(drawContext), width, height, flags));
}
sk_sp<SkGpuDevice> SkGpuDevice::Make(GrContext* context, SkBudgeted budgeted,
@@ -154,35 +167,39 @@ sk_sp<SkGpuDevice> SkGpuDevice::Make(GrContext* context, SkBudgeted budgeted,
return nullptr;
}
- SkAutoTUnref<GrRenderTarget> rt(CreateRenderTarget(context, budgeted, info, sampleCount));
- if (!rt) {
+ sk_sp<GrDrawContext> drawContext(CreateDrawContext(context, budgeted, info,
+ sampleCount, props));
+ if (!drawContext) {
return nullptr;
}
- return sk_sp<SkGpuDevice>(new SkGpuDevice(rt, info.width(), info.height(), props, flags));
+ return sk_sp<SkGpuDevice>(new SkGpuDevice(std::move(drawContext),
+ info.width(), info.height(), flags));
}
-SkGpuDevice::SkGpuDevice(GrRenderTarget* rt, int width, int height,
- const SkSurfaceProps* props, unsigned flags)
- : INHERITED(SkSurfacePropsCopyOrDefault(props))
- , fContext(SkRef(rt->getContext()))
- , fRenderTarget(SkRef(rt)) {
+SkGpuDevice::SkGpuDevice(sk_sp<GrDrawContext> drawContext, int width, int height, unsigned flags)
+ : INHERITED(drawContext->surfaceProps())
+ , fContext(SkRef(drawContext->accessRenderTarget()->getContext()))
+ , fRenderTarget(drawContext->renderTarget())
+ , fDrawContext(std::move(drawContext)) {
fOpaque = SkToBool(flags & kIsOpaque_Flag);
SkAlphaType at = fOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType;
- SkImageInfo info = rt->surfacePriv().info(at).makeWH(width, height);
- SkPixelRef* pr = new SkGrPixelRef(info, rt);
+ SkImageInfo info = fRenderTarget->surfacePriv().info(at).makeWH(width, height);
+ SkPixelRef* pr = new SkGrPixelRef(info, fRenderTarget.get());
fLegacyBitmap.setInfo(info);
fLegacyBitmap.setPixelRef(pr)->unref();
- fDrawContext = this->context()->drawContext(sk_ref_sp(rt), &this->surfaceProps());
if (flags & kNeedClear_Flag) {
this->clearAll();
}
}
-GrRenderTarget* SkGpuDevice::CreateRenderTarget(GrContext* context, SkBudgeted budgeted,
- const SkImageInfo& origInfo, int sampleCount) {
+sk_sp<GrDrawContext> SkGpuDevice::CreateDrawContext(GrContext* context,
+ SkBudgeted budgeted,
+ const SkImageInfo& origInfo,
+ int sampleCount,
+ const SkSurfaceProps* surfaceProps) {
if (kUnknown_SkColorType == origInfo.colorType() ||
origInfo.width() < 0 || origInfo.height() < 0) {
return nullptr;
@@ -208,21 +225,13 @@ GrRenderTarget* SkGpuDevice::CreateRenderTarget(GrContext* context, SkBudgeted b
ct = kN32_SkColorType;
}
- const SkImageInfo info = SkImageInfo::Make(origInfo.width(), origInfo.height(), ct, at, pt);
+ GrPixelConfig config = SkImageInfo2GrPixelConfig(ct, at, pt, *context->caps());
+
+ return context->newDrawContext(SkBackingFit::kExact, // Why exact?
+ origInfo.width(), origInfo.height(),
+ config, sampleCount,
+ kDefault_GrSurfaceOrigin, surfaceProps, budgeted);
- GrSurfaceDesc desc;
- desc.fFlags = kRenderTarget_GrSurfaceFlag;
- desc.fWidth = info.width();
- desc.fHeight = info.height();
- desc.fConfig = SkImageInfo2GrPixelConfig(info, *context->caps());
- desc.fSampleCnt = sampleCount;
- desc.fIsMipMapped = false;
- GrTexture* texture = context->textureProvider()->createTexture(desc, budgeted, nullptr, 0);
- if (nullptr == texture) {
- return nullptr;
- }
- SkASSERT(nullptr != texture->asRenderTarget());
- return texture->asRenderTarget();
}
// This method ensures that we always have a texture-backed "bitmap" when we finally
@@ -346,7 +355,7 @@ void SkGpuDevice::prepareDraw(const SkDraw& draw) {
GrRenderTarget* SkGpuDevice::accessRenderTarget() {
ASSERT_SINGLE_OWNER
- return fRenderTarget;
+ return fRenderTarget.get();
}
GrDrawContext* SkGpuDevice::accessDrawContext() {
@@ -362,15 +371,17 @@ void SkGpuDevice::clearAll() {
fDrawContext->clear(&rect, color, true);
}
-void SkGpuDevice::replaceRenderTarget(bool shouldRetainContent) {
+void SkGpuDevice::replaceDrawContext(bool shouldRetainContent) {
ASSERT_SINGLE_OWNER
SkBudgeted budgeted = fRenderTarget->resourcePriv().isBudgeted();
- SkAutoTUnref<GrRenderTarget> newRT(CreateRenderTarget(
- this->context(), budgeted, this->imageInfo(), fRenderTarget->desc().fSampleCnt));
-
- if (nullptr == newRT) {
+ sk_sp<GrDrawContext> newDC(CreateDrawContext(this->context(),
+ budgeted,
+ this->imageInfo(),
+ fDrawContext->numColorSamples(),
+ &this->surfaceProps()));
+ if (!newDC) {
return;
}
@@ -378,23 +389,24 @@ void SkGpuDevice::replaceRenderTarget(bool shouldRetainContent) {
if (fRenderTarget->wasDestroyed()) {
return;
}
- this->context()->copySurface(newRT, fRenderTarget);
+ newDC->copySurface(fDrawContext->asTexture().get(),
+ SkIRect::MakeWH(this->width(), this->height()),
+ SkIPoint::Make(0, 0));
}
- SkASSERT(fRenderTarget != newRT);
+ SkASSERT(fDrawContext->accessRenderTarget() != newDC->accessRenderTarget());
- fRenderTarget.reset(newRT.release());
+ fRenderTarget = newDC->renderTarget();
#ifdef SK_DEBUG
SkImageInfo info = fRenderTarget->surfacePriv().info(fOpaque ? kOpaque_SkAlphaType :
kPremul_SkAlphaType);
SkASSERT(info == fLegacyBitmap.info());
#endif
- SkPixelRef* pr = new SkGrPixelRef(fLegacyBitmap.info(), fRenderTarget);
+ SkPixelRef* pr = new SkGrPixelRef(fLegacyBitmap.info(), fRenderTarget.get());
fLegacyBitmap.setPixelRef(pr)->unref();
- fDrawContext = this->context()->drawContext(sk_ref_sp(fRenderTarget.get()),
- &this->surfaceProps());
+ fDrawContext = newDC;
}
///////////////////////////////////////////////////////////////////////////////
@@ -1319,9 +1331,8 @@ void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device,
// drawDevice is defined to be in device coords.
CHECK_SHOULD_DRAW(draw);
- GrRenderTarget* devRT = dev->accessRenderTarget();
- GrTexture* devTex;
- if (nullptr == (devTex = devRT->asTexture())) {
+ sk_sp<GrTexture> devTex(dev->accessDrawContext()->asTexture());
+ if (!devTex) {
return;
}
@@ -1333,7 +1344,7 @@ void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device,
GrPaint grPaint;
SkAutoTUnref<const GrFragmentProcessor> fp(
- GrSimpleTextureEffect::Create(devTex, SkMatrix::I()));
+ GrSimpleTextureEffect::Create(devTex.get(), SkMatrix::I()));
if (GrPixelConfigIsAlphaOnly(devTex->config())) {
// Can this happen?
fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp));
@@ -1735,36 +1746,33 @@ void SkGpuDevice::flush() {
SkBaseDevice* SkGpuDevice::onCreateDevice(const CreateInfo& cinfo, const SkPaint*) {
ASSERT_SINGLE_OWNER
- GrSurfaceDesc desc;
- desc.fConfig = fRenderTarget->config();
- desc.fFlags = kRenderTarget_GrSurfaceFlag;
- desc.fWidth = cinfo.fInfo.width();
- desc.fHeight = cinfo.fInfo.height();
- desc.fSampleCnt = fRenderTarget->desc().fSampleCnt;
-
- SkAutoTUnref<GrTexture> texture;
- // Skia's convention is to only clear a device if it is non-opaque.
- InitContents init = cinfo.fInfo.isOpaque() ? kUninit_InitContents : kClear_InitContents;
- // layers are never draw in repeat modes, so we can request an approx
- // match and ignore any padding.
- if (kNever_TileUsage == cinfo.fTileUsage) {
- texture.reset(fContext->textureProvider()->createApproxTexture(desc));
- } else {
- texture.reset(fContext->textureProvider()->createTexture(desc, SkBudgeted::kYes));
- }
+ SkSurfaceProps props(this->surfaceProps().flags(), cinfo.fPixelGeometry);
- if (texture) {
- SkSurfaceProps props(this->surfaceProps().flags(), cinfo.fPixelGeometry);
- return SkGpuDevice::Make(sk_ref_sp(texture->asRenderTarget()),
- cinfo.fInfo.width(), cinfo.fInfo.height(),
- &props, init).release();
- } else {
+ // layers are never drawn in repeat modes, so we can request an approx
+ // match and ignore any padding.
+ SkBackingFit fit = kNever_TileUsage == cinfo.fTileUsage ? SkBackingFit::kApprox
+ : SkBackingFit::kExact;
+
+ sk_sp<GrDrawContext> dc(fContext->newDrawContext(fit,
+ cinfo.fInfo.width(), cinfo.fInfo.height(),
+ fDrawContext->config(),
+ fDrawContext->desc().fSampleCnt,
+ kDefault_GrSurfaceOrigin,
+ &props));
+ if (!dc) {
SkErrorInternals::SetError( kInternalError_SkError,
"---- failed to create gpu device texture [%d %d]\n",
cinfo.fInfo.width(), cinfo.fInfo.height());
- return nullptr;
+ return nullptr;
}
+
+ // Skia's convention is to only clear a device if it is non-opaque.
+ InitContents init = cinfo.fInfo.isOpaque() ? kUninit_InitContents : kClear_InitContents;
+
+ return SkGpuDevice::Make(std::move(dc),
+ cinfo.fInfo.width(), cinfo.fInfo.height(),
+ init).release();
}
sk_sp<SkSurface> SkGpuDevice::makeSurface(const SkImageInfo& info, const SkSurfaceProps& props) {
« no previous file with comments | « src/gpu/SkGpuDevice.h ('k') | src/image/SkSurface_Gpu.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698