mirror of
https://github.com/BinomialLLC/basis_universal.git
synced 2026-06-13 18:59:04 +00:00
127 lines
4.3 KiB
Python
127 lines
4.3 KiB
Python
# basisu_py/wasm/wasm_encoder.py
|
|
|
|
import wasmtime
|
|
import ctypes
|
|
|
|
from ..constants import BasisTexFormat, BasisQuality, BasisEffort, BasisFlags
|
|
|
|
|
|
class BasisuWasmEncoder:
|
|
def __init__(self, wasm_path):
|
|
self.wasm_path = wasm_path
|
|
self.engine = None
|
|
self.store = None
|
|
self.memory = None
|
|
self.exports = None
|
|
|
|
# ------------------------------------------------------
|
|
# Initialize WASM + WASI
|
|
# ------------------------------------------------------
|
|
def _init_engine(self):
|
|
self.engine = wasmtime.Engine()
|
|
self.store = wasmtime.Store(self.engine)
|
|
|
|
wasi = wasmtime.WasiConfig()
|
|
wasi.argv = ["basisu-wasm"]
|
|
wasi.inherit_stdout()
|
|
wasi.inherit_stderr()
|
|
self.store.set_wasi(wasi)
|
|
|
|
def load(self):
|
|
self._init_engine()
|
|
|
|
module = wasmtime.Module.from_file(self.engine, self.wasm_path)
|
|
linker = wasmtime.Linker(self.engine)
|
|
linker.define_wasi()
|
|
|
|
instance = linker.instantiate(self.store, module)
|
|
self.exports = instance.exports(self.store)
|
|
self.memory = self.exports["memory"]
|
|
|
|
# Initialize if present
|
|
if "bu_init" in self.exports:
|
|
self.exports["bu_init"](self.store)
|
|
|
|
print("[WASM Encoder] Loaded:", self.wasm_path)
|
|
|
|
# ------------------------------------------------------
|
|
# Access raw linear memory buffer
|
|
# ------------------------------------------------------
|
|
def _buf(self):
|
|
raw_ptr = self.memory.data_ptr(self.store)
|
|
size = self.memory.data_len(self.store)
|
|
addr = ctypes.addressof(raw_ptr.contents)
|
|
return (ctypes.c_ubyte * size).from_address(addr)
|
|
|
|
# ------------------------------------------------------
|
|
# Version
|
|
# ------------------------------------------------------
|
|
def get_version(self):
|
|
return self.exports["bu_get_version"](self.store)
|
|
|
|
# ------------------------------------------------------
|
|
# Memory alloc/free
|
|
# ------------------------------------------------------
|
|
def alloc(self, size):
|
|
return self.exports["bu_alloc"](self.store, size)
|
|
|
|
def free(self, ptr):
|
|
self.exports["bu_free"](self.store, ptr)
|
|
|
|
# ------------------------------------------------------
|
|
# Params
|
|
# ------------------------------------------------------
|
|
def new_params(self):
|
|
return self.exports["bu_new_comp_params"](self.store)
|
|
|
|
def delete_params(self, params):
|
|
return self.exports["bu_delete_comp_params"](self.store, params)
|
|
|
|
# ------------------------------------------------------
|
|
# Image input
|
|
# ------------------------------------------------------
|
|
def set_image_rgba32(self, params, index, ptr, w, h, pitch):
|
|
return self.exports["bu_comp_params_set_image_rgba32"](
|
|
self.store, params, index, ptr, w, h, pitch
|
|
)
|
|
|
|
def set_image_float_rgba(self, params, index, ptr, w, h, pitch):
|
|
return self.exports["bu_comp_params_set_image_float_rgba"](
|
|
self.store, params, index, ptr, w, h, pitch
|
|
)
|
|
|
|
# ------------------------------------------------------
|
|
# Compression
|
|
# ------------------------------------------------------
|
|
def compress(self, params, fmt, quality, effort, flags, rdo):
|
|
return bool(self.exports["bu_compress_texture"](
|
|
self.store, params, fmt, quality, effort, flags, rdo
|
|
))
|
|
|
|
# ------------------------------------------------------
|
|
# Output blob
|
|
# ------------------------------------------------------
|
|
def get_comp_data_size(self, params):
|
|
return self.exports["bu_comp_params_get_comp_data_size"](self.store, params)
|
|
|
|
def get_comp_data_ofs(self, params):
|
|
return self.exports["bu_comp_params_get_comp_data_ofs"](self.store, params)
|
|
|
|
# ------------------------------------------------------
|
|
# Raw memory I/O
|
|
# ------------------------------------------------------
|
|
def write_bytes(self, ptr, data):
|
|
buf = self._buf()
|
|
buf[ptr:ptr + len(data)] = data
|
|
|
|
def read_bytes(self, ptr, size):
|
|
buf = self._buf()
|
|
return bytes(buf[ptr:ptr + size])
|
|
|
|
# NEW unified names:
|
|
def write_memory(self, ptr, data):
|
|
self.write_bytes(ptr, data)
|
|
|
|
def read_memory(self, ptr, size):
|
|
return self.read_bytes(ptr, size)
|