From d34edf3dc902532f88842f35375c474f94f82d83 Mon Sep 17 00:00:00 2001 From: Brian Salomon Date: Fri, 19 May 2017 15:45:48 -0400 Subject: [PATCH] Revert "Revert "Remove GrSurfaceDesc member from GrSurface."" This reverts commit 4b30a96a3e96b7f051e25025f4f17f3c54e04153. Bug: skia: Change-Id: I14d5b402c87df8fffbc29f16686fcfa18474fc48 Reviewed-on: https://skia-review.googlesource.com/17408 Reviewed-by: Greg Daniel Commit-Queue: Brian Salomon --- include/gpu/GrRenderTarget.h | 9 +++--- include/gpu/GrSurface.h | 25 +++++++++------- include/gpu/GrTexture.h | 3 -- src/gpu/GrRenderTarget.cpp | 12 ++++---- src/gpu/GrResourceProvider.cpp | 44 +++++++++++++++++++++------- src/gpu/GrTexture.cpp | 52 ++++++++++++++++++---------------- src/gpu/GrTexturePriv.h | 16 +++-------- src/gpu/gl/GrGLGpu.cpp | 6 ++-- src/gpu/gl/GrGLRenderTarget.cpp | 2 +- src/gpu/vk/GrVkTexture.cpp | 6 ++-- src/gpu/vk/GrVkTextureRenderTarget.cpp | 4 +-- 11 files changed, 102 insertions(+), 77 deletions(-) diff --git a/include/gpu/GrRenderTarget.h b/include/gpu/GrRenderTarget.h index fdf6f9c..bd25f4f 100644 --- a/include/gpu/GrRenderTarget.h +++ b/include/gpu/GrRenderTarget.h @@ -30,10 +30,10 @@ public: const GrRenderTarget* asRenderTarget() const override { return this; } // GrRenderTarget - bool isStencilBufferMultisampled() const { return fDesc.fSampleCnt > 0; } + bool isStencilBufferMultisampled() const { return fSampleCnt > 0; } GrFSAAType fsaaType() const { - if (!fDesc.fSampleCnt) { + if (!fSampleCnt) { SkASSERT(!(fFlags & Flags::kMixedSampled)); return GrFSAAType::kNone; } @@ -44,13 +44,13 @@ public: /** * Returns the number of samples/pixel in the stencil buffer (Zero if non-MSAA). */ - int numStencilSamples() const { return fDesc.fSampleCnt; } + int numStencilSamples() const { return fSampleCnt; } /** * Returns the number of samples/pixel in the color buffer (Zero if non-MSAA or mixed sampled). */ int numColorSamples() const { - return GrFSAAType::kMixedSamples == this->fsaaType() ? 0 : fDesc.fSampleCnt; + return GrFSAAType::kMixedSamples == this->fsaaType() ? 0 : fSampleCnt; } /** @@ -135,6 +135,7 @@ private: friend class GrRenderTargetPriv; friend class GrRenderTargetProxy; // for Flags + int fSampleCnt; GrStencilAttachment* fStencilAttachment; uint8_t fMultisampleSpecsID; Flags fFlags; diff --git a/include/gpu/GrSurface.h b/include/gpu/GrSurface.h index 6626765..4caa842 100644 --- a/include/gpu/GrSurface.h +++ b/include/gpu/GrSurface.h @@ -23,12 +23,12 @@ public: /** * Retrieves the width of the surface. */ - int width() const { return fDesc.fWidth; } + int width() const { return fWidth; } /** * Retrieves the height of the surface. */ - int height() const { return fDesc.fHeight; } + int height() const { return fHeight; } /** * Helper that gets the width and height of the surface as a bounding rectangle. @@ -36,9 +36,8 @@ public: SkRect getBoundsRect() const { return SkRect::MakeIWH(this->width(), this->height()); } GrSurfaceOrigin origin() const { - SkASSERT(kTopLeft_GrSurfaceOrigin == fDesc.fOrigin || - kBottomLeft_GrSurfaceOrigin == fDesc.fOrigin); - return fDesc.fOrigin; + SkASSERT(kTopLeft_GrSurfaceOrigin == fOrigin || kBottomLeft_GrSurfaceOrigin == fOrigin); + return fOrigin; } /** @@ -47,7 +46,7 @@ public: * if client asked us to render to a target that has a pixel * config that isn't equivalent with one of our configs. */ - GrPixelConfig config() const { return fDesc.fConfig; } + GrPixelConfig config() const { return fConfig; } /** * @return the texture associated with the surface, may be null. @@ -79,17 +78,23 @@ protected: friend class GrSurfacePriv; GrSurface(GrGpu* gpu, const GrSurfaceDesc& desc) - : INHERITED(gpu) - , fDesc(desc) { - } + : INHERITED(gpu) + , fConfig(desc.fConfig) + , fWidth(desc.fWidth) + , fHeight(desc.fHeight) + , fOrigin(desc.fOrigin) {} ~GrSurface() override {} - GrSurfaceDesc fDesc; void onRelease() override; void onAbandon() override; private: + GrPixelConfig fConfig; + int fWidth; + int fHeight; + GrSurfaceOrigin fOrigin; + typedef GrGpuResource INHERITED; }; diff --git a/include/gpu/GrTexture.h b/include/gpu/GrTexture.h index 0edcbd0..a7adc05 100644 --- a/include/gpu/GrTexture.h +++ b/include/gpu/GrTexture.h @@ -36,7 +36,6 @@ public: #ifdef SK_DEBUG void validate() const { this->INHERITED::validate(); - this->validateDesc(); } #endif @@ -54,8 +53,6 @@ protected: GrTexture(GrGpu*, const GrSurfaceDesc&, GrSLType samplerType, GrSamplerParams::FilterMode highestFilterMode, bool wasMipMapDataProvided); - void validateDesc() const; - private: void computeScratchKey(GrScratchKey*) const override; size_t onGpuMemorySize() const override; diff --git a/src/gpu/GrRenderTarget.cpp b/src/gpu/GrRenderTarget.cpp index 61a6f92..8b1fde6 100644 --- a/src/gpu/GrRenderTarget.cpp +++ b/src/gpu/GrRenderTarget.cpp @@ -19,11 +19,13 @@ GrRenderTarget::GrRenderTarget(GrGpu* gpu, const GrSurfaceDesc& desc, Flags flags, GrStencilAttachment* stencil) - : INHERITED(gpu, desc) - , fStencilAttachment(stencil) - , fMultisampleSpecsID(0) - , fFlags(flags) { - SkASSERT(!(fFlags & Flags::kMixedSampled) || fDesc.fSampleCnt > 0); + : INHERITED(gpu, desc) + , fSampleCnt(desc.fSampleCnt) + , fStencilAttachment(stencil) + , fMultisampleSpecsID(0) + , fFlags(flags) { + SkASSERT(desc.fFlags & kRenderTarget_GrSurfaceFlag); + SkASSERT(!(fFlags & Flags::kMixedSampled) || fSampleCnt > 0); SkASSERT(!(fFlags & Flags::kWindowRectsSupport) || gpu->caps()->maxWindowRectangles() > 0); fResolveRect.setLargestInverted(); } diff --git a/src/gpu/GrResourceProvider.cpp b/src/gpu/GrResourceProvider.cpp index a46ecb6..2eb8271 100644 --- a/src/gpu/GrResourceProvider.cpp +++ b/src/gpu/GrResourceProvider.cpp @@ -49,6 +49,28 @@ bool GrResourceProvider::IsFunctionallyExact(GrSurfaceProxy* proxy) { return proxy->priv().isExact() || (SkIsPow2(proxy->width()) && SkIsPow2(proxy->height())); } +bool validate_desc(const GrSurfaceDesc& desc, const GrCaps& caps, int levelCount = 0) { + if (desc.fWidth <= 0 || desc.fHeight <= 0) { + return false; + } + if (!caps.isConfigTexturable(desc.fConfig)) { + return false; + } + if (desc.fFlags & kRenderTarget_GrSurfaceFlag) { + if (!caps.isConfigRenderable(desc.fConfig, desc.fSampleCnt > 0)) { + return false; + } + } else { + if (desc.fSampleCnt) { + return false; + } + } + if (levelCount > 1 && GrPixelConfigIsSint(desc.fConfig)) { + return false; + } + return true; +} + // MDB TODO: this should probably be a factory on GrSurfaceProxy sk_sp GrResourceProvider::createMipMappedTexture( const GrSurfaceDesc& desc, @@ -74,11 +96,7 @@ sk_sp GrResourceProvider::createMipMappedTexture( return nullptr; } - if (mipLevelCount > 1 && GrPixelConfigIsSint(desc.fConfig)) { - return nullptr; - } - if ((desc.fFlags & kRenderTarget_GrSurfaceFlag) && - !fGpu->caps()->isConfigRenderable(desc.fConfig, desc.fSampleCnt > 0)) { + if (!validate_desc(desc, *fCaps, mipLevelCount)) { return nullptr; } @@ -133,6 +151,10 @@ sk_sp GrResourceProvider::createTextureProxy(const GrSurfaceDesc return nullptr; } + if (!validate_desc(desc, *fCaps)) { + return nullptr; + } + GrContext* context = fGpu->getContext(); if (!GrPixelConfigIsCompressed(desc.fConfig)) { @@ -166,8 +188,7 @@ sk_sp GrResourceProvider::createTexture(const GrSurfaceDesc& desc, Sk return nullptr; } - if ((desc.fFlags & kRenderTarget_GrSurfaceFlag) && - !fGpu->caps()->isConfigRenderable(desc.fConfig, desc.fSampleCnt > 0)) { + if (!validate_desc(desc, *fCaps)) { return nullptr; } @@ -195,15 +216,18 @@ GrTexture* GrResourceProvider::createApproxTexture(const GrSurfaceDesc& desc, ui return nullptr; } + if (!validate_desc(desc, *fCaps)) { + return nullptr; + } + return this->refScratchTexture(desc, flags); } -GrTexture* GrResourceProvider::refScratchTexture(const GrSurfaceDesc& inDesc, - uint32_t flags) { +GrTexture* GrResourceProvider::refScratchTexture(const GrSurfaceDesc& inDesc, uint32_t flags) { ASSERT_SINGLE_OWNER SkASSERT(!this->isAbandoned()); SkASSERT(!GrPixelConfigIsCompressed(inDesc.fConfig)); - SkASSERT(inDesc.fWidth > 0 && inDesc.fHeight > 0); + SkASSERT(validate_desc(inDesc, *fCaps)); SkTCopyOnFirstWrite desc(inDesc); diff --git a/src/gpu/GrTexture.cpp b/src/gpu/GrTexture.cpp index 0aa1ac0..cbab5f0 100644 --- a/src/gpu/GrTexture.cpp +++ b/src/gpu/GrTexture.cpp @@ -40,18 +40,7 @@ size_t GrTexture::onGpuMemorySize() const { this->texturePriv().hasMipMaps(), false); } -void GrTexture::validateDesc() const { - if (this->asRenderTarget()) { - // This texture has a render target - SkASSERT(0 != (fDesc.fFlags & kRenderTarget_GrSurfaceFlag)); - SkASSERT(fDesc.fSampleCnt == this->asRenderTarget()->numColorSamples()); - } else { - SkASSERT(0 == (fDesc.fFlags & kRenderTarget_GrSurfaceFlag)); - SkASSERT(0 == fDesc.fSampleCnt); - } -} - -////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// namespace { @@ -79,7 +68,7 @@ GrTexture::GrTexture(GrGpu* gpu, const GrSurfaceDesc& desc, GrSLType samplerType , fMipColorMode(SkDestinationSurfaceColorMode::kLegacy) { if (wasMipMapDataProvided) { fMipMapsStatus = kValid_MipMapsStatus; - fMaxMipMapLevel = SkMipMap::ComputeLevelCount(fDesc.fWidth, fDesc.fHeight); + fMaxMipMapLevel = SkMipMap::ComputeLevelCount(this->width(), this->height()); } else { fMipMapsStatus = kNotAllocated_MipMapsStatus; fMaxMipMapLevel = 0; @@ -87,27 +76,42 @@ GrTexture::GrTexture(GrGpu* gpu, const GrSurfaceDesc& desc, GrSLType samplerType } void GrTexture::computeScratchKey(GrScratchKey* key) const { - if (!GrPixelConfigIsCompressed(fDesc.fConfig)) { - GrTexturePriv::ComputeScratchKey(fDesc, key); + if (!GrPixelConfigIsCompressed(this->config())) { + const GrRenderTarget* rt = this->asRenderTarget(); + int sampleCount = 0; + if (rt) { + sampleCount = rt->numStencilSamples(); + } + GrTexturePriv::ComputeScratchKey(this->config(), this->width(), this->height(), + this->origin(), SkToBool(rt), sampleCount, + this->texturePriv().hasMipMaps(), key); } } -void GrTexturePriv::ComputeScratchKey(const GrSurfaceDesc& desc, GrScratchKey* key) { +void GrTexturePriv::ComputeScratchKey(GrPixelConfig config, int width, int height, + GrSurfaceOrigin origin, bool isRenderTarget, int sampleCnt, + bool isMipMapped, GrScratchKey* key) { static const GrScratchKey::ResourceType kType = GrScratchKey::GenerateResourceType(); + uint32_t flags = isRenderTarget; - GrSurfaceOrigin origin = resolve_origin(desc); - uint32_t flags = desc.fFlags; + SkASSERT(0 == sampleCnt || isRenderTarget); // make sure desc.fConfig fits in 5 bits SkASSERT(sk_float_log2(kLast_GrPixelConfig) <= 5); - SkASSERT(static_cast(desc.fConfig) < (1 << 5)); - SkASSERT(desc.fSampleCnt < (1 << 8)); + SkASSERT(static_cast(config) < (1 << 5)); + SkASSERT(sampleCnt < (1 << 8)); SkASSERT(flags < (1 << 10)); SkASSERT(static_cast(origin) < (1 << 8)); GrScratchKey::Builder builder(key, kType, 3); - builder[0] = desc.fWidth; - builder[1] = desc.fHeight; - builder[2] = desc.fConfig | (desc.fIsMipMapped << 5) | (desc.fSampleCnt << 6) | (flags << 14) - | (origin << 24); + builder[0] = width; + builder[1] = height; + builder[2] = config | (isMipMapped << 5) | (sampleCnt << 6) | (flags << 14) | (origin << 24); +} + +void GrTexturePriv::ComputeScratchKey(const GrSurfaceDesc& desc, GrScratchKey* key) { + GrSurfaceOrigin origin = resolve_origin(desc); + return ComputeScratchKey(desc.fConfig, desc.fWidth, desc.fHeight, origin, + SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag), desc.fSampleCnt, + desc.fIsMipMapped, key); } diff --git a/src/gpu/GrTexturePriv.h b/src/gpu/GrTexturePriv.h index 0420611..67631fc 100644 --- a/src/gpu/GrTexturePriv.h +++ b/src/gpu/GrTexturePriv.h @@ -17,18 +17,6 @@ implemented privately in GrTexture with a inline public method here). */ class GrTexturePriv { public: - void setFlag(GrSurfaceFlags flags) { - fTexture->fDesc.fFlags = fTexture->fDesc.fFlags | flags; - } - - void resetFlag(GrSurfaceFlags flags) { - fTexture->fDesc.fFlags = fTexture->fDesc.fFlags & ~flags; - } - - bool isSetFlag(GrSurfaceFlags flags) const { - return 0 != (fTexture->fDesc.fFlags & flags); - } - void dirtyMipMaps(bool mipMapsDirty) { fTexture->dirtyMipMaps(mipMapsDirty); } @@ -70,6 +58,10 @@ public: static void ComputeScratchKey(const GrSurfaceDesc&, GrScratchKey*); private: + static void ComputeScratchKey(GrPixelConfig config, int width, int height, + GrSurfaceOrigin origin, bool isRenderTarget, int sampleCnt, + bool isMipMapped, GrScratchKey* key); + GrTexturePriv(GrTexture* texture) : fTexture(texture) { } GrTexturePriv(const GrTexturePriv& that) : fTexture(that.fTexture) { } GrTexturePriv& operator=(const GrTexturePriv&); // unimpl diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index a24a259..b324280 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -1524,12 +1524,12 @@ GrTexture* GrGLGpu::onCreateTexture(const GrSurfaceDesc& desc, return return_null_texture(); } - bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag); + bool isRenderTarget = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag); GrGLTexture::IDDesc idDesc; idDesc.fOwnership = GrBackendObjectOwnership::kOwned; GrGLTexture::TexParams initialTexParams; - if (!this->createTextureImpl(desc, &idDesc.fInfo, renderTarget, &initialTexParams, texels)) { + if (!this->createTextureImpl(desc, &idDesc.fInfo, isRenderTarget, &initialTexParams, texels)) { return return_null_texture(); } @@ -1539,7 +1539,7 @@ GrTexture* GrGLGpu::onCreateTexture(const GrSurfaceDesc& desc, } GrGLTexture* tex; - if (renderTarget) { + if (isRenderTarget) { // unbind the texture from the texture unit before binding it to the frame buffer GL_CALL(BindTexture(idDesc.fInfo.fTarget, 0)); GrGLRenderTarget::IDDesc rtIDDesc; diff --git a/src/gpu/gl/GrGLRenderTarget.cpp b/src/gpu/gl/GrGLRenderTarget.cpp index 7d45ceb..00a7840 100644 --- a/src/gpu/gl/GrGLRenderTarget.cpp +++ b/src/gpu/gl/GrGLRenderTarget.cpp @@ -215,7 +215,7 @@ int GrGLRenderTarget::msaaSamples() const { if (fTexFBOID == kUnresolvableFBOID || fTexFBOID != fRTFBOID) { // If the render target's FBO is external (fTexFBOID == kUnresolvableFBOID), or if we own // the render target's FBO (fTexFBOID == fRTFBOID) then we use the provided sample count. - return SkTMax(1, fDesc.fSampleCnt); + return SkTMax(1, this->numStencilSamples()); } // When fTexFBOID == fRTFBOID, we either are not using MSAA, or MSAA is auto resolving, so use diff --git a/src/gpu/vk/GrVkTexture.cpp b/src/gpu/vk/GrVkTexture.cpp index 4857db6..826f091 100644 --- a/src/gpu/vk/GrVkTexture.cpp +++ b/src/gpu/vk/GrVkTexture.cpp @@ -186,7 +186,7 @@ bool GrVkTexture::reallocForMipmap(GrVkGpu* gpu, uint32_t mipLevels) { return false; } - bool renderTarget = SkToBool(fDesc.fFlags & kRenderTarget_GrSurfaceFlag); + bool renderTarget = SkToBool(this->asRenderTarget()); VkImageUsageFlags usageFlags = VK_IMAGE_USAGE_SAMPLED_BIT; if (renderTarget) { @@ -197,8 +197,8 @@ bool GrVkTexture::reallocForMipmap(GrVkGpu* gpu, uint32_t mipLevels) { GrVkImage::ImageDesc imageDesc; imageDesc.fImageType = VK_IMAGE_TYPE_2D; imageDesc.fFormat = fInfo.fFormat; - imageDesc.fWidth = fDesc.fWidth; - imageDesc.fHeight = fDesc.fHeight; + imageDesc.fWidth = this->width(); + imageDesc.fHeight = this->height(); imageDesc.fLevels = mipLevels; imageDesc.fSamples = 1; imageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL; diff --git a/src/gpu/vk/GrVkTextureRenderTarget.cpp b/src/gpu/vk/GrVkTextureRenderTarget.cpp index cfa63be..2a6810d 100644 --- a/src/gpu/vk/GrVkTextureRenderTarget.cpp +++ b/src/gpu/vk/GrVkTextureRenderTarget.cpp @@ -152,8 +152,8 @@ GrVkTextureRenderTarget::MakeWrappedTextureRenderTarget(GrVkGpu* gpu, bool GrVkTextureRenderTarget::updateForMipmap(GrVkGpu* gpu, const GrVkImageInfo& newInfo) { VkFormat pixelFormat; - GrPixelConfigToVkFormat(fDesc.fConfig, &pixelFormat); - if (fDesc.fSampleCnt) { + GrPixelConfigToVkFormat(this->config(), &pixelFormat); + if (this->numStencilSamples()) { const GrVkImageView* resolveAttachmentView = GrVkImageView::Create(gpu, newInfo.fImage, -- 2.7.4