1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2016 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// This is a GPU-backend specific test.
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Test.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// MDB TODO: the early instantiation of the renderTargetContext's backing GrRenderTargetProxy
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// mixes this test up. Re-enable once backing GPU resources are distributed by MDB at flush time.
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if 0
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if SK_SUPPORT_GPU
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrTextureProxy.h"
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrRenderTargetContext.h"
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic const int kSize = 64;
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<GrRenderTargetContext> get_rtc(GrContext* ctx) {
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return ctx->makeDeferredRenderTargetContext(SkBackingFit::kExact,
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                kSize, kSize,
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                kRGBA_8888_GrPixelConfig, nullptr);
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void check_is_wrapped_status(skiatest::Reporter* reporter,
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    GrRenderTargetContext* rtCtx,
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    bool wrappedExpectation) {
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    REPORTER_ASSERT(reporter, rtCtx->isWrapped_ForTesting() == wrappedExpectation);
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrTextureProxy* tProxy = rtCtx->asTextureProxy();
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    REPORTER_ASSERT(reporter, tProxy);
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    REPORTER_ASSERT(reporter, tProxy->isWrapped_ForTesting() == wrappedExpectation);
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GPUTEST_FOR_RENDERING_CONTEXTS(RenderTargetContextTest, reporter, ctxInfo) {
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrContext* ctx = ctxInfo.grContext();
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Calling instantiate on a GrRenderTargetContext's textureProxy also instantiates the
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // GrRenderTargetContext
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    {
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<GrRenderTargetContext> rtCtx(get_rtc(ctx));
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        check_is_wrapped_status(reporter, rtCtx.get(), false);
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrTextureProxy* tProxy = rtCtx->asTextureProxy();
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        REPORTER_ASSERT(reporter, tProxy);
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        REPORTER_ASSERT(reporter, tProxy->instantiate(ctx->resourceProvider()));
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        check_is_wrapped_status(reporter, rtCtx.get(), true);
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // readPixels switches a deferred rtCtx to wrapped
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    {
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<GrRenderTargetContext> rtCtx(get_rtc(ctx));
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        check_is_wrapped_status(reporter, rtCtx.get(), false);
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkImageInfo dstInfo = SkImageInfo::MakeN32Premul(kSize, kSize);
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkAutoTMalloc<uint32_t> dstBuffer(kSize * kSize);
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        static const size_t kRowBytes = sizeof(uint32_t) * kSize;
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bool result = rtCtx->readPixels(dstInfo, dstBuffer.get(), kRowBytes, 0, 0);
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        REPORTER_ASSERT(reporter, result);
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        check_is_wrapped_status(reporter, rtCtx.get(), true);
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // TODO: in a future world we should be able to add a test that the majority of
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // GrRenderTargetContext calls do not force the instantiation of a deferred
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // GrRenderTargetContext
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
79