9#include <emscripten/wasm_worker.h>
15#include "third_party/skia/include/core/SkColorSpace.h"
45 static unsigned long thread = []() {
50 assert(emscripten_is_main_browser_thread());
51 unsigned long t = emscripten_malloc_wasm_worker(65536);
52 emscripten_wasm_worker_post_function_v(t, []() {
74 assert(emscripten_is_main_browser_thread());
87 assert(emscripten_is_main_browser_thread());
88 uint32_t callback_id = ++current_callback_id_;
94 assert(emscripten_is_main_browser_thread());
95 callback_handler_(callback_id, (
void*)context_lost_callback_id_,
96 __builtin_wasm_ref_null_extern());
101 uint32_t callback_id) {
102 if (render_context_) {
103 render_context_.reset();
110 printf(
"Failed to create context!\n");
115 emscripten_webgl_enable_extension(gl_context_,
"WEBGL_debug_renderer_info");
119 emscripten_glBindFramebuffer(GL_FRAMEBUFFER, 0);
120 emscripten_glClearColor(0, 0, 0, 0);
121 emscripten_glClearStencil(0);
122 emscripten_glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
126 emscripten_glGetIntegerv(GL_SAMPLES, &sample_count);
127 emscripten_glGetIntegerv(GL_STENCIL_BITS, &stencil);
130 render_context_->Resize(canvas_width_, canvas_height_);
132 context_lost_callback_id_ = ++current_callback_id_;
140 assert(emscripten_is_main_browser_thread());
141 uint32_t callback_id = ++current_callback_id_;
149 assert(emscripten_is_main_browser_thread());
150 callback_handler_(callback_id,
nullptr, __builtin_wasm_ref_null_extern());
155 uint32_t callback_id) {
160void Skwasm::Surface::ResizeSurface(
int width,
int height) {
161 if (
width != canvas_width_ ||
height != canvas_height_) {
162 canvas_width_ =
width;
172 assert(emscripten_is_main_browser_thread());
173 uint32_t callback_id = ++current_callback_id_;
174 std::unique_ptr<sk_sp<flutter::DisplayList>[]> picture_pointers =
175 std::make_unique<sk_sp<flutter::DisplayList>[]>(count);
176 for (
int i = 0;
i < count;
i++) {
177 picture_pointers[
i] = sk_ref_sp(pictures[
i]);
183 picture_pointers.release(), count, callback_id);
189 assert(emscripten_is_main_browser_thread());
190 callback_handler_(callback_id,
nullptr, image_bitmap);
194 sk_sp<flutter::DisplayList>* pictures,
196 uint32_t callback_id,
197 double raster_start) {
201 SkwasmObject image_bitmap_array = __builtin_wasm_ref_null_extern();
202 for (
int i = 0;
i < picture_count;
i++) {
203 sk_sp<flutter::DisplayList> picture = pictures[
i];
204 render_context_->RenderPicture(picture);
216 assert(emscripten_is_main_browser_thread());
217 uint32_t callback_id = ++current_callback_id_;
226 assert(emscripten_is_main_browser_thread());
227 callback_handler_(callback_id, data, __builtin_wasm_ref_null_extern());
232 uint32_t callback_id) {
238 ? SkAlphaType::kUnpremul_SkAlphaType
239 : SkAlphaType::kPremul_SkAlphaType;
240 SkImageInfo info = SkImageInfo::Make(
image->width(),
image->height(),
241 SkColorType::kRGBA_8888_SkColorType,
244 size_t bytes_per_row = 4 *
image->width();
245 size_t byte_size = info.computeByteSize(bytes_per_row);
246 data = SkData::MakeUninitialized(byte_size);
247 uint8_t* pixels =
reinterpret_cast<uint8_t*
>(data->writable_data());
250 reinterpret_cast<void*
>(pixels));
259 assert(emscripten_is_main_browser_thread());
260 uint32_t callback_id = ++current_callback_id_;
266 assert(emscripten_is_main_browser_thread());
267 callback_handler_(callback_id,
nullptr, __builtin_wasm_ref_null_extern());
271 assert(emscripten_is_main_browser_thread());
272 callback_handler_(callback_id,
nullptr, __builtin_wasm_ref_null_extern());
282 if (!context_lost_callback_id_) {
283 printf(
"Received context lost event but never set callback handler!\n");
292 render_context_->SetResourceCacheLimit(bytes);
295std::unique_ptr<Skwasm::TextureSourceWrapper>
297 return std::unique_ptr<Skwasm::TextureSourceWrapper>(
303void Skwasm::Surface::RecreateSurface() {
306 render_context_->Resize(canvas_width_, canvas_height_);
334 return surface->SetCanvas(canvas);
339 uint32_t callback_id) {
340 surface->ReceiveCanvasOnWorker(canvas, callback_id);
344 uint32_t callback_id) {
345 surface->OnInitialized(callback_id);
357 uint32_t callback_id) {
362 uint32_t callback_id) {
363 surface->OnResizeComplete(callback_id);
372 return surface->GetGlContext();
376 return surface->TriggerContextLoss();
380 uint32_t callback_id) {
381 surface->TriggerContextLossOnWorker(callback_id);
385 uint32_t callback_id) {
386 surface->OnContextLossTriggered(callback_id);
390 uint32_t callback_id) {
391 surface->ReportContextLost(callback_id);
413 surface->SetResourceCacheLimit(bytes);
419 return surface->RenderPictures(pictures, count);
424 sk_sp<flutter::DisplayList>* pictures,
426 uint32_t callback_id,
427 double raster_start) {
429 std::unique_ptr<sk_sp<flutter::DisplayList>[]> pictures_pointer =
430 std::unique_ptr<sk_sp<flutter::DisplayList>[]>(pictures);
431 surface->RenderPicturesOnWorker(pictures, picture_count, callback_id,
445 uint32_t callback_id) {
452 uint32_t callback_id,
454 surface->OnRenderComplete(callback_id, image_bitmap);
459 uint32_t callback_id) {
460 surface->OnRasterizeComplete(callback_id, data);
static std::unique_ptr< RenderContext > Make(int sample_count, int stencil)
void TriggerContextLossOnWorker(uint32_t callback_id)
void ReceiveCanvasOnWorker(SkwasmObject canvas, uint32_t callback_id)
void ReportContextLost(uint32_t callback_id)
std::unique_ptr< TextureSourceWrapper > CreateTextureSourceWrapper(SkwasmObject textureSource)
uint32_t SetSize(int width, int height)
uint32_t TriggerContextLoss()
void RasterizeImageOnWorker(flutter::DlImage *image, ImageByteFormat format, uint32_t callback_id)
void OnInitialized(uint32_t callback_id)
uint32_t SetCanvas(SkwasmObject canvas)
void(uint32_t, void *, SkwasmObject) CallbackHandler
uint32_t RasterizeImage(flutter::DlImage *image, ImageByteFormat format)
uint32_t RenderPictures(flutter::DisplayList **picture, int count)
void OnRenderComplete(uint32_t callback_id, SkwasmObject image_bitmap)
void OnRasterizeComplete(uint32_t callback_id, SkData *data)
void OnResizeComplete(uint32_t callback_id)
void RenderPicturesOnWorker(sk_sp< flutter::DisplayList > *picture, int picture_count, uint32_t callback_id, double raster_start)
void SetCallbackHandler(CallbackHandler *callback_handler)
void ResizeOnWorker(int width, int height, uint32_t callback_id)
void SetResourceCacheLimit(int bytes)
void OnContextLossTriggered(uint32_t callback_id)
SkwasmObject GetTextureSource()
TextureSourceWrapper(SkwasmObject texture_source)
Represents an image whose allocation is (usually) resident on device memory.
FlutterVulkanImage * image
uint32_t uint32_t * format
CallbackHandler callback_handler
__externref_t SkwasmObject
unsigned long GetRasterThread()
void makeCurrent(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE handle)
uint32_t live_surface_count
SKWASM_EXPORT bool skwasm_isWimp()
SKWASM_EXPORT void surface_onInitialized(Skwasm::Surface *surface, uint32_t callback_id)
SKWASM_EXPORT void surface_rasterizeImageOnWorker(Skwasm::Surface *surface, flutter::DlImage *image, Skwasm::ImageByteFormat format, uint32_t callback_id)
SKWASM_EXPORT void surface_onContextLost(Skwasm::Surface *surface)
SKWASM_EXPORT void surface_onRenderComplete(Skwasm::Surface *surface, uint32_t callback_id, SkwasmObject image_bitmap)
SKWASM_EXPORT void surface_resizeOnWorker(Skwasm::Surface *surface, int width, int height, uint32_t callback_id)
SKWASM_EXPORT Skwasm::Surface * surface_create()
SKWASM_EXPORT uint32_t surface_setCanvas(Skwasm::Surface *surface, SkwasmObject canvas)
SKWASM_EXPORT unsigned long surface_getThreadId(Skwasm::Surface *surface)
SKWASM_EXPORT void surface_destroy(Skwasm::Surface *surface)
SKWASM_EXPORT void surface_onRasterizeComplete(Skwasm::Surface *surface, SkData *data, uint32_t callback_id)
SKWASM_EXPORT uint32_t surface_renderPictures(Skwasm::Surface *surface, flutter::DisplayList **pictures, int count)
SKWASM_EXPORT void surface_renderPicturesOnWorker(Skwasm::Surface *surface, sk_sp< flutter::DisplayList > *pictures, int picture_count, uint32_t callback_id, double raster_start)
SKWASM_EXPORT void surface_setCallbackHandler(Skwasm::Surface *surface, Skwasm::Surface::CallbackHandler *callback_handler)
SKWASM_EXPORT void surface_receiveCanvasOnWorker(Skwasm::Surface *surface, SkwasmObject canvas, uint32_t callback_id)
SKWASM_EXPORT bool skwasm_isMultiThreaded()
SKWASM_EXPORT uint32_t surface_rasterizeImage(Skwasm::Surface *surface, flutter::DlImage *image, Skwasm::ImageByteFormat format)
SKWASM_EXPORT uint32_t surface_setSize(Skwasm::Surface *surface, int width, int height)
SKWASM_EXPORT void surface_reportContextLost(Skwasm::Surface *surface, uint32_t callback_id)
SKWASM_EXPORT void surface_dispose(Skwasm::Surface *surface)
SKWASM_EXPORT void surface_onResizeComplete(Skwasm::Surface *surface, uint32_t callback_id)
SKWASM_EXPORT void surface_setResourceCacheLimitBytes(Skwasm::Surface *surface, int bytes)
SKWASM_EXPORT void surface_triggerContextLossOnWorker(Skwasm::Surface *surface, uint32_t callback_id)
SKWASM_EXPORT uint32_t surface_triggerContextLoss(Skwasm::Surface *surface)
SKWASM_EXPORT void surface_onContextLossTriggered(Skwasm::Surface *surface, uint32_t callback_id)
SKWASM_EXPORT EMSCRIPTEN_WEBGL_CONTEXT_HANDLE surface_getGlContext(Skwasm::Surface *surface)
void skwasm_resolveAndPostImages(Skwasm::Surface *surface, SkwasmObject image_bitmaps, double raster_start, uint32_t callback_id)
SkwasmObject skwasm_getAssociatedObject(void *pointer)
void skwasm_reportContextLossTriggered(Skwasm::Surface *surface, uint32_t callback_id)
SkwasmObject skwasm_captureImageBitmap(uint32_t context_handle, SkwasmObject image_bitmaps)
void skwasm_connectThread(pthread_t thread_id)
void skwasm_dispatchDisposeSurface(unsigned long thread_id, Skwasm::Surface *surface)
void skwasm_postRasterizeResult(Skwasm::Surface *surface, SkData *data, uint32_t callback_id)
void skwasm_dispatchRenderPictures(unsigned long thread_id, Skwasm::Surface *surface, sk_sp< flutter::DisplayList > *pictures, int count, uint32_t callback_id)
void skwasm_dispatchTransferCanvas(unsigned long thread_id, Skwasm::Surface *surface, SkwasmObject canvas, uint32_t callback_id)
uint32_t skwasm_getGlContextForCanvas(SkwasmObject canvas, bool antialias, Skwasm::Surface *surface)
void skwasm_dispatchRasterizeImage(unsigned long thread_id, Skwasm::Surface *surface, flutter::DlImage *image, Skwasm::ImageByteFormat format, uint32_t callback_id)
bool skwasm_isSingleThreaded()
void skwasm_reportInitialized(Skwasm::Surface *surface, uint32_t callback_id, uint32_t context_lost_callback_id)
void skwasm_destroyContext(uint32_t context_handle)
void skwasm_resizeCanvas(uint32_t contextHandle, int width, int height)
void skwasm_triggerContextLossOnCanvas()
void skwasm_dispatchResizeSurface(unsigned long thread_id, Skwasm::Surface *surface, int width, int height, uint32_t callback_id)
void skwasm_reportResizeComplete(Skwasm::Surface *surface, uint32_t callback_id)
__externref_t SkwasmObject
void skwasm_disposeAssociatedObjectOnThread(unsigned long thread_id, void *pointer)
void skwasm_reportContextLost(Skwasm::Surface *surface, uint32_t callback_id)
void skwasm_dispatchTriggerContextLoss(unsigned long thread_id, Skwasm::Surface *surface, uint32_t callback_id)
void skwasm_setAssociatedObjectOnThread(unsigned long thread_id, void *pointer, SkwasmObject object)