diff options
author | 2017-04-26 12:19:14 -0400 | |
---|---|---|
committer | 2017-04-27 18:15:38 +0000 | |
commit | fdd77daedbba3b7c53be74a82fb9fae891b51696 (patch) | |
tree | af2780b3f60109deb860b774eb128487d0134de0 /src/gpu | |
parent | a41d48b739c144ee7b36290a9642064bc6cdcd05 (diff) |
Plumb the use of GrBackendRenderTarget throughout Skia
Bug: skia:
Change-Id: Ib99a58d9552f5c7b8d77c09dcc72fa88326c26aa
Reviewed-on: https://skia-review.googlesource.com/14148
Reviewed-by: Brian Salomon <bsalomon@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Greg Daniel <egdaniel@google.com>
Diffstat (limited to 'src/gpu')
-rw-r--r-- | src/gpu/GrBackendSurface.cpp | 31 | ||||
-rw-r--r-- | src/gpu/GrContext.cpp | 6 | ||||
-rw-r--r-- | src/gpu/GrContextPriv.h | 4 | ||||
-rw-r--r-- | src/gpu/GrGpu.cpp | 7 | ||||
-rw-r--r-- | src/gpu/GrGpu.h | 6 | ||||
-rw-r--r-- | src/gpu/GrResourceProvider.cpp | 4 | ||||
-rw-r--r-- | src/gpu/GrResourceProvider.h | 3 | ||||
-rw-r--r-- | src/gpu/gl/GrGLGpu.cpp | 34 | ||||
-rw-r--r-- | src/gpu/gl/GrGLGpu.h | 3 | ||||
-rw-r--r-- | src/gpu/vk/GrVkGpu.cpp | 25 | ||||
-rw-r--r-- | src/gpu/vk/GrVkGpu.h | 3 |
11 files changed, 73 insertions, 53 deletions
diff --git a/src/gpu/GrBackendSurface.cpp b/src/gpu/GrBackendSurface.cpp index 97b3b6ee03..6a1448e17c 100644 --- a/src/gpu/GrBackendSurface.cpp +++ b/src/gpu/GrBackendSurface.cpp @@ -70,14 +70,14 @@ GrBackendRenderTarget::GrBackendRenderTarget(int width, int height, int sampleCnt, int stencilBits, - const GrVkImageInfo* vkInfo) + const GrVkImageInfo& vkInfo) : fWidth(width) , fHeight(height) , fSampleCnt(sampleCnt) , fStencilBits(stencilBits) , fConfig( #ifdef SK_VULKAN - GrVkFormatToPixelConfig(vkInfo->fFormat) + GrVkFormatToPixelConfig(vkInfo.fFormat) #else kUnknown_GrPixelConfig #endif @@ -90,7 +90,7 @@ GrBackendRenderTarget::GrBackendRenderTarget(int width, int sampleCnt, int stencilBits, GrPixelConfig config, - const GrGLTextureInfo* glInfo) + const GrGLFramebufferInfo& glInfo) : fWidth(width) , fHeight(height) , fSampleCnt(sampleCnt) @@ -105,26 +105,33 @@ GrBackendRenderTarget::GrBackendRenderTarget(const GrBackendRenderTargetDesc& de , fHeight(desc.fHeight) , fSampleCnt(desc.fSampleCnt) , fStencilBits(desc.fStencilBits) - , fConfig(kVulkan_GrBackend == backend + , fConfig(desc.fConfig) + , fBackend(backend) { + if (kOpenGL_GrBackend == backend) { + fGLInfo = *reinterpret_cast<const GrGLFramebufferInfo*>(desc.fRenderTargetHandle); + } else { + SkASSERT(kVulkan_GrBackend == backend); #ifdef SK_VULKAN - ? GrVkFormatToPixelConfig(((GrVkImageInfo*)desc.fRenderTargetHandle)->fFormat) + const GrVkImageInfo* vkInfo = + reinterpret_cast<const GrVkImageInfo*>(desc.fRenderTargetHandle); + fConfig = GrVkFormatToPixelConfig(vkInfo->fFormat); + fVkInfo = *vkInfo; #else - ? kUnknown_GrPixelConfig + fConfig = kUnknown_GrPixelConfig; #endif - : desc.fConfig) - , fBackend(backend) - , fHandle(desc.fRenderTargetHandle) {} + } +} const GrVkImageInfo* GrBackendRenderTarget::getVkImageInfo() const { if (kVulkan_GrBackend == fBackend) { - return fVkInfo; + return &fVkInfo; } return nullptr; } -const GrGLTextureInfo* GrBackendRenderTarget::getGLTextureInfo() const { +const GrGLFramebufferInfo* GrBackendRenderTarget::getGLFramebufferInfo() const { if (kOpenGL_GrBackend == fBackend) { - return fGLInfo; + return &fGLInfo; } return nullptr; } diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index a2f227226d..aa245b5672 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -702,12 +702,14 @@ sk_sp<GrRenderTargetContext> GrContextPriv::makeBackendTextureRenderTargetContex } sk_sp<GrRenderTargetContext> GrContextPriv::makeBackendRenderTargetRenderTargetContext( - const GrBackendRenderTargetDesc& desc, + const GrBackendRenderTarget& backendRT, + GrSurfaceOrigin origin, sk_sp<SkColorSpace> colorSpace, const SkSurfaceProps* surfaceProps) { ASSERT_SINGLE_OWNER_PRIV - sk_sp<GrRenderTarget> rt(fContext->resourceProvider()->wrapBackendRenderTarget(desc)); + sk_sp<GrRenderTarget> rt(fContext->resourceProvider()->wrapBackendRenderTarget(backendRT, + origin)); if (!rt) { return nullptr; } diff --git a/src/gpu/GrContextPriv.h b/src/gpu/GrContextPriv.h index c85ac2c9b6..08b26e56d5 100644 --- a/src/gpu/GrContextPriv.h +++ b/src/gpu/GrContextPriv.h @@ -11,6 +11,7 @@ #include "GrContext.h" #include "GrSurfaceContext.h" +class GrBackendRenderTarget; class GrSemaphore; class GrSurfaceProxy; class GrPreFlushCallbackObject; @@ -52,7 +53,8 @@ public: const SkSurfaceProps* = nullptr); sk_sp<GrRenderTargetContext> makeBackendRenderTargetRenderTargetContext( - const GrBackendRenderTargetDesc& desc, + const GrBackendRenderTarget&, + GrSurfaceOrigin origin, sk_sp<SkColorSpace> colorSpace, const SkSurfaceProps* = nullptr); diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp index 4bf0c87bf1..5ce8274215 100644 --- a/src/gpu/GrGpu.cpp +++ b/src/gpu/GrGpu.cpp @@ -223,12 +223,13 @@ sk_sp<GrTexture> GrGpu::wrapBackendTexture(const GrBackendTexture& backendTex, return tex; } -sk_sp<GrRenderTarget> GrGpu::wrapBackendRenderTarget(const GrBackendRenderTargetDesc& desc) { - if (!this->caps()->isConfigRenderable(desc.fConfig, desc.fSampleCnt > 0)) { +sk_sp<GrRenderTarget> GrGpu::wrapBackendRenderTarget(const GrBackendRenderTarget& backendRT, + GrSurfaceOrigin origin) { + if (!this->caps()->isConfigRenderable(backendRT.config(), backendRT.sampleCnt() > 0)) { return nullptr; } this->handleDirtyContext(); - return this->onWrapBackendRenderTarget(desc); + return this->onWrapBackendRenderTarget(backendRT, origin); } sk_sp<GrRenderTarget> GrGpu::wrapBackendTextureAsRenderTarget(const GrBackendTexture& tex, diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h index 523add5cb7..000b32421b 100644 --- a/src/gpu/GrGpu.h +++ b/src/gpu/GrGpu.h @@ -20,6 +20,7 @@ #include "SkTArray.h" #include <map> +class GrBackendRenderTarget; class GrBuffer; class GrContext; struct GrContextOptions; @@ -135,7 +136,7 @@ public: /** * Implements GrResourceProvider::wrapBackendRenderTarget */ - sk_sp<GrRenderTarget> wrapBackendRenderTarget(const GrBackendRenderTargetDesc&); + sk_sp<GrRenderTarget> wrapBackendRenderTarget(const GrBackendRenderTarget&, GrSurfaceOrigin); /** * Implements GrResourceProvider::wrapBackendTextureAsRenderTarget @@ -556,7 +557,8 @@ private: GrBackendTextureFlags, int sampleCnt, GrWrapOwnership) = 0; - virtual sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTargetDesc&) = 0; + virtual sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&, + GrSurfaceOrigin) = 0; virtual sk_sp<GrRenderTarget> onWrapBackendTextureAsRenderTarget(const GrBackendTexture&, GrSurfaceOrigin, int sampleCnt)=0; diff --git a/src/gpu/GrResourceProvider.cpp b/src/gpu/GrResourceProvider.cpp index a250f6826f..d7b90873ed 100644 --- a/src/gpu/GrResourceProvider.cpp +++ b/src/gpu/GrResourceProvider.cpp @@ -254,10 +254,10 @@ sk_sp<GrTexture> GrResourceProvider::wrapBackendTexture(const GrBackendTexture& } sk_sp<GrRenderTarget> GrResourceProvider::wrapBackendRenderTarget( - const GrBackendRenderTargetDesc& desc) + const GrBackendRenderTarget& backendRT, GrSurfaceOrigin origin) { ASSERT_SINGLE_OWNER - return this->isAbandoned() ? nullptr : fGpu->wrapBackendRenderTarget(desc); + return this->isAbandoned() ? nullptr : fGpu->wrapBackendRenderTarget(backendRT, origin); } void GrResourceProvider::assignUniqueKeyToResource(const GrUniqueKey& key, diff --git a/src/gpu/GrResourceProvider.h b/src/gpu/GrResourceProvider.h index c3d96ff803..e22a0d8428 100644 --- a/src/gpu/GrResourceProvider.h +++ b/src/gpu/GrResourceProvider.h @@ -12,6 +12,7 @@ #include "GrGpu.h" #include "GrPathRange.h" +class GrBackendRenderTarget; class GrPath; class GrRenderTarget; class GrSingleOwner; @@ -100,7 +101,7 @@ public: * * @return GrRenderTarget object or NULL on failure. */ - sk_sp<GrRenderTarget> wrapBackendRenderTarget(const GrBackendRenderTargetDesc& desc); + sk_sp<GrRenderTarget> wrapBackendRenderTarget(const GrBackendRenderTarget&, GrSurfaceOrigin); static const int kMinScratchTextureSize; diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index da3ec49a29..646524a8e7 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -504,17 +504,6 @@ void GrGLGpu::onResetContext(uint32_t resetBits) { } } -static GrSurfaceOrigin resolve_origin(GrSurfaceOrigin origin, bool renderTarget) { - // By default, GrRenderTargets are GL's normal orientation so that they - // can be drawn to by the outside world without the client having - // to render upside down. - if (kDefault_GrSurfaceOrigin == origin) { - return renderTarget ? kBottomLeft_GrSurfaceOrigin : kTopLeft_GrSurfaceOrigin; - } else { - return origin; - } -} - sk_sp<GrTexture> GrGLGpu::onWrapBackendTexture(const GrBackendTexture& backendTex, GrSurfaceOrigin origin, GrBackendTextureFlags flags, @@ -591,23 +580,30 @@ sk_sp<GrTexture> GrGLGpu::onWrapBackendTexture(const GrBackendTexture& backendTe } } -sk_sp<GrRenderTarget> GrGLGpu::onWrapBackendRenderTarget(const GrBackendRenderTargetDesc& wrapDesc){ +sk_sp<GrRenderTarget> GrGLGpu::onWrapBackendRenderTarget(const GrBackendRenderTarget& backendRT, + GrSurfaceOrigin origin) { + const GrGLFramebufferInfo* info = backendRT.getGLFramebufferInfo(); + if (!info) { + return nullptr; + } + GrGLRenderTarget::IDDesc idDesc; - idDesc.fRTFBOID = static_cast<GrGLuint>(wrapDesc.fRenderTargetHandle); + idDesc.fRTFBOID = info->fFBOID; idDesc.fMSColorRenderbufferID = 0; idDesc.fTexFBOID = GrGLRenderTarget::kUnresolvableFBOID; idDesc.fRTFBOOwnership = GrBackendObjectOwnership::kBorrowed; idDesc.fIsMixedSampled = false; GrSurfaceDesc desc; - desc.fConfig = wrapDesc.fConfig; + desc.fConfig = backendRT.config(); desc.fFlags = kCheckAllocation_GrSurfaceFlag | kRenderTarget_GrSurfaceFlag; - desc.fWidth = wrapDesc.fWidth; - desc.fHeight = wrapDesc.fHeight; - desc.fSampleCnt = SkTMin(wrapDesc.fSampleCnt, this->caps()->maxSampleCount()); - desc.fOrigin = resolve_origin(wrapDesc.fOrigin, true); + desc.fWidth = backendRT.width(); + desc.fHeight = backendRT.height(); + desc.fSampleCnt = SkTMin(backendRT.sampleCnt(), this->caps()->maxSampleCount()); + SkASSERT(kDefault_GrSurfaceOrigin != origin); + desc.fOrigin = origin; - return GrGLRenderTarget::MakeWrapped(this, desc, idDesc, wrapDesc.fStencilBits); + return GrGLRenderTarget::MakeWrapped(this, desc, idDesc, backendRT.stencilBits()); } sk_sp<GrRenderTarget> GrGLGpu::onWrapBackendTextureAsRenderTarget(const GrBackendTexture& tex, diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h index f7e75cc2e7..f74673faf0 100644 --- a/src/gpu/gl/GrGLGpu.h +++ b/src/gpu/gl/GrGLGpu.h @@ -176,7 +176,8 @@ private: GrBackendTextureFlags, int sampleCnt, GrWrapOwnership) override; - sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTargetDesc&) override; + sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&, + GrSurfaceOrigin origin) override; sk_sp<GrRenderTarget> onWrapBackendTextureAsRenderTarget(const GrBackendTexture&, GrSurfaceOrigin, int sampleCnt) override; diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp index be5b0c7f49..1eec506a42 100644 --- a/src/gpu/vk/GrVkGpu.cpp +++ b/src/gpu/vk/GrVkGpu.cpp @@ -815,32 +815,36 @@ sk_sp<GrTexture> GrVkGpu::onWrapBackendTexture(const GrBackendTexture& backendTe return GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(this, surfDesc, ownership, info); } -sk_sp<GrRenderTarget> GrVkGpu::onWrapBackendRenderTarget(const GrBackendRenderTargetDesc& wrapDesc){ +sk_sp<GrRenderTarget> GrVkGpu::onWrapBackendRenderTarget(const GrBackendRenderTarget& backendRT, + GrSurfaceOrigin origin){ // Currently the Vulkan backend does not support wrapping of msaa render targets directly. In // general this is not an issue since swapchain images in vulkan are never multisampled. Thus if // you want a multisampled RT it is best to wrap the swapchain images and then let Skia handle // creating and owning the MSAA images. - if (wrapDesc.fSampleCnt) { + if (backendRT.sampleCnt()) { return nullptr; } - const GrVkImageInfo* info = - reinterpret_cast<const GrVkImageInfo*>(wrapDesc.fRenderTargetHandle); + const GrVkImageInfo* info = backendRT.getVkImageInfo(); + if (!info) { + return nullptr; + } if (VK_NULL_HANDLE == info->fImage) { return nullptr; } GrSurfaceDesc desc; - desc.fConfig = wrapDesc.fConfig; + desc.fConfig = backendRT.config(); desc.fFlags = kCheckAllocation_GrSurfaceFlag | kRenderTarget_GrSurfaceFlag; - desc.fWidth = wrapDesc.fWidth; - desc.fHeight = wrapDesc.fHeight; + desc.fWidth = backendRT.width(); + desc.fHeight = backendRT.height(); desc.fSampleCnt = 0; - desc.fOrigin = resolve_origin(wrapDesc.fOrigin); + SkASSERT(kDefault_GrSurfaceOrigin != origin); + desc.fOrigin = origin; sk_sp<GrVkRenderTarget> tgt = GrVkRenderTarget::MakeWrappedRenderTarget(this, desc, info); - if (tgt && wrapDesc.fStencilBits) { + if (tgt && backendRT.stencilBits()) { if (!createStencilAttachmentForRenderTarget(tgt.get(), desc.fWidth, desc.fHeight)) { return nullptr; } @@ -853,6 +857,9 @@ sk_sp<GrRenderTarget> GrVkGpu::onWrapBackendTextureAsRenderTarget(const GrBacken int sampleCnt) { const GrVkImageInfo* info = tex.getVkImageInfo(); + if (!info) { + return nullptr; + } if (VK_NULL_HANDLE == info->fImage) { return nullptr; } diff --git a/src/gpu/vk/GrVkGpu.h b/src/gpu/vk/GrVkGpu.h index d3e155581e..6ae34bd105 100644 --- a/src/gpu/vk/GrVkGpu.h +++ b/src/gpu/vk/GrVkGpu.h @@ -180,7 +180,8 @@ private: GrBackendTextureFlags, int sampleCnt, GrWrapOwnership) override; - sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTargetDesc&) override; + sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&, + GrSurfaceOrigin) override; sk_sp<GrRenderTarget> onWrapBackendTextureAsRenderTarget(const GrBackendTexture&, GrSurfaceOrigin, |