Thanks guys, the code works as expected now. I didn't get back as much 
performance as I hoped but its faster nonetheless. Cheers!

On Wednesday, September 21, 2016 at 5:10:16 PM UTC-4, Charles Vaughn wrote:
>
> Yeah, I usually end up screwing up the pointer shifts.
>
> Another thing to keep in mind is if you used packed structs (don't 
> recommend that for Emscripten built code), you'll need to do something like 
> DataView.
>
> On Wednesday, September 21, 2016 at 1:14:05 AM UTC-7, jj wrote:
>>
>> You can also go via the HEAP objects, so
>>
>> event.time = HEAPF64[addr>>3];
>> event.name = Pointer_stringify(HEAP32[addr+8 >> 2]);
>> event.thread_id = HEAP32[addr+12 >> 2];
>> event.type = HEAP8[addr + 16];
>> event.core_id = HEAP8[addr + 17];
>>
>> 2016-09-21 0:06 GMT+03:00 Charles Vaughn <cva...@gmail.com>:
>>
>>> If you're struct is packed (or you know the padding points) and 
>>> contiguous, you can use a DataView ( 
>>> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView
>>>  
>>> ) to wrap a slice of the underlying buffer of the various HEAPs.
>>>
>>> Something like: 
>>>
>>> var view = new DataView(HEAP8.buffer.slice(addr));
>>> event.time = view.getDouble(0, true);
>>> event.name = Pointer_stringify(view.getUint32(8, true));
>>> event.thread_id = view.getInt32(12, true);
>>> event.type = view.getInt8(16, true);
>>> event.core_id = view.getInt8(17, true);
>>>
>>>
>>> On Tuesday, September 20, 2016 at 1:41:56 PM UTC-7, Robert Goulet wrote:
>>>>
>>>> The JS code looks like this:
>>>>
>>>> event.time = getValue(addr, 'double');
>>>> event.name = Pointer_stringify(getValue(addr + 8, '*'));
>>>> event.thread_id = getValue(addr + 12, 'i32');
>>>> event.type = getValue(addr + 16, 'i8');
>>>> event.core_id = getValue(addr + 17, 'i8');
>>>>
>>>> since the different elements of the structure varies in size, I guess I 
>>>> have to use different HEAP methods?
>>>>
>>>> On Tuesday, September 20, 2016 at 4:36:47 PM UTC-4, jj wrote:
>>>>>
>>>>> Directly accessing HEAP32 will definitely be much faster than the very 
>>>>> generic getValue() function. If you don't need any of the genericity of 
>>>>> what getValue() offers, using HEAP32 is definitely recommended.
>>>>>
>>>>> 2016-09-20 23:27 GMT+03:00 Robert Goulet <robert...@autodesk.com>:
>>>>>
>>>>>> Thanks jj, I ended up using getValue on the JS side to get the data 
>>>>>> from the pointer I pass from C. Is there any performance concerns with 
>>>>>> this 
>>>>>> or should I use HEAP32 instead?
>>>>>>
>>>>>> On Tuesday, September 20, 2016 at 12:33:01 PM UTC-4, jj wrote:
>>>>>>>
>>>>>>> The src/library_xxx.js files are generally good examples.
>>>>>>>
>>>>>>> Here's one snippet where C function passes a pointer to an integer 
>>>>>>> array and length of that array to JS side, and JS code reads through 
>>>>>>> the 
>>>>>>> array: 
>>>>>>> https://github.com/kripken/emscripten/blob/master/src/library_openal.js#L329.
>>>>>>>  
>>>>>>> If not using JS code that lives in js-libraries, the i32 {{{ 
>>>>>>> makeGetValue 
>>>>>>> }}} can be replaced with a direct HEAP32[pointer >> 2].
>>>>>>>
>>>>>>> Another example with filling a struct in JS side: 
>>>>>>> https://github.com/kripken/emscripten/blob/master/src/library_html5.js#L180
>>>>>>>
>>>>>>> and reading the fields from a pointer to a struct: 
>>>>>>> https://github.com/kripken/emscripten/blob/master/src/library_html5.js#L1728
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> 2016-09-20 16:45 GMT+03:00 Robert Goulet <robert...@autodesk.com>:
>>>>>>>
>>>>>>>> Do you have an example of sending pointer into EM_ASM and reading 
>>>>>>>> it directly from memory?
>>>>>>>>
>>>>>>>> In my case I am calling EM_ASM close to a thousand times to pass 
>>>>>>>> engine profiling data to javascript for drawing on the web page, so I 
>>>>>>>> am 
>>>>>>>> trying to avoid adding time to the profiling result. If EM_ASM does 
>>>>>>>> add 
>>>>>>>> overhead, then I hope to reduce it by calling it only once instead of 
>>>>>>>> a 
>>>>>>>> thousand times per frame. I profiled it to about ~2.5ms per frame to 
>>>>>>>> do 
>>>>>>>> these thousand calls to EM_ASM, which is a lot if you consider the 
>>>>>>>> actual 
>>>>>>>> frame time is <= 17ms.
>>>>>>>>
>>>>>>>> On Monday, September 19, 2016 at 5:45:21 PM UTC-4, Alon Zakai wrote:
>>>>>>>>>
>>>>>>>>> The most efficient way is to send the pointer into EM_ASM, then do 
>>>>>>>>> reads directly to memory using the right offsets, but that requires 
>>>>>>>>> using 
>>>>>>>>> information about how the data is laid out in memory (on the plus 
>>>>>>>>> side, the 
>>>>>>>>> alignment rules are the natural 32-bit ones, with fully aligned 
>>>>>>>>> doubles).
>>>>>>>>>
>>>>>>>>> Otherwise multiple calls into EM_ASM adds overhead, but in many 
>>>>>>>>> cases it wouldn't be noticeable.
>>>>>>>>>
>>>>>>>>> On Mon, Sep 19, 2016 at 1:57 PM, Robert Goulet <
>>>>>>>>> robert...@autodesk.com> wrote:
>>>>>>>>>
>>>>>>>>>> Hi,
>>>>>>>>>>
>>>>>>>>>> How do we pass an array of objects to Javascript function from C?
>>>>>>>>>>
>>>>>>>>>> Consider the following example:
>>>>>>>>>>
>>>>>>>>>> struct data {
>>>>>>>>>>     double a;
>>>>>>>>>>     int b;
>>>>>>>>>>     unsigned char c;
>>>>>>>>>> };
>>>>>>>>>>
>>>>>>>>>> std::vector<data> my_data;
>>>>>>>>>>
>>>>>>>>>> EM_ASM_ARGS({
>>>>>>>>>>     var data_array = ???
>>>>>>>>>>     process_data(data_array);
>>>>>>>>>> }, my_data);
>>>>>>>>>>
>>>>>>>>>> Is this possible? I couldn't find any clear documentation about 
>>>>>>>>>> this topic.
>>>>>>>>>>
>>>>>>>>>> For the moment I've used the following workaround, but it doesn't 
>>>>>>>>>> look super efficient:
>>>>>>>>>>
>>>>>>>>>> for( auto const & i : my_data ) {
>>>>>>>>>>     EM_ASM_ARGS({
>>>>>>>>>>         process_data($0, $1, $2);
>>>>>>>>>>     }, i.a, i.b, i.c);
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> Thanks!
>>>>>>>>>>
>>>>>>>>>> -- 
>>>>>>>>>> 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 emscripten-discuss+unsubscr...@googlegroups.com.
>>>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> -- 
>>>>>>>> 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 emscripten-discuss+unsubscr...@googlegroups.com.
>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>> 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 emscripten-discuss+unsubscr...@googlegroups.com.
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>
>>>>> -- 
>>> 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 emscripten-discuss+unsubscr...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>

-- 
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 emscripten-discuss+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to