Skip to content

Commit 063bb4e

Browse files
committed
feat: WASM
1 parent fcdbf56 commit 063bb4e

28 files changed

+6414
-0
lines changed

.github/workflows/wasm-build.yml

Lines changed: 448 additions & 0 deletions
Large diffs are not rendered by default.

.gitignore

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,35 @@ mastercopy
1313
.vscode
1414

1515
src/apps/ocioview/poetry.lock
16+
17+
# WASM build artifacts
18+
dist/
19+
build-wasm*/
20+
*.wasm
21+
*.js.mem
22+
*.js.symbols
23+
*.js.temp
24+
*.wast
25+
*.wat
26+
27+
# Emscripten cache and tools
28+
emsdk/
29+
emsdk_env.sh
30+
.emscripten_cache/
31+
32+
# Node.js and NPM
33+
node_modules/
34+
package-lock.json
35+
yarn.lock
36+
npm-debug.log*
37+
38+
# Testing and CI artifacts
39+
test-results/
40+
benchmark-results/
41+
coverage/
42+
.nyc_output/
43+
build-logs/
44+
45+
# Development tools
46+
.vscode/
47+
.idea/

CMakeLists.wasm.txt

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
# OpenColorIO.wasm - Graphics Tier 3 CMake Configuration
2+
# Production-quality color management library compiled to WebAssembly
3+
# Following WASM Ecosystem Standards v2.0
4+
5+
cmake_minimum_required(VERSION 3.16)
6+
project(OpenColorIO_WASM VERSION 2.5.0)
7+
8+
# Verify we're using Emscripten
9+
if(NOT EMSCRIPTEN)
10+
message(FATAL_ERROR "This build script requires Emscripten. Please use: emcmake cmake")
11+
endif()
12+
13+
# Set C++ standard
14+
set(CMAKE_CXX_STANDARD 17)
15+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
16+
17+
# Build type configuration
18+
if(NOT CMAKE_BUILD_TYPE)
19+
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type" FORCE)
20+
endif()
21+
22+
# Graphics Tier 3 memory configuration - High memory for rendering and LUTs
23+
set(WASM_INITIAL_MEMORY "128MB")
24+
set(WASM_MAXIMUM_MEMORY "2GB")
25+
26+
# Build options for OpenColorIO.wasm
27+
option(ENABLE_SIMD "Enable WebAssembly SIMD optimizations" ON)
28+
option(ENABLE_WEBGPU "Enable WebGPU compute shader support" ON)
29+
option(ENABLE_WASM_NATIVE "Enable WASM-native filesystem features" ON)
30+
31+
# Ecosystem dependency integration - Foundation Tier 1 libraries
32+
set(ECOSYSTEM_DEPS "")
33+
34+
# Check for Foundation Tier 1 dependencies
35+
find_path(IMATH_WASM_DIR "imath.wasm" PATHS "../Imath.wasm/install" "../Imath.wasm/dist" NO_DEFAULT_PATH)
36+
if(IMATH_WASM_DIR)
37+
list(APPEND ECOSYSTEM_DEPS "${IMATH_WASM_DIR}/imath.wasm")
38+
message(STATUS "Using ecosystem Imath.wasm from ${IMATH_WASM_DIR}")
39+
else()
40+
message(WARNING "Imath.wasm not found - OpenColorIO requires Foundation Tier 1 dependencies")
41+
endif()
42+
43+
find_path(LIBEXPAT_WASM_DIR "libexpat.wasm" PATHS "../libexpat.wasm/install" "../libexpat.wasm/dist" NO_DEFAULT_PATH)
44+
if(LIBEXPAT_WASM_DIR)
45+
list(APPEND ECOSYSTEM_DEPS "${LIBEXPAT_WASM_DIR}/libexpat.wasm")
46+
message(STATUS "Using ecosystem libexpat.wasm from ${LIBEXPAT_WASM_DIR}")
47+
endif()
48+
49+
find_path(ZLIB_WASM_DIR "zlib.wasm" PATHS "../zlib.wasm/install" "../zlib.wasm/dist" NO_DEFAULT_PATH)
50+
if(ZLIB_WASM_DIR)
51+
list(APPEND ECOSYSTEM_DEPS "${ZLIB_WASM_DIR}/zlib.wasm")
52+
message(STATUS "Using ecosystem zlib.wasm from ${ZLIB_WASM_DIR}")
53+
endif()
54+
55+
find_path(MINIZIP_NG_WASM_DIR "minizip-ng.wasm" PATHS "../minizip-ng.wasm/install" "../minizip-ng.wasm/dist" NO_DEFAULT_PATH)
56+
if(MINIZIP_NG_WASM_DIR)
57+
list(APPEND ECOSYSTEM_DEPS "${MINIZIP_NG_WASM_DIR}/minizip-ng.wasm")
58+
message(STATUS "Using ecosystem minizip-ng.wasm from ${MINIZIP_NG_WASM_DIR}")
59+
endif()
60+
61+
find_path(PYSTRING_WASM_DIR "pystring.wasm" PATHS "../pystring.wasm/install" "../pystring.wasm/dist" NO_DEFAULT_PATH)
62+
if(PYSTRING_WASM_DIR)
63+
list(APPEND ECOSYSTEM_DEPS "${PYSTRING_WASM_DIR}/pystring.wasm")
64+
message(STATUS "Using ecosystem pystring.wasm from ${PYSTRING_WASM_DIR}")
65+
endif()
66+
67+
# Base compiler flags for Graphics Tier 3
68+
set(WASM_BASE_FLAGS
69+
-sWASM=1
70+
-sMODULARIZE=1
71+
-sEXPORT_ES6=1
72+
-sEXPORT_NAME='OpenColorIOModule'
73+
-sINITIAL_MEMORY=${WASM_INITIAL_MEMORY}
74+
-sMAXIMUM_MEMORY=${WASM_MAXIMUM_MEMORY}
75+
-sALLOW_MEMORY_GROWTH=1
76+
-sSTACK_SIZE=5MB
77+
-sASSERTIONS=0
78+
)
79+
80+
# Performance optimization flags
81+
set(WASM_OPTIMIZATION_FLAGS
82+
-O3
83+
-flto
84+
--closure 1
85+
)
86+
87+
# SIMD flags - Enable WebAssembly SIMD for color processing
88+
if(ENABLE_SIMD)
89+
list(APPEND WASM_BASE_FLAGS -msimd128)
90+
add_compile_definitions(OCIO_WASM_SIMD_ENABLED)
91+
message(STATUS "✅ WebAssembly SIMD enabled for color transforms")
92+
else()
93+
message(STATUS "❌ SIMD disabled - using scalar fallback")
94+
endif()
95+
96+
# WebGPU support flags
97+
if(ENABLE_WEBGPU)
98+
list(APPEND WASM_BASE_FLAGS
99+
-sUSE_WEBGPU=1
100+
-sASYNCIFY=1 # Required for async WebGPU operations
101+
)
102+
add_compile_definitions(OCIO_WASM_WEBGPU_ENABLED)
103+
message(STATUS "✅ WebGPU compute shader support enabled")
104+
else()
105+
message(STATUS "❌ WebGPU disabled")
106+
endif()
107+
108+
# WASM-native filesystem support
109+
if(ENABLE_WASM_NATIVE)
110+
list(APPEND WASM_BASE_FLAGS
111+
-sFORCE_FILESYSTEM=1
112+
-sASYNCIFY=1 # Required for async file operations
113+
-lidbfs.js # IDBFS for persistent color space storage
114+
--preload-file configs@/color-configs
115+
)
116+
add_compile_definitions(OCIO_WASM_NATIVE_ENABLED)
117+
message(STATUS "✅ WASM-native filesystem patterns enabled")
118+
else()
119+
message(STATUS "❌ WASM-native features disabled")
120+
endif()
121+
122+
# Runtime method exports
123+
set(WASM_RUNTIME_METHODS
124+
ccall
125+
cwrap
126+
HEAPU8
127+
HEAPF32
128+
addFunction
129+
removeFunction
130+
FS
131+
)
132+
list(JOIN WASM_RUNTIME_METHODS "," RUNTIME_METHODS_STR)
133+
list(APPEND WASM_BASE_FLAGS -sEXPORTED_RUNTIME_METHODS=[${RUNTIME_METHODS_STR}])
134+
135+
# Debug vs Release configuration
136+
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
137+
list(APPEND WASM_BASE_FLAGS
138+
-g
139+
-gsource-map
140+
-sASSERTIONS=1
141+
-sDEBUG_LEVEL=1
142+
)
143+
message(STATUS "🐛 Debug build with source maps enabled")
144+
else()
145+
list(APPEND WASM_BASE_FLAGS ${WASM_OPTIMIZATION_FLAGS})
146+
message(STATUS "🚀 Release build with full optimization")
147+
endif()
148+
149+
# Apply flags to both compile and link
150+
string(JOIN " " WASM_FLAGS_STR ${WASM_BASE_FLAGS})
151+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS_STR}")
152+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS_STR}")
153+
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${WASM_FLAGS_STR}")
154+
155+
# Link ecosystem dependencies
156+
if(ECOSYSTEM_DEPS)
157+
string(JOIN " " ECOSYSTEM_DEPS_STR ${ECOSYSTEM_DEPS})
158+
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${ECOSYSTEM_DEPS_STR}")
159+
message(STATUS "🔗 Linking ecosystem dependencies: ${ECOSYSTEM_DEPS_STR}")
160+
endif()
161+
162+
# Source files for OpenColorIO WASM module
163+
set(OCIO_WASM_SOURCES
164+
wasm/ocio_wasm_main.cpp
165+
wasm/ocio_wasm_api.cpp
166+
wasm/ocio_wasm_simd.cpp
167+
wasm/ocio_wasm_webgpu.cpp
168+
wasm/ocio_wasm_native.cpp
169+
wasm/ocio_js_bindings.cpp
170+
)
171+
172+
# Create the WASM executable
173+
add_executable(opencolorio_wasm ${OCIO_WASM_SOURCES})
174+
175+
# Set output names
176+
set_target_properties(opencolorio_wasm PROPERTIES
177+
OUTPUT_NAME "opencolorio"
178+
)
179+
180+
# Include directories for OpenColorIO headers
181+
target_include_directories(opencolorio_wasm PRIVATE
182+
${CMAKE_CURRENT_SOURCE_DIR}/include
183+
${CMAKE_CURRENT_SOURCE_DIR}/src
184+
)
185+
186+
# Link against system OpenColorIO (assumes already built)
187+
find_package(PkgConfig)
188+
if(PkgConfig_FOUND)
189+
pkg_check_modules(OCIO REQUIRED OpenColorIO)
190+
target_include_directories(opencolorio_wasm PRIVATE ${OCIO_INCLUDE_DIRS})
191+
target_compile_options(opencolorio_wasm PRIVATE ${OCIO_CFLAGS_OTHER})
192+
target_link_libraries(opencolorio_wasm ${OCIO_LIBRARIES})
193+
endif()
194+
195+
# Compile definitions
196+
target_compile_definitions(opencolorio_wasm PRIVATE
197+
OCIO_VERSION_MAJOR=2
198+
OCIO_VERSION_MINOR=5
199+
OCIO_VERSION_PATCH=0
200+
OCIO_WASM_BUILD=1
201+
)
202+
203+
# Installation
204+
install(FILES
205+
${CMAKE_CURRENT_BINARY_DIR}/opencolorio.js
206+
${CMAKE_CURRENT_BINARY_DIR}/opencolorio.wasm
207+
DESTINATION dist/
208+
)
209+
210+
# Install TypeScript definitions
211+
install(FILES
212+
wasm/opencolorio.d.ts
213+
DESTINATION dist/
214+
)
215+
216+
# Install additional assets
217+
if(ENABLE_WASM_NATIVE)
218+
install(DIRECTORY configs/ DESTINATION dist/color-configs/)
219+
endif()
220+
221+
# Print build summary
222+
message(STATUS "")
223+
message(STATUS "=== OpenColorIO.wasm Build Configuration ===")
224+
message(STATUS "Version: ${PROJECT_VERSION}")
225+
message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
226+
message(STATUS "SIMD: ${ENABLE_SIMD}")
227+
message(STATUS "WebGPU: ${ENABLE_WEBGPU}")
228+
message(STATUS "WASM-native: ${ENABLE_WASM_NATIVE}")
229+
message(STATUS "Ecosystem deps: ${ECOSYSTEM_DEPS}")
230+
message(STATUS "Memory: ${WASM_INITIAL_MEMORY} - ${WASM_MAXIMUM_MEMORY}")
231+
message(STATUS "==========================================")
232+
message(STATUS "")

