skia2/modules/canvaskit/compile_gm.sh
Nathaniel Nifong 110367dcfc Fix most remaining wasm gm unit tests by correctly providing gl context
The basic problem was that WasmContextInfo shadowed non-virtual members
of ContextInfo. the tests, which work with that type, end up calling the
super class's methods which return null for directContext()

The context created and stored in WasmContextInfo would have worked if it
could be returned, but I've opted to go with what looks like a more
canonical way to test a new backend, that is to create a platform-
specific subclass of GLTestContext, and let GrContextFactory create the
GL context.

Bug:skia:10869

Change-Id: Ie9e1142cf2e7268242ff9aab70f76151714850a3
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/355116
Commit-Queue: Nathaniel Nifong <nifong@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Reviewed-by: Kevin Lubick <kjlubick@google.com>
2021-01-21 20:46:19 +00:00

248 lines
7.2 KiB
Bash
Executable File

#!/bin/bash
# Copyright 2020 Google LLC
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
set -ex
BASE_DIR=`cd $(dirname ${BASH_SOURCE[0]}) && pwd`
# This expects the environment variable EMSDK to be set
if [[ ! -d $EMSDK ]]; then
cat >&2 << "EOF"
Be sure to set the EMSDK environment variable to the location of Emscripten SDK:
https://emscripten.org/docs/getting_started/downloads.html
EOF
exit 1
fi
# Navigate to SKIA_HOME from where this file is located.
pushd $BASE_DIR/../..
source $EMSDK/emsdk_env.sh
EMCC=`which emcc`
EMCXX=`which em++`
EMAR=`which emar`
if [[ $@ == *debug* ]]; then
echo "Building a Debug build"
DEBUG=true
EXTRA_CFLAGS="\"-DSK_DEBUG\", \"-DGR_TEST_UTILS\", "
RELEASE_CONF="-O1 --js-opts 0 -s DEMANGLE_SUPPORT=1 -frtti -s ASSERTIONS=1 -s GL_ASSERTIONS=1 -g \
-DSK_DEBUG --pre-js $BASE_DIR/debug.js"
BUILD_DIR=${BUILD_DIR:="out/wasm_gm_tests_debug"}
else
echo "Building a release build"
DEBUG=false
BUILD_DIR=${BUILD_DIR:="out/wasm_gm_tests"}
RELEASE_CONF="-O3 -DSK_RELEASE --pre-js $BASE_DIR/release.js \
-DGR_TEST_UTILS"
EXTRA_CFLAGS="\"-DSK_RELEASE\", \"-DGR_TEST_UTILS\", "
fi
IS_OFFICIAL_BUILD="false"
mkdir -p $BUILD_DIR
# sometimes the .a files keep old symbols around - cleaning them out makes sure
# we get a fresh build.
rm -f $BUILD_DIR/*.a
GN_GPU="skia_enable_gpu=true skia_gl_standard = \"webgl\""
GN_GPU_FLAGS="\"-DSK_DISABLE_LEGACY_SHADERCONTEXT\","
WASM_GPU="-lGL -DSK_SUPPORT_GPU=1 -DSK_GL \
-DSK_DISABLE_LEGACY_SHADERCONTEXT --pre-js $BASE_DIR/cpu.js --pre-js $BASE_DIR/gpu.js\
-s USE_WEBGL2=1"
GM_LIB="$BUILD_DIR/libgm_wasm.a"
GN_FONT="skia_enable_fontmgr_custom_directory=false "
BUILTIN_FONT="$BASE_DIR/fonts/NotoMono-Regular.ttf.cpp"
# Generate the font's binary file (which is covered by .gitignore)
python tools/embed_resources.py \
--name SK_EMBEDDED_FONTS \
--input $BASE_DIR/fonts/NotoMono-Regular.ttf \
--output $BASE_DIR/fonts/NotoMono-Regular.ttf.cpp \
--align 4
GN_FONT+="skia_enable_fontmgr_custom_embedded=true skia_enable_fontmgr_custom_empty=false"
GN_SHAPER="skia_use_icu=true skia_use_system_icu=false skia_use_harfbuzz=true skia_use_system_harfbuzz=false"
# Turn off exiting while we check for ninja (which may not be on PATH)
set +e
NINJA=`which ninja`
if [[ -z $NINJA ]]; then
git clone "https://chromium.googlesource.com/chromium/tools/depot_tools.git" --depth 1 $BUILD_DIR/depot_tools
NINJA=$BUILD_DIR/depot_tools/ninja
fi
# Re-enable error checking
set -e
./bin/fetch-gn
echo "Compiling bitcode"
# Inspired by https://github.com/Zubnix/skia-wasm-port/blob/master/build_bindings.sh
./bin/gn gen ${BUILD_DIR} \
--args="cc=\"${EMCC}\" \
cxx=\"${EMCXX}\" \
ar=\"${EMAR}\" \
extra_cflags_cc=[\"-frtti\"] \
extra_cflags=[\"-s\", \"WARN_UNALIGNED=1\", \"-s\", \"MAIN_MODULE=1\",
\"-DSKNX_NO_SIMD\", \"-DSK_DISABLE_AAA\",
\"-DSK_FORCE_8_BYTE_ALIGNMENT\",
${GN_GPU_FLAGS}
${EXTRA_CFLAGS}
] \
is_debug=${DEBUG} \
is_official_build=${IS_OFFICIAL_BUILD} \
is_component_build=false \
werror=true \
target_cpu=\"wasm\" \
\
skia_use_angle=false \
skia_use_dng_sdk=false \
skia_use_webgl=true \
skia_use_fontconfig=false \
skia_use_freetype=true \
skia_use_libheif=true \
skia_use_libjpeg_turbo_decode=true \
skia_use_libjpeg_turbo_encode=true \
skia_use_libpng_decode=true \
skia_use_libpng_encode=true \
skia_use_libwebp_decode=true \
skia_use_libwebp_encode=true \
skia_use_lua=false \
skia_use_piex=true \
skia_use_system_freetype2=false \
skia_use_system_libjpeg_turbo=false \
skia_use_system_libpng=false \
skia_use_system_libwebp=false \
skia_use_system_zlib=false\
skia_use_vulkan=false \
skia_use_wuffs=true \
skia_use_zlib=true \
\
${GN_SHAPER} \
${GN_GPU} \
${GN_FONT} \
skia_use_expat=true \
skia_enable_ccpr=true \
skia_enable_svg=true \
skia_enable_skshaper=true \
skia_enable_nvpr=false \
skia_enable_skparagraph=true \
skia_enable_pdf=false"
# Build all the libs we will need below
parse_targets() {
for LIBPATH in $@; do
basename $LIBPATH
done
}
${NINJA} -C ${BUILD_DIR} libskia.a libskshaper.a \
$(parse_targets $SHAPER_LIB $GM_LIB)
echo "Generating final wasm"
# Defines for the emscripten compilation step, which builds the tests
# Aim to match the defines that would be set by gn for the skia compilation step.
SKIA_DEFINES="
-DSK_DISABLE_AAA \
-DSK_FORCE_8_BYTE_ALIGNMENT \
-DGR_OP_ALLOCATE_USE_NEW \
-DSK_HAS_WUFFS_LIBRARY \
-DSK_HAS_HEIF_LIBRARY \
-DSK_ENCODE_WEBP \
-DSK_CODEC_DECODES_WEBP \
-DSK_ENCODE_PNG \
-DSK_CODEC_DECODES_PNG \
-DSK_ENCODE_JPEG \
-DSK_CODEC_DECODES_JPEG \
-DSK_SHAPER_HARFBUZZ_AVAILABLE \
-DSK_UNICODE_AVAILABLE \
-DSK_ENABLE_SVG"
# Disable '-s STRICT=1' outside of Linux until
# https://github.com/emscripten-core/emscripten/issues/12118 is resovled.
STRICTNESS="-s STRICT=1"
if [[ `uname` != "Linux" ]]; then
echo "Disabling '-s STRICT=1'. See: https://github.com/emscripten-core/emscripten/issues/12118"
STRICTNESS=""
fi
GMS_TO_BUILD="gm/*.cpp"
TESTS_TO_BUILD="tests/*.cpp"
# When developing locally, it can be faster to focus only on the gms or tests you care about
# (since they all have to be recompiled/relinked) every time. To do so, mark the following as true
if false; then
GMS_TO_BUILD="gm/gm.cpp"
TESTS_TO_BUILD="tests/BulkRectTest.cpp tests/Test.cpp"
fi
# These gms do not compile or link with the WASM code. Thus, we omit them.
GLOBIGNORE="gm/cgms.cpp:"\
"gm/compressed_textures.cpp:"\
"gm/fiddle.cpp:"\
"gm/xform.cpp:"\
"gm/video_decoder.cpp:"
# These tests do not compile with the WASM code (require other deps).
GLOBIGNORE+="tests/CodecTest.cpp:"\
"tests/ColorSpaceTest.cpp:"\
"tests/DrawOpAtlasTest.cpp:"\
"tests/EncodeTest.cpp:"\
"tests/FontMgrAndroidParserTest.cpp:"\
"tests/FontMgrFontConfigTest.cpp:"\
"tests/SkVMTest.cpp:"
# These tests do complex things with TestContexts, which is not easily supported for the WASM
# test harness. Thus we omit them.
GLOBIGNORE+="tests/BackendAllocationTest.cpp:"\
"tests/EGLImageTest.cpp:"\
"tests/ImageTest.cpp:"\
"tests/SurfaceSemaphoreTest.cpp:"\
"tests/TextureBindingsResetTest.cpp:"\
"tests/VkHardwareBufferTest.cpp:"
# All the tests in these files crash.
GLOBIGNORE+="tests/GrThreadSafeCacheTest.cpp"
# Emscripten prefers that the .a files go last in order, otherwise, it
# may drop symbols that it incorrectly thinks aren't used. One day,
# Emscripten will use LLD, which may relax this requirement.
EMCC_DEBUG=1 ${EMCXX} \
$RELEASE_CONF \
-I. \
-DGR_TEST_UTILS \
$SKIA_DEFINES \
$WASM_GPU \
-std=c++17 \
--profiling-funcs \
--profiling \
--bind \
--no-entry \
--pre-js $BASE_DIR/gm.js \
tools/Resources.cpp \
$BASE_DIR/gm_bindings.cpp \
$GMS_TO_BUILD \
$TESTS_TO_BUILD \
$GM_LIB \
$BUILD_DIR/libskshaper.a \
$BUILD_DIR/libsvg.a \
$BUILD_DIR/libskia.a \
$BUILTIN_FONT \
-s LLD_REPORT_UNDEFINED \
-s ALLOW_MEMORY_GROWTH=1 \
-s EXPORT_NAME="InitWasmGMTests" \
-s EXPORTED_FUNCTIONS=['_malloc','_free'] \
-s FORCE_FILESYSTEM=1 \
-s FILESYSTEM=1 \
-s MODULARIZE=1 \
-s NO_EXIT_RUNTIME=1 \
-s INITIAL_MEMORY=256MB \
-s WASM=1 \
$STRICTNESS \
-o $BUILD_DIR/wasm_gm_tests.js