diff options
-rw-r--r-- | include/core/SkSurface.h | 3 | ||||
-rw-r--r-- | include/gpu/GrRenderTarget.h | 2 | ||||
-rw-r--r-- | include/gpu/GrSurface.h | 5 | ||||
-rw-r--r-- | include/gpu/GrTexture.h | 2 | ||||
-rw-r--r-- | src/gpu/GrRenderTarget.cpp | 11 | ||||
-rw-r--r-- | src/gpu/GrRenderTargetProxy.cpp | 2 | ||||
-rw-r--r-- | src/gpu/GrSurface.cpp | 37 | ||||
-rw-r--r-- | src/gpu/GrTexture.cpp | 23 | ||||
-rw-r--r-- | src/gpu/GrTextureProxy.cpp | 2 | ||||
-rw-r--r-- | src/gpu/gl/GrGLGpu.cpp | 12 | ||||
-rw-r--r-- | src/gpu/gl/GrGLRenderTarget.cpp | 4 | ||||
-rw-r--r-- | src/gpu/gl/GrGLRenderTarget.h | 5 | ||||
-rw-r--r-- | src/gpu/gl/GrGLTexture.cpp | 5 | ||||
-rw-r--r-- | src/gpu/gl/GrGLTexture.h | 2 | ||||
-rw-r--r-- | src/gpu/gl/GrGLTextureRenderTarget.cpp | 2 | ||||
-rw-r--r-- | src/gpu/gl/GrGLTextureRenderTarget.h | 16 | ||||
-rw-r--r-- | src/gpu/vk/GrVkRenderTarget.h | 3 | ||||
-rw-r--r-- | src/gpu/vk/GrVkTextureRenderTarget.h | 6 | ||||
-rw-r--r-- | tests/ResourceCacheTest.cpp | 107 |
19 files changed, 183 insertions, 66 deletions
diff --git a/include/core/SkSurface.h b/include/core/SkSurface.h index e6e6ff1b96..eb8f6aefc8 100644 --- a/include/core/SkSurface.h +++ b/include/core/SkSurface.h @@ -146,6 +146,9 @@ public: } static sk_sp<SkSurface> MakeRenderTarget(GrContext* gr, SkBudgeted b, const SkImageInfo& info) { + if (!info.width() || !info.height()) { + return nullptr; + } return MakeRenderTarget(gr, b, info, 0, kBottomLeft_GrSurfaceOrigin, nullptr); } diff --git a/include/gpu/GrRenderTarget.h b/include/gpu/GrRenderTarget.h index ad96229dc7..dcbe8ea974 100644 --- a/include/gpu/GrRenderTarget.h +++ b/include/gpu/GrRenderTarget.h @@ -119,8 +119,6 @@ public: return (GrRenderTargetOpList*) this->getLastOpList(); } - static size_t ComputeSize(const GrSurfaceDesc& desc, int colorValuesPerPixel); - protected: enum class Flags { kNone = 0, diff --git a/include/gpu/GrSurface.h b/include/gpu/GrSurface.h index 8479599948..3f91a2fb70 100644 --- a/include/gpu/GrSurface.h +++ b/include/gpu/GrSurface.h @@ -126,11 +126,12 @@ public: fReleaseCtx = ctx; } - static size_t WorstCaseSize(const GrSurfaceDesc& desc); - void setLastOpList(GrOpList* opList); GrOpList* getLastOpList() { return fLastOpList; } + static size_t WorstCaseSize(const GrSurfaceDesc& desc); + static size_t ComputeSize(const GrSurfaceDesc& desc, int colorSamplesPerPixel, bool hasMIPMaps); + protected: // Methods made available via GrSurfacePriv bool savePixels(const char* filename); diff --git a/include/gpu/GrTexture.h b/include/gpu/GrTexture.h index c86496c3cf..211f1937da 100644 --- a/include/gpu/GrTexture.h +++ b/include/gpu/GrTexture.h @@ -45,8 +45,6 @@ public: inline GrTexturePriv texturePriv(); inline const GrTexturePriv texturePriv() const; - static size_t ComputeSize(const GrSurfaceDesc&, bool hasMipMaps); - protected: GrTexture(GrGpu*, const GrSurfaceDesc&, GrSLType, bool wasMipMapDataProvided); diff --git a/src/gpu/GrRenderTarget.cpp b/src/gpu/GrRenderTarget.cpp index 2828866435..f15e3b01bf 100644 --- a/src/gpu/GrRenderTarget.cpp +++ b/src/gpu/GrRenderTarget.cpp @@ -84,17 +84,6 @@ void GrRenderTarget::onAbandon() { INHERITED::onAbandon(); } -size_t GrRenderTarget::ComputeSize(const GrSurfaceDesc& desc, int colorValuesPerPixel) { - SkASSERT(kUnknown_GrPixelConfig != desc.fConfig); - SkASSERT(!GrPixelConfigIsCompressed(desc.fConfig)); - size_t colorBytes = GrBytesPerPixel(desc.fConfig); - SkASSERT(colorBytes > 0); - - size_t rtSize = colorValuesPerPixel * desc.fWidth * desc.fHeight * colorBytes; - SkASSERT(rtSize <= WorstCaseSize(desc)); - return rtSize; -} - /////////////////////////////////////////////////////////////////////////////// bool GrRenderTargetPriv::attachStencilAttachment(GrStencilAttachment* stencil) { diff --git a/src/gpu/GrRenderTargetProxy.cpp b/src/gpu/GrRenderTargetProxy.cpp index ac8f5edb76..eb750847d2 100644 --- a/src/gpu/GrRenderTargetProxy.cpp +++ b/src/gpu/GrRenderTargetProxy.cpp @@ -82,7 +82,7 @@ size_t GrRenderTargetProxy::onGpuMemorySize() const { } // TODO: do we have enough information to improve this worst case estimate? - return GrRenderTarget::ComputeSize(fDesc, fDesc.fSampleCnt+1); + return GrSurface::ComputeSize(fDesc, fDesc.fSampleCnt+1, false); } sk_sp<GrRenderTargetProxy> GrRenderTargetProxy::Make(const GrCaps& caps, diff --git a/src/gpu/GrSurface.cpp b/src/gpu/GrSurface.cpp index 9fe00ded5d..f2318793d2 100644 --- a/src/gpu/GrSurface.cpp +++ b/src/gpu/GrSurface.cpp @@ -38,15 +38,19 @@ size_t GrSurface::WorstCaseSize(const GrSurfaceDesc& desc) { } SkASSERT(kUnknown_GrPixelConfig != desc.fConfig); SkASSERT(!GrPixelConfigIsCompressed(desc.fConfig)); - size_t colorBytes = GrBytesPerPixel(desc.fConfig); - SkASSERT(colorBytes > 0); + size_t colorBytes = desc.fWidth * desc.fHeight * GrBytesPerPixel(desc.fConfig); - size = (size_t) colorValuesPerPixel * desc.fWidth * desc.fHeight * colorBytes; + // This would be a nice assert to have (i.e., we aren't creating 0 width/height surfaces). + // Unfortunately Chromium seems to want to do this. + //SkASSERT(colorBytes > 0); + + size = colorValuesPerPixel * colorBytes; + size += colorBytes/3; // in case we have to mipmap } else { if (GrPixelConfigIsCompressed(desc.fConfig)) { size = GrCompressedFormatDataSize(desc.fConfig, desc.fWidth, desc.fHeight); } else { - size = (size_t) desc.fWidth * desc.fHeight * GrBytesPerPixel(desc.fConfig); + size = desc.fWidth * desc.fHeight * GrBytesPerPixel(desc.fConfig); } size += size/3; // in case we have to mipmap @@ -55,6 +59,31 @@ size_t GrSurface::WorstCaseSize(const GrSurfaceDesc& desc) { return size; } +size_t GrSurface::ComputeSize(const GrSurfaceDesc& desc, + int colorSamplesPerPixel, + bool hasMIPMaps) { + size_t colorSize; + + SkASSERT(kUnknown_GrPixelConfig != desc.fConfig); + if (GrPixelConfigIsCompressed(desc.fConfig)) { + colorSize = GrCompressedFormatDataSize(desc.fConfig, desc.fWidth, desc.fHeight); + } else { + colorSize = desc.fWidth * desc.fHeight * GrBytesPerPixel(desc.fConfig); + } + SkASSERT(colorSize > 0); + + size_t finalSize = colorSamplesPerPixel * colorSize; + + if (hasMIPMaps) { + // We don't have to worry about the mipmaps being a different size than + // we'd expect because we never change fDesc.fWidth/fHeight. + finalSize += colorSize/3; + } + + SkASSERT(finalSize <= WorstCaseSize(desc)); + return finalSize; +} + template<typename T> static bool adjust_params(int surfaceWidth, int surfaceHeight, size_t bpp, diff --git a/src/gpu/GrTexture.cpp b/src/gpu/GrTexture.cpp index 91036bc156..de1135a1eb 100644 --- a/src/gpu/GrTexture.cpp +++ b/src/gpu/GrTexture.cpp @@ -35,29 +35,8 @@ void GrTexture::dirtyMipMaps(bool mipMapsDirty) { } } -size_t GrTexture::ComputeSize(const GrSurfaceDesc& desc, bool hasMipMaps) { - size_t textureSize; - - if (GrPixelConfigIsCompressed(desc.fConfig)) { - textureSize = GrCompressedFormatDataSize(desc.fConfig, desc.fWidth, desc.fHeight); - } else { - textureSize = (size_t) desc.fWidth * desc.fHeight * GrBytesPerPixel(desc.fConfig); - } - - if (hasMipMaps) { - // We don't have to worry about the mipmaps being a different size than - // we'd expect because we never change fDesc.fWidth/fHeight. - textureSize += textureSize/3; - } - - SkASSERT(!SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag)); - SkASSERT(textureSize <= WorstCaseSize(desc)); - - return textureSize; -} - size_t GrTexture::onGpuMemorySize() const { - return ComputeSize(fDesc, this->texturePriv().hasMipMaps()); + return GrSurface::ComputeSize(fDesc, 1, this->texturePriv().hasMipMaps()); } void GrTexture::validateDesc() const { diff --git a/src/gpu/GrTextureProxy.cpp b/src/gpu/GrTextureProxy.cpp index d60bf90ba4..0a7f767fa7 100644 --- a/src/gpu/GrTextureProxy.cpp +++ b/src/gpu/GrTextureProxy.cpp @@ -46,7 +46,7 @@ size_t GrTextureProxy::onGpuMemorySize() const { static const bool kHasMipMaps = true; // TODO: add tracking of mipmap state to improve the estimate - return GrTexture::ComputeSize(fDesc, kHasMipMaps); + return GrSurface::ComputeSize(fDesc, 1, kHasMipMaps); } sk_sp<GrTextureProxy> GrTextureProxy::Make(GrTextureProvider* texProvider, diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index d8f383a196..9af3acc474 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -1642,6 +1642,11 @@ GrTexture* GrGLGpu::onCreateTexture(const GrSurfaceDesc& desc, return return_null_texture(); } + bool wasMipMapDataProvided = false; + if (texels.count() > 1) { + wasMipMapDataProvided = true; + } + GrGLTexture* tex; if (renderTarget) { // unbind the texture from the texture unit before binding it to the frame buffer @@ -1652,12 +1657,9 @@ GrTexture* GrGLGpu::onCreateTexture(const GrSurfaceDesc& desc, GL_CALL(DeleteTextures(1, &idDesc.fInfo.fID)); return return_null_texture(); } - tex = new GrGLTextureRenderTarget(this, budgeted, desc, idDesc, rtIDDesc); + tex = new GrGLTextureRenderTarget(this, budgeted, desc, idDesc, rtIDDesc, + wasMipMapDataProvided); } else { - bool wasMipMapDataProvided = false; - if (texels.count() > 1) { - wasMipMapDataProvided = true; - } tex = new GrGLTexture(this, budgeted, desc, idDesc, wasMipMapDataProvided); } tex->setCachedTexParams(initialTexParams, this->getResetTimestamp()); diff --git a/src/gpu/gl/GrGLRenderTarget.cpp b/src/gpu/gl/GrGLRenderTarget.cpp index 2f92e0a82d..5af5e67676 100644 --- a/src/gpu/gl/GrGLRenderTarget.cpp +++ b/src/gpu/gl/GrGLRenderTarget.cpp @@ -82,7 +82,7 @@ sk_sp<GrGLRenderTarget> GrGLRenderTarget::MakeWrapped(GrGLGpu* gpu, } size_t GrGLRenderTarget::onGpuMemorySize() const { - return GrRenderTarget::ComputeSize(fDesc, fNumSamplesOwnedPerPixel); + return GrSurface::ComputeSize(fDesc, fNumSamplesOwnedPerPixel, false); } bool GrGLRenderTarget::completeStencilAttachment() { @@ -183,7 +183,7 @@ void GrGLRenderTarget::dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) // Log any renderbuffer's contribution to memory. We only do this if we own the renderbuffer // (have a fMSColorRenderbufferID). if (fMSColorRenderbufferID) { - size_t size = GrRenderTarget::ComputeSize(fDesc, this->msaaSamples()); + size_t size = GrSurface::ComputeSize(fDesc, this->msaaSamples(), false); // Due to this resource having both a texture and a renderbuffer component, dump as // skia/gpu_resources/resource_#/renderbuffer diff --git a/src/gpu/gl/GrGLRenderTarget.h b/src/gpu/gl/GrGLRenderTarget.h index fc18e30437..11b23473cf 100644 --- a/src/gpu/gl/GrGLRenderTarget.h +++ b/src/gpu/gl/GrGLRenderTarget.h @@ -77,8 +77,7 @@ protected: void onAbandon() override; void onRelease() override; - // In protected because subclass GrGLTextureRenderTarget calls this version. - size_t onGpuMemorySize() const override; + int numSamplesOwnedPerPixel() const { return fNumSamplesOwnedPerPixel; } private: // Constructor for instances wrapping backend objects. @@ -89,6 +88,8 @@ private: GrGLGpu* getGLGpu() const; bool completeStencilAttachment() override; + size_t onGpuMemorySize() const override; + int msaaSamples() const; // The number total number of samples, including both MSAA and resolve texture samples. int totalSamples() const; diff --git a/src/gpu/gl/GrGLTexture.cpp b/src/gpu/gl/GrGLTexture.cpp index 4653c5bce7..ec0ad3b7f3 100644 --- a/src/gpu/gl/GrGLTexture.cpp +++ b/src/gpu/gl/GrGLTexture.cpp @@ -50,9 +50,10 @@ GrGLTexture::GrGLTexture(GrGLGpu* gpu, Wrapped, const GrSurfaceDesc& desc, const this->registerWithCacheWrapped(); } -GrGLTexture::GrGLTexture(GrGLGpu* gpu, const GrSurfaceDesc& desc, const IDDesc& idDesc) +GrGLTexture::GrGLTexture(GrGLGpu* gpu, const GrSurfaceDesc& desc, const IDDesc& idDesc, + bool wasMipMapDataProvided) : GrSurface(gpu, desc) - , INHERITED(gpu, desc, sampler_type(idDesc, gpu), false) { + , INHERITED(gpu, desc, sampler_type(idDesc, gpu), wasMipMapDataProvided) { this->init(desc, idDesc); } diff --git a/src/gpu/gl/GrGLTexture.h b/src/gpu/gl/GrGLTexture.h index ee027d790d..029fd87a1a 100644 --- a/src/gpu/gl/GrGLTexture.h +++ b/src/gpu/gl/GrGLTexture.h @@ -59,7 +59,7 @@ public: static sk_sp<GrGLTexture> MakeWrapped(GrGLGpu*, const GrSurfaceDesc&, const IDDesc&); protected: // Constructor for subclasses. - GrGLTexture(GrGLGpu*, const GrSurfaceDesc&, const IDDesc&); + GrGLTexture(GrGLGpu*, const GrSurfaceDesc&, const IDDesc&, bool wasMipMapDataProvided); enum Wrapped { kWrapped }; // Constructor for instances wrapping backend objects. diff --git a/src/gpu/gl/GrGLTextureRenderTarget.cpp b/src/gpu/gl/GrGLTextureRenderTarget.cpp index 9b37fbb343..9c350f89ae 100644 --- a/src/gpu/gl/GrGLTextureRenderTarget.cpp +++ b/src/gpu/gl/GrGLTextureRenderTarget.cpp @@ -49,5 +49,5 @@ sk_sp<GrGLTextureRenderTarget> GrGLTextureRenderTarget::MakeWrapped( const GrGLTexture::IDDesc& texIDDesc, const GrGLRenderTarget::IDDesc& rtIDDesc) { return sk_sp<GrGLTextureRenderTarget>( - new GrGLTextureRenderTarget(gpu, desc, texIDDesc, rtIDDesc)); + new GrGLTextureRenderTarget(gpu, desc, texIDDesc, rtIDDesc, false)); } diff --git a/src/gpu/gl/GrGLTextureRenderTarget.h b/src/gpu/gl/GrGLTextureRenderTarget.h index c5c020fef6..7ff8d490e0 100644 --- a/src/gpu/gl/GrGLTextureRenderTarget.h +++ b/src/gpu/gl/GrGLTextureRenderTarget.h @@ -12,6 +12,7 @@ #include "GrGLGpu.h" #include "GrGLTexture.h" #include "GrGLRenderTarget.h" +#include "GrTexturePriv.h" class GrGLGpu; @@ -29,9 +30,10 @@ public: SkBudgeted budgeted, const GrSurfaceDesc& desc, const GrGLTexture::IDDesc& texIDDesc, - const GrGLRenderTarget::IDDesc& rtIDDesc) + const GrGLRenderTarget::IDDesc& rtIDDesc, + bool wasMipMapDataProvided) : GrSurface(gpu, desc) - , GrGLTexture(gpu, desc, texIDDesc) + , GrGLTexture(gpu, desc, texIDDesc, wasMipMapDataProvided) , GrGLRenderTarget(gpu, desc, rtIDDesc) { this->registerWithCache(budgeted); } @@ -59,16 +61,18 @@ private: GrGLTextureRenderTarget(GrGLGpu* gpu, const GrSurfaceDesc& desc, const GrGLTexture::IDDesc& texIDDesc, - const GrGLRenderTarget::IDDesc& rtIDDesc) + const GrGLRenderTarget::IDDesc& rtIDDesc, + bool wasMipMapDataProvided) : GrSurface(gpu, desc) - , GrGLTexture(gpu, desc, texIDDesc) + , GrGLTexture(gpu, desc, texIDDesc, wasMipMapDataProvided) , GrGLRenderTarget(gpu, desc, rtIDDesc) { this->registerWithCacheWrapped(); } - // GrGLRenderTarget accounts for the texture's memory and any MSAA renderbuffer's memory. size_t onGpuMemorySize() const override { - return GrGLRenderTarget::onGpuMemorySize(); + return GrSurface::ComputeSize(fDesc, + this->numSamplesOwnedPerPixel(), + this->texturePriv().hasMipMaps()); } }; diff --git a/src/gpu/vk/GrVkRenderTarget.h b/src/gpu/vk/GrVkRenderTarget.h index 2e2f60a5fd..3e5c5eab17 100644 --- a/src/gpu/vk/GrVkRenderTarget.h +++ b/src/gpu/vk/GrVkRenderTarget.h @@ -100,7 +100,8 @@ protected: // This accounts for the texture's memory and any MSAA renderbuffer's memory. size_t onGpuMemorySize() const override { // The plus 1 is to account for the resolve texture. - return GrRenderTarget::ComputeSize(fDesc, fDesc.fSampleCnt+1); // TODO: this still correct? + // TODO: is this still correct? + return GrSurface::ComputeSize(fDesc, fDesc.fSampleCnt+1, false); } void createFramebuffer(GrVkGpu* gpu); diff --git a/src/gpu/vk/GrVkTextureRenderTarget.h b/src/gpu/vk/GrVkTextureRenderTarget.h index daa168758d..2877a36265 100644 --- a/src/gpu/vk/GrVkTextureRenderTarget.h +++ b/src/gpu/vk/GrVkTextureRenderTarget.h @@ -13,6 +13,8 @@ #include "GrVkRenderTarget.h" #include "GrVkGpu.h" +#include "GrTexturePriv.h" + #ifdef SK_BUILD_FOR_WIN // Windows gives bogus warnings about inheriting asTexture/asRenderTarget via dominance. #pragma warning(push) @@ -112,7 +114,9 @@ private: // GrGLRenderTarget accounts for the texture's memory and any MSAA renderbuffer's memory. size_t onGpuMemorySize() const override { - return GrVkRenderTarget::onGpuMemorySize(); + // The plus 1 is to account for the resolve texture. + return GrSurface::ComputeSize(fDesc, fDesc.fSampleCnt+1, // TODO: this still correct? + this->texturePriv().hasMipMaps()); } }; diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp index 3a42474708..e96653b88f 100644 --- a/tests/ResourceCacheTest.cpp +++ b/tests/ResourceCacheTest.cpp @@ -23,6 +23,7 @@ #include "SkCanvas.h" #include "SkGr.h" #include "SkMessageBus.h" +#include "SkMipMap.h" #include "SkSurface.h" #include "Test.h" @@ -1344,4 +1345,110 @@ DEF_GPUTEST(ResourceCacheMisc, reporter, factory) { test_abandoned(reporter); } +//////////////////////////////////////////////////////////////////////////////// +static sk_sp<GrTexture> make_normal_texture(GrTextureProvider* provider, + GrSurfaceFlags flags, + int width, int height, + int sampleCnt) { + GrSurfaceDesc desc; + desc.fFlags = flags; + desc.fWidth = width; + desc.fHeight = height; + desc.fConfig = kRGBA_8888_GrPixelConfig; + desc.fSampleCnt = sampleCnt; + + return sk_sp<GrTexture>(provider->createTexture(desc, SkBudgeted::kYes)); +} + +static sk_sp<GrTexture> make_mipmap_texture(GrTextureProvider* provider, + GrSurfaceFlags flags, + int width, int height, + int sampleCnt) { + SkBitmap bm; + + bm.allocN32Pixels(width, height, true); + bm.eraseColor(SK_ColorBLUE); + + SkAutoTUnref<SkMipMap> mipmaps(SkMipMap::Build(bm, SkSourceGammaTreatment::kIgnore, nullptr)); + SkASSERT(mipmaps); + SkASSERT(mipmaps->countLevels() > 1); + + int mipLevelCount = mipmaps->countLevels() + 1; + + std::unique_ptr<GrMipLevel[]> texels(new GrMipLevel[mipLevelCount]); + + texels[0].fPixels = bm.getPixels(); + texels[0].fRowBytes = bm.rowBytes(); + + for (int i = 1; i < mipLevelCount; ++i) { + SkMipMap::Level generatedMipLevel; + mipmaps->getLevel(i - 1, &generatedMipLevel); + texels[i].fPixels = generatedMipLevel.fPixmap.addr(); + texels[i].fRowBytes = generatedMipLevel.fPixmap.rowBytes(); + } + + GrSurfaceDesc desc; + desc.fFlags = flags; + desc.fWidth = width; + desc.fHeight = height; + desc.fConfig = kRGBA_8888_GrPixelConfig; + desc.fSampleCnt = sampleCnt; + desc.fIsMipMapped = true; + + return sk_sp<GrTexture>(provider->createMipMappedTexture(desc, SkBudgeted::kYes, + texels.get(), mipLevelCount)); +} + +// Exercise GrSurface::gpuMemorySize for different combos of MSAA, RT-only, +// Texture-only, both-RT-and-Texture and MIPmapped +DEF_GPUTEST_FOR_RENDERING_CONTEXTS(GPUMemorySize, reporter, ctxInfo) { + GrContext* context = ctxInfo.grContext(); + GrTextureProvider* provider = context->textureProvider(); + + // Vulkan is unhappy with this test + if (kVulkan_GrBackend == ctxInfo.backend()) { + return; + } + + static const int kSize = 64; + + sk_sp<GrTexture> tex; + + // Normal versions + tex = make_normal_texture(provider, kRenderTarget_GrSurfaceFlag, kSize, kSize, 0); + size_t size = tex->gpuMemorySize(); + REPORTER_ASSERT(reporter, kSize*kSize*4 == size); + + if (context->caps()->maxSampleCount() >= 4) { + tex = make_normal_texture(provider, kRenderTarget_GrSurfaceFlag, kSize, kSize, 4); + size = tex->gpuMemorySize(); + REPORTER_ASSERT(reporter, kSize*kSize*4 == size || // msaa4 failed + kSize*kSize*4*4 == size || // auto-resolving + kSize*kSize*4*5 == size); // explicit resolve buffer + } + + tex = make_normal_texture(provider, kNone_GrSurfaceFlags, kSize, kSize, 0); + size = tex->gpuMemorySize(); + REPORTER_ASSERT(reporter, kSize*kSize*4 == size); + + // Mipmapped versions + tex = make_mipmap_texture(provider, kRenderTarget_GrSurfaceFlag, kSize, kSize, 0); + size = tex->gpuMemorySize(); + REPORTER_ASSERT(reporter, kSize*kSize*4+(kSize*kSize*4)/3 == size); + + if (context->caps()->maxSampleCount() >= 4) { + tex = make_mipmap_texture(provider, kRenderTarget_GrSurfaceFlag, kSize, kSize, 4); + size = tex->gpuMemorySize(); + REPORTER_ASSERT(reporter, + kSize*kSize*4+(kSize*kSize*4)/3 == size || // msaa4 failed + kSize*kSize*4*4+(kSize*kSize*4)/3 == size || // auto-resolving + kSize*kSize*4*5+(kSize*kSize*4)/3 == size); // explicit resolve buffer + } + + tex = make_mipmap_texture(provider, kNone_GrSurfaceFlags, kSize, kSize, 0); + size = tex->gpuMemorySize(); + REPORTER_ASSERT(reporter, kSize*kSize*4+(kSize*kSize*4)/3 == size); +} + + #endif |