cmake/WASMConfig.cmake

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# SPDX-License-Identifier: BSD-3-Clause
2+
# Copyright Contributors to the OpenColorIO Project.
3+
4+
# WebAssembly-specific build configuration for OpenColorIO
5+
6+
message(STATUS "Configuring OpenColorIO for WebAssembly build")
7+
8+
# Force static library build
9+
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build static libraries for WASM" FORCE)
10+
11+
# Disable components not needed for WASM
12+
set(OCIO_BUILD_APPS OFF CACHE BOOL "Disable command-line apps for WASM" FORCE)
13+
set(OCIO_BUILD_OPENFX OFF CACHE BOOL "Disable OpenFX plugins for WASM" FORCE)
14+
set(OCIO_BUILD_NUKE OFF CACHE BOOL "Disable Nuke plugins for WASM" FORCE)
15+
set(OCIO_BUILD_TESTS OFF CACHE BOOL "Disable tests for WASM" FORCE)
16+
set(OCIO_BUILD_GPU_TESTS OFF CACHE BOOL "Disable GPU tests for WASM" FORCE)
17+
set(OCIO_BUILD_DOCS OFF CACHE BOOL "Disable documentation for WASM" FORCE)
18+
set(OCIO_BUILD_PYTHON OFF CACHE BOOL "Disable Python bindings for WASM" FORCE)
19+
set(OCIO_BUILD_JAVA OFF CACHE BOOL "Disable Java bindings for WASM" FORCE)
20+
21+
# Enable headless GPU rendering
22+
set(OCIO_USE_HEADLESS ON CACHE BOOL "Enable headless GPU rendering for WASM" FORCE)
23+
24+
# SIMD configuration - enable WebAssembly SIMD compatible optimizations
25+
# WebAssembly SIMD supports 128-bit vectors compatible with SSE-style operations
26+
set(OCIO_USE_SIMD ON CACHE BOOL "Enable SIMD optimizations" FORCE)
27+
28+
# Enable SSE optimizations compatible with WebAssembly SIMD (-msimd128)
29+
# These will be translated to WebAssembly SIMD instructions
30+
set(OCIO_USE_SSE2 ON CACHE BOOL "Enable SSE2 for WASM SIMD" FORCE)
31+
set(OCIO_USE_SSE3 ON CACHE BOOL "Enable SSE3 for WASM SIMD" FORCE)
32+
set(OCIO_USE_SSSE3 ON CACHE BOOL "Enable SSSE3 for WASM SIMD" FORCE)
33+
set(OCIO_USE_SSE4 ON CACHE BOOL "Enable SSE4 for WASM SIMD" FORCE)
34+
set(OCIO_USE_SSE42 ON CACHE BOOL "Enable SSE4.2 for WASM SIMD" FORCE)
35+
36+
# Disable AVX and higher - not supported by WebAssembly SIMD
37+
set(OCIO_USE_AVX OFF CACHE BOOL "Disable AVX for WASM build" FORCE)
38+
set(OCIO_USE_AVX2 OFF CACHE BOOL "Disable AVX2 for WASM build" FORCE)
39+
set(OCIO_USE_AVX512 OFF CACHE BOOL "Disable AVX512 for WASM build" FORCE)
40+
set(OCIO_USE_F16C OFF CACHE BOOL "Disable F16C for WASM build" FORCE)
41+
42+
# SSE2NEON not needed for WebAssembly SIMD
43+
set(OCIO_USE_SSE2NEON OFF CACHE BOOL "Disable SSE2NEON for WASM build" FORCE)
44+
45+
# External packages - use MISSING to allow system packages where available
46+
set(OCIO_INSTALL_EXT_PACKAGES "MISSING" CACHE STRING "Install missing external packages" FORCE)
47+
48+
# Warning configuration
49+
set(OCIO_WARNING_AS_ERROR OFF CACHE BOOL "Disable warnings as errors for WASM" FORCE)
50+
51+
# Disable sanitizers for WASM
52+
set(OCIO_ENABLE_SANITIZER OFF CACHE BOOL "Disable sanitizers for WASM" FORCE)
53+
54+
# Optimization settings
55+
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Use Release build for WASM" FORCE)
56+
57+
message(STATUS "WASM Configuration applied:")
58+
message(STATUS " Build Type: ${CMAKE_BUILD_TYPE}")
59+
message(STATUS " Static Libraries: ${BUILD_SHARED_LIBS}")
60+
message(STATUS " SIMD Enabled: ${OCIO_USE_SIMD}")
61+
message(STATUS " WebAssembly SIMD: SSE2=${OCIO_USE_SSE2} SSE3=${OCIO_USE_SSE3} SSE4=${OCIO_USE_SSE4}")
62+
message(STATUS " Apps/Tests Disabled: ${OCIO_BUILD_APPS}/${OCIO_BUILD_TESTS}")
63+
message(STATUS " Headless GPU: ${OCIO_USE_HEADLESS}")

0 commit comments

Comments
 (0)