Dynamically create stencil buffer when needed.
Review URL: https://codereview.chromium.org/938383004
diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp
index d063b6a..b6e1eb7 100644
--- a/tests/ResourceCacheTest.cpp
+++ b/tests/ResourceCacheTest.cpp
@@ -12,6 +12,8 @@
#include "GrGpu.h"
#include "GrGpuResourceCacheAccess.h"
#include "GrGpuResourcePriv.h"
+#include "GrRenderTarget.h"
+#include "GrRenderTargetPriv.h"
#include "GrResourceCache.h"
#include "SkCanvas.h"
#include "SkGr.h"
@@ -73,18 +75,29 @@
// Test that two budgeted RTs with the same desc share a stencil buffer.
SkAutoTUnref<GrTexture> smallRT0(context->createTexture(smallDesc, true));
+ if (smallRT0 && smallRT0->asRenderTarget()) {
+ smallRT0->asRenderTarget()->renderTargetPriv().attachStencilBuffer();
+ }
+
SkAutoTUnref<GrTexture> smallRT1(context->createTexture(smallDesc, true));
+ if (smallRT1 && smallRT1->asRenderTarget()) {
+ smallRT1->asRenderTarget()->renderTargetPriv().attachStencilBuffer();
+ }
+
REPORTER_ASSERT(reporter, smallRT0 && smallRT1 &&
smallRT0->asRenderTarget() && smallRT1->asRenderTarget() &&
- smallRT0->asRenderTarget()->getStencilBuffer() ==
- smallRT1->asRenderTarget()->getStencilBuffer());
+ smallRT0->asRenderTarget()->renderTargetPriv().getStencilBuffer() ==
+ smallRT1->asRenderTarget()->renderTargetPriv().getStencilBuffer());
// An unbudgeted RT with the same desc should also share.
SkAutoTUnref<GrTexture> smallRT2(context->createTexture(smallDesc, false));
+ if (smallRT2 && smallRT2->asRenderTarget()) {
+ smallRT2->asRenderTarget()->renderTargetPriv().attachStencilBuffer();
+ }
REPORTER_ASSERT(reporter, smallRT0 && smallRT2 &&
smallRT0->asRenderTarget() && smallRT2->asRenderTarget() &&
- smallRT0->asRenderTarget()->getStencilBuffer() ==
- smallRT2->asRenderTarget()->getStencilBuffer());
+ smallRT0->asRenderTarget()->renderTargetPriv().getStencilBuffer() ==
+ smallRT2->asRenderTarget()->renderTargetPriv().getStencilBuffer());
// An RT with a much larger size should not share.
GrSurfaceDesc bigDesc;
@@ -94,44 +107,60 @@
bigDesc.fHeight = 200;
bigDesc.fSampleCnt = 0;
SkAutoTUnref<GrTexture> bigRT(context->createTexture(bigDesc, false));
+ if (bigRT && bigRT->asRenderTarget()) {
+ bigRT->asRenderTarget()->renderTargetPriv().attachStencilBuffer();
+ }
REPORTER_ASSERT(reporter, smallRT0 && bigRT &&
smallRT0->asRenderTarget() && bigRT->asRenderTarget() &&
- smallRT0->asRenderTarget()->getStencilBuffer() !=
- bigRT->asRenderTarget()->getStencilBuffer());
+ smallRT0->asRenderTarget()->renderTargetPriv().getStencilBuffer() !=
+ bigRT->asRenderTarget()->renderTargetPriv().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));
+ if (smallMSAART0 && smallMSAART0->asRenderTarget()) {
+ smallMSAART0->asRenderTarget()->renderTargetPriv().attachStencilBuffer();
+ }
#ifdef SK_BUILD_FOR_ANDROID
if (!smallMSAART0) {
// The nexus player seems to fail to create MSAA textures.
return;
}
#endif
- REPORTER_ASSERT(reporter, smallRT0 && smallMSAART0 &&
- smallRT0->asRenderTarget() && smallMSAART0->asRenderTarget() &&
- smallRT0->asRenderTarget()->getStencilBuffer() !=
- smallMSAART0->asRenderTarget()->getStencilBuffer());
+ REPORTER_ASSERT(reporter,
+ smallRT0 && smallMSAART0 &&
+ smallRT0->asRenderTarget() && smallMSAART0->asRenderTarget() &&
+ smallRT0->asRenderTarget()->renderTargetPriv().getStencilBuffer() !=
+ smallMSAART0->asRenderTarget()->renderTargetPriv().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());
+ if (smallMSAART1 && smallMSAART1->asRenderTarget()) {
+ smallMSAART1->asRenderTarget()->renderTargetPriv().attachStencilBuffer();
+ }
+ REPORTER_ASSERT(reporter,
+ smallMSAART0 && smallMSAART1 &&
+ smallMSAART0->asRenderTarget() &&
+ smallMSAART1->asRenderTarget() &&
+ smallMSAART0->asRenderTarget()->renderTargetPriv().getStencilBuffer() ==
+ smallMSAART1->asRenderTarget()->renderTargetPriv().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());
+ SkAutoTUnref<GrTexture> smallMSAART1(context->createTexture(smallMSAADesc, false));
+ if (smallMSAART1 && smallMSAART1->asRenderTarget()) {
+ smallMSAART1->asRenderTarget()->renderTargetPriv().attachStencilBuffer();
+ }
+ REPORTER_ASSERT(reporter,
+ smallMSAART0 && smallMSAART1 &&
+ smallMSAART0->asRenderTarget() &&
+ smallMSAART1->asRenderTarget() &&
+ smallMSAART0->asRenderTarget()->renderTargetPriv().getStencilBuffer() !=
+ smallMSAART1->asRenderTarget()->renderTargetPriv().getStencilBuffer());
}
}
}