2
0
Эх сурвалжийг харах

Emscripten platform updates (#116)

* preparations for MINIMAL_RUNTIME
* better closure compiler compatibility
* replace deprecated functions with 'modern' equivalents
Andre Weissflog 6 жил өмнө
parent
commit
75a16e2ace
4 өөрчлөгдсөн 46 нэмэгдсэн , 29 устгасан
  1. 25 25
      sokol_app.h
  2. 1 1
      sokol_args.h
  3. 2 2
      sokol_audio.h
  4. 18 1
      sokol_time.h

+ 25 - 25
sokol_app.h

@@ -780,7 +780,7 @@ _SOKOL_PRIVATE void _sapp_init_state(sapp_desc* desc, int argc, char* argv[]) {
     _sapp.framebuffer_height = _sapp.window_height;
     _sapp.framebuffer_height = _sapp.window_height;
     _sapp.sample_count = _sapp_def(_sapp.desc.sample_count, 1);
     _sapp.sample_count = _sapp_def(_sapp.desc.sample_count, 1);
     _sapp.swap_interval = _sapp_def(_sapp.desc.swap_interval, 1);
     _sapp.swap_interval = _sapp_def(_sapp.desc.swap_interval, 1);
-    _sapp.html5_canvas_name = _sapp_def(_sapp.desc.html5_canvas_name, "#canvas");
+    _sapp.html5_canvas_name = _sapp_def(_sapp.desc.html5_canvas_name, "canvas");
     _sapp.html5_canvas_resize = _sapp.desc.html5_canvas_resize;
     _sapp.html5_canvas_resize = _sapp.desc.html5_canvas_resize;
     if (_sapp.desc.window_title) {
     if (_sapp.desc.window_title) {
         _sapp_strcpy(_sapp.desc.window_title, _sapp.window_title, sizeof(_sapp.window_title));
         _sapp_strcpy(_sapp.desc.window_title, _sapp.window_title, sizeof(_sapp.window_title));
@@ -1663,23 +1663,23 @@ EMSCRIPTEN_KEEPALIVE void _sapp_emsc_notify_keyboard_hidden(void) {
 #endif
 #endif
 
 
 /* Javascript helper functions for mobile virtual keyboard input */
 /* Javascript helper functions for mobile virtual keyboard input */
-EM_JS(void, _sapp_js_create_textfield, (), {
-    var inp = document.createElement("input");
-    inp.type = "text";
-    inp.id = "_sokol_app_input_element";
-    inp.autocapitalize = "none";
-    inp.addEventListener("focusout", function(e) {
+EM_JS(void, _sapp_js_create_textfield, (void), {
+    var _sapp_inp = document.createElement("input");
+    _sapp_inp.type = "text";
+    _sapp_inp.id = "_sokol_app_input_element";
+    _sapp_inp.autocapitalize = "none";
+    _sapp_inp.addEventListener("focusout", function(_sapp_event) {
         __sapp_emsc_notify_keyboard_hidden()
         __sapp_emsc_notify_keyboard_hidden()
 
 
     });
     });
-    document.body.append(x);
+    document.body.append(_sapp_inp);
 });
 });
 
 
-EM_JS(void, _sapp_js_focus_textfield, (), {
+EM_JS(void, _sapp_js_focus_textfield, (void), {
     document.getElementById("_sokol_app_input_element").focus();
     document.getElementById("_sokol_app_input_element").focus();
 });
 });
 
 
-EM_JS(void, _sapp_js_unfocus_textfield, (), {
+EM_JS(void, _sapp_js_unfocus_textfield, (void), {
     document.getElementById("_sokol_app_input_element").blur();
     document.getElementById("_sokol_app_input_element").blur();
 });
 });
 
 
@@ -1773,11 +1773,11 @@ _SOKOL_PRIVATE EM_BOOL _sapp_emsc_size_changed(int event_type, const EmscriptenU
     return true;
     return true;
 }
 }
 
 
-_SOKOL_PRIVATE void _sapp_emsc_frame(void) {
-    if (_sapp.first_frame) {
-        emscripten_set_main_loop_timing(EM_TIMING_RAF, _sapp.swap_interval);
-    }
+_SOKOL_PRIVATE EM_BOOL _sapp_emsc_frame(double time, void* userData) {
+    _SOKOL_UNUSED(time);
+    _SOKOL_UNUSED(userData);
     _sapp_frame();
     _sapp_frame();
+    return EM_TRUE;
 }
 }
 
 
 _SOKOL_PRIVATE EM_BOOL _sapp_emsc_context_cb(int emsc_type, const void* reserved, void* user_data) {
 _SOKOL_PRIVATE EM_BOOL _sapp_emsc_context_cb(int emsc_type, const void* reserved, void* user_data) {
@@ -1795,8 +1795,8 @@ _SOKOL_PRIVATE EM_BOOL _sapp_emsc_context_cb(int emsc_type, const void* reserved
 }
 }
 
 
 _SOKOL_PRIVATE EM_BOOL _sapp_emsc_mouse_cb(int emsc_type, const EmscriptenMouseEvent* emsc_event, void* user_data) {
 _SOKOL_PRIVATE EM_BOOL _sapp_emsc_mouse_cb(int emsc_type, const EmscriptenMouseEvent* emsc_event, void* user_data) {
-    _sapp.mouse_x = (emsc_event->canvasX * _sapp.dpi_scale);
-    _sapp.mouse_y = (emsc_event->canvasY * _sapp.dpi_scale);
+    _sapp.mouse_x = (emsc_event->targetX * _sapp.dpi_scale);
+    _sapp.mouse_y = (emsc_event->targetY * _sapp.dpi_scale);
     if (_sapp_events_enabled() && (emsc_event->button >= 0) && (emsc_event->button < SAPP_MAX_MOUSEBUTTONS)) {
     if (_sapp_events_enabled() && (emsc_event->button >= 0) && (emsc_event->button < SAPP_MAX_MOUSEBUTTONS)) {
         sapp_event_type type;
         sapp_event_type type;
         bool is_button_event = false;
         bool is_button_event = false;
@@ -2032,8 +2032,8 @@ _SOKOL_PRIVATE EM_BOOL _sapp_emsc_touch_cb(int emsc_type, const EmscriptenTouchE
                 const EmscriptenTouchPoint* src = &emsc_event->touches[i];
                 const EmscriptenTouchPoint* src = &emsc_event->touches[i];
                 sapp_touchpoint* dst = &_sapp.event.touches[i];
                 sapp_touchpoint* dst = &_sapp.event.touches[i];
                 dst->identifier = src->identifier;
                 dst->identifier = src->identifier;
-                dst->pos_x = src->canvasX * _sapp.dpi_scale;
-                dst->pos_y = src->canvasY * _sapp.dpi_scale;
+                dst->pos_x = src->targetX * _sapp.dpi_scale;
+                dst->pos_y = src->targetY * _sapp.dpi_scale;
                 dst->changed = src->isChanged;
                 dst->changed = src->isChanged;
             }
             }
             _sapp.desc.event_cb(&_sapp.event);
             _sapp.desc.event_cb(&_sapp.event);
@@ -2158,7 +2158,7 @@ int main(int argc, char* argv[]) {
     }
     }
     else {
     else {
         emscripten_get_element_css_size(_sapp.html5_canvas_name, &w, &h);
         emscripten_get_element_css_size(_sapp.html5_canvas_name, &w, &h);
-        emscripten_set_resize_callback(0, 0, false, _sapp_emsc_size_changed);
+        emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, false, _sapp_emsc_size_changed);
     }
     }
     if (_sapp.desc.high_dpi) {
     if (_sapp.desc.high_dpi) {
         _sapp.dpi_scale = emscripten_get_device_pixel_ratio();
         _sapp.dpi_scale = emscripten_get_device_pixel_ratio();
@@ -2186,10 +2186,10 @@ int main(int argc, char* argv[]) {
             attrs.majorVersion = 2;
             attrs.majorVersion = 2;
         }
         }
     #endif
     #endif
-    EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_create_context(0, &attrs);
+    EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_create_context(_sapp.html5_canvas_name, &attrs);
     if (!ctx) {
     if (!ctx) {
         attrs.majorVersion = 1;
         attrs.majorVersion = 1;
-        ctx = emscripten_webgl_create_context(0, &attrs);
+        ctx = emscripten_webgl_create_context(_sapp.html5_canvas_name, &attrs);
         _sapp.gles2_fallback = true;
         _sapp.gles2_fallback = true;
     }
     }
     emscripten_webgl_make_context_current(ctx);
     emscripten_webgl_make_context_current(ctx);
@@ -2200,16 +2200,16 @@ int main(int argc, char* argv[]) {
     emscripten_set_mouseenter_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_mouse_cb);
     emscripten_set_mouseenter_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_mouse_cb);
     emscripten_set_mouseleave_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_mouse_cb);
     emscripten_set_mouseleave_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_mouse_cb);
     emscripten_set_wheel_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_wheel_cb);
     emscripten_set_wheel_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_wheel_cb);
-    emscripten_set_keydown_callback(0, 0, true, _sapp_emsc_key_cb);
-    emscripten_set_keyup_callback(0, 0, true, _sapp_emsc_key_cb);
-    emscripten_set_keypress_callback(0, 0, true, _sapp_emsc_key_cb);
+    emscripten_set_keydown_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, _sapp_emsc_key_cb);
+    emscripten_set_keyup_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, _sapp_emsc_key_cb);
+    emscripten_set_keypress_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, 0, true, _sapp_emsc_key_cb);
     emscripten_set_touchstart_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_touch_cb);
     emscripten_set_touchstart_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_touch_cb);
     emscripten_set_touchmove_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_touch_cb);
     emscripten_set_touchmove_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_touch_cb);
     emscripten_set_touchend_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_touch_cb);
     emscripten_set_touchend_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_touch_cb);
     emscripten_set_touchcancel_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_touch_cb);
     emscripten_set_touchcancel_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_touch_cb);
     emscripten_set_webglcontextlost_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_context_cb);
     emscripten_set_webglcontextlost_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_context_cb);
     emscripten_set_webglcontextrestored_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_context_cb);
     emscripten_set_webglcontextrestored_callback(_sapp.html5_canvas_name, 0, true, _sapp_emsc_context_cb);
