Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | List of all members
GrTextureEffect::Sampling Struct Reference

Public Member Functions

 Sampling (Filter filter, MipmapMode mm)
 
 Sampling (const GrSurfaceProxy &proxy, GrSamplerState wrap, const SkRect &, const SkRect *, const float border[4], bool alwaysUseShaderTileMode, const GrCaps &, SkVector linearFilterInset={0.5f, 0.5f})
 
bool hasBorderAlpha () const
 

Public Attributes

GrSamplerState fHWSampler
 
ShaderMode fShaderModes [2] = {ShaderMode::kNone, ShaderMode::kNone}
 
SkRect fShaderSubset = {0, 0, 0, 0}
 
SkRect fShaderClamp = {0, 0, 0, 0}
 
float fBorder [4] = {0, 0, 0, 0}
 

Detailed Description

Definition at line 40 of file GrTextureEffect.cpp.

Constructor & Destructor Documentation

◆ Sampling() [1/2]

GrTextureEffect::Sampling::Sampling ( Filter  filter,
MipmapMode  mm 
)
inline

Definition at line 46 of file GrTextureEffect.cpp.

46: fHWSampler(filter, mm) {}

◆ Sampling() [2/2]

GrTextureEffect::Sampling::Sampling ( const GrSurfaceProxy proxy,
GrSamplerState  wrap,
const SkRect subset,
const SkRect domain,
const float  border[4],
bool  alwaysUseShaderTileMode,
const GrCaps caps,
SkVector  linearFilterInset = {0.5f, 0.5f} 
)

Definition at line 58 of file GrTextureEffect.cpp.

65 {
66 struct Span {
67 float fA = 0.f, fB = 0.f;
68
69 Span makeInset(float o) const {
70 Span r = {fA + o, fB - o};
71 if (r.fA > r.fB) {
72 r.fA = r.fB = (r.fA + r.fB) / 2;
73 }
74 return r;
75 }
76
77 bool contains(Span r) const { return fA <= r.fA && fB >= r.fB; }
78 };
79 struct Result1D {
80 ShaderMode fShaderMode = ShaderMode::kNone;
81 Span fShaderSubset = {};
82 Span fShaderClamp = {};
83 Wrap fHWWrap = Wrap::kClamp;
84 };
85
86 auto type = proxy.asTextureProxy()->textureType();
87 auto filter = sampler.filter();
88 auto mm = sampler.mipmapMode();
89
90 auto canDoWrapInHW = [&](int size, Wrap wrap) {
91 if (alwaysUseShaderTileMode) {
92 return false;
93 }
94 // TODO: Use HW border color when available.
95 if (wrap == Wrap::kClampToBorder &&
96 (!caps.clampToBorderSupport() || border[0] || border[1] || border[2] || border[3])) {
97 return false;
98 }
99 if (wrap != Wrap::kClamp && !caps.npotTextureTileSupport() && !SkIsPow2(size)) {
100 return false;
101 }
102 if (type != GrTextureType::k2D &&
103 !(wrap == Wrap::kClamp || wrap == Wrap::kClampToBorder)) {
104 return false;
105 }
106 return true;
107 };
108
109 SkISize dim = proxy.isFullyLazy() ? SkISize{-1, -1} : proxy.backingStoreDimensions();
110
111 // TODO: Right now if we use shader based subsetting for any reason we just completely drop
112 // aniso. Longer term allow shader subsetting, reusing the special repeat mode LOD selection
113 // logic for mip maps, and simply don't attempt to restrict ansiso's computed samples to the
114 // subset. That is use "subsetting" but not "clamping"/insetting in terms of the shader gen
115 // logic.
116 bool aniso = sampler.isAniso();
117 SkASSERT(!aniso || caps.anisoSupport());
118 if (aniso) {
119 bool anisoSubset = !subset.contains(proxy.backingStoreBoundsRect()) &&
120 (!domain || !subset.contains(*domain));
121 bool needsShaderWrap = !canDoWrapInHW(dim.width(), sampler.wrapModeX()) ||
122 !canDoWrapInHW(dim.height(), sampler.wrapModeY());
123 if (needsShaderWrap || anisoSubset) {
124 MipmapMode newMM = proxy.asTextureProxy()->mipmapped() == skgpu::Mipmapped::kYes
125 ? MipmapMode::kLinear
126 : MipmapMode::kNone;
127 sampler = GrSamplerState(sampler.wrapModeX(),
128 sampler.wrapModeY(),
130 newMM);
131 aniso = false;
132 }
133 }
134
135 auto resolve = [&](int size, Wrap wrap, Span subset, Span domain, float linearFilterInset) {
136 Result1D r;
137 bool canDoModeInHW = canDoWrapInHW(size, wrap);
138 if (canDoModeInHW && size > 0 && subset.fA <= 0 && subset.fB >= size) {
139 r.fShaderMode = ShaderMode::kNone;
140 r.fHWWrap = wrap;
141 r.fShaderSubset = r.fShaderClamp = {0, 0};
142 return r;
143 }
144
145 r.fShaderSubset = subset;
146 bool domainIsSafe = false;
147 if (filter == Filter::kNearest) {
148 Span isubset{std::floor(subset.fA), std::ceil(subset.fB)};
149 if (domain.fA > isubset.fA && domain.fB < isubset.fB) {
150 domainIsSafe = true;
151 }
152 // This inset prevents sampling neighboring texels that could occur when
153 // texture coords fall exactly at texel boundaries (depending on precision
154 // and GPU-specific snapping at the boundary).
155 r.fShaderClamp = isubset.makeInset(0.5f + kInsetEpsilon);
156 } else {
157 r.fShaderClamp = subset.makeInset(linearFilterInset + kInsetEpsilon);
158 if (r.fShaderClamp.contains(domain)) {
159 domainIsSafe = true;
160 }
161 }
162 if (!alwaysUseShaderTileMode && domainIsSafe) {
163 // The domain of coords that will be used won't access texels outside of the subset.
164 // So the wrap mode effectively doesn't matter. We use kClamp since it is always
165 // supported.
166 r.fShaderMode = ShaderMode::kNone;
167 r.fHWWrap = Wrap::kClamp;
168 r.fShaderSubset = r.fShaderClamp = {0, 0};
169 return r;
170 }
171 r.fShaderMode = GetShaderMode(wrap, filter, mm);
172 r.fHWWrap = Wrap::kClamp;
173 return r;
174 };
175
176 Result1D x, y;
177 if (!aniso) {
178 Span subsetX{subset.fLeft, subset.fRight};
179 auto domainX = domain ? Span{domain->fLeft, domain->fRight}
181 x = resolve(dim.width(), sampler.wrapModeX(), subsetX, domainX, linearFilterInset.fX);
182
183 Span subsetY{subset.fTop, subset.fBottom};
184 auto domainY = domain ? Span{domain->fTop, domain->fBottom}
186 y = resolve(dim.height(), sampler.wrapModeY(), subsetY, domainY, linearFilterInset.fY);
187 } else {
188 x.fHWWrap = sampler.wrapModeX();
189 y.fHWWrap = sampler.wrapModeY();
190 }
191
192 fHWSampler = aniso ? GrSamplerState::Aniso(x.fHWWrap,
193 y.fHWWrap,
194 sampler.maxAniso(),
195 proxy.asTextureProxy()->mipmapped())
196 : GrSamplerState{x.fHWWrap, y.fHWWrap, filter, mm};
197 fShaderModes[0] = x.fShaderMode;
198 fShaderModes[1] = y.fShaderMode;
199 fShaderSubset = {x.fShaderSubset.fA, y.fShaderSubset.fA,
200 x.fShaderSubset.fB, y.fShaderSubset.fB};
201 fShaderClamp = {x.fShaderClamp.fA, y.fShaderClamp.fA,
202 x.fShaderClamp.fB, y.fShaderClamp.fB};
203 std::copy_n(border, 4, fBorder);
204}
#define SkASSERT(cond)
Definition SkAssert.h:116
constexpr float SK_FloatInfinity
constexpr float SK_FloatNegativeInfinity
constexpr bool SkIsPow2(T value)
Definition SkMath.h:51
static bool contains(const SkRect &r, SkPoint p)
SkMipmapMode
bool anisoSupport() const
Definition GrCaps.h:74
bool clampToBorderSupport() const
Definition GrCaps.h:484
bool npotTextureTileSupport() const
Definition GrCaps.h:69
static constexpr GrSamplerState Aniso(WrapMode wrapX, WrapMode wrapY, int maxAniso, skgpu::Mipmapped viewIsMipped)
SkISize backingStoreDimensions() const
SkRect backingStoreBoundsRect() const
bool isFullyLazy() const
virtual GrTextureProxy * asTextureProxy()
static constexpr float kInsetEpsilon
GrTextureType textureType() const
skgpu::Mipmapped mipmapped() const
double y
double x
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
Definition switches.h:259
constexpr int32_t width() const
Definition SkSize.h:36
constexpr int32_t height() const
Definition SkSize.h:37
float fX
x-axis value
float fY
y-axis value
bool contains(SkScalar x, SkScalar y) const
Definition extension.cpp:19

