29 uint32_t
key =
static_cast<uint32_t
>(fp.sampleUsage().kind()) << 1;
31 if (fp.sampleUsage().hasPerspective()) {
38 b->appendComment(
"vertex attributes");
40 b->appendComment(
"instance attributes");
49 return std::min(requestedFilter, GrSamplerState::Filter::kLinear);
51 return requestedFilter;
63 fSamplerState = samplerState;
68 fBackendFormat = backendFormat;
70 fIsInitialized =
true;
77std::tuple<ProgramImpl::FPCoordsMap, GrShaderVar>
85 gpArgs.fLocalCoordShader,
86 gpArgs.fLocalCoordVar,
95 gpArgs.fPositionVar.getType());
97 args.fVaryingHandler->setNoPerspective();
100 return {transformMap, gpArgs.fLocalCoordVar};
119 auto baseLocalCoordFSVar = [&, baseLocalCoordVarying =
GrGLSLVarying()]()
mutable {
121 return localCoordsVar;
128 varyingHandler->
addVarying(
"LocalCoord", &baseLocalCoordVarying);
130 baseLocalCoordVarying.vsOut(),
133 return baseLocalCoordVarying.fsInVar();
142 auto liftTransforms = [&, traversalIndex = 0](
147 int lastMatrixTraversalIndex = -1,
148 BaseCoord baseCoord = BaseCoord::kLocal)
mutable ->
void {
151 switch (
fp.sampleUsage().kind()) {
160 hasPerspective |=
fp.sampleUsage().hasPerspective();
162 lastMatrixTraversalIndex = traversalIndex;
166 lastMatrixFP =
nullptr;
167 lastMatrixTraversalIndex = -1;
168 baseCoord = BaseCoord::kPosition;
171 baseCoord = BaseCoord::kNone;
177 baseCoord = BaseCoord::kNone;
180 auto& [varyingFSVar, hasCoordsParam] =
result[&
fp];
181 hasCoordsParam =
fp.usesSampleCoordsDirectly();
187 if (
fp.usesSampleCoordsDirectly() &&
188 (baseCoord == BaseCoord::kLocal ||
189 (baseCoord == BaseCoord::kPosition && lastMatrixFP && canUsePosition))) {
194 varyingFSVar = baseLocalCoordFSVar();
198 auto& [varying, inputCoords, varyingIdx] = fTransformVaryingsMap[lastMatrixFP];
202 lastMatrixTraversalIndex);
204 inputCoords = baseCoord == BaseCoord::kLocal ? localCoordsVar : positionVar;
205 varyingIdx = lastMatrixTraversalIndex;
207 SkASSERT(varyingIdx == lastMatrixTraversalIndex);
209 varyingFSVar = varying.fsInVar();
211 hasCoordsParam =
false;
214 for (
int c = 0; c <
fp.numChildProcessors(); ++c) {
215 if (
auto* child =
fp.childProcessor(c)) {
220 lastMatrixTraversalIndex,
225 !child->sampleUsage().isExplicit() &&
226 !child->sampleUsage().isFragCoord() &&
227 result[child].hasCoordsParam;
243 using FPAndInfo = std::tuple<const GrFragmentProcessor*, TransformInfo>;
244 auto compare = [](
const FPAndInfo&
a,
const FPAndInfo&
b) {
245 return std::get<1>(
a).traversalOrder > std::get<1>(
b).traversalOrder;
247 std::priority_queue<FPAndInfo, std::vector<FPAndInfo>,
decltype(
compare)> pq(
compare);
248 std::for_each(fTransformVaryingsMap.begin(), fTransformVaryingsMap.end(), [&pq](
auto entry) {
251 for (; !pq.empty(); pq.pop()) {
252 const auto& [fp,
info] = pq.top();
254 SkASSERT(fp->sampleUsage().isUniformMatrix());
266 if (
auto iter = fTransformVaryingsMap.find(
base); iter != fTransformVaryingsMap.end()) {
270 inputCoords = iter->second.varying.vsOutVar();
272 }
else if (
base->sampleUsage().isUniformMatrix()) {
280 }
else if (
base->sampleUsage().isFragCoord()) {
286 SkASSERT(
base->sampleUsage().isPassThrough() || !
base->sampleUsage().isSampled());
295 inputStr = inputCoords.
getName();
302 info.varying.vsOut(),
303 transformExpression.
c_str(),
307 info.varying.vsOut(),
308 transformExpression.
c_str(),
314 info.varying.vsOut(),
315 transformExpression.
c_str(),
322 fTransformVaryingsMap.clear();
327 const char* outputName,
330 const char* stagedLocalVarName;
331 *colorUniform = uniformHandler->
addUniform(
nullptr,
335 &stagedLocalVarName);
336 fragBuilder->
codeAppendf(
"%s = %s;", outputName, stagedLocalVarName);
338 fragBuilder->
codeAppendf(
"%s = max(%s, half4(0));", outputName, outputName);
357 float values[4] = {matrix.getScaleX(), matrix.getTranslateX(),
358 matrix.getScaleY(), matrix.getTranslateY()};
359 pdman.
set4fv(uniform, 1, values);
382 const char* matrixName,
394 bool useCompactTransform = matrix.isScaleTranslate() && !shaderCaps.
fReducedShaderMode;
395 const char* mangledMatrixName;
396 *matrixUniform = uniformHandler->
addUniform(
nullptr,
405 if (useCompactTransform) {
406 vertBuilder->
codeAppendf(
"float3 %s = %s.xz1 * %s + %s.yw0;\n",
420 if (matrix.hasPerspective()) {
423 vertBuilder->
codeAppendf(
"float3 %s = (%s * %s.xy1);",
430 if (useCompactTransform) {
431 vertBuilder->
codeAppendf(
"float2 %s = %s.xz * %s + %s.yw;\n",
437 vertBuilder->
codeAppendf(
"float2 %s = float3x2(%s) * %s.xy1;\n",
442 vertBuilder->
codeAppendf(
"float2 %s = (%s * %s.xy1).xy;\n",
452 const char* posName) {
464 UniformHandle* viewMatrixUniform) {
472 &gpArgs->fPositionVar,
499 if (fCurr->offset().has_value()) {
502 return Attribute(fCurr->name(), fCurr->cpuType(), fCurr->gpuType(), fImplicitOffset);
505void AttributeSet::Iter::operator++() {
508 fImplicitOffset += Attribute::AlignOffset(fCurr->size());
510 this->skipUninitialized();
514void AttributeSet::Iter::skipUninitialized() {
518 while (!fCurr->isInitialized()) {
529 for (
int i = 0; i <
count; ++i) {
530 if (attrs[i].isInitialized()) {
532 fStride += Attribute::AlignOffset(attrs[i].size());
542 SkASSERT(Attribute::AlignOffset(fStride) == fStride);
543 for (
int i = 0; i <
count; ++i) {
552 int rawCount =
SkAbs32(fRawCount);
554 b->
addBits(16, rawCount,
"attribute count");
555 size_t implicitOffset = 0;
556 for (
int i = 0; i < rawCount; ++i) {
566 if (attr.
offset().has_value()) {
570 implicitOffset += Attribute::AlignOffset(attr.
size());
573 b->addBits(16,
static_cast<uint16_t
>(
offset),
"attrOffset");
static bool compare(const SkBitmap &ref, const SkIRect &iref, const SkBitmap &test, const SkIRect &itest)
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
static void write_passthrough_vertex_position(GrGLSLVertexBuilder *vertBuilder, const GrShaderVar &inPos, GrShaderVar *outPos)
static GrSamplerState::Filter clamp_filter(GrTextureType type, GrSamplerState::Filter requestedFilter)
static void write_vertex_position(GrGLSLVertexBuilder *vertBuilder, GrGLSLUniformHandler *uniformHandler, const GrShaderCaps &shaderCaps, const GrShaderVar &inPos, const SkMatrix &matrix, const char *matrixName, GrShaderVar *outPos, ProgramImpl::UniformHandle *matrixUniform)
static const int kGrVertexAttribTypeCount
static bool GrTextureTypeHasRestrictedSampling(GrTextureType type)
static const int kSkSLTypeCount
static constexpr bool SkSLTypeIsFloatType(SkSLType type)
static constexpr int SkSLTypeVecLength(SkSLType type)
static int32_t SkAbs32(int32_t value)
SK_API SkString static SkString SkStringPrintf()
constexpr uint16_t SkToU16(S x)
GrGLSLUniformHandler::UniformHandle UniformHandle
virtual void emitCode(EmitArgs &)=0
const GrShaderCaps * shaderCaps() const
virtual void set4fv(UniformHandle, int arrayCount, const float v[]) const =0
void setSkMatrix(UniformHandle, const SkMatrix &) const
void codeAppend(const char *str)
void codeAppendf(const char format[],...) SK_PRINTF_LIKE(2
SkString newTmpVarName(const char *suffix)
GrGLSLProgramBuilder * getProgramBuilder()
void addVarying(const char *name, GrGLSLVarying *varying, Interpolation=Interpolation::kInterpolated)
void emitNormalizedSkPosition(const char *devPos, SkSLType devPosType=SkSLType::kFloat2)
void initImplicit(const Attribute *attrs, int count)
void addToKey(skgpu::KeyBuilder *b) const
void initExplicit(const Attribute *attrs, int count, size_t stride)
std::optional< size_t > offset() const
constexpr GrVertexAttribType cpuType() const
constexpr bool isInitialized() const
constexpr const char * name() const
constexpr size_t size() const
constexpr SkSLType gpuType() const
virtual void onEmitCode(EmitArgs &, GrGPArgs *)=0
GrGLSLProgramDataManager::UniformHandle UniformHandle
std::unordered_map< const GrFragmentProcessor *, FPCoords > FPCoordsMap
void reset(GrSamplerState, const GrBackendFormat &, const skgpu::Swizzle &)
const GrBackendFormat & backendFormat() const
const skgpu::Swizzle & swizzle() const
GrGeometryProcessor(ClassID)
const TextureSampler & textureSampler(int index) const
int numTextureSamplers() const
virtual const TextureSampler & onTextureSampler(int) const
static uint32_t ComputeCoordTransformsKey(const GrFragmentProcessor &fp)
void getAttributeKey(skgpu::KeyBuilder *b) const
int numFragmentProcessors() const
const GrFragmentProcessor & getFragmentProcessor(int idx) const
constexpr WrapMode wrapModeX() const
constexpr Filter filter() const
constexpr MipmapMode mipmapMode() const
constexpr WrapMode wrapModeY() const
void set(SkSLType type, const char *name)
const SkString & getName() const
static bool CheapEqual(const SkMatrix &a, const SkMatrix &b)
static const char * MatrixUniformName()
const char * c_str() const
void void void appendf(const char format[],...) SK_PRINTF_LIKE(2
virtual void addBits(uint32_t numBits, uint32_t val, std::string_view label)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
GrShaderVar fLocalCoordVar
bool fMustObfuscateUniformColor
bool fNonsquareMatrixSupport