151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips/*
251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips * Copyright 2017 Google Inc.
351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips *
451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips * Use of this source code is governed by a BSD-style license that can be
551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips * found in the LICENSE file.
651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips */
751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips#include "Test.h"
951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
1051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips#if SK_SUPPORT_GPU
1151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
1251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips#include "GrSurfaceProxy.h"
1351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips#include "GrTextureProducer.h"
1451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips#include "GrTextureProxy.h"
1551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
1651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips// For DetermineDomainMode (in the MDB world) we have 4 rects:
1751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips//      1) the final instantiated backing storage (i.e., the actual GrTexture's extent)
1851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips//      2) the proxy's extent, which may or may not match the GrTexture's extent
1951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips//      3) the content rect, which can be a subset of the proxy's extent or null
2051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips//      4) the constraint rect, which can optionally be hard or soft
2151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips// This test "fuzzes" all the combinations of these rects.
2251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsclass GrTextureProducer_TestAccess {
2351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipspublic:
2451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    using DomainMode = GrTextureProducer::DomainMode;
2551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
2651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    static DomainMode DetermineDomainMode(
2751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                const SkRect& constraintRect,
2851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                GrTextureProducer::FilterConstraint filterConstraint,
2951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                bool coordsLimitedToConstraintRect,
3051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                GrTextureProxy* proxy,
3151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                const SkIRect* textureContentArea,
3251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                const GrSamplerParams::FilterMode* filterModeOrNullForBicubic,
3351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                SkRect* domainRect) {
3451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        return GrTextureProducer::DetermineDomainMode(constraintRect,
3551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                      filterConstraint,
3651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                      coordsLimitedToConstraintRect,
3751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                      proxy,
3851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                      textureContentArea,
3951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                      filterModeOrNullForBicubic,
4051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                      domainRect);
4151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    }
4251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips};
4351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
4451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsusing DomainMode = GrTextureProducer_TestAccess::DomainMode;
4551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
4651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips#ifdef SK_DEBUG
4751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic bool is_irect(const SkRect& r) {
4851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    return SkScalarIsInt(r.fLeft)  && SkScalarIsInt(r.fTop) &&
4951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips           SkScalarIsInt(r.fRight) && SkScalarIsInt(r.fBottom);
5051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips}
5151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips#endif
5251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
5351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic SkIRect to_irect(const SkRect& r) {
5451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    SkASSERT(is_irect(r));
5551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    return SkIRect::MakeLTRB(SkScalarRoundToInt(r.fLeft),
5651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                             SkScalarRoundToInt(r.fTop),
5751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                             SkScalarRoundToInt(r.fRight),
5851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                             SkScalarRoundToInt(r.fBottom));
5951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips}
6051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
6151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
6251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsclass RectInfo {
6351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipspublic:
6451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    enum Side { kLeft = 0, kTop = 1, kRight = 2, kBot = 3 };
6551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
6651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    enum EdgeType {
6751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        kSoft = 0,   // there is data on the other side of this edge that we are allowed to sample
6851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        kHard = 1,   // the backing resource ends at this edge
6951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        kBad  = 2    // we can't sample across this edge
7051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    };
7151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
7251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    void set(const SkRect& rect, EdgeType left, EdgeType top, EdgeType right, EdgeType bot,
7351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips             const char* name) {
7451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        fRect = rect;
7551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        fTypes[kLeft]  = left;
7651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        fTypes[kTop]   = top;
7751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        fTypes[kRight] = right;
7851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        fTypes[kBot]   = bot;
7951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        fName = name;
8051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    }
8151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
8251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    const SkRect& rect() const { return fRect; }
8351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    EdgeType edgeType(Side side) const { return fTypes[side]; }
8451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    const char* name() const { return fName; }
8551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
8651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips#ifdef SK_DEBUG
8751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    bool isHardOrBadAllAround() const {
8851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        for (int i = 0; i < 4; ++i) {
8951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips            if (kHard != fTypes[i] && kBad != fTypes[i]) {
9051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                return false;
9151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips            }
9251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        }
9351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        return true;
9451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    }
9551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips#endif
9651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
9751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    bool hasABad() const {
9851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        for (int i = 0; i < 4; ++i) {
9951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips            if (kBad == fTypes[i]) {
10051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                return true;
10151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips            }
10251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        }
10351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        return false;
10451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    }
10551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
10651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips#ifdef SK_DEBUG
10751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    void print(const char* label) const {
10851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        SkDebugf("%s: %s (%.1f, %.1f, %.1f, %.1f), L: %s T: %s R: %s B: %s\n",
10951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                 label, fName,
11051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                 fRect.fLeft, fRect.fTop, fRect.fRight, fRect.fBottom,
11151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                 ToStr(fTypes[kLeft]), ToStr(fTypes[kTop]),
11251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                 ToStr(fTypes[kRight]), ToStr(fTypes[kBot]));
11351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    }
11451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips#endif
11551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
11651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsprivate:
11751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips#ifdef SK_DEBUG
11851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    static const char* ToStr(EdgeType type) {
11951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        static const char* names[] = { "soft", "hard", "bad" };
12051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        return names[type];
12151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    }
12251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips#endif
12351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
12451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    RectInfo operator=(const RectInfo& other); // disallow
12551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
12651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    SkRect      fRect;
12751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    EdgeType    fTypes[4];
12851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    const char* fName;
12951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
13051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips};
13151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
13251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic sk_sp<GrTextureProxy> create_proxy(GrResourceProvider* resourceProvider,
13351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                          bool isPowerOfTwo,
13451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                          bool isExact,
13551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                          RectInfo* rect) {
13651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    int size = isPowerOfTwo ? 128 : 100;
13751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    SkBackingFit fit = isExact ? SkBackingFit::kExact : SkBackingFit::kApprox;
13851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
13951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    GrSurfaceDesc desc;
14051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    desc.fConfig = kRGBA_8888_GrPixelConfig;
14151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    desc.fWidth = size;
14251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    desc.fHeight = size;
14351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
14451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    static const char* name = "proxy";
14551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
14651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    // Proxies are always hard on the left and top but can be bad on the right and bottom
14751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    rect->set(SkRect::MakeWH(size, size),
14851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips              RectInfo::kHard,
14951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips              RectInfo::kHard,
15051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips              (isPowerOfTwo || isExact) ? RectInfo::kHard : RectInfo::kBad,
15151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips              (isPowerOfTwo || isExact) ? RectInfo::kHard : RectInfo::kBad,
15251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips              name);
15351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
15451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    sk_sp<GrTextureProxy> proxy = GrSurfaceProxy::MakeDeferred(resourceProvider,
15551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                               desc, fit,
15651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                               SkBudgeted::kYes);
15751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    return proxy;
15851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips}
15951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
16051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic RectInfo::EdgeType compute_inset_edgetype(RectInfo::EdgeType previous,
16151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                 bool isInsetHard, bool coordsAreLimitedToRect,
16251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                 float insetAmount, float halfFilterWidth) {
16351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    if (isInsetHard) {
16451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        if (coordsAreLimitedToRect) {
16551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips            SkASSERT(halfFilterWidth >= 0.0f);
16651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips            if (0.0f == halfFilterWidth) {
16751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                return RectInfo::kSoft;
16851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips            }
16951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        }
17051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
17151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        if (0.0f == insetAmount && RectInfo::kHard == previous) {
17251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips            return RectInfo::kHard;
17351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        }
17451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
17551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        return RectInfo::kBad;
17651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    }
17751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
17851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    if (RectInfo::kHard == previous) {
17951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        return RectInfo::kHard;
18051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    }
18151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
18251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    if (coordsAreLimitedToRect) {
18351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        SkASSERT(halfFilterWidth >= 0.0f);
18451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        if (0.0 == halfFilterWidth || insetAmount > halfFilterWidth) {
18551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips            return RectInfo::kSoft;
18651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        }
18751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    }
18851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
18951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    return previous;
19051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips}
19151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
19251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic const int kInsetLeft_Flag  = 0x1;
19351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic const int kInsetTop_Flag   = 0x2;
19451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic const int kInsetRight_Flag = 0x4;
19551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic const int kInsetBot_Flag   = 0x8;
19651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
19751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips// If 'isInsetHard' is true we can't sample across the inset boundary.
19851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips// If 'areCoordsLimitedToRect' is true the client promises to never sample outside the inset.
19951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic const SkRect* generic_inset(const RectInfo& enclosing,
20051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                   RectInfo* result,
20151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                   bool isInsetHard,
20251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                   bool areCoordsLimitedToRect,
20351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                   float insetAmount,
20451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                   float halfFilterWidth,
20551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                   uint32_t flags,
20651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                   const char* name) {
20751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    SkRect newR = enclosing.rect();
20851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
20951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    RectInfo::EdgeType left = enclosing.edgeType(RectInfo::kLeft);
21051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    if (flags & kInsetLeft_Flag) {
21151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        newR.fLeft += insetAmount;
21251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        left = compute_inset_edgetype(left, isInsetHard, areCoordsLimitedToRect,
21351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                      insetAmount, halfFilterWidth);
21451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    } else {
21551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        left = compute_inset_edgetype(left, isInsetHard, areCoordsLimitedToRect,
21651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                      0.0f, halfFilterWidth);
21751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    }
21851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
21951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    RectInfo::EdgeType top = enclosing.edgeType(RectInfo::kTop);
22051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    if (flags & kInsetTop_Flag) {
22151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        newR.fTop += insetAmount;
22251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        top = compute_inset_edgetype(top, isInsetHard, areCoordsLimitedToRect,
22351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                     insetAmount, halfFilterWidth);
22451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    } else {
22551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        top = compute_inset_edgetype(top, isInsetHard, areCoordsLimitedToRect,
22651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                     0.0f, halfFilterWidth);
22751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    }
22851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
22951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    RectInfo::EdgeType right = enclosing.edgeType(RectInfo::kRight);
23051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    if (flags & kInsetRight_Flag) {
23151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        newR.fRight -= insetAmount;
23251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        right = compute_inset_edgetype(right, isInsetHard, areCoordsLimitedToRect,
23351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                       insetAmount, halfFilterWidth);
23451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    } else {
23551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        right = compute_inset_edgetype(right, isInsetHard, areCoordsLimitedToRect,
23651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                       0.0f, halfFilterWidth);
23751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    }
23851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
23951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    RectInfo::EdgeType bot = enclosing.edgeType(RectInfo::kBot);
24051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    if (flags & kInsetBot_Flag) {
24151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        newR.fBottom -= insetAmount;
24251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        bot = compute_inset_edgetype(bot, isInsetHard, areCoordsLimitedToRect,
24351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                     insetAmount, halfFilterWidth);
24451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    } else {
24551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        bot = compute_inset_edgetype(bot, isInsetHard, areCoordsLimitedToRect,
24651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                     0.0f, halfFilterWidth);
24751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    }
24851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
24951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    result->set(newR, left, top, right, bot, name);
25051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    return &result->rect();
25151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips}
25251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
25351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips// Make a rect that only touches the enclosing rect on the left.
25451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic const SkRect* left_only(const RectInfo& enclosing,
25551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               RectInfo* result,
25651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               bool isInsetHard,
25751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               bool areCoordsLimitedToRect,
25851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               float insetAmount,
25951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               float halfFilterWidth) {
26051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    static const char* name = "left";
26151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    return generic_inset(enclosing, result, isInsetHard, areCoordsLimitedToRect,
26251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                         insetAmount, halfFilterWidth,
26351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                         kInsetTop_Flag|kInsetRight_Flag|kInsetBot_Flag, name);
26451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips}
26551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
26651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips// Make a rect that only touches the enclosing rect on the top.
26751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic const SkRect* top_only(const RectInfo& enclosing,
26851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               RectInfo* result,
26951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               bool isInsetHard,
27051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               bool areCoordsLimitedToRect,
27151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               float insetAmount,
27251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               float halfFilterWidth) {
27351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    static const char* name = "top";
27451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    return generic_inset(enclosing, result, isInsetHard, areCoordsLimitedToRect,
27551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                         insetAmount, halfFilterWidth,
27651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                         kInsetLeft_Flag|kInsetRight_Flag|kInsetBot_Flag, name);
27751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips}
27851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
27951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips// Make a rect that only touches the enclosing rect on the right.
28051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic const SkRect* right_only(const RectInfo& enclosing,
28151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                RectInfo* result,
28251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                bool isInsetHard,
28351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                bool areCoordsLimitedToRect,
28451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                float insetAmount,
28551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                float halfFilterWidth) {
28651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    static const char* name = "right";
28751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    return generic_inset(enclosing, result, isInsetHard, areCoordsLimitedToRect,
28851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                         insetAmount, halfFilterWidth,
28951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                         kInsetLeft_Flag|kInsetTop_Flag|kInsetBot_Flag, name);
29051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips}
29151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
29251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips// Make a rect that only touches the enclosing rect on the bottom.
29351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic const SkRect* bot_only(const RectInfo& enclosing,
29451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                              RectInfo* result,
29551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                              bool isInsetHard,
29651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                              bool areCoordsLimitedToRect,
29751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                              float insetAmount,
29851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                              float halfFilterWidth) {
29951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    static const char* name = "bot";
30051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    return generic_inset(enclosing, result, isInsetHard, areCoordsLimitedToRect,
30151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                         insetAmount, halfFilterWidth,
30251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                         kInsetLeft_Flag|kInsetTop_Flag|kInsetRight_Flag, name);
30351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips}
30451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
30551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips// Make a rect that is inset all around.
30651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic const SkRect* full_inset(const RectInfo& enclosing,
30751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                RectInfo* result,
30851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                bool isInsetHard,
30951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                bool areCoordsLimitedToRect,
31051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                float insetAmount,
31151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                float halfFilterWidth) {
31251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    static const char* name = "all";
31351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    return generic_inset(enclosing, result, isInsetHard, areCoordsLimitedToRect,
31451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                         insetAmount, halfFilterWidth,
31551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                         kInsetLeft_Flag|kInsetTop_Flag|kInsetRight_Flag|kInsetBot_Flag, name);
31651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips}
31751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
31851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips// This is only used for content rect creation. We ensure 'result' is correct but
31951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips// return null to indicate no content area (other than what the proxy specifies).
32051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic const SkRect* null_rect(const RectInfo& enclosing,
32151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               RectInfo* result,
32251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               bool isInsetHard,
32351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               bool areCoordsLimitedToRect,
32451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               float insetAmount,
32551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                               float halfFilterWidth) {
32651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    static const char* name = "null";
32751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    generic_inset(enclosing, result, isInsetHard, areCoordsLimitedToRect,
32851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                  insetAmount, halfFilterWidth, 0, name);
32951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    return nullptr;
33051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips}
33151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
33251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips// Make a rect with no inset. This is only used for constraint rect creation.
33351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic const SkRect* no_inset(const RectInfo& enclosing,
33451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                              RectInfo* result,
33551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                              bool isInsetHard,
33651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                              bool areCoordsLimitedToRect,
33751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                              float insetAmount,
33851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                              float halfFilterWidth) {
33951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    static const char* name = "none";
34051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    return generic_inset(enclosing, result, isInsetHard, areCoordsLimitedToRect,
34151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                         insetAmount, halfFilterWidth, 0, name);
34251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips}
34351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
34451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillipsstatic void proxy_test(skiatest::Reporter* reporter, GrResourceProvider* resourceProvider) {
34551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    GrTextureProducer_TestAccess::DomainMode actualMode, expectedMode;
34651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    SkRect actualDomainRect;
34751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
34851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    static const GrSamplerParams::FilterMode gModes[] = {
34951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        GrSamplerParams::kNone_FilterMode,
35051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        GrSamplerParams::kBilerp_FilterMode,
35151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        GrSamplerParams::kMipMap_FilterMode,
35251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    };
35351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
35451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    static const GrSamplerParams::FilterMode* gModePtrs[] = {
35551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        &gModes[0], &gModes[1], nullptr, &gModes[2]
35651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    };
35751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
35851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    static const float gHalfFilterWidth[] = { 0.0f, 0.5f, 1.5f, 10000.0f };
35951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
36051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    for (auto isPowerOfTwoSized : { true, false }) {
36151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        for (auto isExact : { true, false }) {
36251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips            RectInfo outermost;
36351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
36451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips            sk_sp<GrTextureProxy> proxy = create_proxy(resourceProvider, isPowerOfTwoSized,
36551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                       isExact, &outermost);
36651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips            SkASSERT(outermost.isHardOrBadAllAround());
36751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
36851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips            for (auto contentRectMaker : { left_only, top_only, right_only,
36951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                           bot_only, full_inset, null_rect}) {
37051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                RectInfo contentRectStorage;
37151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                const SkRect* contentRect = (*contentRectMaker)(outermost,
37251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                                &contentRectStorage,
37351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                                true, false, 5.0f, -1.0f);
37451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                if (contentRect) {
37551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                    // We only have content rects if they actually reduce the extent of the content
37651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                    SkASSERT(!contentRect->contains(outermost.rect()));
37751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                    SkASSERT(outermost.rect().contains(*contentRect));
37851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                    SkASSERT(is_irect(*contentRect));
37951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                }
38051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                SkASSERT(contentRectStorage.isHardOrBadAllAround());
38151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
38251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                for (auto isConstraintRectHard : { true, false }) {
38351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                    for (auto areCoordsLimitedToConstraintRect : { true, false }) {
38451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                        for (int filterMode = 0; filterMode < 4; ++filterMode) {
38551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                            for (auto constraintRectMaker : { left_only, top_only, right_only,
38651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                              bot_only, full_inset, no_inset }) {
38751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                for (auto insetAmt : { 0.25f, 0.75f, 1.25f, 1.75f, 5.0f }) {
38851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    RectInfo constraintRectStorage;
38951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    const SkRect* constraintRect = (*constraintRectMaker)(
39051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                    contentRect ? contentRectStorage : outermost,
39151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                    &constraintRectStorage,
39251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                    isConstraintRectHard,
39351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                    areCoordsLimitedToConstraintRect,
39451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                    insetAmt,
39551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                    gHalfFilterWidth[filterMode]);
39651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    SkASSERT(constraintRect); // always need one of these
39751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    if (contentRect) {
39851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                        SkASSERT(contentRect->contains(*constraintRect));
39951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    } else {
40051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                        SkASSERT(outermost.rect().contains(*constraintRect));
40151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    }
40251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
40351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    SkIRect contentIRect;
40451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    if (contentRect) {
40551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                        contentIRect = to_irect(*contentRect);
40651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    }
40751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
40851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    actualMode = GrTextureProducer_TestAccess::DetermineDomainMode(
40951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                    *constraintRect,
41051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                    isConstraintRectHard
41151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                        ? GrTextureProducer::kYes_FilterConstraint
41251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                        : GrTextureProducer::kNo_FilterConstraint,
41351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                    areCoordsLimitedToConstraintRect,
41451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                    proxy.get(),
41551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                    contentRect ? &contentIRect : nullptr,
41651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                    gModePtrs[filterMode],
41751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                                    &actualDomainRect);
41851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
41951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    expectedMode = DomainMode::kNoDomain_DomainMode;
42051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    if (constraintRectStorage.hasABad()) {
42151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                        if (3 == filterMode) {
42251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                            expectedMode = DomainMode::kTightCopy_DomainMode;
42351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                        } else {
42451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                            expectedMode = DomainMode::kDomain_DomainMode;
42551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                        }
42651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    }
42751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
42851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    REPORTER_ASSERT(reporter, expectedMode == actualMode);
42951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                    // TODO: add a check that the returned domain rect is correct
43051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                                }
43151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                            }
43251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                        }
43351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                    }
43451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips                }
43551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips            }
43651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips        }
43751e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    }
43851e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips}
43951e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
44051e7ca31cedc821d2317930d91c5a7dd10cb8735Robert PhillipsDEF_GPUTEST_FOR_RENDERING_CONTEXTS(DetermineDomainModeTest, reporter, ctxInfo) {
44151e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    GrContext* context = ctxInfo.grContext();
44251e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
44351e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips    proxy_test(reporter, context->resourceProvider());
44451e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips}
44551e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips
44651e7ca31cedc821d2317930d91c5a7dd10cb8735Robert Phillips#endif
447