| Index: tests/ResourceCacheTest.cpp
|
| diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp
|
| index 64cd327b81181f08a519426551f1d09697960e37..d9e4c18a7d41bd1eceb8299ac68f599322151cb8 100644
|
| --- a/tests/ResourceCacheTest.cpp
|
| +++ b/tests/ResourceCacheTest.cpp
|
| @@ -63,6 +63,73 @@ static void test_cache(skiatest::Reporter* reporter, GrContext* context, SkCanva
|
| context->setResourceCacheLimits(oldMaxNum, oldMaxBytes);
|
| }
|
|
|
| +static void test_stencil_buffers(skiatest::Reporter* reporter, GrContext* context) {
|
| + GrSurfaceDesc smallDesc;
|
| + smallDesc.fFlags = kRenderTarget_GrSurfaceFlag;
|
| + smallDesc.fConfig = kSkia8888_GrPixelConfig;
|
| + smallDesc.fWidth = 4;
|
| + smallDesc.fHeight = 4;
|
| + smallDesc.fSampleCnt = 0;
|
| +
|
| + // Test that two budgeted RTs with the same desc share a stencil buffer.
|
| + SkAutoTUnref<GrTexture> smallRT0(context->createTexture(smallDesc, true));
|
| + SkAutoTUnref<GrTexture> smallRT1(context->createTexture(smallDesc, true));
|
| + REPORTER_ASSERT(reporter, smallRT0 && smallRT1 &&
|
| + smallRT0->asRenderTarget() && smallRT1->asRenderTarget() &&
|
| + smallRT0->asRenderTarget()->getStencilBuffer() ==
|
| + smallRT1->asRenderTarget()->getStencilBuffer());
|
| +
|
| + // An unbudgeted RT with the same desc should also share.
|
| + SkAutoTUnref<GrTexture> smallRT2(context->createTexture(smallDesc, false));
|
| + REPORTER_ASSERT(reporter, smallRT0 && smallRT2 &&
|
| + smallRT0->asRenderTarget() && smallRT2->asRenderTarget() &&
|
| + smallRT0->asRenderTarget()->getStencilBuffer() ==
|
| + smallRT2->asRenderTarget()->getStencilBuffer());
|
| +
|
| + // An RT with a much larger size should not share.
|
| + GrSurfaceDesc bigDesc;
|
| + bigDesc.fFlags = kRenderTarget_GrSurfaceFlag;
|
| + bigDesc.fConfig = kSkia8888_GrPixelConfig;
|
| + bigDesc.fWidth = 400;
|
| + bigDesc.fHeight = 200;
|
| + bigDesc.fSampleCnt = 0;
|
| + SkAutoTUnref<GrTexture> bigRT(context->createTexture(bigDesc, false));
|
| + REPORTER_ASSERT(reporter, smallRT0 && bigRT &&
|
| + smallRT0->asRenderTarget() && bigRT->asRenderTarget() &&
|
| + smallRT0->asRenderTarget()->getStencilBuffer() !=
|
| + bigRT->asRenderTarget()->getStencilBuffer());
|
| +
|
| + if (context->getMaxSampleCount() >= 4) {
|
| + // An RT with a different sample count should not share.
|
| + GrSurfaceDesc smallMSAADesc = smallDesc;
|
| + smallMSAADesc.fSampleCnt = 4;
|
| + SkAutoTUnref<GrTexture> smallMSAART0(context->createTexture(smallMSAADesc, false));
|
| + REPORTER_ASSERT(reporter, smallRT0 && smallMSAART0 &&
|
| + smallRT0->asRenderTarget() && smallMSAART0->asRenderTarget() &&
|
| + smallRT0->asRenderTarget()->getStencilBuffer() !=
|
| + smallMSAART0->asRenderTarget()->getStencilBuffer());
|
| + // A second MSAA RT should share with the first MSAA RT.
|
| + SkAutoTUnref<GrTexture> smallMSAART1(context->createTexture(smallMSAADesc, false));
|
| + REPORTER_ASSERT(reporter, smallMSAART0 && smallMSAART1 &&
|
| + smallMSAART0->asRenderTarget() &&
|
| + smallMSAART1->asRenderTarget() &&
|
| + smallMSAART0->asRenderTarget()->getStencilBuffer() ==
|
| + smallMSAART1->asRenderTarget()->getStencilBuffer());
|
| + // But not one with a larger sample count should not. (Also check that the request for 4
|
| + // samples didn't get rounded up to >= 8 or else they could share.).
|
| + if (context->getMaxSampleCount() >= 8 && smallMSAART0 && smallMSAART0->asRenderTarget() &&
|
| + smallMSAART0->asRenderTarget()->numSamples() < 8) {
|
| + smallMSAADesc.fSampleCnt = 8;
|
| + smallMSAART1.reset(context->createTexture(smallMSAADesc, false));
|
| + REPORTER_ASSERT(reporter, smallMSAART0 && smallMSAART1 &&
|
| + smallMSAART0->asRenderTarget() &&
|
| + smallMSAART1->asRenderTarget() &&
|
| + smallMSAART0->asRenderTarget()->getStencilBuffer() !=
|
| + smallMSAART1->asRenderTarget()->getStencilBuffer());
|
| + }
|
| + }
|
| +}
|
| +
|
| class TestResource : public GrGpuResource {
|
| static const size_t kDefaultSize = 100;
|
| enum ScratchConstructor { kScratchConstructor };
|
| @@ -936,6 +1003,7 @@ DEF_GPUTEST(ResourceCache, reporter, factory) {
|
| SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(context,
|
| SkSurface::kNo_Budgeted, info));
|
| test_cache(reporter, context, surface->getCanvas());
|
| + test_stencil_buffers(reporter, context);
|
| }
|
|
|
| // The below tests create their own mock contexts.
|
|
|