On Mar 7, 2011, at 7:12 PM, Glenn Maynard wrote:

> On Mon, Mar 7, 2011 at 9:07 PM, Boris Zbarsky <bzbar...@mit.edu> wrote:
> On 3/7/11 8:55 PM, Glenn Maynard wrote:
> I'd expect CanvasPixelArray to allow optimizations that ArrayBuffer
> doesn't, since the implementation can use the native surface format,
> translating to RGBA for the script transparently.  This can matter for
> streaming textures to OpenGL/D3D, too; creating BGRA textures on nVidia
> hardware is typically much faster than RGBA ones.
> 
> But modifying the ImageData is not supposed to modify what the graphics card 
> sees, right?  So you have to make a copy here on putImageData (or on the next 
> write to the image data), right?
> 
> Right, either way you need to make a copy when you send the data back to the 
> canvas.  But, if the surface format of the memory buffer matches a native 
> format of the graphics card, the copy is very fast--probably a DMA, for 
> hardware-accelerated surfaces.  (The exact mechanics of this are hidden 
> behind the drivers, of course, but that's what it looks like in my 
> experience.)  For example, nVidia cards typically are BGRA natively, and if 
> you give them RGBA with OpenGL it needs to be converted before (or as) it's 
> copied, which is much slower.
> 
> (Of course, CanvasPixelData itself always has to *appear* RGBA, but that 
> doesn't mean the backing store needs to actually be RGBA.)
> 
> I don't recall if this has been brought up: are there cases where
> explicit zero-copy messaging is better than transparent copy-on-write?
> 
> Transparent copy on write requires that each write do a "should I copy?" 
> check, right?
> 
> Yeah.  The question is probably whether that check can be moved out of inner 
> loops.  It couldn't be if function calls are made that might have 
> side-effects to cause a private object to become a COW object (eg. non-pure 
> functions).
> 
> For page-aligned buffers, an implementation could optimize these checks away 
> entirely by marking the buffer read-only, so if a write is made it'll raise 
> an exception that the engine can catch.
> 
> > Yes. Copy on write does not efficiently handle the case where large
> > amounts of data are continually produced by workers and posted to the
> > main thread for display. Each time the worker posts a block of data to
> > the main thread, the next time it attempts to update its version of
> > the block for the next iteration, a copy will need to be made so the
> > main thread's version appears immutable.
> 
> But how is this any different than just throwing away the ArrayBuffer and 
> creating a fresh one after each postMessage?

You can't "throw away" the ArrayBuffer, since the sender still has a reference 
to it. The proposal we've tossed around would make that ArrayBuffer 0 length, 
which I suppose is conceptually throwing it away since you can't add a fresh 
buffer to ArrayBuffer. So maybe it would be better if ArrayBuffer still has the 
same length but now points at a new buffer of data. This could be done lazily 
so the buffer need not be allocated until accessed.

-----
~Chris
cmar...@apple.com




Reply via email to