/* * 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 "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_FOR_NULLGL_CONTEXT(GrTextureMipMapInvalidationTest, reporter, ctxInfo) { GrContext* context = ctxInfo.fGrContext; 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, SkBudgeted::kNo, nullptr, 0); GrSurface* texRT2 = context->textureProvider()->createTexture( desc, SkBudgeted::kNo, 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 auto surface = SkSurface::MakeRenderTargetDirect(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()); texRT1->unref(); texRT2->unref(); } #endif