aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/GrSurfaceTest.cpp
diff options
context:
space:
mode:
authorGravatar Brian Salomon <bsalomon@google.com>2017-05-23 10:43:51 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-23 18:07:25 +0000
commit45e5068a6d10f4e4fd4658824310f8871f02ccf7 (patch)
tree6d6fa75f2539789b5c6021f628e5ad543681af09 /tests/GrSurfaceTest.cpp
parentccb46aaef838e1bd9d2feb249fb65aa935d7dc2c (diff)
Add a flag to GrSurfaceFlags that requires the texture to be cleared upon creation.
Bug: chromium:656320 Change-Id: I940bfa24540516ab83a2ed52f761b96eb6ad19f1 Reviewed-on: https://skia-review.googlesource.com/17391 Reviewed-by: Greg Daniel <egdaniel@google.com> Commit-Queue: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'tests/GrSurfaceTest.cpp')
-rw-r--r--tests/GrSurfaceTest.cpp97
1 files changed, 97 insertions, 0 deletions
diff --git a/tests/GrSurfaceTest.cpp b/tests/GrSurfaceTest.cpp
index 19f2df50fe..51b5362ab0 100644
--- a/tests/GrSurfaceTest.cpp
+++ b/tests/GrSurfaceTest.cpp
@@ -123,4 +123,101 @@ DEF_GPUTEST_FOR_ALL_CONTEXTS(GrSurfaceRenderability, reporter, ctxInfo) {
}
#endif
+#include "GrDrawingManager.h"
+#include "GrSurfaceProxy.h"
+#include "GrTextureContext.h"
+
+DEF_GPUTEST_FOR_RENDERING_CONTEXTS(InitialTextureClear, reporter, context_info) {
+ static constexpr int kSize = 100;
+ GrSurfaceDesc desc;
+ desc.fWidth = desc.fHeight = kSize;
+ uint32_t data[kSize * kSize];
+ GrContext* context = context_info.grContext();
+ for (int c = 0; c <= kLast_GrPixelConfig; ++c) {
+ desc.fConfig = static_cast<GrPixelConfig>(c);
+ if (!context_info.grContext()->caps()->isConfigTexturable(desc.fConfig)) {
+ continue;
+ }
+ desc.fFlags = kPerformInitialClear_GrSurfaceFlag;
+ for (bool rt : {false, true}) {
+ if (rt && !context->caps()->isConfigRenderable(desc.fConfig, false)) {
+ continue;
+ }
+ desc.fFlags |= rt ? kRenderTarget_GrSurfaceFlag : kNone_GrSurfaceFlags;
+ for (bool mipped : {false, true}) {
+ desc.fIsMipMapped = mipped;
+ for (GrSurfaceOrigin origin :
+ {kTopLeft_GrSurfaceOrigin, kBottomLeft_GrSurfaceOrigin}) {
+ desc.fOrigin = origin;
+ for (bool approx : {false, true}) {
+ auto resourceProvider = context->resourceProvider();
+ // Try directly creating the texture.
+ // Do this twice in an attempt to hit the cache on the second time through.
+ for (int i = 0; i < 2; ++i) {
+ sk_sp<GrTexture> tex;
+ if (approx) {
+ tex = sk_sp<GrTexture>(
+ resourceProvider->createApproxTexture(desc, 0));
+ } else {
+ tex = resourceProvider->createTexture(desc, SkBudgeted::kYes);
+ }
+ if (!tex) {
+ continue;
+ }
+ auto proxy = GrSurfaceProxy::MakeWrapped(std::move(tex));
+ auto texCtx = context->contextPriv().makeWrappedSurfaceContext(
+ std::move(proxy), nullptr);
+ SkImageInfo info = SkImageInfo::Make(
+ kSize, kSize, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
+ memset(data, 0xAB, kSize * kSize * sizeof(uint32_t));
+ if (texCtx->readPixels(info, data, 0, 0, 0)) {
+ uint32_t cmp = GrPixelConfigIsOpaque(desc.fConfig) ? 0xFF000000 : 0;
+ for (int i = 0; i < kSize * kSize; ++i) {
+ if (cmp != data[i]) {
+ ERRORF(reporter, "Failed on config %d", desc.fConfig);
+ break;
+ }
+ }
+ }
+ memset(data, 0xBC, kSize * kSize * sizeof(uint32_t));
+ // Here we overwrite the texture so that the second time through we
+ // test against recycling without reclearing.
+ if (0 == i) {
+ texCtx->writePixels(info, data, 0, 0, 0);
+ }
+ }
+ context->purgeAllUnlockedResources();
+ // Try creating the texture as a deferred proxy.
+ for (int i = 0; i < 2; ++i) {
+ auto surfCtx = context->contextPriv().makeDeferredSurfaceContext(
+ desc, approx ? SkBackingFit::kApprox : SkBackingFit::kExact,
+ SkBudgeted::kYes);
+ if (!surfCtx) {
+ continue;
+ }
+ SkImageInfo info = SkImageInfo::Make(
+ kSize, kSize, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
+ memset(data, 0xAB, kSize * kSize * sizeof(uint32_t));
+ if (surfCtx->readPixels(info, data, 0, 0, 0)) {
+ uint32_t cmp = GrPixelConfigIsOpaque(desc.fConfig) ? 0xFF000000 : 0;
+ for (int i = 0; i < kSize * kSize; ++i) {
+ if (cmp != data[i]) {
+ ERRORF(reporter, "Failed on config %d", desc.fConfig);
+ break;
+ }
+ }
+ }
+ // Here we overwrite the texture so that the second time through we
+ // test against recycling without reclearing.
+ if (0 == i) {
+ surfCtx->writePixels(info, data, 0, 0, 0);
+ }
+ }
+ context->purgeAllUnlockedResources();
+ }
+ }
+ }
+ }
+ }
+}
#endif