> On Jul 14, 2020, at 12:00, Beuc <b...@beuc.net> wrote:
> 
>> 
>> XMLHttpRequest most definitely supports receiving responses into 
>> ArrayBuffers. You set responseType=‘arrayBuffer’. However now I look more 
>> closely at the API there doesn’t seem to be any way to provide it with the 
>> destination ArrayBuffer. It looks like XMLHttpRequest always creates it 
>> itself which makes my question moot.
> One optimization I did for RenPyWeb was importing XMLHttpRequest's buffer 
> into the filesystem (FS):
> https://github.com/renpy/renpy/blob/8b0d3dd4986a5a8656b3a5ad634c62bd52b1afbd/renpy/webloader.py#L64
>  
> <https://github.com/renpy/renpy/blob/8b0d3dd4986a5a8656b3a5ad634c62bd52b1afbd/renpy/webloader.py#L64>
> FS.writeFile(path, new Uint8Array(xhr.response), {canOwn:true});
> I'm not sure what's your use case is, it might help.
> 
> 

My use case is an inflater and transcoder for universal supercompressed 
textures. the incoming texture file, received by XMLHttpRequest into am 
ArrayBuffer, is parsed in JS from which a typed array with the data for a mip 
level is created. That has, maybe, it’s file dependent, to be passed to a Zstd 
decoder compiled with Emscripten. Back in JS-land, JS identifies the position 
and length of each image  and then must pass the image data to the transcoder, 
also compiled with Emscripten.

My goal is to reduce data copies to the minimum so I don’t think saving in the 
filesystem will help. Thanks for the suggestion though.

I have some further questions to help guide me on the right path w.r.t WebIDL 
binder vs Embind and moving the data.

1. Is it possible for 2 separately compiled .wasm packages to use the same 
HEAP8, possibly by not modularizing them? My initial plan was to make a 
separate Zstd module but a different HEAP8 from that used by the transcoder 
means a data copy.

2. If I use WebIDL binder then to pass data into, e.g. the Zstd decoder, I will 
have to do in Javascript:

        var levelData = new Uint8Array( this.arrayBuffer, this.levels[ level 
].byteOffs, this.levels[ level ].byteLength);
        var deflatedData = this.zstdModule._malloc(this.levels[ level 
].byteLength);
        var inflatedData = this.zstdModule._malloc(this.levels[ level 
].uncompressedByteLength);
        this.zstdModule.HEAPU8.set(levelData, deflatedData);
        var byteCount = zstdDecoder.decompress(inflatedData,
                                                  this.levels[ level 
].uncompressedByteLength,
                                      deflatedData,
                                      this.levels[ level ].byteLength);


I have a c++ wrapper around the Zstd decoder, which is c code. This class is 
called ZstdDecoder.  Is it possible to add JS to this class so instead of users 
of the decoder doing the above they could just call something more in the 
spirit of JS that hides the mallocs and takes a typed array in?


var byteCount = zstdDecoder.decompress(i
                                                  this.levels[ level 
].uncompressedByteLength,
                                                  levelData,
                                      );

var inflatedData = zstdDecoder.getInflatedData();


Regards

    -Mark

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/emscripten-discuss/8128FE9C-6D80-4292-B240-0D74B364AA8D%40callow.im.

Attachment: signature.asc
Description: Message signed with OpenPGP

Reply via email to