Member Function Documentation

◆ hasBorderAlpha()

bool GrTextureEffect::Sampling::hasBorderAlpha ( ) const
inline

Definition at line 206 of file GrTextureEffect.cpp.

206 {
207 if (fHWSampler.wrapModeX() == Wrap::kClampToBorder ||
208 fHWSampler.wrapModeY() == Wrap::kClampToBorder) {
209 return true;
210 }
211 if (ShaderModeIsClampToBorder(fShaderModes[0]) || ShaderModeIsClampToBorder(fShaderModes[1])) {
212 return fBorder[3] < 1.f;
213 }
214 return false;
215}
constexpr WrapMode wrapModeX() const
constexpr WrapMode wrapModeY() const

Member Data Documentation

◆ fBorder

float GrTextureEffect::Sampling::fBorder[4] = {0, 0, 0, 0}

Definition at line 45 of file GrTextureEffect.cpp.

45{0, 0, 0, 0};

◆ fHWSampler

GrSamplerState GrTextureEffect::Sampling::fHWSampler

Definition at line 41 of file GrTextureEffect.cpp.

◆ fShaderClamp

SkRect GrTextureEffect::Sampling::fShaderClamp = {0, 0, 0, 0}

Definition at line 44 of file GrTextureEffect.cpp.

44{0, 0, 0, 0};

◆ fShaderModes

ShaderMode GrTextureEffect::Sampling::fShaderModes[2] = {ShaderMode::kNone, ShaderMode::kNone}

Definition at line 42 of file GrTextureEffect.cpp.

42{ShaderMode::kNone, ShaderMode::kNone};

◆ fShaderSubset

SkRect GrTextureEffect::Sampling::fShaderSubset = {0, 0, 0, 0}

Definition at line 43 of file GrTextureEffect.cpp.

43{0, 0, 0, 0};

The documentation for this struct was generated from the following file: