[whatwg] Endianness of typed arrays
Boris Zbarsky
bzbarsky at MIT.EDU
Wed Mar 28 03:46:52 PDT 2012
On 3/28/12 3:14 AM, Mark Callow wrote:
> vertexAttribPointer lets you specifiy to WebGL the layout and type of
> the data in the buffer object.
Sure. That works for the GPU, but it doesn't allow for the sort of
on-the-fly endianness conversion that would be needed to make webgl
still work on big-endian platforms if the JS-visible typed arrays were
always little-endian.
> The API follows OpenGL {,ES} for familiarity and reflects its
> heritage of a C API avoiding use of structures.
Yep. I know the history. I think this was a mistake, if we care about
the web ever being usable on big-endian hardware. Whether we do is a
separate question.
> But it works.
Sort of, but maybe not; see below.
> OpenGL {,ES} developers typically load data from a serialized form and
> perform endianness conversion during deserialization. The serialized
> form is what would be loaded into an ArrayBuffer via XHR. It is then
> deserialized into 1 or more additional ArrayBuffers.
The point is that developers are:
1) Loading data in serialized forms that has nothing to do with WebGL
via XHR and then reading it using typed array views on the
resulting array buffer.
2) Not doing endianness conversions, either for the use case in point
1 or indeed for WebGL.
Again, I think we all agree how this would work if everyone using the
typed array APIs were perfect in every way and had infinite resources.
But they're not and they don't... The question is where we go from here.
In practice, it sounds like a UA on a big-endian system has a few options:
A) Native-endianness typed arrays. Breaks anyone loading data via XHR
arraybuffer responses (whether for WebGL or not) and not doing manual
endianness conversions.
B) Little-endian typed arrays. Breaks WebGL, unless developers switch
to a more "struct-based" API. Makes the non-WebGL cases of XHR
arraybuffer responses work.
C) Try to guess based on where the array buffer came from and have
different behavior for different array buffers. With enough luck (or
good enough heuristics), would make at least some WebGL work, while also
making non-WebGL things loaded over XHR work.
In practice, if forced to implement a UA on a big-endian system today, I
would likely pick option (C).... I wouldn't classify that as a victory
for standardization, but I'm also not sure what we can do at this point
to fix the brokenness.
-Boris
More information about the whatwg
mailing list