Lines Matching defs:skvm

56     struct FastF32 { skvm::F32 val; };
57 static FastF32 operator*(skvm::F32 y) { return {y}; }
58 static skvm::F32 operator*(skvm::F32 x, FastF32 y) { return fast_mul(x, y.val); }
59 static skvm::F32 operator*(float x, FastF32 y) { return fast_mul(x, y.val); }
72 Value(skvm::F32 x) : fVals({ x.id }) {}
73 Value(skvm::I32 x) : fVals({ x.id }) {}
80 ValRef(skvm::Val& val) : fVal(val) {}
85 ValRef& operator=(skvm::Val v) { fVal = v; return *this; }
86 ValRef& operator=(skvm::F32 v) { fVal = v.id; return *this; }
87 ValRef& operator=(skvm::I32 v) { fVal = v.id; return *this; }
89 operator skvm::Val() { return fVal; }
91 skvm::Val& fVal;
100 skvm::Val operator[](size_t i) const {
107 SkSpan<skvm::Val> asSpan() { return SkMakeSpan(fVals); }
110 SkSTArray<4, skvm::Val, true> fVals;
118 skvm::Builder* builder,
124 void writeProgram(SkSpan<skvm::Val> uniforms,
125 skvm::Coord device,
127 SkSpan<skvm::Val> arguments,
128 SkSpan<skvm::Val> outReturn);
134 * skvm::Val. Those skvm::Val entries hold the current actual value of that variable.
142 * which is a set of skvm::Val. (This allows an Expression to produce a vector or matrix, in
146 * Variable (from fVariableMap), use that to look up the current skvm::Vals holding the
163 void writeToSlot(int slot, skvm::Val value);
172 void setupGlobals(SkSpan<skvm::Val> uniforms, skvm::Coord device);
176 SkSpan<skvm::Val> arguments,
177 SkSpan<skvm::Val> outReturn);
179 skvm::F32 f32(skvm::Val id) { SkASSERT(id != skvm::NA); return {fBuilder, id}; }
180 skvm::I32 i32(skvm::Val id) { SkASSERT(id != skvm::NA); return {fBuilder, id}; }
183 skvm::F32 f32(const Value& v) { SkASSERT(v.slots() == 1); return f32(v[0]); }
184 skvm::I32 i32(const Value& v) { SkASSERT(v.slots() == 1); return i32(v[0]); }
195 skvm::I32 mask() {
197 skvm::I32 result = fConditionMask & fLoopMask;
243 skvm::Val writeConditionalStore(skvm::Val lhs, skvm::Val rhs, skvm::I32 mask);
253 skvm::Builder* fBuilder;
261 skvm::Val val;
268 skvm::I32 fConditionMask;
274 skvm::I32 fLoopMask;
275 skvm::I32 fContinueMask;
281 const SkSpan<skvm::Val> fReturnValue;
282 skvm::I32 fReturned;
289 ScopedCondition(SkVMGenerator* generator, skvm::I32 mask)
298 skvm::I32 fOldConditionMask;
350 skvm::Builder* builder,
362 void SkVMGenerator::writeProgram(SkSpan<skvm::Val> uniforms,
363 skvm::Coord device,
365 SkSpan<skvm::Val> arguments,
366 SkSpan<skvm::Val> outReturn) {
373 void SkVMGenerator::setupGlobals(SkSpan<skvm::Val> uniforms, skvm::Coord device) {
376 const skvm::Val* uniformIter = uniforms.begin();
441 SkSpan<skvm::Val> arguments,
442 SkSpan<skvm::Val> outReturn) {
489 void SkVMGenerator::writeToSlot(int slot, skvm::Val value) {
571 skvm::Val initialValue = fBuilder->splat(0.0f).id;
600 skvm::I32 lVal = i32(this->writeExpression(left));
602 skvm::I32 rVal = i32(this->writeExpression(right));
608 skvm::I32 lVal = i32(this->writeExpression(left));
610 skvm::I32 rVal = i32(this->writeExpression(right));
641 const skvm::F32 zero = fBuilder->splat(0.0f);
644 skvm::F32 sum = zero;
660 skvm::Val L = lVal.slots() == 1 ? lVal[0] : lVal[i],
671 auto unsupported_f = [&](skvm::F32, skvm::F32) {
673 return skvm::F32{};
679 Value cmp = binary([](skvm::F32 x, skvm::F32 y) { return x == y; },
680 [](skvm::I32 x, skvm::I32 y) { return x == y; });
681 skvm::I32 folded = i32(cmp[0]);
689 Value cmp = binary([](skvm::F32 x, skvm::F32 y) { return x != y; },
690 [](skvm::I32 x, skvm::I32 y) { return x != y; });
691 skvm::I32 folded = i32(cmp[0]);
698 return binary([](skvm::F32 x, skvm::F32 y) { return x > y; },
699 [](skvm::I32 x, skvm::I32 y) { return x > y; });
701 return binary([](skvm::F32 x, skvm::F32 y) { return x >= y; },
702 [](skvm::I32 x, skvm::I32 y) { return x >= y; });
704 return binary([](skvm::F32 x, skvm::F32 y) { return x < y; },
705 [](skvm::I32 x, skvm::I32 y) { return x < y; });
707 return binary([](skvm::F32 x, skvm::F32 y) { return x <= y; },
708 [](skvm::I32 x, skvm::I32 y) { return x <= y; });
711 return binary([](skvm::F32 x, skvm::F32 y) { return x + y; },
712 [](skvm::I32 x, skvm::I32 y) { return x + y; });
714 return binary([](skvm::F32 x, skvm::F32 y) { return x - y; },
715 [](skvm::I32 x, skvm::I32 y) { return x - y; });
717 return binary([](skvm::F32 x, skvm::F32 y) { return x ** y; },
718 [](skvm::I32 x, skvm::I32 y) { return x * y; });
724 return binary([](skvm::F32 x, skvm::F32 y) { return x / y; },
725 [](skvm::I32 x, skvm::I32 y) {
726 return skvm::trunc(skvm::to_F32(x) / skvm::to_F32(y));
731 return binary(unsupported_f, [](skvm::I32 x, skvm::I32 y) { return x ^ y; });
733 return binary(unsupported_f, [](skvm::I32 x, skvm::I32 y) { return x & y; });
735 return binary(unsupported_f, [](skvm::I32 x, skvm::I32 y) { return x | y; });
775 dst[i] = skvm::to_F32(i32(src[i]));
782 dst[i] = skvm::select(i32(src[i]), 1.0f, 0.0f);
792 dst[i] = skvm::trunc(f32(src[i]));
799 dst[i] = skvm::select(i32(src[i]), 1, 0);
866 const skvm::F32 zero = fBuilder->splat(0.0f);
952 skvm::F32 a = f32(m[0]),
956 skvm::F32 idet = 1.0f / (a*d - b*c);
968 skvm::F32 a11 = f32(m[0]), a12 = f32(m[3]), a13 = f32(m[6]),
971 skvm::F32 idet = 1.0f / (a11*a22*a33 + a12*a23*a31 + a13*a21*a32 -
989 skvm::F32 a00 = f32(m[0]), a10 = f32(m[4]), a20 = f32(m[ 8]), a30 = f32(m[12]),
994 skvm::F32 b00 = a00**a11 - a01**a10,
1007 skvm::F32 idet = 1.0f / (b00**b11 - b01**b10 + b02**b09 + b03**b08 - b04**b07 + b05**b06);
1048 skvm::Color color;
1054 skvm::Coord coord = {f32(argVal[0]), f32(argVal[1])};
1062 skvm::Color inColor = {f32(argVal[0]), f32(argVal[1]), f32(argVal[2]), f32(argVal[3])};
1070 skvm::Color srcColor = {f32(argVal[0]), f32(argVal[1]), f32(argVal[2]), f32(argVal[3])};
1076 skvm::Color dstColor = {f32(argVal[0]), f32(argVal[1]), f32(argVal[2]), f32(argVal[3])};
1141 skvm::F32 result = f32(x[0]) * f32(y[0]);
1150 return unary(args[0], [](skvm::F32 deg) { return deg * (SK_FloatPI / 180); });
1152 return unary(args[0], [](skvm::F32 rad) { return rad * (180 / SK_FloatPI); });
1154 case k_sin_IntrinsicKind: return unary(args[0], skvm::approx_sin);
1155 case k_cos_IntrinsicKind: return unary(args[0], skvm::approx_cos);
1156 case k_tan_IntrinsicKind: return unary(args[0], skvm::approx_tan);
1158 case k_asin_IntrinsicKind: return unary(args[0], skvm::approx_asin);
1159 case k_acos_IntrinsicKind: return unary(args[0], skvm::approx_acos);
1161 case k_atan_IntrinsicKind: return nargs == 1 ? unary(args[0], skvm::approx_atan)
1162 : binary(skvm::approx_atan2);
1165 return binary([](skvm::F32 x, skvm::F32 y) { return skvm::approx_powf(x, y); });
1166 case k_exp_IntrinsicKind: return unary(args[0], skvm::approx_exp);
1167 case k_log_IntrinsicKind: return unary(args[0], skvm::approx_log);
1168 case k_exp2_IntrinsicKind: return unary(args[0], skvm::approx_pow2);
1169 case k_log2_IntrinsicKind: return unary(args[0], skvm::approx_log2);
1171 case k_sqrt_IntrinsicKind: return unary(args[0], skvm::sqrt);
1173 return unary(args[0], [](skvm::F32 x) { return 1.0f / skvm::sqrt(x); });
1175 case k_abs_IntrinsicKind: return unary(args[0], skvm::abs);
1177 return unary(args[0], [](skvm::F32 x) { return select(x < 0, -1.0f,
1179 case k_floor_IntrinsicKind: return unary(args[0], skvm::floor);
1180 case k_ceil_IntrinsicKind: return unary(args[0], skvm::ceil);
1181 case k_fract_IntrinsicKind: return unary(args[0], skvm::fract);
1183 return binary([](skvm::F32 x, skvm::F32 y) { return x - y*skvm::floor(x / y); });
1186 return binary([](skvm::F32 x, skvm::F32 y) { return skvm::min(x, y); });
1188 return binary([](skvm::F32 x, skvm::F32 y) { return skvm::max(x, y); });
1191 [](skvm::F32 x, skvm::F32 lo, skvm::F32 hi) { return skvm::clamp(x, lo, hi); });
1193 return unary(args[0], [](skvm::F32 x) { return skvm::clamp01(x); });
1196 [](skvm::F32 x, skvm::F32 y, skvm::F32 t) { return skvm::lerp(x, y, t); });
1198 return binary([](skvm::F32 edge, skvm::F32 x) { return select(x < edge, 0.0f, 1.0f); });
1200 return ternary([](skvm::F32 edge0, skvm::F32 edge1, skvm::F32 x) {
1201 skvm::F32 t = skvm::clamp01((x - edge0) / (edge1 - edge0));
1205 case k_length_IntrinsicKind: return skvm::sqrt(dot(args[0], args[0]));
1207 Value vec = binary([](skvm::F32 x, skvm::F32 y) { return x - y; });
1208 return skvm::sqrt(dot(vec, vec));
1212 skvm::F32 ax = f32(args[0][0]), ay = f32(args[0][1]), az = f32(args[0][2]),
1221 skvm::F32 invLen = 1.0f / skvm::sqrt(dot(args[0], args[0]));
1222 return unary(args[0], [&](skvm::F32 x) { return x ** invLen; });
1229 skvm::F32 dotNrefI = dot(Nref, I);
1230 return unary(N, [&](skvm::F32 n) { return select(dotNrefI<0, n, -n); });
1236 skvm::F32 dotNI = dot(N, I);
1237 return binary([&](skvm::F32 i, skvm::F32 n) {
1244 skvm::F32 eta = f32(args[2]);
1246 skvm::F32 dotNI = dot(N, I),
1248 return binary([&](skvm::F32 i, skvm::F32 n) {
1254 return binary([](skvm::F32 x, skvm::F32 y) { return x ** y; });
1268 ? binary([](skvm::F32 x, skvm::F32 y) { return x < y; })
1269 : binary([](skvm::I32 x, skvm::I32 y) { return x < y; });
1272 ? binary([](skvm::F32 x, skvm::F32 y) { return x <= y; })
1273 : binary([](skvm::I32 x, skvm::I32 y) { return x <= y; });
1276 ? binary([](skvm::F32 x, skvm::F32 y) { return x > y; })
1277 : binary([](skvm::I32 x, skvm::I32 y) { return x > y; });
1280 ? binary([](skvm::F32 x, skvm::F32 y) { return x >= y; })
1281 : binary([](skvm::I32 x, skvm::I32 y) { return x >= y; });
1285 ? binary([](skvm::F32 x, skvm::F32 y) { return x == y; })
1286 : binary([](skvm::I32 x, skvm::I32 y) { return x == y; });
1289 ? binary([](skvm::F32 x, skvm::F32 y) { return x != y; })
1290 : binary([](skvm::I32 x, skvm::I32 y) { return x != y; });
1293 skvm::I32 result = i32(args[0][0]);
1300 skvm::I32 result = i32(args[0][0]);
1306 case k_not_IntrinsicKind: return unary(args[0], [](skvm::I32 x) { return ~x; });
1323 std::vector<skvm::Val> argVals;
1332 const skvm::F32 zero = fBuilder->splat(0.0f);
1370 std::vector<skvm::F32> args;
1380 std::vector<skvm::F32> result(nslots, fBuilder->splat(0.0f));
1428 return this->unary(val, [](skvm::F32 x) { return -x; });
1430 return this->unary(val, [](skvm::I32 x) { return -x; });
1438 return this->unary(val, [](skvm::I32 x) { return ~x; });
1484 skvm::I32 test = i32(this->writeExpression(*t.test()));
1501 result[i] = skvm::select(test, i32(ifTrue[i]), i32(ifFalse[i]));
1617 skvm::I32 mask = this->mask();
1620 skvm::Val conditionalStore = this->writeConditionalStore(fSlots[slotNum].val, rhs[i], mask);
1627 skvm::Val SkVMGenerator::writeConditionalStore(skvm::Val lhs, skvm::Val rhs, skvm::I32 mask) {
1645 skvm::I32 mask = this->mask();
1659 const skvm::I32 zero = fBuilder->splat(0);
1660 skvm::I32 oldLoopMask = fLoopMask,
1695 skvm::I32 returnsHere = this->mask();
1701 for (skvm::Val& slot : currentFunction().fReturnValue) {
1711 skvm::I32 falseValue = fBuilder->splat( 0);
1712 skvm::I32 trueValue = fBuilder->splat(~0);
1715 skvm::I32 switchFallthrough = falseValue;
1719 skvm::I32 oldLoopMask = fLoopMask;
1808 skvm::Color ProgramToSkVM(const Program& program,
1810 skvm::Builder* builder,
1812 SkSpan<skvm::Val> uniforms,
1813 skvm::Coord device,
1814 skvm::Coord local,
1815 skvm::Color inputColor,
1816 skvm::Color destColor,
1820 skvm::Val zero = builder->splat(0.0f).id;
1821 skvm::Val result[4] = {zero,zero,zero,zero};
1823 skvm::Val args[8]; // At most 8 arguments (half4 srcColor, half4 dstColor)
1860 return skvm::Color{{builder, result[0]},
1868 skvm::Builder* b,
1870 SkSpan<skvm::Val> uniforms,
1875 std::vector<skvm::Ptr> argPtrs;
1876 std::vector<skvm::Val> argVals;
1887 std::vector<skvm::Ptr> returnPtrs;
1888 std::vector<skvm::Val> returnVals;
1897 auto sampleShader = [&](int, skvm::Coord) {
1899 return skvm::Color{};
1901 auto sampleColorFilter = [&](int, skvm::Color) {
1903 return skvm::Color{};
1905 auto sampleBlender = [&](int, skvm::Color, skvm::Color) {
1907 return skvm::Color{};
1910 skvm::F32 zero = b->splat(0.0f);
1911 skvm::Coord zeroCoord = {zero, zero};
1929 b->storeF(argPtrs[argIdx + i], skvm::F32{b, argVals[argIdx + i]});
1938 b->storeF(returnPtrs[i], skvm::F32{b, returnVals[i]});
1996 * representative skvm op sequences for SkSL tests.
1999 skvm::Builder* builder,
2020 skvm::Uniforms uniforms(builder->uniform(), 0);
2025 skvm::Coord device = {pun_to_F32(builder->index()), new_uni()};
2026 skvm::Coord local = device;
2029 skvm::Uniform addr;
2030 skvm::I32 rowBytesAsPixels;
2038 auto sampleShader = [&](int i, skvm::Coord coord) {
2039 skvm::PixelFormat pixelFormat = skvm::SkColorType_to_PixelFormat(kRGBA_F32_SkColorType);
2040 skvm::I32 index = trunc(coord.x);
2045 std::vector<skvm::Val> uniformVals;
2050 skvm::Color inColor = builder->uniformColor(SkColors::kWhite, &uniforms);
2051 skvm::Color destColor = builder->uniformColor(SkColors::kBlack, &uniforms);
2053 skvm::Color result = SkSL::ProgramToSkVM(program, *main, builder, debugInfo,