diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkImageFilter.cpp | 2 | ||||
-rw-r--r-- | src/effects/SkAlphaThresholdFilter.cpp | 2 | ||||
-rw-r--r-- | src/effects/SkDisplacementMapEffect.cpp | 2 | ||||
-rw-r--r-- | src/effects/SkLightingImageFilter.cpp | 2 | ||||
-rw-r--r-- | src/effects/SkMorphologyImageFilter.cpp | 4 | ||||
-rw-r--r-- | src/effects/SkXfermodeImageFilter.cpp | 2 | ||||
-rw-r--r-- | src/gpu/GrBlurUtils.cpp | 2 | ||||
-rw-r--r-- | src/gpu/GrContext.cpp | 4 | ||||
-rw-r--r-- | src/gpu/GrRenderTarget.cpp | 8 | ||||
-rw-r--r-- | src/gpu/GrRenderTargetPriv.h | 2 | ||||
-rw-r--r-- | src/gpu/GrRenderTargetProxy.cpp | 77 | ||||
-rw-r--r-- | src/gpu/GrSurfaceProxy.cpp | 19 | ||||
-rw-r--r-- | src/gpu/GrTextureProxy.cpp | 44 | ||||
-rw-r--r-- | src/gpu/gl/GrGLGpu.cpp | 6 | ||||
-rw-r--r-- | src/image/SkImage_Gpu.cpp | 2 |
15 files changed, 164 insertions, 14 deletions
diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp index d0042527e4..899083dbb4 100644 --- a/src/core/SkImageFilter.cpp +++ b/src/core/SkImageFilter.cpp @@ -280,7 +280,7 @@ sk_sp<SkSpecialImage> SkImageFilter::DrawWithFP(GrContext* context, paint.addColorFragmentProcessor(fp.get()); paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); - sk_sp<GrDrawContext> drawContext(context->newDrawContext(GrContext::kLoose_BackingFit, + sk_sp<GrDrawContext> drawContext(context->newDrawContext(SkBackingFit::kApprox, bounds.width(), bounds.height(), kRGBA_8888_GrPixelConfig)); if (!drawContext) { diff --git a/src/effects/SkAlphaThresholdFilter.cpp b/src/effects/SkAlphaThresholdFilter.cpp index cec45ba911..a4876c8008 100644 --- a/src/effects/SkAlphaThresholdFilter.cpp +++ b/src/effects/SkAlphaThresholdFilter.cpp @@ -102,7 +102,7 @@ sk_sp<GrTexture> SkAlphaThresholdFilterImpl::createMaskTexture(GrContext* contex config = kRGBA_8888_GrPixelConfig; } - sk_sp<GrDrawContext> drawContext(context->newDrawContext(GrContext::kLoose_BackingFit, + sk_sp<GrDrawContext> drawContext(context->newDrawContext(SkBackingFit::kApprox, bounds.width(), bounds.height(), config)); if (!drawContext) { diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp index cf9e2c3c9f..befda79332 100644 --- a/src/effects/SkDisplacementMapEffect.cpp +++ b/src/effects/SkDisplacementMapEffect.cpp @@ -335,7 +335,7 @@ sk_sp<SkSpecialImage> SkDisplacementMapEffect::onFilterImage(SkSpecialImage* sou SkMatrix matrix; matrix.setTranslate(-SkIntToScalar(colorBounds.x()), -SkIntToScalar(colorBounds.y())); - sk_sp<GrDrawContext> drawContext(context->newDrawContext(GrContext::kLoose_BackingFit, + sk_sp<GrDrawContext> drawContext(context->newDrawContext(SkBackingFit::kApprox, bounds.width(), bounds.height(), kSkia8888_GrPixelConfig)); if (!drawContext) { diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp index 6efb0f6c4e..d9b29363ed 100644 --- a/src/effects/SkLightingImageFilter.cpp +++ b/src/effects/SkLightingImageFilter.cpp @@ -407,7 +407,7 @@ sk_sp<SkSpecialImage> SkLightingImageFilterInternal::filterImageGPU(SkSpecialIma sk_sp<GrTexture> inputTexture(input->asTextureRef(context)); SkASSERT(inputTexture); - sk_sp<GrDrawContext> drawContext(context->newDrawContext(GrContext::kLoose_BackingFit, + sk_sp<GrDrawContext> drawContext(context->newDrawContext(SkBackingFit::kApprox, offsetBounds.width(), offsetBounds.height(), kRGBA_8888_GrPixelConfig)); diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp index 2a0f078c05..121a7fdc01 100644 --- a/src/effects/SkMorphologyImageFilter.cpp +++ b/src/effects/SkMorphologyImageFilter.cpp @@ -487,7 +487,7 @@ static sk_sp<SkSpecialImage> apply_morphology(GrContext* context, SkASSERT(radius.width() > 0 || radius.height() > 0); if (radius.fWidth > 0) { - sk_sp<GrDrawContext> dstDrawContext(context->newDrawContext(GrContext::kLoose_BackingFit, + sk_sp<GrDrawContext> dstDrawContext(context->newDrawContext(SkBackingFit::kApprox, rect.width(), rect.height(), kSkia8888_GrPixelConfig)); if (!dstDrawContext) { @@ -508,7 +508,7 @@ static sk_sp<SkSpecialImage> apply_morphology(GrContext* context, srcRect = dstRect; } if (radius.fHeight > 0) { - sk_sp<GrDrawContext> dstDrawContext(context->newDrawContext(GrContext::kLoose_BackingFit, + sk_sp<GrDrawContext> dstDrawContext(context->newDrawContext(SkBackingFit::kApprox, rect.width(), rect.height(), kSkia8888_GrPixelConfig)); if (!dstDrawContext) { diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp index b1e19bbec3..99ce24f129 100644 --- a/src/effects/SkXfermodeImageFilter.cpp +++ b/src/effects/SkXfermodeImageFilter.cpp @@ -238,7 +238,7 @@ sk_sp<SkSpecialImage> SkXfermodeImageFilter::filterImageGPU(SkSpecialImage* sour paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); - sk_sp<GrDrawContext> drawContext(context->newDrawContext(GrContext::kLoose_BackingFit, + sk_sp<GrDrawContext> drawContext(context->newDrawContext(SkBackingFit::kApprox, bounds.width(), bounds.height(), kSkia8888_GrPixelConfig)); if (!drawContext) { diff --git a/src/gpu/GrBlurUtils.cpp b/src/gpu/GrBlurUtils.cpp index f95bdfff02..59a3dfcd08 100644 --- a/src/gpu/GrBlurUtils.cpp +++ b/src/gpu/GrBlurUtils.cpp @@ -116,7 +116,7 @@ static sk_sp<GrTexture> create_mask_GPU(GrContext* context, config = kAlpha_8_GrPixelConfig; } - sk_sp<GrDrawContext> drawContext(context->newDrawContext(GrContext::kLoose_BackingFit, + sk_sp<GrDrawContext> drawContext(context->newDrawContext(SkBackingFit::kApprox, SkScalarCeilToInt(maskRect->width()), SkScalarCeilToInt(maskRect->height()), config, diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index a186bd87bc..31845f9d6d 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -615,7 +615,7 @@ sk_sp<GrDrawContext> GrContext::drawContext(sk_sp<GrRenderTarget> rt, return fDrawingManager->drawContext(std::move(rt), surfaceProps); } -sk_sp<GrDrawContext> GrContext::newDrawContext(BackingFit fit, +sk_sp<GrDrawContext> GrContext::newDrawContext(SkBackingFit fit, int width, int height, GrPixelConfig config, int sampleCnt, @@ -629,7 +629,7 @@ sk_sp<GrDrawContext> GrContext::newDrawContext(BackingFit fit, desc.fSampleCnt = sampleCnt; sk_sp<GrTexture> tex; - if (kTight_BackingFit == fit) { + if (SkBackingFit::kExact == fit) { tex.reset(this->textureProvider()->createTexture(desc, SkBudgeted::kYes)); } else { tex.reset(this->textureProvider()->createApproxTexture(desc)); diff --git a/src/gpu/GrRenderTarget.cpp b/src/gpu/GrRenderTarget.cpp index a6736403fc..ebbfae9b95 100644 --- a/src/gpu/GrRenderTarget.cpp +++ b/src/gpu/GrRenderTarget.cpp @@ -109,3 +109,11 @@ const GrGpu::MultisampleSpecs& GrRenderTargetPriv::getMultisampleSpecs(const GrStencilSettings& stencil) const { return fRenderTarget->getGpu()->getMultisampleSpecs(fRenderTarget, stencil); } + +GrRenderTarget::SampleConfig GrRenderTarget::ComputeSampleConfig(const GrCaps& caps, + int sampleCnt) { + return (caps.usesMixedSamples() && sampleCnt > 0) + ? GrRenderTarget::kStencil_SampleConfig + : GrRenderTarget::kUnified_SampleConfig; +} + diff --git a/src/gpu/GrRenderTargetPriv.h b/src/gpu/GrRenderTargetPriv.h index e64ed57141..24b7e8838a 100644 --- a/src/gpu/GrRenderTargetPriv.h +++ b/src/gpu/GrRenderTargetPriv.h @@ -32,6 +32,8 @@ public: const GrGpu::MultisampleSpecs& getMultisampleSpecs(const GrStencilSettings& stencil) const; + GrRenderTarget::SampleConfig sampleConfig() const { return fRenderTarget->fSampleConfig; } + private: explicit GrRenderTargetPriv(GrRenderTarget* renderTarget) : fRenderTarget(renderTarget) {} GrRenderTargetPriv(const GrRenderTargetPriv&) {} // unimpl diff --git a/src/gpu/GrRenderTargetProxy.cpp b/src/gpu/GrRenderTargetProxy.cpp new file mode 100644 index 0000000000..8d821c3c1d --- /dev/null +++ b/src/gpu/GrRenderTargetProxy.cpp @@ -0,0 +1,77 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "GrRenderTargetProxy.h" + +#include "GrDrawTarget.h" +#include "GrGpuResourcePriv.h" +#include "GrRenderTargetPriv.h" + +GrRenderTargetProxy::GrRenderTargetProxy(sk_sp<GrRenderTarget> rt) + : INHERITED(rt->desc(), SkBackingFit::kExact, rt->resourcePriv().isBudgeted()) + , fTarget(std::move(rt)) + , fSampleConfig(fTarget->renderTargetPriv().sampleConfig()) + , fLastDrawTarget(nullptr) { +} + +GrRenderTargetProxy::~GrRenderTargetProxy() { + if (fLastDrawTarget) { + fLastDrawTarget->clearRT(); + } + SkSafeUnref(fLastDrawTarget); +} + +GrRenderTarget* GrRenderTargetProxy::instantiate(GrTextureProvider* texProvider) { + if (fTarget) { + return fTarget.get(); + } + + // TODO: it would be nice to not have to copy the desc here + GrSurfaceDesc desc = fDesc; + desc.fFlags |= GrSurfaceFlags::kRenderTarget_GrSurfaceFlag; + + sk_sp<GrTexture> tex; + if (SkBackingFit::kApprox == fFit) { + tex.reset(texProvider->createApproxTexture(desc)); + } else { + tex.reset(texProvider->createTexture(desc, fBudgeted)); + } + if (!tex || !tex->asRenderTarget()) { + return nullptr; + } + + fTarget.reset(tex->asRenderTarget()); + + // Check that our a priori computation matched the ultimate reality + SkASSERT(fSampleConfig == fTarget->renderTargetPriv().sampleConfig()); + + return fTarget.get(); +} + +void GrRenderTargetProxy::setLastDrawTarget(GrDrawTarget* dt) { + if (fLastDrawTarget) { + // The non-MDB world never closes so we can't check this condition +#ifdef ENABLE_MDB + SkASSERT(fLastDrawTarget->isClosed()); +#endif + fLastDrawTarget->clearRT(); + } + + SkRefCnt_SafeAssign(fLastDrawTarget, dt); +} + +sk_sp<GrRenderTargetProxy> GrRenderTargetProxy::Make(const GrCaps& caps, + const GrSurfaceDesc& desc, + SkBackingFit fit, + SkBudgeted budgeted) { + return sk_sp<GrRenderTargetProxy>(new GrRenderTargetProxy(caps, desc, fit, budgeted)); +} + +sk_sp<GrRenderTargetProxy> GrRenderTargetProxy::Make(sk_sp<GrRenderTarget> rt) { + return sk_sp<GrRenderTargetProxy>(new GrRenderTargetProxy(rt)); +} + diff --git a/src/gpu/GrSurfaceProxy.cpp b/src/gpu/GrSurfaceProxy.cpp new file mode 100644 index 0000000000..b8b5d7510d --- /dev/null +++ b/src/gpu/GrSurfaceProxy.cpp @@ -0,0 +1,19 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "GrSurfaceProxy.h" + +#include "SkAtomics.h" + +uint32_t GrSurfaceProxy::CreateUniqueID() { + static int32_t gUniqueID = SK_InvalidUniqueID; + uint32_t id; + do { + id = static_cast<uint32_t>(sk_atomic_inc(&gUniqueID) + 1); + } while (id == SK_InvalidUniqueID); + return id; +} diff --git a/src/gpu/GrTextureProxy.cpp b/src/gpu/GrTextureProxy.cpp new file mode 100644 index 0000000000..09c22e37b0 --- /dev/null +++ b/src/gpu/GrTextureProxy.cpp @@ -0,0 +1,44 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "GrTextureProxy.h" + +#include "GrTextureProvider.h" +#include "GrGpuResourcePriv.h" + +GrTextureProxy::GrTextureProxy(sk_sp<GrTexture> tex) + : INHERITED(tex->desc(), SkBackingFit::kExact, tex->resourcePriv().isBudgeted()) + , fTexture(std::move(tex)) { +} + +GrTexture* GrTextureProxy::instantiate(GrTextureProvider* texProvider) { + if (fTexture) { + return fTexture.get(); + } + + if (SkBackingFit::kApprox == fFit) { + fTexture.reset(texProvider->createApproxTexture(fDesc)); + } else { + fTexture.reset(texProvider->createTexture(fDesc, fBudgeted)); + } + + return fTexture.get(); +} + +sk_sp<GrTextureProxy> GrTextureProxy::Make(const GrSurfaceDesc& desc, + SkBackingFit fit, + SkBudgeted budgeted, + const void* srcData, + size_t rowBytes) { + // TODO: handle 'srcData' (we could use the wrapped version if there is data) + SkASSERT(!srcData && !rowBytes); + return sk_sp<GrTextureProxy>(new GrTextureProxy(desc, fit, budgeted, srcData, rowBytes)); +} + +sk_sp<GrTextureProxy> GrTextureProxy::Make(sk_sp<GrTexture> tex) { + return sk_sp<GrTextureProxy>(new GrTextureProxy(tex)); +} diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index 9d2984f186..027d9527c0 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -1474,9 +1474,9 @@ bool GrGLGpu::createRenderTargetObjects(const GrSurfaceDesc& desc, idDesc->fRTFBOID = 0; idDesc->fRTFBOOwnership = GrBackendObjectOwnership::kOwned; idDesc->fTexFBOID = 0; - idDesc->fSampleConfig = (GrGLCaps::kMixedSamples_MSFBOType == this->glCaps().msFBOType() && - desc.fSampleCnt > 0) ? GrRenderTarget::kStencil_SampleConfig : - GrRenderTarget::kUnified_SampleConfig; + SkASSERT((GrGLCaps::kMixedSamples_MSFBOType == this->glCaps().msFBOType()) == + this->caps()->usesMixedSamples()); + idDesc->fSampleConfig = GrRenderTarget::ComputeSampleConfig(*this->caps(), desc.fSampleCnt); GrGLenum status; diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index eea7e2c040..339dee7a5c 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -253,7 +253,7 @@ sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx , SkYUVColorSpace const int height = yuvSizes[0].fHeight; // Needs to be a render target in order to draw to it for the yuv->rgb conversion. - sk_sp<GrDrawContext> drawContext(ctx->newDrawContext(GrContext::kTight_BackingFit, + sk_sp<GrDrawContext> drawContext(ctx->newDrawContext(SkBackingFit::kExact, width, height, kRGBA_8888_GrPixelConfig, 0, |