From 440ef12297ae47663950aa6cd4a71296dea2fee1 Mon Sep 17 00:00:00 2001 From: dpd Date: Tue, 5 Aug 2025 09:29:25 +0800 Subject: [PATCH] add skia support for loongarch64 --- ...fix-loongarch64-build-error-for-skia.patch | 466 ++++++++++++++++++ webkitgtk.spec | 19 +- 2 files changed, 471 insertions(+), 14 deletions(-) create mode 100644 0001-fix-loongarch64-build-error-for-skia.patch diff --git a/0001-fix-loongarch64-build-error-for-skia.patch b/0001-fix-loongarch64-build-error-for-skia.patch new file mode 100644 index 0000000..09be990 --- /dev/null +++ b/0001-fix-loongarch64-build-error-for-skia.patch @@ -0,0 +1,466 @@ +From cb42bf7db07e371a7256b42cf5811b904d490d9f Mon Sep 17 00:00:00 2001 +From: doupengda +Date: Mon, 4 Aug 2025 16:37:13 +0800 +Subject: [PATCH] fix loongarch64 build error for skia + +--- + Source/ThirdParty/skia/CMakeLists.txt | 9 ++ + .../ThirdParty/skia/src/core/SkBlurEngine.cpp | 59 ++++--- + .../skia/src/opts/SkRasterPipeline_opts.h | 148 +++++++++--------- + 3 files changed, 116 insertions(+), 100 deletions(-) + +diff --git a/Source/ThirdParty/skia/CMakeLists.txt b/Source/ThirdParty/skia/CMakeLists.txt +index 74b12c3c..67e9773e 100644 +--- a/Source/ThirdParty/skia/CMakeLists.txt ++++ b/Source/ThirdParty/skia/CMakeLists.txt +@@ -79,6 +79,7 @@ add_library(Skia STATIC + src/core/SkBitmapProcState.cpp + src/core/SkBitmapProcState_matrixProcs.cpp + src/core/SkBitmapProcState_opts.cpp ++ src/core/SkBitmapProcState_opts_lasx.cpp + src/core/SkBitmapProcState_opts_ssse3.cpp + src/core/SkBlendMode.cpp + src/core/SkBlendModeBlender.cpp +@@ -87,6 +88,7 @@ add_library(Skia STATIC + src/core/SkBlitRow_D32.cpp + src/core/SkBlitRow_opts.cpp + src/core/SkBlitRow_opts_hsw.cpp ++ src/core/SkBlitRow_opts_lasx.cpp + src/core/SkBlitter.cpp + src/core/SkBlitter_A8.cpp + src/core/SkBlitter_ARGB32.cpp +@@ -242,6 +244,7 @@ add_library(Skia STATIC + src/core/SkSwizzle.cpp + src/core/SkSwizzler_opts.cpp + src/core/SkSwizzler_opts_hsw.cpp ++ src/core/SkSwizzler_opts_lasx.cpp + src/core/SkSwizzler_opts_ssse3.cpp + src/core/SkTaskGroup.cpp + src/core/SkTextBlob.cpp +@@ -1088,6 +1091,12 @@ if (WTF_CPU_X86 OR WTF_CPU_X86_64) + WEBKIT_ADD_COMPILER_FLAGS(CXX SOURCE src/opts/SkOpts_skx.cpp "-march=skylake-avx512") + endif () + ++if (WTF_CPU_LOONGARCH64) ++ target_compile_options(Skia PRIVATE "-mlasx") ++ target_compile_options(Skia PRIVATE "-mlsx") ++ target_compile_options(Skia PRIVATE "-mabi=lp64d") ++endif () ++ + if (Skia_SkCMS_HSW_OPTS) + WEBKIT_ADD_COMPILER_FLAGS(CXX SOURCE modules/skcms/src/skcms_TransformHsw.cc ${Skia_SkCMS_HSW_FLAGS}) + else () +diff --git a/Source/ThirdParty/skia/src/core/SkBlurEngine.cpp b/Source/ThirdParty/skia/src/core/SkBlurEngine.cpp +index 2c18eb0f..c2aa5506 100644 +--- a/Source/ThirdParty/skia/src/core/SkBlurEngine.cpp ++++ b/Source/ThirdParty/skia/src/core/SkBlurEngine.cpp +@@ -330,62 +330,69 @@ private: + skvx::Vec<4, uint32_t>* buffer0Cursor = fBuffer0Cursor; + skvx::Vec<4, uint32_t>* buffer1Cursor = fBuffer1Cursor; + skvx::Vec<4, uint32_t>* buffer2Cursor = fBuffer2Cursor; +- v4u32 sum0 = __lsx_vld(fSum0, 0); // same as skvx::Vec<4, uint32_t>::Load(fSum0); +- v4u32 sum1 = __lsx_vld(fSum1, 0); +- v4u32 sum2 = __lsx_vld(fSum2, 0); ++ v4u32 sum0 = (v4u32)__lsx_vld(fSum0, 0); // same as skvx::Vec<4, uint32_t>::Load(fSum0); ++ v4u32 sum1 = (v4u32)__lsx_vld(fSum1, 0); ++ v4u32 sum2 = (v4u32)__lsx_vld(fSum2, 0); + + auto processValue = [&](v4u32& vLeadingEdge){ + sum0 += vLeadingEdge; + sum1 += sum0; + sum2 += sum1; + +- v4u32 divisorFactor = __lsx_vreplgr2vr_w(fDivider.divisorFactor()); +- v4u32 blurred = __lsx_vmuh_w(divisorFactor, sum2); ++ v4u32 divisorFactor = (v4u32)__lsx_vreplgr2vr_w(fDivider.divisorFactor()); ++ v4u32 blurred = (v4u32)__lsx_vmuh_w( ++ (__m128i)divisorFactor, ++ (__m128i)sum2); + +- v4u32 buffer2Value = __lsx_vld(buffer2Cursor, 0); //Not fBuffer0Cursor, out of bounds. ++ v4u32 buffer2Value = (v4u32)__lsx_vld(buffer2Cursor, 0); //Not fBuffer0Cursor, out of bounds. + sum2 -= buffer2Value; +- __lsx_vst(sum1, (void *)buffer2Cursor, 0); ++ __lsx_vst((__m128i)sum1, (void *)buffer2Cursor, 0); + buffer2Cursor = (buffer2Cursor + 1) < fBuffersEnd ? buffer2Cursor + 1 : fBuffer2; +- v4u32 buffer1Value = __lsx_vld(buffer1Cursor, 0); ++ v4u32 buffer1Value = (v4u32)__lsx_vld(buffer1Cursor, 0); + sum1 -= buffer1Value; +- __lsx_vst(sum0, (void *)buffer1Cursor, 0); ++ __lsx_vst((__m128i)sum0, (void *)buffer1Cursor, 0); + buffer1Cursor = (buffer1Cursor + 1) < fBuffer2 ? buffer1Cursor + 1 : fBuffer1; +- v4u32 buffer0Value = __lsx_vld(buffer0Cursor, 0); ++ v4u32 buffer0Value = (v4u32)__lsx_vld(buffer0Cursor, 0); + sum0 -= buffer0Value; +- __lsx_vst(vLeadingEdge, (void *)buffer0Cursor, 0); ++ __lsx_vst((__m128i)vLeadingEdge, (void *)buffer0Cursor, 0); + buffer0Cursor = (buffer0Cursor + 1) < fBuffer1 ? buffer0Cursor + 1 : fBuffer0; + + v16u8 shuf = {0x0,0x4,0x8,0xc,0x0}; +- v16u8 ret = __lsx_vshuf_b(blurred, blurred, shuf); ++ v16u8 ret = (v16u8)__lsx_vshuf_b( ++ (__m128i)blurred, ++ (__m128i)blurred, ++ (__m128i)shuf); + return ret; + }; + +- v4u32 zero = __lsx_vldi(0x0); ++ v4u32 zero = (v4u32)__lsx_vldi(0x0); + if (!src && !dst) { + while (n --> 0) { + (void)processValue(zero); + } + } else if (src && !dst) { + while (n --> 0) { +- v4u32 edge = __lsx_vinsgr2vr_w(zero, *src, 0); +- edge = __lsx_vilvl_b(zero, edge); +- edge = __lsx_vilvl_h(zero, edge); ++ v4u32 edge = (v4u32)__lsx_vinsgr2vr_w((__m128i)zero, *src, 0); ++ edge = (v4u32)__lsx_vilvl_b((__m128i)zero, (__m128i)edge); ++ edge = (v4u32)__lsx_vilvl_h((__m128i)zero, (__m128i)edge); + (void)processValue(edge); + src += srcStride; + } + } else if (!src && dst) { + while (n --> 0) { +- v4u32 ret = processValue(zero); +- __lsx_vstelm_w(ret, dst, 0, 0); // 3rd is offset, 4th is idx. ++ v16u8 ret_vec = processValue(zero); ++ v4u32 ret = (v4u32)ret_vec; ++ __lsx_vstelm_w((__m128i)ret, dst, 0, 0); // 3rd is offset, 4th is idx. + dst += dstStride; + } + } else if (src && dst) { + while (n --> 0) { +- v4u32 edge = __lsx_vinsgr2vr_w(zero, *src, 0); +- edge = __lsx_vilvl_b(zero, edge); +- edge = __lsx_vilvl_h(zero, edge); +- v4u32 ret = processValue(edge); +- __lsx_vstelm_w(ret, dst, 0, 0); ++ v4u32 edge = (v4u32)__lsx_vinsgr2vr_w((__m128i)zero, *src, 0); ++ edge = (v4u32)__lsx_vilvl_b((__m128i)zero, (__m128i)edge); ++ edge = (v4u32)__lsx_vilvl_h((__m128i)zero, (__m128i)edge); ++ v16u8 ret_vec = processValue(edge); ++ v4u32 ret = (v4u32)ret_vec; ++ __lsx_vstelm_w((__m128i)ret, dst, 0, 0); + src += srcStride; + dst += dstStride; + } +@@ -396,9 +403,9 @@ private: + fBuffer1Cursor = buffer1Cursor; + fBuffer2Cursor = buffer2Cursor; + +- __lsx_vst(sum0, fSum0, 0); +- __lsx_vst(sum1, fSum1, 0); +- __lsx_vst(sum2, fSum2, 0); ++ __lsx_vst((__m128i)sum0, fSum0, 0); ++ __lsx_vst((__m128i)sum1, fSum1, 0); ++ __lsx_vst((__m128i)sum2, fSum2, 0); + #else + skvx::Vec<4, uint32_t>* buffer0Cursor = fBuffer0Cursor; + skvx::Vec<4, uint32_t>* buffer1Cursor = fBuffer1Cursor; +diff --git a/Source/ThirdParty/skia/src/opts/SkRasterPipeline_opts.h b/Source/ThirdParty/skia/src/opts/SkRasterPipeline_opts.h +index c2a0f5af..8842c081 100644 +--- a/Source/ThirdParty/skia/src/opts/SkRasterPipeline_opts.h ++++ b/Source/ThirdParty/skia/src/opts/SkRasterPipeline_opts.h +@@ -924,14 +924,14 @@ namespace SK_OPTS_NS { + + SI F min(F a, F b) { return __lasx_xvfmin_s(a,b); } + SI F max(F a, F b) { return __lasx_xvfmax_s(a,b); } +- SI I32 min(I32 a, I32 b) { return __lasx_xvmin_w(a,b); } +- SI U32 min(U32 a, U32 b) { return __lasx_xvmin_wu(a,b); } +- SI I32 max(I32 a, I32 b) { return __lasx_xvmax_w(a,b); } +- SI U32 max(U32 a, U32 b) { return __lasx_xvmax_wu(a,b); } ++ SI I32 min(I32 a, I32 b) { return (I32)__lasx_xvmin_w((__m256i)a,(__m256i)b); } ++ SI U32 min(U32 a, U32 b) { return (U32)__lasx_xvmin_wu((__m256i)a,(__m256i)b); } ++ SI I32 max(I32 a, I32 b) { return (I32)__lasx_xvmax_w((__m256i)a,(__m256i)b); } ++ SI U32 max(U32 a, U32 b) { return (U32)__lasx_xvmax_wu((__m256i)a,(__m256i)b); } + + SI F mad(F f, F m, F a) { return __lasx_xvfmadd_s(f, m, a); } + SI F nmad(F f, F m, F a) { return __lasx_xvfmadd_s(-f, m, a); } +- SI F abs_ (F v) { return (F)__lasx_xvand_v((I32)v, (I32)(0-v)); } ++ SI F abs_ (F v) { return (F)__lasx_xvand_v((__m256i)v, (__m256i)(0-v)); } + SI I32 abs_(I32 v) { return max(v, -v); } + SI F rcp_approx(F v) { return __lasx_xvfrecip_s(v); } + SI F rcp_precise (F v) { F e = rcp_approx(v); return e * nmad(v, e, F() + 2.0f); } +@@ -940,17 +940,17 @@ namespace SK_OPTS_NS { + + SI U32 iround(F v) { + F t = F() + 0.5f; +- return __lasx_xvftintrz_w_s(v + t); ++ return (U32)__lasx_xvftintrz_w_s(v + t); + } + + SI U32 round(F v) { + F t = F() + 0.5f; +- return __lasx_xvftintrz_w_s(v + t); ++ return (U32)__lasx_xvftintrz_w_s(v + t); + } + + SI U16 pack(U32 v) { +- return __lsx_vpickev_h(__lsx_vsat_wu(emulate_lasx_d_xr2vr_h(v), 15), +- __lsx_vsat_wu(emulate_lasx_d_xr2vr_l(v), 15)); ++ return (U16)__lsx_vpickev_h(__lsx_vsat_wu(emulate_lasx_d_xr2vr_h((__m256i)v), 15), ++ __lsx_vsat_wu(emulate_lasx_d_xr2vr_l((__m256i)v), 15)); + } + + SI U8 pack(U16 v) { +@@ -960,12 +960,12 @@ namespace SK_OPTS_NS { + } + + SI bool any(I32 c){ +- v8i32 retv = (v8i32)__lasx_xvmskltz_w(__lasx_xvslt_wu(__lasx_xvldi(0), c)); ++ v8i32 retv = (v8i32)__lasx_xvmskltz_w(__lasx_xvslt_wu(__lasx_xvldi(0), (__m256i)c)); + return (retv[0] | retv[4]) != 0b0000; + } + + SI bool all(I32 c){ +- v8i32 retv = (v8i32)__lasx_xvmskltz_w(__lasx_xvslt_wu(__lasx_xvldi(0), c)); ++ v8i32 retv = (v8i32)__lasx_xvmskltz_w(__lasx_xvslt_wu(__lasx_xvldi(0), (__m256i)c)); + return (retv[0] & retv[4]) == 0b1111; + } + +@@ -998,16 +998,16 @@ namespace SK_OPTS_NS { + } + + SI void load2(const uint16_t* ptr, U16* r, U16* g) { +- U16 _0123 = __lsx_vld(ptr, 0), +- _4567 = __lsx_vld(ptr, 16); +- *r = __lsx_vpickev_h(__lsx_vsat_w(__lsx_vsrai_w(__lsx_vslli_w(_4567, 16), 16), 15), ++ U16 _0123 = (U16)__lsx_vld(ptr, 0), ++ _4567 = (U16)__lsx_vld(ptr, 16); ++ *r = (U16)__lsx_vpickev_h(__lsx_vsat_w(__lsx_vsrai_w(__lsx_vslli_w(_4567, 16), 16), 15), + __lsx_vsat_w(__lsx_vsrai_w(__lsx_vslli_w(_0123, 16), 16), 15)); +- *g = __lsx_vpickev_h(__lsx_vsat_w(__lsx_vsrai_w(_4567, 16), 15), ++ *g = (U16)__lsx_vpickev_h(__lsx_vsat_w(__lsx_vsrai_w(_4567, 16), 15), + __lsx_vsat_w(__lsx_vsrai_w(_0123, 16), 15)); + } + SI void store2(uint16_t* ptr, U16 r, U16 g) { +- auto _0123 = __lsx_vilvl_h(g, r), +- _4567 = __lsx_vilvh_h(g, r); ++ auto _0123 = __lsx_vilvl_h((__m128i)g, (__m128i)r), ++ _4567 = __lsx_vilvh_h((__m128i)g, (__m128i)r); + __lsx_vst(_0123, ptr, 0); + __lsx_vst(_4567, ptr, 16); + } +@@ -1028,17 +1028,17 @@ namespace SK_OPTS_NS { + rg4567 = __lsx_vilvl_h(_57, _46), + ba4567 = __lsx_vilvh_h(_57, _46); + +- *r = __lsx_vilvl_d(rg4567, rg0123); +- *g = __lsx_vilvh_d(rg4567, rg0123); +- *b = __lsx_vilvl_d(ba4567, ba0123); +- *a = __lsx_vilvh_d(ba4567, ba0123); ++ *r = (U16)__lsx_vilvl_d((__m128i)rg4567, (__m128i)rg0123); ++ *g = (U16)__lsx_vilvh_d((__m128i)rg4567, (__m128i)rg0123); ++ *b = (U16)__lsx_vilvl_d((__m128i)ba4567, (__m128i)ba0123); ++ *a = (U16)__lsx_vilvh_d((__m128i)ba4567, (__m128i)ba0123); + } + + SI void store4(uint16_t* ptr, U16 r, U16 g, U16 b, U16 a) { +- auto rg0123 = __lsx_vilvl_h(g, r), // r0 g0 r1 g1 r2 g2 r3 g3 +- rg4567 = __lsx_vilvh_h(g, r), // r4 g4 r5 g5 r6 g6 r7 g7 +- ba0123 = __lsx_vilvl_h(a, b), +- ba4567 = __lsx_vilvh_h(a, b); ++ auto rg0123 = __lsx_vilvl_h((__m128i)g, (__m128i)r), // r0 g0 r1 g1 r2 g2 r3 g3 ++ rg4567 = __lsx_vilvh_h((__m128i)g, (__m128i)r), // r4 g4 r5 g5 r6 g6 r7 g7 ++ ba0123 = __lsx_vilvl_h((__m128i)a, (__m128i)b), ++ ba4567 = __lsx_vilvh_h((__m128i)a, (__m128i)b); + + auto _01 =__lsx_vilvl_w(ba0123, rg0123), + _23 =__lsx_vilvh_w(ba0123, rg0123), +@@ -1123,14 +1123,14 @@ namespace SK_OPTS_NS { + + SI F min(F a, F b) { return __lsx_vfmin_s(a,b); } + SI F max(F a, F b) { return __lsx_vfmax_s(a,b); } +- SI I32 min(I32 a, I32 b) { return __lsx_vmin_w(a,b); } +- SI U32 min(U32 a, U32 b) { return __lsx_vmin_wu(a,b); } +- SI I32 max(I32 a, I32 b) { return __lsx_vmax_w(a,b); } +- SI U32 max(U32 a, U32 b) { return __lsx_vmax_wu(a,b); } ++ SI I32 min(I32 a, I32 b) { return (I32)__lsx_vmin_w((__m128i)a,(__m128i)b); } ++ SI U32 min(U32 a, U32 b) { return (U32)__lsx_vmin_wu((__m128i)a,(__m128i)b); } ++ SI I32 max(I32 a, I32 b) { return (I32)__lsx_vmax_w((__m128i)a,(__m128i)b); } ++ SI U32 max(U32 a, U32 b) { return (U32)__lsx_vmax_wu((__m128i)a,(__m128i)b); } + + SI F mad(F f, F m, F a) { return __lsx_vfmadd_s(f, m, a); } + SI F nmad(F f, F m, F a) { return __lsx_vfmadd_s(-f, m, a); } +- SI F abs_(F v) { return (F)__lsx_vand_v((I32)v, (I32)(0-v)); } ++ SI F abs_(F v) { return (F)__lsx_vand_v((__m128i)v, (__m128i)(0-v)); } + SI I32 abs_(I32 v) { return max(v, -v); } + SI F rcp_approx (F v) { return __lsx_vfrecip_s(v); } + SI F rcp_precise (F v) { F e = rcp_approx(v); return e * nmad(v, e, F() + 2.0f); } +@@ -1139,11 +1139,11 @@ namespace SK_OPTS_NS { + + SI U32 iround(F v) { + F t = F() + 0.5f; +- return __lsx_vftintrz_w_s(v + t); } ++ return (U32)__lsx_vftintrz_w_s(v + t); } + + SI U32 round(F v) { + F t = F() + 0.5f; +- return __lsx_vftintrz_w_s(v + t); } ++ return (U32)__lsx_vftintrz_w_s(v + t); } + + SI U16 pack(U32 v) { + __m128i tmp = __lsx_vsat_wu(v, 15); +@@ -1159,12 +1159,12 @@ namespace SK_OPTS_NS { + } + + SI bool any(I32 c){ +- v4i32 retv = (v4i32)__lsx_vmskltz_w(__lsx_vslt_wu(__lsx_vldi(0), c)); ++ v4i32 retv = (v4i32)__lsx_vmskltz_w(__lsx_vslt_wu(__lsx_vldi(0), (__m128i)c)); + return retv[0] != 0b0000; + } + + SI bool all(I32 c){ +- v4i32 retv = (v4i32)__lsx_vmskltz_w(__lsx_vslt_wu(__lsx_vldi(0), c)); ++ v4i32 retv = (v4i32)__lsx_vmskltz_w(__lsx_vslt_wu(__lsx_vldi(0), (__m128i)c)); + return retv[0] == 0b1111; + } + +@@ -1211,7 +1211,7 @@ namespace SK_OPTS_NS { + } + + SI void store2(uint16_t* ptr, U16 r, U16 g) { +- U32 rg = __lsx_vilvl_h(widen_cast<__m128i>(g), widen_cast<__m128i>(r)); ++ __m128i rg = __lsx_vilvl_h(widen_cast<__m128i>(g), widen_cast<__m128i>(r)); + __lsx_vst(rg, ptr, 0); + } + +@@ -3391,26 +3391,26 @@ SI void gradient_lookup(const SkRasterPipeline_GradientCtx* c, U32 idx, F t, + } else + #elif defined(SKRP_CPU_LASX) + if (c->stopCount <= 8) { +- fr = (__m256)__lasx_xvperm_w(__lasx_xvld(c->fs[0], 0), idx); +- br = (__m256)__lasx_xvperm_w(__lasx_xvld(c->bs[0], 0), idx); +- fg = (__m256)__lasx_xvperm_w(__lasx_xvld(c->fs[1], 0), idx); +- bg = (__m256)__lasx_xvperm_w(__lasx_xvld(c->bs[1], 0), idx); +- fb = (__m256)__lasx_xvperm_w(__lasx_xvld(c->fs[2], 0), idx); +- bb = (__m256)__lasx_xvperm_w(__lasx_xvld(c->bs[2], 0), idx); +- fa = (__m256)__lasx_xvperm_w(__lasx_xvld(c->fs[3], 0), idx); +- ba = (__m256)__lasx_xvperm_w(__lasx_xvld(c->bs[3], 0), idx); ++ fr = (__m256)__lasx_xvperm_w(__lasx_xvld(c->fs[0], 0), (__m256i)idx); ++ br = (__m256)__lasx_xvperm_w(__lasx_xvld(c->bs[0], 0), (__m256i)idx); ++ fg = (__m256)__lasx_xvperm_w(__lasx_xvld(c->fs[1], 0), (__m256i)idx); ++ bg = (__m256)__lasx_xvperm_w(__lasx_xvld(c->bs[1], 0), (__m256i)idx); ++ fb = (__m256)__lasx_xvperm_w(__lasx_xvld(c->fs[2], 0), (__m256i)idx); ++ bb = (__m256)__lasx_xvperm_w(__lasx_xvld(c->bs[2], 0), (__m256i)idx); ++ fa = (__m256)__lasx_xvperm_w(__lasx_xvld(c->fs[3], 0), (__m256i)idx); ++ ba = (__m256)__lasx_xvperm_w(__lasx_xvld(c->bs[3], 0), (__m256i)idx); + } else + #elif defined(SKRP_CPU_LSX) + if (c->stopCount <= 4) { + __m128i zero = __lsx_vldi(0); +- fr = (__m128)__lsx_vshuf_w(idx, zero, __lsx_vld(c->fs[0], 0)); +- br = (__m128)__lsx_vshuf_w(idx, zero, __lsx_vld(c->bs[0], 0)); +- fg = (__m128)__lsx_vshuf_w(idx, zero, __lsx_vld(c->fs[1], 0)); +- bg = (__m128)__lsx_vshuf_w(idx, zero, __lsx_vld(c->bs[1], 0)); +- fb = (__m128)__lsx_vshuf_w(idx, zero, __lsx_vld(c->fs[2], 0)); +- bb = (__m128)__lsx_vshuf_w(idx, zero, __lsx_vld(c->bs[2], 0)); +- fa = (__m128)__lsx_vshuf_w(idx, zero, __lsx_vld(c->fs[3], 0)); +- ba = (__m128)__lsx_vshuf_w(idx, zero, __lsx_vld(c->bs[3], 0)); ++ fr = (__m128)__lsx_vshuf_w((__m128i)idx, zero, __lsx_vld(c->fs[0], 0)); ++ br = (__m128)__lsx_vshuf_w((__m128i)idx, zero, __lsx_vld(c->bs[0], 0)); ++ fg = (__m128)__lsx_vshuf_w((__m128i)idx, zero, __lsx_vld(c->fs[1], 0)); ++ bg = (__m128)__lsx_vshuf_w((__m128i)idx, zero, __lsx_vld(c->bs[1], 0)); ++ fb = (__m128)__lsx_vshuf_w((__m128i)idx, zero, __lsx_vld(c->fs[2], 0)); ++ bb = (__m128)__lsx_vshuf_w((__m128i)idx, zero, __lsx_vld(c->bs[2], 0)); ++ fa = (__m128)__lsx_vshuf_w((__m128i)idx, zero, __lsx_vld(c->fs[3], 0)); ++ ba = (__m128)__lsx_vshuf_w((__m128i)idx, zero, __lsx_vld(c->bs[3], 0)); + } else + #endif + { +@@ -5532,11 +5532,11 @@ SI I16 scaled_mult(I16 a, I16 b) { + #elif defined(SKRP_CPU_NEON) + return vqrdmulhq_s16(a, b); + #elif defined(SKRP_CPU_LASX) +- I16 res = __lasx_xvmuh_h(a, b); +- return __lasx_xvslli_h(res, 1); ++ __m256i res = __lasx_xvmuh_h((__m256i)a, (__m256i)b); ++ return (I16)__lasx_xvslli_h(res, 1); + #elif defined(SKRP_CPU_LSX) +- I16 res = __lsx_vmuh_h(a, b); +- return __lsx_vslli_h(res, 1); ++ __m128i res = __lsx_vmuh_h((__m128i)a, (__m128i)b); ++ return (I16)__lsx_vslli_h(res, 1); + #else + const I32 roundingTerm = I32_(1 << 14); + return cast((cast(a) * cast(b) + roundingTerm) >> 15); +@@ -5923,7 +5923,7 @@ SI void from_8888(U32 rgba, U16* r, U16* g, U16* b, U16* a) { + split(v, &_02,&_13); + __m256i tmp0 = __lasx_xvsat_wu(_02, 15); + __m256i tmp1 = __lasx_xvsat_wu(_13, 15); +- return __lasx_xvpickev_h(tmp1, tmp0); ++ return (U16)__lasx_xvpickev_h(tmp1, tmp0); + }; + #elif defined(SKRP_CPU_LSX) + __m128i _01, _23, rg, ba; +@@ -5933,10 +5933,10 @@ SI void from_8888(U32 rgba, U16* r, U16* g, U16* b, U16* a) { + + __m128i mask_00ff = __lsx_vreplgr2vr_h(0xff); + +- *r = __lsx_vand_v(rg, mask_00ff); +- *g = __lsx_vsrli_h(rg, 8); +- *b = __lsx_vand_v(ba, mask_00ff); +- *a = __lsx_vsrli_h(ba, 8); ++ *r = (U16)__lsx_vand_v(rg, mask_00ff); ++ *g = (U16)__lsx_vsrli_h(rg, 8); ++ *b = (U16)__lsx_vand_v(ba, mask_00ff); ++ *a = (U16)__lsx_vsrli_h(ba, 8); + #else + auto cast_U16 = [](U32 v) -> U16 { + return cast(v); +@@ -5964,26 +5964,26 @@ SI void load_8888_(const uint32_t* ptr, U16* r, U16* g, U16* b, U16* a) { + SI void store_8888_(uint32_t* ptr, U16 r, U16 g, U16 b, U16 a) { + #if defined(SKRP_CPU_LSX) + __m128i mask = __lsx_vreplgr2vr_h(255); +- r = __lsx_vmin_hu(r, mask); +- g = __lsx_vmin_hu(g, mask); +- b = __lsx_vmin_hu(b, mask); +- a = __lsx_vmin_hu(a, mask); ++ r = (U16)__lsx_vmin_hu((__m128i)r, mask); ++ g = (U16)__lsx_vmin_hu((__m128i)g, mask); ++ b = (U16)__lsx_vmin_hu((__m128i)b, mask); ++ a = (U16)__lsx_vmin_hu((__m128i)a, mask); + +- g = __lsx_vslli_h(g, 8); ++ g = (U16)__lsx_vslli_h((__m128i)g, 8); + r = r | g; +- a = __lsx_vslli_h(a, 8); ++ a = (U16)__lsx_vslli_h((__m128i)a, 8); + a = a | b; + +- __m128i r_lo = __lsx_vsllwil_wu_hu(r, 0); +- __m128i r_hi = __lsx_vexth_wu_hu(r); +- __m128i a_lo = __lsx_vsllwil_wu_hu(a, 0); +- __m128i a_hi = __lsx_vexth_wu_hu(a); ++ __m128i r_lo = __lsx_vsllwil_wu_hu((__m128i)r, 0); ++ __m128i r_hi = __lsx_vexth_wu_hu((__m128i)r); ++ __m128i a_lo = __lsx_vsllwil_wu_hu((__m128i)a, 0); ++ __m128i a_hi = __lsx_vexth_wu_hu((__m128i)a); + + a_lo = __lsx_vslli_w(a_lo, 16); + a_hi = __lsx_vslli_w(a_hi, 16); + +- r = r_lo | a_lo; +- a = r_hi | a_hi; ++ r = (U16)(r_lo | a_lo); ++ a = (U16)(r_hi | a_hi); + store(ptr, join(r, a)); + #else + r = min(r, 255); +@@ -6549,8 +6549,8 @@ STAGE_GP(bilerp_clamp_8888, const SkRasterPipeline_GatherCtx* ctx) { + qy_lo = __lsx_vxor_v(qy_lo, temp); + qy_hi = __lsx_vxor_v(qy_hi, temp); + +- I16 tx = __lsx_vpickev_h(qx_hi, qx_lo); +- I16 ty = __lsx_vpickev_h(qy_hi, qy_lo); ++ I16 tx = (I16)__lsx_vpickev_h(qx_hi, qx_lo); ++ I16 ty = (I16)__lsx_vpickev_h(qy_hi, qy_lo); + #else + I16 tx = cast(qx ^ 0x8000), + ty = cast(qy ^ 0x8000); +-- +2.47.3 + diff --git a/webkitgtk.spec b/webkitgtk.spec index f985be9..0202650 100644 --- a/webkitgtk.spec +++ b/webkitgtk.spec @@ -1,4 +1,4 @@ -%define anolis_release 3 +%define anolis_release 4 ## NOTE: Lots of files in various subdirectories have the same name (such as ## "LICENSE") so this short macro allows us to distinguish them by using their @@ -27,6 +27,7 @@ Source1: https://webkitgtk.org/releases/webkitgtk-%{version}.tar.xz.asc Patch01: riscv-use-unknown-cpu.patch Patch02: fix_code_error.patch +Patch03: 0001-fix-loongarch64-build-error-for-skia.patch BuildRequires: bison @@ -125,9 +126,7 @@ Recommends: xdg-desktop-portal-gtk Provides: bundled(angle) Provides: bundled(pdfjs) Provides: bundled(xdgmime) -%ifnarch loongarch64 Provides: bundled(skia) -%endif Obsoletes: webkit2gtk5.0 < %{version}-%{release} %description -n webkitgtk6.0 @@ -147,9 +146,7 @@ Recommends: xdg-desktop-portal-gtk Provides: bundled(angle) Provides: bundled(pdfjs) Provides: bundled(xdgmime) -%ifnarch loongarch64 Provides: bundled(skia) -%endif %description -n webkit2gtk4.1 WebKitGTK is the port of the WebKit web rendering engine to the @@ -273,9 +270,6 @@ files for developing applications that use JavaScript engine from webkit2gtk-4.1 %if !0%{?with_gamepad} -DENABLE_GAMEPAD=OFF \ %endif -%ifarch loongarch64 - -DUSE_SKIA=OFF \ -%endif %ifarch aarch64 -DUSE_64KB_PAGE_BLOCK=ON \ %endif @@ -295,9 +289,6 @@ files for developing applications that use JavaScript engine from webkit2gtk-4.1 %if !0%{?with_gamepad} -DENABLE_GAMEPAD=OFF \ %endif -%ifarch loongarch64 - -DUSE_SKIA=OFF \ -%endif %ifarch aarch64 -DUSE_64KB_PAGE_BLOCK=ON \ %endif @@ -318,9 +309,6 @@ files for developing applications that use JavaScript engine from webkit2gtk-4.1 %if !0%{?with_gamepad} -DENABLE_GAMEPAD=OFF \ %endif -%ifarch loongarch64 - -DUSE_SKIA=OFF \ -%endif %ifarch aarch64 -DUSE_64KB_PAGE_BLOCK=ON \ %endif @@ -456,6 +444,9 @@ export NINJA_STATUS="[2/2][%f/%t %es] " %endif %changelog +* Tue Aug 5 2025 doupengda - 2.48.1-4 +- add skia support for loongarch64 + * Tue Jun 24 2025 doupengda - 2.48.1-3 - add support for loongarch64 -- Gitee