diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gpu/GrRenderTargetContext.cpp | 34 | ||||
-rw-r--r-- | src/gpu/gl/GrGLCaps.cpp | 32 | ||||
-rw-r--r-- | src/gpu/gl/GrGLCaps.h | 3 | ||||
-rw-r--r-- | src/gpu/gl/GrGLGpu.cpp | 19 | ||||
-rw-r--r-- | src/gpu/vk/GrVkCaps.cpp | 7 | ||||
-rw-r--r-- | src/gpu/vk/GrVkCaps.h | 3 |
6 files changed, 18 insertions, 80 deletions
diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp index 49e45f01c1..acc0f671c5 100644 --- a/src/gpu/GrRenderTargetContext.cpp +++ b/src/gpu/GrRenderTargetContext.cpp @@ -1761,11 +1761,10 @@ void GrRenderTargetContext::setupDstTexture(GrRenderTarget* rt, const GrClip& cl clip.getConservativeBounds(rt->width(), rt->height(), ©Rect); SkIRect drawIBounds; - SkIRect clippedRect; opBounds.roundOut(&drawIBounds); // Cover up for any precision issues by outsetting the op bounds a pixel in each direction. drawIBounds.outset(1, 1); - if (!clippedRect.intersect(copyRect, drawIBounds)) { + if (!copyRect.intersect(drawIBounds)) { #ifdef SK_DEBUG GrCapsDebugf(this->caps(), "Missed an early reject. " "Bailing on draw from setupDstTexture.\n"); @@ -1776,43 +1775,24 @@ void GrRenderTargetContext::setupDstTexture(GrRenderTarget* rt, const GrClip& cl // MSAA consideration: When there is support for reading MSAA samples in the shader we could // have per-sample dst values by making the copy multisampled. GrSurfaceDesc desc; - bool rectsMustMatch = false; - bool disallowSubrect = false; - if (!this->caps()->initDescForDstCopy(rt, &desc, &rectsMustMatch, &disallowSubrect)) { + if (!this->caps()->initDescForDstCopy(rt, &desc)) { desc.fOrigin = kDefault_GrSurfaceOrigin; desc.fFlags = kRenderTarget_GrSurfaceFlag; desc.fConfig = rt->config(); } - if (!disallowSubrect) { - copyRect = clippedRect; - } + desc.fWidth = copyRect.width(); + desc.fHeight = copyRect.height(); - SkIPoint dstPoint; - SkIPoint dstOffset; static const uint32_t kFlags = 0; - sk_sp<GrTexture> copy; - if (rectsMustMatch) { - SkASSERT(desc.fOrigin == rt->origin()); - desc.fWidth = rt->width(); - desc.fHeight = rt->height(); - dstPoint = {copyRect.fLeft, copyRect.fTop}; - dstOffset = {0, 0}; - copy.reset(fContext->resourceProvider()->createTexture(desc, SkBudgeted::kYes, kFlags)); - } else { - desc.fWidth = copyRect.width(); - desc.fHeight = copyRect.height(); - dstPoint = {0, 0}; - dstOffset = {copyRect.fLeft, copyRect.fTop}; - copy.reset(fContext->resourceProvider()->createApproxTexture(desc, kFlags)); - } + sk_sp<GrTexture> copy(fContext->resourceProvider()->createApproxTexture(desc, kFlags)); if (!copy) { SkDebugf("Failed to create temporary copy of destination texture.\n"); return; } - + SkIPoint dstPoint = {0, 0}; this->getOpList()->copySurface(copy.get(), rt, copyRect, dstPoint); dstTexture->setTexture(std::move(copy)); - dstTexture->setOffset(dstOffset); + dstTexture->setOffset(copyRect.fLeft, copyRect.fTop); } diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp index 1a41a5b686..2ec95347f8 100644 --- a/src/gpu/gl/GrGLCaps.cpp +++ b/src/gpu/gl/GrGLCaps.cpp @@ -1018,7 +1018,6 @@ void GrGLCaps::initFSAASupport(const GrGLContextInfo& ctxInfo, const GrGLInterfa // is available. if (ctxInfo.version() >= GR_GL_VER(3, 0)) { fBlitFramebufferFlags = kNoFormatConversionForMSAASrc_BlitFramebufferFlag | - kNoMSAADst_BlitFramebufferFlag | kRectsMustMatchForMSAASrc_BlitFramebufferFlag; } else if (ctxInfo.hasExtension("GL_CHROMIUM_framebuffer_multisample") || ctxInfo.hasExtension("GL_ANGLE_framebuffer_blit")) { @@ -1027,8 +1026,7 @@ void GrGLCaps::initFSAASupport(const GrGLContextInfo& ctxInfo, const GrGLInterfa fBlitFramebufferFlags = kNoScalingOrMirroring_BlitFramebufferFlag | kResolveMustBeFull_BlitFrambufferFlag | kNoMSAADst_BlitFramebufferFlag | - kNoFormatConversion_BlitFramebufferFlag | - kRectsMustMatchForMSAASrc_BlitFramebufferFlag; + kNoFormatConversion_BlitFramebufferFlag; } } else { if (fUsesMixedSamples) { @@ -2070,14 +2068,7 @@ void GrGLCaps::initConfigTable(const GrContextOptions& contextOptions, #endif } -bool GrGLCaps::initDescForDstCopy(const GrRenderTarget* src, GrSurfaceDesc* desc, - bool* rectsMustMatch, bool* disallowSubrect) const { - // By default, we don't require rects to match. - *rectsMustMatch = false; - - // By default, we allow subrects. - *disallowSubrect = false; - +bool GrGLCaps::initDescForDstCopy(const GrRenderTarget* src, GrSurfaceDesc* desc) const { // If the src is a texture, we can implement the blit as a draw assuming the config is // renderable. if (src->asTexture() && this->isConfigRenderable(src->config(), false)) { @@ -2098,20 +2089,7 @@ bool GrGLCaps::initDescForDstCopy(const GrRenderTarget* src, GrSurfaceDesc* desc // texture. This code prefers CopyTexSubImage to fbo blit and avoids triggering temporary fbo // creation. It isn't clear that avoiding temporary fbo creation is actually optimal. GrSurfaceOrigin originForBlitFramebuffer = kDefault_GrSurfaceOrigin; - bool rectsMustMatchForBlitFramebuffer = false; - bool disallowSubrectForBlitFramebuffer = false; - if (src->numColorSamples() && - (this->blitFramebufferSupportFlags() & kResolveMustBeFull_BlitFrambufferFlag)) { - rectsMustMatchForBlitFramebuffer = true; - disallowSubrectForBlitFramebuffer = true; - // Mirroring causes rects to mismatch later, don't allow it. - originForBlitFramebuffer = src->origin(); - } else if (src->numColorSamples() && (this->blitFramebufferSupportFlags() & - kRectsMustMatchForMSAASrc_BlitFramebufferFlag)) { - rectsMustMatchForBlitFramebuffer = true; - // Mirroring causes rects to mismatch later, don't allow it. - originForBlitFramebuffer = src->origin(); - } else if (this->blitFramebufferSupportFlags() & kNoScalingOrMirroring_BlitFramebufferFlag) { + if (this->blitFramebufferSupportFlags() & kNoScalingOrMirroring_BlitFramebufferFlag) { originForBlitFramebuffer = src->origin(); } @@ -2122,8 +2100,6 @@ bool GrGLCaps::initDescForDstCopy(const GrRenderTarget* src, GrSurfaceDesc* desc if (this->canConfigBeFBOColorAttachment(kBGRA_8888_GrPixelConfig)) { desc->fOrigin = originForBlitFramebuffer; desc->fConfig = kBGRA_8888_GrPixelConfig; - *rectsMustMatch = rectsMustMatchForBlitFramebuffer; - *disallowSubrect = disallowSubrectForBlitFramebuffer; return true; } return false; @@ -2136,8 +2112,6 @@ bool GrGLCaps::initDescForDstCopy(const GrRenderTarget* src, GrSurfaceDesc* desc if (this->canConfigBeFBOColorAttachment(src->config())) { desc->fOrigin = originForBlitFramebuffer; desc->fConfig = src->config(); - *rectsMustMatch = rectsMustMatchForBlitFramebuffer; - *disallowSubrect = disallowSubrectForBlitFramebuffer; return true; } return false; diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h index b8c4745a50..a659435784 100644 --- a/src/gpu/gl/GrGLCaps.h +++ b/src/gpu/gl/GrGLCaps.h @@ -359,8 +359,7 @@ public: return fRGBAToBGRAReadbackConversionsAreSlow; } - bool initDescForDstCopy(const GrRenderTarget* src, GrSurfaceDesc* desc, bool* rectsMustMatch, - bool* disallowSubrect) const override; + bool initDescForDstCopy(const GrRenderTarget* src, GrSurfaceDesc* desc) const override; private: enum ExternalFormatUsage { diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index 3af3ed25aa..6cdda0672a 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -3344,13 +3344,8 @@ static inline bool can_blit_framebuffer_for_copy_surface(const GrSurface* dst, } } if (GrGLCaps::kResolveMustBeFull_BlitFrambufferFlag & blitFramebufferFlags) { - if (srcRT && srcRT->numColorSamples()) { - if (dstRT && !dstRT->numColorSamples()) { - return false; - } - if (SkRect::Make(srcRect) != srcRT->getBoundsRect()) { - return false; - } + if (srcRT && srcRT->numColorSamples() && dstRT && !dstRT->numColorSamples()) { + return false; } } if (GrGLCaps::kNoMSAADst_BlitFramebufferFlag & blitFramebufferFlags) { @@ -3369,13 +3364,9 @@ static inline bool can_blit_framebuffer_for_copy_surface(const GrSurface* dst, } } if (GrGLCaps::kRectsMustMatchForMSAASrc_BlitFramebufferFlag & blitFramebufferFlags) { - if (srcRT && srcRT->numColorSamples()) { - if (dstPoint.fX != srcRect.fLeft || dstPoint.fY != srcRect.fTop) { - return false; - } - if (dst->origin() != src->origin()) { - return false; - } + if (srcRT && srcRT->numColorSamples() && + (dstPoint.fX != srcRect.fLeft || dstPoint.fY != srcRect.fTop)) { + return false; } } return true; diff --git a/src/gpu/vk/GrVkCaps.cpp b/src/gpu/vk/GrVkCaps.cpp index bf7e5ad3ce..bf343a9ae9 100644 --- a/src/gpu/vk/GrVkCaps.cpp +++ b/src/gpu/vk/GrVkCaps.cpp @@ -53,12 +53,7 @@ GrVkCaps::GrVkCaps(const GrContextOptions& contextOptions, const GrVkInterface* this->init(contextOptions, vkInterface, physDev, featureFlags, extensionFlags); } -bool GrVkCaps::initDescForDstCopy(const GrRenderTarget* src, GrSurfaceDesc* desc, - bool* rectsMustMatch, bool* disallowSubrect) const { - // Vk doesn't use rectsMustMatch or disallowSubrect. Always return false. - *rectsMustMatch = false; - *disallowSubrect = false; - +bool GrVkCaps::initDescForDstCopy(const GrRenderTarget* src, GrSurfaceDesc* desc) const { // We can always succeed here with either a CopyImage (none msaa src) or ResolveImage (msaa). // For CopyImage we can make a simple texture, for ResolveImage we require the dst to be a // render target as well. diff --git a/src/gpu/vk/GrVkCaps.h b/src/gpu/vk/GrVkCaps.h index 0fb95247f2..73ed367896 100644 --- a/src/gpu/vk/GrVkCaps.h +++ b/src/gpu/vk/GrVkCaps.h @@ -104,8 +104,7 @@ public: return fPreferedStencilFormat; } - bool initDescForDstCopy(const GrRenderTarget* src, GrSurfaceDesc* desc, - bool* rectsMustMatch, bool* disallowSubrect) const override; + bool initDescForDstCopy(const GrRenderTarget* src, GrSurfaceDesc* desc) const override; private: enum VkVendor { |