diff --git a/frontend/renderer/.gitignore b/frontend/renderer/cpp/.gitignore similarity index 100% rename from frontend/renderer/.gitignore rename to frontend/renderer/cpp/.gitignore diff --git a/frontend/renderer/cpp/Makefile b/frontend/renderer/cpp/Makefile index 836ba4168..85ac71b69 100644 --- a/frontend/renderer/cpp/Makefile +++ b/frontend/renderer/cpp/Makefile @@ -7,7 +7,7 @@ all: # -sUSE_PTHREADS: Disables pthreads. # -sMAX_WEBGL_VERSION: Max WebGL set to 2 # -sUSE_WEBGL2: Uses WebGL2 by default. - emcc \ + em++ \ -std=c++20 \ -lembind \ -fno-rtti \ diff --git a/frontend/renderer/cpp/js/preamble.js b/frontend/renderer/cpp/js/preamble.js index 17463caab..ee6e3825e 100644 --- a/frontend/renderer/cpp/js/preamble.js +++ b/frontend/renderer/cpp/js/preamble.js @@ -3,10 +3,17 @@ console.log("preamble", Renderer); Renderer.setCanvas = function setCanvas(canvas, attrs) { console.log("GL", GL); + debugger const context = GL.createContext(canvas, attrs); if (!context) { throw new Error('Could not create a new WebGL context') } + GL.makeContextCurrent(context); + + // Emscripten does not enable this by default and Skia needs this + // to handle certain GPU corner cases. + GL.currentContext.GLctx.getExtension('WEBGL_debug_renderer_info'); + console.log("setCanvas", canvas, attrs); const gr = this._MakeGrContext(); console.log("gr", gr); diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index ee8c898ff..539464954 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -74,8 +74,7 @@ [app.main.repo :as rp] [app.main.streams :as ms] [app.main.worker :as uw] - [app.renderer.cpp :as renderer-cpp] - [app.renderer.rs :as renderer-rs] + [app.renderer :as renderer] [app.util.dom :as dom] [app.util.globals :as ug] [app.util.http :as http] @@ -355,11 +354,6 @@ (dcm/retrieve-comment-threads file-id) (fetch-bundle project-id file-id)) - (when (contains? cf/flags :renderer-v2-cpp) - (rx/of (renderer-cpp/init))) - (when (contains? cf/flags :renderer-v2-rs) - (rx/of (renderer-rs/init))) - (->> stream (rx/filter dch/commit?) (rx/map deref) diff --git a/frontend/src/app/main/ui/workspace/viewport.cljs b/frontend/src/app/main/ui/workspace/viewport.cljs index 3689d57fc..7e2738bf8 100644 --- a/frontend/src/app/main/ui/workspace/viewport.cljs +++ b/frontend/src/app/main/ui/workspace/viewport.cljs @@ -48,10 +48,10 @@ [app.main.ui.workspace.viewport.utils :as utils] [app.main.ui.workspace.viewport.viewport-ref :refer [create-viewport-ref]] [app.main.ui.workspace.viewport.widgets :as widgets] - [app.renderer.cpp :as renderer-cpp] - [app.renderer.rs :as renderer-rs] + [app.renderer :as renderer] [app.util.debug :as dbg] [beicon.v2.core :as rx] + [promesa.core :as p] [rumext.v2 :as mf])) ;; --- Viewport @@ -269,13 +269,13 @@ rule-area-size (/ rulers/ruler-area-size zoom)] - (mf/with-effect + + (when (renderer/is-enabled?) + (mf/with-effect [canvas-ref] (let [canvas (mf/ref-val canvas-ref)] - (when (contains? cf/flags :renderer-v2-cpp) - (renderer-cpp/set-canvas canvas)) - (when (contains? cf/flags :renderer-v2-rs) - (renderer-rs/set-canvas canvas)))) + (p/then (renderer/init) + #(renderer/set-canvas canvas))))) (hooks/setup-dom-events zoom disable-paste in-viewport? workspace-read-only? drawing-tool drawing-path?) (hooks/setup-viewport-size vport viewport-ref) diff --git a/frontend/src/app/renderer.cljs b/frontend/src/app/renderer.cljs new file mode 100644 index 000000000..e5239943c --- /dev/null +++ b/frontend/src/app/renderer.cljs @@ -0,0 +1,32 @@ +(ns app.renderer + (:require + [app.config :as cf] + [app.renderer.cpp :as renderer-cpp] + [app.renderer.rs :as renderer-rs])) + +(defn is-enabled? + [] + (or (contains? cf/flags :renderer-v2-cpp) + (contains? cf/flags :renderer-v2-rs))) + +(defn init + [] + (cond + ;; CPP + (contains? cf/flags :renderer-v2-cpp) + (renderer-cpp/init) + + ;; Rust + (contains? cf/flags :renderer-v2-rs) + (renderer-rs/init))) + +(defn set-canvas + [canvas] + (cond + ;; CPP + (contains? cf/flags :renderer-v2-cpp) + (renderer-cpp/set-canvas canvas) + + ;; Rust + (contains? cf/flags :renderer-v2-rs) + (renderer-rs/set-canvas canvas))) diff --git a/frontend/src/app/renderer/cpp.js b/frontend/src/app/renderer/cpp.js index 01d9b898b..962147da0 100644 --- a/frontend/src/app/renderer/cpp.js +++ b/frontend/src/app/renderer/cpp.js @@ -71,6 +71,7 @@ Module['ready'] = new Promise(function(resolve, reject) { console.log("preamble", Renderer); Renderer.setCanvas = function setCanvas(canvas, attrs) { console.log("GL", GL); + debugger const context = GL.createContext(canvas, attrs); if (!context) { throw new Error('Could not create a new WebGL context') @@ -212,13 +213,13 @@ if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { scriptDirectory = ''; } - scriptDirectory += 'renderer/cpp/'; if (!(typeof window == 'object' || typeof importScripts == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); // Differentiate the Web Worker from the Node Worker case, as reading must // be done differently. { // include: web_or_worker_shell_read.js + scriptDirectory += 'renderer/cpp/'; read_ = (url) => {