9#include <emscripten/wasm_worker.h>
15#include "third_party/skia/include/core/SkColorSpace.h"
21 assert(emscripten_is_main_browser_thread());
23 thread_ = emscripten_malloc_wasm_worker(65536);
24 emscripten_wasm_worker_post_function_v(thread_, []() {
41 render_context_->SetResourceCacheLimit(bytes);
49 assert(emscripten_is_main_browser_thread());
50 uint32_t callback_id = ++current_callback_id_;
51 std::unique_ptr<sk_sp<flutter::DisplayList>[]> picture_pointers =
52 std::make_unique<sk_sp<flutter::DisplayList>[]>(count);
53 for (
int i = 0;
i < count;
i++) {
54 picture_pointers[
i] = sk_ref_sp(pictures[
i]);
67 assert(emscripten_is_main_browser_thread());
68 uint32_t callback_id = ++current_callback_id_;
75std::unique_ptr<Skwasm::TextureSourceWrapper>
78 return std::unique_ptr<Skwasm::TextureSourceWrapper>(
85 assert(emscripten_is_main_browser_thread());
90void Skwasm::Surface::Init() {
95 printf(
"Failed to create context!\n");
100 emscripten_webgl_enable_extension(gl_context_,
"WEBGL_debug_renderer_info");
104 emscripten_glBindFramebuffer(GL_FRAMEBUFFER, 0);
105 emscripten_glClearColor(0, 0, 0, 0);
106 emscripten_glClearStencil(0);
107 emscripten_glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
111 emscripten_glGetIntegerv(GL_SAMPLES, &sample_count);
112 emscripten_glGetIntegerv(GL_STENCIL_BITS, &stencil);
115 render_context_->Resize(256, 256);
117 is_initialized_ =
true;
121void Skwasm::Surface::ResizeSurface(
int width,
int height) {
122 if (
width != canvas_width_ ||
height != canvas_height_) {
123 canvas_width_ =
width;
130void Skwasm::Surface::RecreateSurface() {
133 render_context_->Resize(canvas_width_, canvas_height_);
138 sk_sp<flutter::DisplayList>* pictures,
142 uint32_t callback_id,
143 double raster_start) {
144 if (!is_initialized_) {
151 for (
int i = 0;
i < picture_count;
i++) {
152 sk_sp<flutter::DisplayList> picture = pictures[
i];
156 render_context_->RenderPicture(picture);
168 uint32_t callback_id) {
169 if (!is_initialized_) {
177 ? SkAlphaType::kUnpremul_SkAlphaType
178 : SkAlphaType::kPremul_SkAlphaType;
179 SkImageInfo info = SkImageInfo::Make(
image->width(),
image->height(),
180 SkColorType::kRGBA_8888_SkColorType,
183 size_t bytes_per_row = 4 *
image->width();
184 size_t byte_size = info.computeByteSize(bytes_per_row);
185 data = SkData::MakeUninitialized(byte_size);
186 uint8_t* pixels =
reinterpret_cast<uint8_t*
>(
data->writable_data());
195 ResizeSurface(
image->width(),
image->height());
199 emscripten_glReadPixels(0, 0,
image->width(),
image->height(), GL_RGBA,
200 GL_UNSIGNED_BYTE,
reinterpret_cast<void*
>(pixels));
207 callback_handler_(callback_id,
data, __builtin_wasm_ref_null_extern());
213 assert(emscripten_is_main_browser_thread());
214 callback_handler_(callback_id,
nullptr, image_bitmap);
218 unsigned long thread_id,
220 : raster_thread_id_(thread_id) {
260 surface->SetResourceCacheLimit(bytes);
273 sk_sp<flutter::DisplayList>* pictures,
277 uint32_t callback_id,
278 double raster_start) {
280 std::unique_ptr<sk_sp<flutter::DisplayList>[]> pictures_pointer =
281 std::unique_ptr<sk_sp<flutter::DisplayList>[]>(pictures);
283 callback_id, raster_start);
296 uint32_t callback_id) {
303 uint32_t callback_id,
305 surface->OnRenderComplete(callback_id, image_bitmap);
310 uint32_t callback_id) {
static std::unique_ptr< RenderContext > Make(int sample_count, int stencil)
uint32_t RenderPictures(flutter::DisplayList **pictures, int width, int height, int count)
std::unique_ptr< TextureSourceWrapper > CreateTextureSourceWrapper(SkwasmObject texture_source)
void RenderPicturesOnWorker(sk_sp< flutter::DisplayList > *pictures, int width, int height, int picture_count, uint32_t callback_id, double raster_start)
void RasterizeImageOnWorker(flutter::DlImage *image, ImageByteFormat format, uint32_t callback_id)
void(uint32_t, void *, SkwasmObject) CallbackHandler
uint32_t RasterizeImage(flutter::DlImage *image, ImageByteFormat format)
void OnRenderComplete(uint32_t callback_id, SkwasmObject image_bitmap)
void OnRasterizeComplete(uint32_t callback_id, SkData *data)
void SetCallbackHandler(CallbackHandler *callback_handler)
void SetResourceCacheLimit(int bytes)
SkwasmObject GetTextureSource()
TextureSourceWrapper(unsigned long thread_id, 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
void makeCurrent(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE handle)
uint32_t live_surface_count
SKWASM_EXPORT void surface_rasterizeImageOnWorker(Skwasm::Surface *surface, flutter::DlImage *image, Skwasm::ImageByteFormat format, uint32_t callback_id)
SKWASM_EXPORT Skwasm::Surface * surface_create()
SKWASM_EXPORT unsigned long surface_getThreadId(Skwasm::Surface *surface)
SKWASM_EXPORT uint32_t surface_renderPictures(Skwasm::Surface *surface, flutter::DisplayList **pictures, int width, int height, int count)
SKWASM_EXPORT void surface_destroy(Skwasm::Surface *surface)
SKWASM_EXPORT void surface_onRasterizeComplete(Skwasm::Surface *surface, SkData *data, uint32_t callback_id)
SKWASM_EXPORT void surface_setCallbackHandler(Skwasm::Surface *surface, Skwasm::Surface::CallbackHandler *callback_handler)
SKWASM_EXPORT bool skwasm_isMultiThreaded()
SKWASM_EXPORT void surface_onRenderComplete(Skwasm::Surface *surface, uint32_t callback_id, Skwasm::SkwasmObject image_bitmap)
SKWASM_EXPORT uint32_t surface_rasterizeImage(Skwasm::Surface *surface, flutter::DlImage *image, Skwasm::ImageByteFormat format)
SKWASM_EXPORT void surface_dispose(Skwasm::Surface *surface)
SKWASM_EXPORT void surface_renderPicturesOnWorker(Skwasm::Surface *surface, sk_sp< flutter::DisplayList > *pictures, int width, int height, int picture_count, uint32_t callback_id, double raster_start)
SKWASM_EXPORT void surface_setResourceCacheLimitBytes(Skwasm::Surface *surface, int bytes)
void skwasm_resolveAndPostImages(Skwasm::Surface *surface, SkwasmObject image_bitmaps, double raster_start, uint32_t callback_id)
void skwasm_resizeCanvas(uint32_t context_handle, int width, int height)
SkwasmObject skwasm_getAssociatedObject(void *pointer)
uint32_t skwasm_createOffscreenCanvas(int width, int height)
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_dispatchRasterizeImage(unsigned long thread_id, Skwasm::Surface *surface, flutter::DlImage *image, Skwasm::ImageByteFormat format, uint32_t callback_id)
bool skwasm_isSingleThreaded()
void skwasm_disposeAssociatedObjectOnThread(unsigned long thread_id, void *pointer)
void skwasm_setAssociatedObjectOnThread(unsigned long thread_id, void *pointer, SkwasmObject object)
void skwasm_dispatchRenderPictures(unsigned long thread_id, Skwasm::Surface *surface, sk_sp< flutter::DisplayList > *pictures, int width, int height, int count, uint32_t callback_id)
std::shared_ptr< const fml::Mapping > data