If you allocate data within the Emscripten heap via Module._malloc, you can then create typed arrays that alias said region of the Emscripten heap which allows zero-copy data transfer between C++ and JavaScript.
It's not currently possible C++ to efficiently write into a Canvas's TypedArray, but if your C++ decoded into the Emscripten heap, I think you could use one of the ArrayBufferView.set calls to efficiently copy data between the Emscripten heap and the canvas. Embind provides a memory_view type which, on the C++ side, describes a range of memory (pointer + length). When passed to JavaScript, it comes out as a typed array that aliases the Emscripten heap. Of course, you can do this manually by passing pointer values between C++ and JS too. https://github.com/kripken/emscripten/blob/master/system/include/emscripten/wire.h#L332 https://github.com/kripken/emscripten/blob/master/tests/embind/embind_test.cpp#L1170 https://github.com/kripken/emscripten/blob/master/src/embind/embind.js#L541 On Wed, May 28, 2014 at 9:11 AM, ben layet <[email protected]> wrote: > One costly part of our app is image decoding. We use a custom codec not > supported by browser - and which has a C++ implementation. We want a high > frame rate, so I'm investigating options to improve performance. I thought > we could pass the encoded image to a C++ function, decode and return the > decoded result to the JS. > > Can I pass TypedArrays into the C++? (One as input, one to hold the > output.) The wiki page "Interacting with Compiled > Code<https://github.com/kripken/emscripten/wiki/Interacting-with-code>" > only says that JS native types Number and String can be used. I could pass > the encoded input as a String I suppose. But what about the output? In > order to avoid copying, I would like to decode directly into the TypedArray > from a Canvas 2d context ImageData object. > > As for using the C++ heap, I can't see how to do that without copying back > and forth - as per the "Accessing Memory" example in the wiki page. (Well, > maybe I could wrap a TypedArray around a part of Emscripten's heap > ArrayBuffer that I reserved with malloc, but that would only useful with JS > APIs that only consume TypedArrays - and it doesn't allow me to efficiently > get the data from a TypedArray into the C++.) > > Maybe I've tried an awkward split between the C++ and the JS. > > Any comments welcome, thanks > ben > > -- > You received this message because you are subscribed to the Google Groups > "emscripten-discuss" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- Chad Austin Technical Director, IMVU http://engineering.imvu.com <http://www.imvu.com/members/Chad/> http://chadaustin.me -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
