diff options
author | Robert Phillips <robertphillips@google.com> | 2017-07-21 08:44:46 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-07-21 14:05:33 +0000 |
commit | 467022b1861033d968195687da15270c208279ff (patch) | |
tree | 34de5b201fb4dc64090c292cdc7bf924d073cae6 /src | |
parent | 594838a44dd1253e71c1b0330018d2b5180ccc32 (diff) |
Reduce dependence on GrSurface's origin field
Unfortunately, GrGPU and its ilk are still using the GrSurface's origin a lot. I will clean that up in a second CL.
Change-Id: Iba729440ce8ea8d24bb7f4e5de55ed576a0f176d
Reviewed-on: https://skia-review.googlesource.com/24700
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src')
37 files changed, 143 insertions, 95 deletions
diff --git a/src/core/SkColorSpaceXformImageGenerator.cpp b/src/core/SkColorSpaceXformImageGenerator.cpp index 707de08b72..5cd1d1d0f2 100644 --- a/src/core/SkColorSpaceXformImageGenerator.cpp +++ b/src/core/SkColorSpaceXformImageGenerator.cpp @@ -86,7 +86,8 @@ sk_sp<GrTextureProxy> SkColorSpaceXformImageGenerator::onGenerateTexture( } sk_sp<GrRenderTargetContext> renderTargetContext = ctx->makeDeferredRenderTargetContext( - SkBackingFit::kExact, fSrc.width(), fSrc.height(), kRGBA_8888_GrPixelConfig, nullptr); + SkBackingFit::kExact, fSrc.width(), fSrc.height(), kRGBA_8888_GrPixelConfig, nullptr, + 0, kTopLeft_GrSurfaceOrigin); if (!renderTargetContext) { return nullptr; } diff --git a/src/core/SkPictureImageGenerator.cpp b/src/core/SkPictureImageGenerator.cpp index 1f60380b8d..75861329d6 100644 --- a/src/core/SkPictureImageGenerator.cpp +++ b/src/core/SkPictureImageGenerator.cpp @@ -110,7 +110,8 @@ sk_sp<GrTextureProxy> SkPictureImageGenerator::onGenerateTexture( // TODO: respect the usage, by possibly creating a different (pow2) surface // SkImageInfo surfaceInfo = useXformCanvas ? info.makeColorSpace(nullptr) : info; - sk_sp<SkSurface> surface(SkSurface::MakeRenderTarget(ctx, SkBudgeted::kYes, surfaceInfo)); + sk_sp<SkSurface> surface(SkSurface::MakeRenderTarget(ctx, SkBudgeted::kYes, surfaceInfo, + 0, kTopLeft_GrSurfaceOrigin, nullptr)); if (!surface) { return nullptr; } diff --git a/src/effects/GrCircleBlurFragmentProcessor.cpp b/src/effects/GrCircleBlurFragmentProcessor.cpp index 135b00e4d9..a30bc4be35 100644 --- a/src/effects/GrCircleBlurFragmentProcessor.cpp +++ b/src/effects/GrCircleBlurFragmentProcessor.cpp @@ -174,10 +174,12 @@ static sk_sp<GrTextureProxy> create_profile_texture(GrResourceProvider* resource builder[0] = sigmaToCircleRRatioFixed; builder.finish(); - sk_sp<GrTextureProxy> blurProfile = resourceProvider->findProxyByUniqueKey(key); + sk_sp<GrTextureProxy> blurProfile = resourceProvider->findProxyByUniqueKey( + key, kTopLeft_GrSurfaceOrigin); if (!blurProfile) { static constexpr int kProfileTextureWidth = 512; GrSurfaceDesc texDesc; + texDesc.fOrigin = kTopLeft_GrSurfaceOrigin; texDesc.fWidth = kProfileTextureWidth; texDesc.fHeight = 1; texDesc.fConfig = kAlpha_8_GrPixelConfig; @@ -197,6 +199,7 @@ static sk_sp<GrTextureProxy> create_profile_texture(GrResourceProvider* resource return nullptr; } + SkASSERT(blurProfile->origin() == kTopLeft_GrSurfaceOrigin); resourceProvider->assignUniqueKeyToProxy(key, blurProfile.get()); } diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp index d85160e651..28b5870560 100644 --- a/src/effects/SkBlurMaskFilter.cpp +++ b/src/effects/SkBlurMaskFilter.cpp @@ -942,23 +942,24 @@ void GrGLRectBlurEffect::onSetData(const GrGLSLProgramDataManager& pdman, sk_sp<GrTextureProxy> GrRectBlurEffect::CreateBlurProfileTexture( GrResourceProvider* resourceProvider, float sigma) { - GrSurfaceDesc texDesc; - unsigned int profileSize = SkScalarCeilToInt(6*sigma); - texDesc.fWidth = profileSize; - texDesc.fHeight = 1; - texDesc.fConfig = kAlpha_8_GrPixelConfig; - texDesc.fIsMipMapped = false; - static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); GrUniqueKey key; GrUniqueKey::Builder builder(&key, kDomain, 1); builder[0] = profileSize; builder.finish(); - sk_sp<GrTextureProxy> blurProfile(resourceProvider->findProxyByUniqueKey(key)); + sk_sp<GrTextureProxy> blurProfile(resourceProvider->findProxyByUniqueKey( + key, kTopLeft_GrSurfaceOrigin)); if (!blurProfile) { + GrSurfaceDesc texDesc; + texDesc.fOrigin = kTopLeft_GrSurfaceOrigin; + texDesc.fWidth = profileSize; + texDesc.fHeight = 1; + texDesc.fConfig = kAlpha_8_GrPixelConfig; + texDesc.fIsMipMapped = false; + std::unique_ptr<uint8_t[]> profile(SkBlurMask::ComputeBlurProfile(sigma)); blurProfile = GrSurfaceProxy::MakeDeferred(resourceProvider, @@ -967,6 +968,7 @@ sk_sp<GrTextureProxy> GrRectBlurEffect::CreateBlurProfileTexture( return nullptr; } + SkASSERT(blurProfile->origin() == kTopLeft_GrSurfaceOrigin); resourceProvider->assignUniqueKeyToProxy(key, blurProfile.get()); } @@ -1117,7 +1119,8 @@ static sk_sp<GrTextureProxy> find_or_create_rrect_blur_mask(GrContext* context, } builder.finish(); - sk_sp<GrTextureProxy> mask(context->resourceProvider()->findProxyByUniqueKey(key)); + sk_sp<GrTextureProxy> mask(context->resourceProvider()->findProxyByUniqueKey( + key, kBottomLeft_GrSurfaceOrigin)); if (!mask) { // TODO: this could be approx but the texture coords will need to be updated sk_sp<GrRenderTargetContext> rtc(context->makeDeferredRenderTargetContextWithFallback( @@ -1154,6 +1157,7 @@ static sk_sp<GrTextureProxy> find_or_create_rrect_blur_mask(GrContext* context, if (!mask) { return nullptr; } + SkASSERT(mask->origin() == kBottomLeft_GrSurfaceOrigin); context->resourceProvider()->assignUniqueKeyToProxy(key, mask.get()); } diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp index 90756a7265..06e7e687ab 100644 --- a/src/effects/SkDisplacementMapEffect.cpp +++ b/src/effects/SkDisplacementMapEffect.cpp @@ -597,14 +597,15 @@ void GrGLDisplacementMapEffect::emitCode(EmitArgs& args) { void GrGLDisplacementMapEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& proc) { const GrDisplacementMapEffect& displacementMap = proc.cast<GrDisplacementMapEffect>(); - GrTexture* colorTex = displacementMap.textureSampler(1).peekTexture(); + GrSurfaceProxy* proxy = displacementMap.textureSampler(1).proxy(); + GrTexture* colorTex = proxy->priv().peekTexture(); SkScalar scaleX = displacementMap.scale().fX / colorTex->width(); SkScalar scaleY = displacementMap.scale().fY / colorTex->height(); pdman.set2f(fScaleUni, SkScalarToFloat(scaleX), - colorTex->origin() == kTopLeft_GrSurfaceOrigin ? + proxy->origin() == kTopLeft_GrSurfaceOrigin ? SkScalarToFloat(scaleY) : SkScalarToFloat(-scaleY)); - fGLDomain.setData(pdman, displacementMap.domain(), colorTex); + fGLDomain.setData(pdman, displacementMap.domain(), proxy); if (SkToBool(displacementMap.colorSpaceXform())) { fColorSpaceHelper.setData(pdman, displacementMap.colorSpaceXform()); } diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp index 7b72fcd5aa..58064ceea9 100644 --- a/src/effects/SkLightingImageFilter.cpp +++ b/src/effects/SkLightingImageFilter.cpp @@ -1899,14 +1899,15 @@ void GrGLLightingEffect::onSetData(const GrGLSLProgramDataManager& pdman, fLight = lighting.light()->createGLLight(); } - GrTexture* texture = lighting.textureSampler(0).peekTexture(); + GrTextureProxy* proxy = lighting.textureSampler(0).proxy(); + GrTexture* texture = proxy->priv().peekTexture(); - float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; + float ySign = proxy->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; pdman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->height()); pdman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); sk_sp<SkImageFilterLight> transformedLight( lighting.light()->transform(lighting.filterMatrix())); - fDomain.setData(pdman, lighting.domain(), texture); + fDomain.setData(pdman, lighting.domain(), proxy); fLight->setData(pdman, transformedLight.get()); } diff --git a/src/effects/SkMagnifierImageFilter.cpp b/src/effects/SkMagnifierImageFilter.cpp index 90e0a5c879..b2c6714828 100644 --- a/src/effects/SkMagnifierImageFilter.cpp +++ b/src/effects/SkMagnifierImageFilter.cpp @@ -202,14 +202,15 @@ void GrGLMagnifierEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& effect) { const GrMagnifierEffect& zoom = effect.cast<GrMagnifierEffect>(); - GrTexture* tex = zoom.textureSampler(0).peekTexture(); + GrSurfaceProxy* proxy = zoom.textureSampler(0).proxy(); + GrTexture* tex = proxy->priv().peekTexture(); SkScalar invW = 1.0f / tex->width(); SkScalar invH = 1.0f / tex->height(); { SkScalar y = zoom.srcRect().y() * invH; - if (tex->origin() != kTopLeft_GrSurfaceOrigin) { + if (proxy->origin() != kTopLeft_GrSurfaceOrigin) { y = 1.0f - (zoom.srcRect().height() / zoom.bounds().height()) - y; } @@ -221,7 +222,7 @@ void GrGLMagnifierEffect::onSetData(const GrGLSLProgramDataManager& pdman, { SkScalar y = zoom.bounds().y() * invH; - if (tex->origin() != kTopLeft_GrSurfaceOrigin) { + if (proxy->origin() != kTopLeft_GrSurfaceOrigin) { y = 1.0f - zoom.bounds().height() * invH; } diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp index a148bb3bcd..2cc224da99 100644 --- a/src/effects/SkMorphologyImageFilter.cpp +++ b/src/effects/SkMorphologyImageFilter.cpp @@ -293,7 +293,8 @@ void GrGLMorphologyEffect::GenKey(const GrProcessor& proc, void GrGLMorphologyEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& proc) { const GrMorphologyEffect& m = proc.cast<GrMorphologyEffect>(); - GrTexture& texture = *m.textureSampler(0).peekTexture(); + GrSurfaceProxy* proxy = m.textureSampler(0).proxy(); + GrTexture& texture = *proxy->priv().peekTexture(); float pixelSize = 0.0f; switch (m.direction()) { @@ -311,7 +312,7 @@ void GrGLMorphologyEffect::onSetData(const GrGLSLProgramDataManager& pdman, if (m.useRange()) { const float* range = m.range(); if (Gr1DKernelEffect::kY_Direction == m.direction() && - texture.origin() == kBottomLeft_GrSurfaceOrigin) { + proxy->origin() == kBottomLeft_GrSurfaceOrigin) { pdman.set2f(fRangeUni, 1.0f - (range[1]*pixelSize), 1.0f - (range[0]*pixelSize)); } else { pdman.set2f(fRangeUni, range[0] * pixelSize, range[1] * pixelSize); diff --git a/src/gpu/GrBackendTextureImageGenerator.cpp b/src/gpu/GrBackendTextureImageGenerator.cpp index dac81681cd..3de6fec85c 100644 --- a/src/gpu/GrBackendTextureImageGenerator.cpp +++ b/src/gpu/GrBackendTextureImageGenerator.cpp @@ -165,7 +165,7 @@ sk_sp<GrTextureProxy> GrBackendTextureImageGenerator::onGenerateTexture( SkASSERT(fRefHelper->fBorrowingContextID == context->uniqueID()); - sk_sp<GrTextureProxy> proxy = GrSurfaceProxy::MakeWrapped(std::move(tex)); + sk_sp<GrTextureProxy> proxy = GrSurfaceProxy::MakeWrapped(std::move(tex), fSurfaceOrigin); if (0 == origin.fX && 0 == origin.fY && info.width() == fBackendTexture.width() && info.height() == fBackendTexture.height()) { diff --git a/src/gpu/GrBitmapTextureMaker.cpp b/src/gpu/GrBitmapTextureMaker.cpp index 762b72c811..85e791ef90 100644 --- a/src/gpu/GrBitmapTextureMaker.cpp +++ b/src/gpu/GrBitmapTextureMaker.cpp @@ -37,7 +37,8 @@ sk_sp<GrTextureProxy> GrBitmapTextureMaker::refOriginalTextureProxy(bool willBeM sk_sp<GrTextureProxy> proxy; if (fOriginalKey.isValid()) { - proxy = this->context()->resourceProvider()->findProxyByUniqueKey(fOriginalKey); + proxy = this->context()->resourceProvider()->findProxyByUniqueKey( + fOriginalKey, kTopLeft_GrSurfaceOrigin); if (proxy) { return proxy; } @@ -50,6 +51,7 @@ sk_sp<GrTextureProxy> GrBitmapTextureMaker::refOriginalTextureProxy(bool willBeM dstColorSpace); } if (proxy && fOriginalKey.isValid()) { + SkASSERT(proxy->origin() == kTopLeft_GrSurfaceOrigin); this->context()->resourceProvider()->assignUniqueKeyToProxy(fOriginalKey, proxy.get()); // MDB TODO (caching): this has to play nice with the GrSurfaceProxy's caching GrInstallBitmapUniqueKeyInvalidator(fOriginalKey, fBitmap.pixelRef()); diff --git a/src/gpu/GrClipStackClip.cpp b/src/gpu/GrClipStackClip.cpp index 9a93687e50..0a63e40076 100644 --- a/src/gpu/GrClipStackClip.cpp +++ b/src/gpu/GrClipStackClip.cpp @@ -394,7 +394,8 @@ sk_sp<GrTextureProxy> GrClipStackClip::createAlphaClipMask(GrContext* context, GrUniqueKey key; create_clip_mask_key(reducedClip.elementsGenID(), reducedClip.ibounds(), &key); - sk_sp<GrTextureProxy> proxy(resourceProvider->findProxyByUniqueKey(key)); + sk_sp<GrTextureProxy> proxy(resourceProvider->findProxyByUniqueKey( + key, kBottomLeft_GrSurfaceOrigin)); if (proxy) { return proxy; } @@ -418,6 +419,7 @@ sk_sp<GrTextureProxy> GrClipStackClip::createAlphaClipMask(GrContext* context, return nullptr; } + SkASSERT(result->origin() == kBottomLeft_GrSurfaceOrigin); resourceProvider->assignUniqueKeyToProxy(key, result.get()); // MDB TODO (caching): this has to play nice with the GrSurfaceProxy's caching add_invalidate_on_pop_message(*fStack, reducedClip.elementsGenID(), key); @@ -431,7 +433,8 @@ sk_sp<GrTextureProxy> GrClipStackClip::createSoftwareClipMask( GrUniqueKey key; create_clip_mask_key(reducedClip.elementsGenID(), reducedClip.ibounds(), &key); - sk_sp<GrTextureProxy> proxy(context->resourceProvider()->findProxyByUniqueKey(key)); + sk_sp<GrTextureProxy> proxy(context->resourceProvider()->findProxyByUniqueKey( + key, kTopLeft_GrSurfaceOrigin)); if (proxy) { return proxy; } @@ -489,6 +492,7 @@ sk_sp<GrTextureProxy> GrClipStackClip::createSoftwareClipMask( sk_sp<GrTextureProxy> result(helper.toTextureProxy(context, SkBackingFit::kApprox)); + SkASSERT(result->origin() == kTopLeft_GrSurfaceOrigin); context->resourceProvider()->assignUniqueKeyToProxy(key, result.get()); // MDB TODO (caching): this has to play nice with the GrSurfaceProxy's caching add_invalidate_on_pop_message(*fStack, reducedClip.elementsGenID(), key); diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index 88fe379c37..434744c089 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -676,7 +676,7 @@ sk_sp<GrTextureContext> GrContextPriv::makeBackendTextureContext(const GrBackend return nullptr; } - sk_sp<GrSurfaceProxy> proxy(GrSurfaceProxy::MakeWrapped(std::move(surface))); + sk_sp<GrSurfaceProxy> proxy(GrSurfaceProxy::MakeWrapped(std::move(surface), origin)); if (!proxy) { return nullptr; } @@ -698,7 +698,7 @@ sk_sp<GrRenderTargetContext> GrContextPriv::makeBackendTextureRenderTargetContex return nullptr; } - sk_sp<GrSurfaceProxy> proxy(GrSurfaceProxy::MakeWrapped(std::move(surface))); + sk_sp<GrSurfaceProxy> proxy(GrSurfaceProxy::MakeWrapped(std::move(surface), origin)); if (!proxy) { return nullptr; } @@ -720,7 +720,7 @@ sk_sp<GrRenderTargetContext> GrContextPriv::makeBackendRenderTargetRenderTargetC return nullptr; } - sk_sp<GrSurfaceProxy> proxy(GrSurfaceProxy::MakeWrapped(std::move(rt))); + sk_sp<GrSurfaceProxy> proxy(GrSurfaceProxy::MakeWrapped(std::move(rt), origin)); if (!proxy) { return nullptr; } @@ -746,7 +746,7 @@ sk_sp<GrRenderTargetContext> GrContextPriv::makeBackendTextureAsRenderTargetRend return nullptr; } - sk_sp<GrSurfaceProxy> proxy(GrSurfaceProxy::MakeWrapped(std::move(surface))); + sk_sp<GrSurfaceProxy> proxy(GrSurfaceProxy::MakeWrapped(std::move(surface), origin)); if (!proxy) { return nullptr; } diff --git a/src/gpu/GrDrawOpAtlas.cpp b/src/gpu/GrDrawOpAtlas.cpp index 37bad65a1f..f4f0883ccf 100644 --- a/src/gpu/GrDrawOpAtlas.cpp +++ b/src/gpu/GrDrawOpAtlas.cpp @@ -39,7 +39,8 @@ std::unique_ptr<GrDrawOpAtlas> GrDrawOpAtlas::Make(GrContext* ctx, GrPixelConfig // should receive special attention. // Note: When switching over to the deferred proxy, use the kExact flag to create // the atlas and assert that the width & height are powers of 2. - sk_sp<GrTextureProxy> proxy = GrSurfaceProxy::MakeWrapped(std::move(texture)); + sk_sp<GrTextureProxy> proxy = GrSurfaceProxy::MakeWrapped(std::move(texture), + kTopLeft_GrSurfaceOrigin); if (!proxy) { return nullptr; } diff --git a/src/gpu/GrRenderTargetProxy.cpp b/src/gpu/GrRenderTargetProxy.cpp index eef5f3ec31..83809114ff 100644 --- a/src/gpu/GrRenderTargetProxy.cpp +++ b/src/gpu/GrRenderTargetProxy.cpp @@ -34,8 +34,8 @@ GrRenderTargetProxy::GrRenderTargetProxy(const GrCaps& caps, const GrSurfaceDesc } // Wrapped version -GrRenderTargetProxy::GrRenderTargetProxy(sk_sp<GrSurface> surf) - : INHERITED(std::move(surf), SkBackingFit::kExact) +GrRenderTargetProxy::GrRenderTargetProxy(sk_sp<GrSurface> surf, GrSurfaceOrigin origin) + : INHERITED(std::move(surf), origin, SkBackingFit::kExact) , fSampleCnt(fTarget->asRenderTarget()->numStencilSamples()) , fRenderTargetFlags(fTarget->asRenderTarget()->renderTargetPriv().flags()) { } diff --git a/src/gpu/GrResourceProvider.cpp b/src/gpu/GrResourceProvider.cpp index cc9ec2a315..6061b33e1b 100644 --- a/src/gpu/GrResourceProvider.cpp +++ b/src/gpu/GrResourceProvider.cpp @@ -140,7 +140,7 @@ sk_sp<GrTextureProxy> GrResourceProvider::createTextureProxy(const GrSurfaceDesc if (make_info(desc.fWidth, desc.fHeight, desc.fConfig, &srcInfo)) { sk_sp<GrTexture> tex = this->getExactScratch(desc, budgeted, 0); - sk_sp<GrTextureProxy> proxy = GrSurfaceProxy::MakeWrapped(std::move(tex)); + sk_sp<GrTextureProxy> proxy = GrSurfaceProxy::MakeWrapped(std::move(tex), desc.fOrigin); if (proxy) { sk_sp<GrSurfaceContext> sContext = context->contextPriv().makeWrappedSurfaceContext(std::move(proxy), nullptr); @@ -153,7 +153,7 @@ sk_sp<GrTextureProxy> GrResourceProvider::createTextureProxy(const GrSurfaceDesc } sk_sp<GrTexture> tex(fGpu->createTexture(desc, budgeted, &mipLevel, 1)); - return GrSurfaceProxy::MakeWrapped(std::move(tex)); + return GrSurfaceProxy::MakeWrapped(std::move(tex), desc.fOrigin); } sk_sp<GrTexture> GrResourceProvider::createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted, @@ -312,7 +312,8 @@ void GrResourceProvider::assignUniqueKeyToProxy(const GrUniqueKey& key, GrTextur } // MDB TODO (caching): this side-steps the issue of texture proxies with unique IDs -sk_sp<GrTextureProxy> GrResourceProvider::findProxyByUniqueKey(const GrUniqueKey& key) { +sk_sp<GrTextureProxy> GrResourceProvider::findProxyByUniqueKey(const GrUniqueKey& key, + GrSurfaceOrigin origin) { ASSERT_SINGLE_OWNER sk_sp<GrTexture> texture(this->findAndRefTextureByUniqueKey(key)); @@ -320,7 +321,7 @@ sk_sp<GrTextureProxy> GrResourceProvider::findProxyByUniqueKey(const GrUniqueKey return nullptr; } - return GrSurfaceProxy::MakeWrapped(std::move(texture)); + return GrSurfaceProxy::MakeWrapped(std::move(texture), origin); } const GrBuffer* GrResourceProvider::createPatternedIndexBuffer(const uint16_t* pattern, diff --git a/src/gpu/GrResourceProvider.h b/src/gpu/GrResourceProvider.h index 44155a834f..28207b7a87 100644 --- a/src/gpu/GrResourceProvider.h +++ b/src/gpu/GrResourceProvider.h @@ -53,7 +53,9 @@ public: void assignUniqueKeyToProxy(const GrUniqueKey& key, GrTextureProxy*); /** Finds a texture by unique key. If the texture is found it is ref'ed and returned. */ - sk_sp<GrTextureProxy> findProxyByUniqueKey(const GrUniqueKey& key); + // MDB TODO (caching): If this were actually caching proxies (rather than shallowly + // wrapping GrSurface caching) we would not need the origin parameter. + sk_sp<GrTextureProxy> findProxyByUniqueKey(const GrUniqueKey& key, GrSurfaceOrigin); /** * Finds a texture that approximately matches the descriptor. Will be at least as large in width diff --git a/src/gpu/GrSoftwarePathRenderer.cpp b/src/gpu/GrSoftwarePathRenderer.cpp index e171b78b4a..f479a483fe 100644 --- a/src/gpu/GrSoftwarePathRenderer.cpp +++ b/src/gpu/GrSoftwarePathRenderer.cpp @@ -205,7 +205,7 @@ bool GrSoftwarePathRenderer::onDrawPath(const DrawPathArgs& args) { sk_sp<GrTextureProxy> proxy; if (useCache) { - proxy = fResourceProvider->findProxyByUniqueKey(maskKey); + proxy = fResourceProvider->findProxyByUniqueKey(maskKey, kTopLeft_GrSurfaceOrigin); } if (!proxy) { SkBackingFit fit = useCache ? SkBackingFit::kExact : SkBackingFit::kApprox; @@ -217,6 +217,7 @@ bool GrSoftwarePathRenderer::onDrawPath(const DrawPathArgs& args) { return false; } if (useCache) { + SkASSERT(proxy->origin() == kTopLeft_GrSurfaceOrigin); fResourceProvider->assignUniqueKeyToProxy(maskKey, proxy.get()); } } diff --git a/src/gpu/GrSurfaceProxy.cpp b/src/gpu/GrSurfaceProxy.cpp index 0932971f8b..18c0c32402 100644 --- a/src/gpu/GrSurfaceProxy.cpp +++ b/src/gpu/GrSurfaceProxy.cpp @@ -20,19 +20,22 @@ #include "SkMathPriv.h" -GrSurfaceProxy::GrSurfaceProxy(sk_sp<GrSurface> surface, SkBackingFit fit) +GrSurfaceProxy::GrSurfaceProxy(sk_sp<GrSurface> surface, GrSurfaceOrigin origin, SkBackingFit fit) : INHERITED(std::move(surface)) , fConfig(fTarget->config()) , fWidth(fTarget->width()) , fHeight(fTarget->height()) - , fOrigin(fTarget->origin()) + , fOrigin(origin) , fFit(fit) , fBudgeted(fTarget->resourcePriv().isBudgeted()) , fFlags(0) , fUniqueID(fTarget->uniqueID()) // Note: converting from unique resource ID to a proxy ID! , fNeedsClear(false) , fGpuMemorySize(kInvalidGpuMemorySize) - , fLastOpList(nullptr) {} + , fLastOpList(nullptr) { + SkASSERT(kDefault_GrSurfaceOrigin != fOrigin); + SkASSERT(fTarget->origin() == fOrigin); +} GrSurfaceProxy::~GrSurfaceProxy() { // For this to be deleted the opList that held a ref on it (if there was one) must have been @@ -117,34 +120,34 @@ GrTextureOpList* GrSurfaceProxy::getLastTextureOpList() { return fLastOpList ? fLastOpList->asTextureOpList() : nullptr; } -sk_sp<GrSurfaceProxy> GrSurfaceProxy::MakeWrapped(sk_sp<GrSurface> surf) { +sk_sp<GrSurfaceProxy> GrSurfaceProxy::MakeWrapped(sk_sp<GrSurface> surf, GrSurfaceOrigin origin) { if (!surf) { return nullptr; } if (surf->asTexture()) { if (surf->asRenderTarget()) { - return sk_sp<GrSurfaceProxy>(new GrTextureRenderTargetProxy(std::move(surf))); + return sk_sp<GrSurfaceProxy>(new GrTextureRenderTargetProxy(std::move(surf), origin)); } else { - return sk_sp<GrSurfaceProxy>(new GrTextureProxy(std::move(surf))); + return sk_sp<GrSurfaceProxy>(new GrTextureProxy(std::move(surf), origin)); } } else { SkASSERT(surf->asRenderTarget()); // Not texturable - return sk_sp<GrSurfaceProxy>(new GrRenderTargetProxy(std::move(surf))); + return sk_sp<GrSurfaceProxy>(new GrRenderTargetProxy(std::move(surf), origin)); } } -sk_sp<GrTextureProxy> GrSurfaceProxy::MakeWrapped(sk_sp<GrTexture> tex) { +sk_sp<GrTextureProxy> GrSurfaceProxy::MakeWrapped(sk_sp<GrTexture> tex, GrSurfaceOrigin origin) { if (!tex) { return nullptr; } if (tex->asRenderTarget()) { - return sk_sp<GrTextureProxy>(new GrTextureRenderTargetProxy(std::move(tex))); + return sk_sp<GrTextureProxy>(new GrTextureRenderTargetProxy(std::move(tex), origin)); } else { - return sk_sp<GrTextureProxy>(new GrTextureProxy(std::move(tex))); + return sk_sp<GrTextureProxy>(new GrTextureProxy(std::move(tex), origin)); } } @@ -242,14 +245,14 @@ sk_sp<GrTextureProxy> GrSurfaceProxy::MakeDeferredMipMap( return nullptr; } - return GrSurfaceProxy::MakeWrapped(std::move(tex)); + return GrSurfaceProxy::MakeWrapped(std::move(tex), desc.fOrigin); } sk_sp<GrTextureProxy> GrSurfaceProxy::MakeWrappedBackend(GrContext* context, GrBackendTexture& backendTex, GrSurfaceOrigin origin) { sk_sp<GrTexture> tex(context->resourceProvider()->wrapBackendTexture(backendTex, origin)); - return GrSurfaceProxy::MakeWrapped(std::move(tex)); + return GrSurfaceProxy::MakeWrapped(std::move(tex), origin); } #ifdef SK_DEBUG diff --git a/src/gpu/GrTextureAdjuster.cpp b/src/gpu/GrTextureAdjuster.cpp index be29857e3b..166cb9d54b 100644 --- a/src/gpu/GrTextureAdjuster.cpp +++ b/src/gpu/GrTextureAdjuster.cpp @@ -46,7 +46,8 @@ sk_sp<GrTextureProxy> GrTextureAdjuster::refTextureProxyCopy(const CopyParams& c GrUniqueKey key; this->makeCopyKey(copyParams, &key, nullptr); if (key.isValid()) { - sk_sp<GrTextureProxy> cachedCopy = fContext->resourceProvider()->findProxyByUniqueKey(key); + sk_sp<GrTextureProxy> cachedCopy = fContext->resourceProvider()->findProxyByUniqueKey( + key, this->originalProxy()->origin()); if (cachedCopy) { return cachedCopy; } @@ -58,6 +59,7 @@ sk_sp<GrTextureProxy> GrTextureAdjuster::refTextureProxyCopy(const CopyParams& c sk_sp<GrTextureProxy> copy = CopyOnGpu(fContext, std::move(proxy), contentArea, copyParams); if (copy) { if (key.isValid()) { + SkASSERT(copy->origin() == this->originalProxy()->origin()); fContext->resourceProvider()->assignUniqueKeyToProxy(key, copy.get()); this->didCacheCopy(key); } diff --git a/src/gpu/GrTextureMaker.cpp b/src/gpu/GrTextureMaker.cpp index 44212fe433..e8ef215772 100644 --- a/src/gpu/GrTextureMaker.cpp +++ b/src/gpu/GrTextureMaker.cpp @@ -41,10 +41,12 @@ sk_sp<GrTextureProxy> GrTextureMaker::refTextureProxyForParams(const GrSamplerPa } } + GrSurfaceOrigin origOrigin = original->origin(); GrUniqueKey copyKey; this->makeCopyKey(copyParams, ©Key, dstColorSpace); if (copyKey.isValid()) { - sk_sp<GrTextureProxy> result(fContext->resourceProvider()->findProxyByUniqueKey(copyKey)); + sk_sp<GrTextureProxy> result(fContext->resourceProvider()->findProxyByUniqueKey( + copyKey, origOrigin)); if (result) { return result; } @@ -62,6 +64,7 @@ sk_sp<GrTextureProxy> GrTextureMaker::refTextureProxyForParams(const GrSamplerPa } if (copyKey.isValid()) { + SkASSERT(result->origin() == origOrigin); fContext->resourceProvider()->assignUniqueKeyToProxy(copyKey, result.get()); this->didCacheCopy(copyKey); } diff --git a/src/gpu/GrTextureProducer.cpp b/src/gpu/GrTextureProducer.cpp index 276dc10f02..78d143b435 100644 --- a/src/gpu/GrTextureProducer.cpp +++ b/src/gpu/GrTextureProducer.cpp @@ -24,7 +24,8 @@ sk_sp<GrTextureProxy> GrTextureProducer::CopyOnGpu(GrContext* context, const SkRect dstRect = SkRect::MakeIWH(copyParams.fWidth, copyParams.fHeight); sk_sp<GrRenderTargetContext> copyRTC = context->makeDeferredRenderTargetContextWithFallback( - SkBackingFit::kExact, dstRect.width(), dstRect.height(), inputProxy->config(), nullptr); + SkBackingFit::kExact, dstRect.width(), dstRect.height(), inputProxy->config(), nullptr, + 0, inputProxy->origin()); if (!copyRTC) { return nullptr; } diff --git a/src/gpu/GrTextureProxy.cpp b/src/gpu/GrTextureProxy.cpp index 310b36d7c6..21533df0ee 100644 --- a/src/gpu/GrTextureProxy.cpp +++ b/src/gpu/GrTextureProxy.cpp @@ -17,8 +17,8 @@ GrTextureProxy::GrTextureProxy(const GrSurfaceDesc& srcDesc, SkBackingFit fit, S SkASSERT(!srcData); // currently handled in Make() } -GrTextureProxy::GrTextureProxy(sk_sp<GrSurface> surf) - : INHERITED(std::move(surf), SkBackingFit::kExact) +GrTextureProxy::GrTextureProxy(sk_sp<GrSurface> surf, GrSurfaceOrigin origin) + : INHERITED(std::move(surf), origin, SkBackingFit::kExact) , fIsMipMapped(fTarget->asTexture()->texturePriv().hasMipMaps()) , fMipColorMode(fTarget->asTexture()->texturePriv().mipColorMode()) { } diff --git a/src/gpu/GrTextureRenderTargetProxy.cpp b/src/gpu/GrTextureRenderTargetProxy.cpp index a9a56e18c4..1bb0e239fd 100644 --- a/src/gpu/GrTextureRenderTargetProxy.cpp +++ b/src/gpu/GrTextureRenderTargetProxy.cpp @@ -24,10 +24,11 @@ GrTextureRenderTargetProxy::GrTextureRenderTargetProxy(const GrCaps& caps, // Wrapped version // This class is virtually derived from GrSurfaceProxy (via both GrTextureProxy and // GrRenderTargetProxy) so its constructor must be explicitly called. -GrTextureRenderTargetProxy::GrTextureRenderTargetProxy(sk_sp<GrSurface> surf) - : GrSurfaceProxy(surf, SkBackingFit::kExact) - , GrTextureProxy(surf) - , GrRenderTargetProxy(surf) { +GrTextureRenderTargetProxy::GrTextureRenderTargetProxy(sk_sp<GrSurface> surf, + GrSurfaceOrigin origin) + : GrSurfaceProxy(surf, origin, SkBackingFit::kExact) + , GrTextureProxy(surf, origin) + , GrRenderTargetProxy(surf, origin) { SkASSERT(surf->asTexture()); SkASSERT(surf->asRenderTarget()); } diff --git a/src/gpu/GrTextureRenderTargetProxy.h b/src/gpu/GrTextureRenderTargetProxy.h index ed64d9072d..7005169b22 100644 --- a/src/gpu/GrTextureRenderTargetProxy.h +++ b/src/gpu/GrTextureRenderTargetProxy.h @@ -30,7 +30,7 @@ private: SkBackingFit, SkBudgeted, uint32_t flags); // Wrapped version - GrTextureRenderTargetProxy(sk_sp<GrSurface>); + GrTextureRenderTargetProxy(sk_sp<GrSurface>, GrSurfaceOrigin); bool instantiate(GrResourceProvider*) override; sk_sp<GrSurface> createSurface(GrResourceProvider*) const override; diff --git a/src/gpu/GrYUVProvider.cpp b/src/gpu/GrYUVProvider.cpp index 341b711fbf..12390aaab0 100644 --- a/src/gpu/GrYUVProvider.cpp +++ b/src/gpu/GrYUVProvider.cpp @@ -124,10 +124,11 @@ sk_sp<GrTextureProxy> GrYUVProvider::refAsTextureProxy(GrContext* ctx, const GrS // We never want to perform color-space conversion during the decode sk_sp<GrRenderTargetContext> renderTargetContext(ctx->makeDeferredRenderTargetContext( - SkBackingFit::kExact, - desc.fWidth, desc.fHeight, - desc.fConfig, nullptr, - desc.fSampleCnt)); + SkBackingFit::kExact, + desc.fWidth, desc.fHeight, + desc.fConfig, nullptr, + desc.fSampleCnt, + kTopLeft_GrSurfaceOrigin)); if (!renderTargetContext) { return nullptr; } diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp index af0a55a156..e426b95af0 100644 --- a/src/gpu/SkGr.cpp +++ b/src/gpu/SkGr.cpp @@ -42,6 +42,7 @@ GrSurfaceDesc GrImageInfoToSurfaceDesc(const SkImageInfo& info, const GrCaps& caps) { GrSurfaceDesc desc; desc.fFlags = kNone_GrSurfaceFlags; + desc.fOrigin = kTopLeft_GrSurfaceOrigin; desc.fWidth = info.width(); desc.fHeight = info.height(); desc.fConfig = SkImageInfo2GrPixelConfig(info, caps); @@ -245,7 +246,7 @@ sk_sp<GrTextureProxy> GrMakeCachedBitmapProxy(GrResourceProvider* resourceProvid sk_sp<GrTextureProxy> proxy; if (originalKey.isValid()) { - proxy = resourceProvider->findProxyByUniqueKey(originalKey); + proxy = resourceProvider->findProxyByUniqueKey(originalKey, kTopLeft_GrSurfaceOrigin); } if (!proxy) { // Pass nullptr for |dstColorSpace|. This is lenient - we allow a wider range of @@ -253,6 +254,7 @@ sk_sp<GrTextureProxy> GrMakeCachedBitmapProxy(GrResourceProvider* resourceProvid // we can't necessarily know the |dstColorSpace| at this time. proxy = GrUploadBitmapToTextureProxy(resourceProvider, bitmap, nullptr); if (proxy && originalKey.isValid()) { + SkASSERT(proxy->origin() == kTopLeft_GrSurfaceOrigin); resourceProvider->assignUniqueKeyToProxy(originalKey, proxy.get()); // MDB TODO (caching): this has to play nice with the GrSurfaceProxy's caching GrInstallBitmapUniqueKeyInvalidator(originalKey, bitmap.pixelRef()); diff --git a/src/gpu/ccpr/GrCCPRPathProcessor.cpp b/src/gpu/ccpr/GrCCPRPathProcessor.cpp index bc2e45cb24..1e6fd0829a 100644 --- a/src/gpu/ccpr/GrCCPRPathProcessor.cpp +++ b/src/gpu/ccpr/GrCCPRPathProcessor.cpp @@ -86,7 +86,7 @@ GrCCPRPathProcessor::GrCCPRPathProcessor(GrResourceProvider* rp, sk_sp<GrTexture } void GrCCPRPathProcessor::getGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder* b) const { - b->add32((fFillType << 16) | this->atlas()->origin()); + b->add32((fFillType << 16) | this->proxy()->origin()); } class GLSLPathProcessor : public GrGLSLGeometryProcessor { @@ -161,10 +161,10 @@ void GLSLPathProcessor::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { // Convert to atlas coordinates in order to do our texture lookup. v->codeAppendf("highp vec2 atlascoord = octocoord + vec2(%s);", proc.getInstanceAttrib(InstanceAttribs::kAtlasOffset).fName); - if (kTopLeft_GrSurfaceOrigin == proc.atlas()->origin()) { + if (kTopLeft_GrSurfaceOrigin == proc.proxy()->origin()) { v->codeAppendf("%s = atlascoord * %s;", texcoord.vsOut(), atlasAdjust); } else { - SkASSERT(kBottomLeft_GrSurfaceOrigin == proc.atlas()->origin()); + SkASSERT(kBottomLeft_GrSurfaceOrigin == proc.proxy()->origin()); v->codeAppendf("%s = vec2(atlascoord.x * %s.x, 1 - atlascoord.y * %s.y);", texcoord.vsOut(), atlasAdjust, atlasAdjust); } diff --git a/src/gpu/ccpr/GrCCPRPathProcessor.h b/src/gpu/ccpr/GrCCPRPathProcessor.h index a74455bc8e..29f4e06b44 100644 --- a/src/gpu/ccpr/GrCCPRPathProcessor.h +++ b/src/gpu/ccpr/GrCCPRPathProcessor.h @@ -58,6 +58,7 @@ public: const GrShaderCaps&); const char* name() const override { return "GrCCPRPathProcessor"; } + const GrSurfaceProxy* proxy() const { return fAtlasAccess.proxy(); } const GrTexture* atlas() const { return fAtlasAccess.peekTexture(); } SkPath::FillType fillType() const { return fFillType; } const Attribute& getInstanceAttrib(InstanceAttribs attribID) const { diff --git a/src/gpu/effects/GrBicubicEffect.cpp b/src/gpu/effects/GrBicubicEffect.cpp index 6d8072f231..f7441bc043 100644 --- a/src/gpu/effects/GrBicubicEffect.cpp +++ b/src/gpu/effects/GrBicubicEffect.cpp @@ -120,13 +120,14 @@ void GrGLBicubicEffect::emitCode(EmitArgs& args) { void GrGLBicubicEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& processor) { const GrBicubicEffect& bicubicEffect = processor.cast<GrBicubicEffect>(); - GrTexture* texture = processor.textureSampler(0).peekTexture(); + GrSurfaceProxy* proxy = processor.textureSampler(0).proxy(); + GrTexture* texture = proxy->priv().peekTexture(); float imageIncrement[2]; imageIncrement[0] = 1.0f / texture->width(); imageIncrement[1] = 1.0f / texture->height(); pdman.set2fv(fImageIncrementUni, 1, imageIncrement); - fDomain.setData(pdman, bicubicEffect.domain(), texture); + fDomain.setData(pdman, bicubicEffect.domain(), proxy); if (SkToBool(bicubicEffect.colorSpaceXform())) { fColorSpaceHelper.setData(pdman, bicubicEffect.colorSpaceXform()); } diff --git a/src/gpu/effects/GrConfigConversionEffect.cpp b/src/gpu/effects/GrConfigConversionEffect.cpp index e4989de507..e8d04771f5 100644 --- a/src/gpu/effects/GrConfigConversionEffect.cpp +++ b/src/gpu/effects/GrConfigConversionEffect.cpp @@ -133,6 +133,7 @@ bool GrConfigConversionEffect::TestForPreservingPMConversions(GrContext* context return false; } GrSurfaceDesc desc; + desc.fOrigin = kTopLeft_GrSurfaceOrigin; desc.fWidth = kSize; desc.fHeight = kSize; desc.fConfig = kConfig; diff --git a/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.cpp b/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.cpp index 4d1a99d83e..1ab9b78cfc 100644 --- a/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.cpp +++ b/src/gpu/effects/GrGaussianConvolutionFragmentProcessor.cpp @@ -121,10 +121,11 @@ void GrGLConvolutionEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& processor) { const GrGaussianConvolutionFragmentProcessor& conv = processor.cast<GrGaussianConvolutionFragmentProcessor>(); - GrTexture& texture = *conv.textureSampler(0).peekTexture(); + GrSurfaceProxy* proxy = conv.textureSampler(0).proxy(); + GrTexture& texture = *proxy->priv().peekTexture(); float imageIncrement[2] = {0}; - float ySign = texture.origin() != kTopLeft_GrSurfaceOrigin ? 1.0f : -1.0f; + float ySign = proxy->origin() != kTopLeft_GrSurfaceOrigin ? 1.0f : -1.0f; switch (conv.direction()) { case Gr1DKernelEffect::kX_Direction: imageIncrement[0] = 1.0f / texture.width(); @@ -149,7 +150,7 @@ void GrGLConvolutionEffect::onSetData(const GrGLSLProgramDataManager& pdman, pdman.set2f(fBoundsUni, inv * bounds[0], inv * bounds[1]); } else { SkScalar inv = SkScalarInvert(SkIntToScalar(texture.height())); - if (texture.origin() != kTopLeft_GrSurfaceOrigin) { + if (proxy->origin() != kTopLeft_GrSurfaceOrigin) { pdman.set2f(fBoundsUni, 1.0f - (inv * bounds[1]), 1.0f - (inv * bounds[0])); } else { pdman.set2f(fBoundsUni, inv * bounds[1], inv * bounds[0]); diff --git a/src/gpu/effects/GrMatrixConvolutionEffect.cpp b/src/gpu/effects/GrMatrixConvolutionEffect.cpp index bc1537c8b4..abfe5b3774 100644 --- a/src/gpu/effects/GrMatrixConvolutionEffect.cpp +++ b/src/gpu/effects/GrMatrixConvolutionEffect.cpp @@ -131,10 +131,11 @@ void GrGLMatrixConvolutionEffect::GenKey(const GrProcessor& processor, void GrGLMatrixConvolutionEffect::onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& processor) { const GrMatrixConvolutionEffect& conv = processor.cast<GrMatrixConvolutionEffect>(); - GrTexture* texture = conv.textureSampler(0).peekTexture(); + GrSurfaceProxy* proxy = conv.textureSampler(0).proxy(); + GrTexture* texture = proxy->priv().peekTexture(); float imageIncrement[2]; - float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? 1.0f : -1.0f; + float ySign = proxy->origin() == kTopLeft_GrSurfaceOrigin ? 1.0f : -1.0f; imageIncrement[0] = 1.0f / texture->width(); imageIncrement[1] = ySign / texture->height(); pdman.set2fv(fImageIncrementUni, 1, imageIncrement); @@ -145,7 +146,7 @@ void GrGLMatrixConvolutionEffect::onSetData(const GrGLSLProgramDataManager& pdma pdman.set4fv(fKernelUni, arrayCount, conv.kernel()); pdman.set1f(fGainUni, conv.gain()); pdman.set1f(fBiasUni, conv.bias()); - fDomain.setData(pdman, conv.domain(), texture); + fDomain.setData(pdman, conv.domain(), proxy); } GrMatrixConvolutionEffect::GrMatrixConvolutionEffect(sk_sp<GrTextureProxy> proxy, diff --git a/src/gpu/effects/GrTextureDomain.cpp b/src/gpu/effects/GrTextureDomain.cpp index a8ce0ab6c5..f2b78586d7 100644 --- a/src/gpu/effects/GrTextureDomain.cpp +++ b/src/gpu/effects/GrTextureDomain.cpp @@ -161,7 +161,8 @@ void GrTextureDomain::GLDomain::sampleTexture(GrGLSLShaderBuilder* builder, void GrTextureDomain::GLDomain::setData(const GrGLSLProgramDataManager& pdman, const GrTextureDomain& textureDomain, - GrTexture* tex) { + GrSurfaceProxy* proxy) { + GrTexture* tex = proxy->priv().peekTexture(); SkASSERT(textureDomain.mode() == fMode); if (kIgnore_Mode != textureDomain.mode()) { SkScalar wInv = SK_Scalar1 / tex->width(); @@ -180,7 +181,7 @@ void GrTextureDomain::GLDomain::setData(const GrGLSLProgramDataManager& pdman, SkASSERT(values[3] >= 0.0f && values[3] <= 1.0f); // vertical flip if necessary - if (kBottomLeft_GrSurfaceOrigin == tex->origin()) { + if (kBottomLeft_GrSurfaceOrigin == proxy->origin()) { values[1] = 1.0f - values[1]; values[3] = 1.0f - values[3]; // The top and bottom were just flipped, so correct the ordering @@ -270,9 +271,9 @@ GrGLSLFragmentProcessor* GrTextureDomainEffect::onCreateGLSLInstance() const { const GrFragmentProcessor& fp) override { const GrTextureDomainEffect& tde = fp.cast<GrTextureDomainEffect>(); const GrTextureDomain& domain = tde.fTextureDomain; - GrTexture* texture = tde.textureSampler(0).peekTexture(); + GrSurfaceProxy* proxy = tde.textureSampler(0).proxy(); - fGLDomain.setData(pdman, domain, texture); + fGLDomain.setData(pdman, domain, proxy); if (SkToBool(tde.colorSpaceXform())) { fColorSpaceHelper.setData(pdman, tde.colorSpaceXform()); } @@ -372,16 +373,17 @@ GrGLSLFragmentProcessor* GrDeviceSpaceTextureDecalFragmentProcessor::onCreateGLS const GrFragmentProcessor& fp) override { const GrDeviceSpaceTextureDecalFragmentProcessor& dstdfp = fp.cast<GrDeviceSpaceTextureDecalFragmentProcessor>(); - GrTexture* texture = dstdfp.textureSampler(0).peekTexture(); + GrSurfaceProxy* proxy = dstdfp.textureSampler(0).proxy(); + GrTexture* texture = proxy->priv().peekTexture(); - fGLDomain.setData(pdman, dstdfp.fTextureDomain, texture); + fGLDomain.setData(pdman, dstdfp.fTextureDomain, proxy); float iw = 1.f / texture->width(); float ih = 1.f / texture->height(); float scaleAndTransData[4] = { iw, ih, -dstdfp.fDeviceSpaceOffset.fX * iw, -dstdfp.fDeviceSpaceOffset.fY * ih }; - if (texture->origin() == kBottomLeft_GrSurfaceOrigin) { + if (proxy->origin() == kBottomLeft_GrSurfaceOrigin) { scaleAndTransData[1] = -scaleAndTransData[1]; scaleAndTransData[3] = 1 - scaleAndTransData[3]; } diff --git a/src/gpu/effects/GrTextureDomain.h b/src/gpu/effects/GrTextureDomain.h index cbc55ecdba..8be1a2bc66 100644 --- a/src/gpu/effects/GrTextureDomain.h +++ b/src/gpu/effects/GrTextureDomain.h @@ -115,8 +115,7 @@ public: * texture domain. The rectangle is automatically adjusted to account for the texture's * origin. */ - void setData(const GrGLSLProgramDataManager& pdman, const GrTextureDomain& textureDomain, - GrTexture* texure); + void setData(const GrGLSLProgramDataManager&, const GrTextureDomain&, GrSurfaceProxy*); enum { kDomainKeyBits = 2, // See DomainKey(). diff --git a/src/gpu/effects/GrTextureStripAtlas.cpp b/src/gpu/effects/GrTextureStripAtlas.cpp index 72817b2133..02c8ce8faa 100644 --- a/src/gpu/effects/GrTextureStripAtlas.cpp +++ b/src/gpu/effects/GrTextureStripAtlas.cpp @@ -193,11 +193,6 @@ GrTextureStripAtlas::AtlasRow* GrTextureStripAtlas::getLRU() { } void GrTextureStripAtlas::lockTexture() { - GrSurfaceDesc texDesc; - texDesc.fOrigin = kTopLeft_GrSurfaceOrigin; - texDesc.fWidth = fDesc.fWidth; - texDesc.fHeight = fDesc.fHeight; - texDesc.fConfig = fDesc.fConfig; static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); GrUniqueKey key; @@ -205,8 +200,15 @@ void GrTextureStripAtlas::lockTexture() { builder[0] = static_cast<uint32_t>(fCacheKey); builder.finish(); - sk_sp<GrTextureProxy> proxy = fDesc.fContext->resourceProvider()->findProxyByUniqueKey(key); + sk_sp<GrTextureProxy> proxy = fDesc.fContext->resourceProvider()->findProxyByUniqueKey( + key, kTopLeft_GrSurfaceOrigin); if (!proxy) { + GrSurfaceDesc texDesc; + texDesc.fOrigin = kTopLeft_GrSurfaceOrigin; + texDesc.fWidth = fDesc.fWidth; + texDesc.fHeight = fDesc.fHeight; + texDesc.fConfig = fDesc.fConfig; + proxy = GrSurfaceProxy::MakeDeferred(fDesc.fContext->resourceProvider(), texDesc, SkBackingFit::kExact, SkBudgeted::kYes, @@ -215,6 +217,7 @@ void GrTextureStripAtlas::lockTexture() { return; } + SkASSERT(proxy->origin() == kTopLeft_GrSurfaceOrigin); fDesc.fContext->resourceProvider()->assignUniqueKeyToProxy(key, proxy.get()); // This is a new texture, so all of our cache info is now invalid this->initLRU(); diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index adc23599ad..3bed9e8298 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -277,7 +277,7 @@ static sk_sp<SkImage> new_wrapped_texture_common(GrContext* ctx, } const SkBudgeted budgeted = SkBudgeted::kNo; - sk_sp<GrTextureProxy> proxy(GrSurfaceProxy::MakeWrapped(std::move(tex))); + sk_sp<GrTextureProxy> proxy(GrSurfaceProxy::MakeWrapped(std::move(tex), origin)); return sk_make_sp<SkImage_Gpu>(ctx, kNeedNewImageUniqueID, at, std::move(proxy), std::move(colorSpace), budgeted); } diff --git a/src/image/SkImage_Lazy.cpp b/src/image/SkImage_Lazy.cpp index 13025520de..aff19f8d79 100644 --- a/src/image/SkImage_Lazy.cpp +++ b/src/image/SkImage_Lazy.cpp @@ -697,6 +697,7 @@ public: static void set_key_on_proxy(GrResourceProvider* resourceProvider, GrTextureProxy* proxy, const GrUniqueKey& key) { if (key.isValid()) { + SkASSERT(proxy->origin() == kTopLeft_GrSurfaceOrigin); resourceProvider->assignUniqueKeyToProxy(key, proxy); } } @@ -747,7 +748,8 @@ sk_sp<GrTextureProxy> SkImage_Lazy::lockTextureProxy(GrContext* ctx, // 1. Check the cache for a pre-existing one if (key.isValid()) { - if (sk_sp<GrTextureProxy> proxy = ctx->resourceProvider()->findProxyByUniqueKey(key)) { + if (sk_sp<GrTextureProxy> proxy = ctx->resourceProvider()->findProxyByUniqueKey( + key, kTopLeft_GrSurfaceOrigin)) { SK_HISTOGRAM_ENUMERATION("LockTexturePath", kPreExisting_LockTexturePath, kLockTexturePathCount); return proxy; |