-    emscripten_set_main_loop(_sapp_emsc_frame, 0, 1);
+    emscripten_request_animation_frame_loop(_sapp_emsc_frame, 0);
     return 0;
     return 0;
 }
 }
 #endif  /* __EMSCRIPTEN__ */
 #endif  /* __EMSCRIPTEN__ */

+ 1 - 1
sokol_args.h

@@ -632,7 +632,7 @@ EM_JS(void, sargs_js_parse_url, (), {
     for (var p = params.next(); !p.done; p = params.next()) {
     for (var p = params.next(); !p.done; p = params.next()) {
         var key = p.value[0];
         var key = p.value[0];
         var val = p.value[1];
         var val = p.value[1];
-        var res = Module.ccall('_sargs_add_kvp', 'void', ['string','string'], [key,val]);
+        var res = ccall('_sargs_add_kvp', 'void', ['string','string'], [key,val]);
     }
     }
 });
 });
 
 

+ 2 - 2
sokol_audio.h

@@ -1247,7 +1247,7 @@ EM_JS(int, _saudio_js_init, (int sample_rate, int num_channels, int buffer_size)
 });
 });
 
 
 /* get the actual sample rate back from the WebAudio context */
 /* get the actual sample rate back from the WebAudio context */
-EM_JS(int, _saudio_js_sample_rate, (), {
+EM_JS(int, _saudio_js_sample_rate, (void), {
     if (Module._saudio_context) {
     if (Module._saudio_context) {
         return Module._saudio_context.sampleRate;
         return Module._saudio_context.sampleRate;
     }
     }
@@ -1257,7 +1257,7 @@ EM_JS(int, _saudio_js_sample_rate, (), {
 });
 });
 
 
 /* get the actual buffer size in number of frames */
 /* get the actual buffer size in number of frames */
-EM_JS(int, _saudio_js_buffer_frames, (), {
+EM_JS(int, _saudio_js_buffer_frames, (void), {
     if (Module._saudio_node) {
     if (Module._saudio_node) {
         return Module._saudio_node.bufferSize;
         return Module._saudio_node.bufferSize;
     }
     }

+ 18 - 1
sokol_time.h

@@ -53,7 +53,7 @@
 
 
     Windows:        QueryPerformanceFrequency() / QueryPerformanceCounter()
     Windows:        QueryPerformanceFrequency() / QueryPerformanceCounter()
     MacOS/iOS:      mach_absolute_time()
     MacOS/iOS:      mach_absolute_time()
-    emscripten:     clock_gettime(CLOCK_MONOTONIC)
+    emscripten:     performance.now()
     Linux+others:   clock_gettime(CLOCK_MONOTONIC)
     Linux+others:   clock_gettime(CLOCK_MONOTONIC)
 
 
     zlib/libpng license
     zlib/libpng license
@@ -139,6 +139,11 @@ typedef struct {
     mach_timebase_info_data_t timebase;
     mach_timebase_info_data_t timebase;
     uint64_t start;
     uint64_t start;
 } _stm_state_t;
 } _stm_state_t;
+#elif defined(__EMSCRIPTEN__)
+typedef struct {
+    uint32_t initialized;
+    double start;
+} _stm_state_t;
 #else /* anything else, this will need more care for non-Linux platforms */
 #else /* anything else, this will need more care for non-Linux platforms */
 #include <time.h>
 #include <time.h>
 typedef struct {
 typedef struct {
@@ -159,6 +164,12 @@ _SOKOL_PRIVATE int64_t int64_muldiv(int64_t value, int64_t numer, int64_t denom)
 }
 }
 #endif
 #endif
 
 
+#if defined(__EMSCRIPTEN__)
+EM_JS(double, _stm_js_perfnow, (void), {
+    return performance.now();
+});
+#endif
+
 SOKOL_API_IMPL void stm_setup(void) {
 SOKOL_API_IMPL void stm_setup(void) {
     memset(&_stm, 0, sizeof(_stm));
     memset(&_stm, 0, sizeof(_stm));
     _stm.initialized = 0xABCDABCD;
     _stm.initialized = 0xABCDABCD;
@@ -168,6 +179,8 @@ SOKOL_API_IMPL void stm_setup(void) {
     #elif defined(__APPLE__) && defined(__MACH__)
     #elif defined(__APPLE__) && defined(__MACH__)
         mach_timebase_info(&_stm.timebase);
         mach_timebase_info(&_stm.timebase);
         _stm.start = mach_absolute_time();
         _stm.start = mach_absolute_time();
+    #elif defined(__EMSCRIPTEN__)
+        _stm.start = _stm_js_perfnow();
     #else
     #else
         struct timespec ts;
         struct timespec ts;
         clock_gettime(CLOCK_MONOTONIC, &ts);
         clock_gettime(CLOCK_MONOTONIC, &ts);
@@ -185,6 +198,10 @@ SOKOL_API_IMPL uint64_t stm_now(void) {
     #elif defined(__APPLE__) && defined(__MACH__)
     #elif defined(__APPLE__) && defined(__MACH__)
         const uint64_t mach_now = mach_absolute_time() - _stm.start;
         const uint64_t mach_now = mach_absolute_time() - _stm.start;
         now = int64_muldiv(mach_now, _stm.timebase.numer, _stm.timebase.denom);
         now = int64_muldiv(mach_now, _stm.timebase.numer, _stm.timebase.denom);
+    #elif defined(__EMSCRIPTEN__)
+        double js_now = _stm_js_perfnow() - _stm.start;
+        SOKOL_ASSERT(js_now >= 0.0);
+        now = (uint64_t) (js_now * 1000000.0);
     #else
     #else
         struct timespec ts;
         struct timespec ts;
         clock_gettime(CLOCK_MONOTONIC, &ts);
         clock_gettime(CLOCK_MONOTONIC, &ts);