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