/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkTypes.h" #if SK_SUPPORT_GPU #include "GrContext.h" #include "GrContextFactory.h" #include "GrTexture.h" #include "GrTexturePriv.h" #include "SkCanvas.h" #include "SkGr.h" #include "SkSurface.h" #include "Test.h" // Tests that GrSurface::asTexture(), GrSurface::asRenderTarget(), and static upcasting of texture // and render targets to GrSurface all work as expected. DEF_GPUTEST(GrTextureMipMapInvalidationTest, reporter, factory) { GrContext* context = factory->get(GrContextFactory::kNull_GLContextType); if (context) { GrSurfaceDesc desc; desc.fConfig = kSkia8888_GrPixelConfig; desc.fFlags = kRenderTarget_GrSurfaceFlag; desc.fWidth = 256; desc.fHeight = 256; desc.fSampleCnt = 0; GrSurface* texRT1 = context->textureProvider()->createTexture(desc, false, nullptr, 0); GrSurface* texRT2 = context->textureProvider()->createTexture(desc, false, nullptr, 0); REPORTER_ASSERT(reporter, nullptr != texRT1); REPORTER_ASSERT(reporter, nullptr != texRT2); GrTexture* tex = texRT1->asTexture(); REPORTER_ASSERT(reporter, nullptr != tex); SkBitmap bitmap; GrWrapTextureInBitmap(tex, 256, 256, false, &bitmap); // No mipmaps initially REPORTER_ASSERT(reporter, false == tex->texturePriv().hasMipMaps()); // Painting with downscale and medium filter quality should result in mipmap creation SkSurface* surface = SkSurface::NewRenderTargetDirect(texRT2->asRenderTarget()); SkPaint paint; paint.setFilterQuality(kMedium_SkFilterQuality); surface->getCanvas()->scale(0.2f, 0.2f); surface->getCanvas()->drawBitmap(bitmap, 0, 0, &paint); context->flush(); REPORTER_ASSERT(reporter, true == tex->texturePriv().hasMipMaps()); REPORTER_ASSERT(reporter, false == tex->texturePriv().mipMapsAreDirty()); // Invalidating the contents of the bitmap should invalidate the mipmap, but not de-allocate bitmap.notifyPixelsChanged(); REPORTER_ASSERT(reporter, true == tex->texturePriv().hasMipMaps()); REPORTER_ASSERT(reporter, true == tex->texturePriv().mipMapsAreDirty()); surface->unref(); texRT1->unref(); texRT2->unref(); } } #endif