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 <javascript:>>:
>
>> 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 <javascript:>.
>> 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