From 58943231b61b4e9ea633de2e1e87c8106d19fe6b Mon Sep 17 00:00:00 2001 From: Lars T Hansen Date: Thu, 26 Nov 2015 12:47:53 +0100 Subject: [PATCH] Bug 1176214 - Part 12: Changes to WebGL. r=bz, r=clb --- dom/canvas/WebGL2Context.h | 9 +++-- dom/canvas/WebGL2ContextBuffers.cpp | 7 ++-- dom/canvas/WebGL2ContextTextures.cpp | 8 ++--- dom/canvas/WebGLContext.h | 16 +++------ dom/canvas/WebGLContextBuffers.cpp | 36 +++++++------------ dom/canvas/WebGLContextGL.cpp | 35 ++++-------------- dom/canvas/WebGLContextTextures.cpp | 8 ++--- dom/canvas/WebGLElementArrayCache.cpp | 3 ++ dom/canvas/WebGLTexture.h | 6 ++-- dom/canvas/WebGLTextureUpload.cpp | 36 +++++++++---------- .../webgl-mochitest/test_sab_with_webgl.html | 20 ++++------- dom/webidl/WebGL2RenderingContext.webidl | 8 ++--- dom/webidl/WebGLRenderingContext.webidl | 12 +++---- 13 files changed, 78 insertions(+), 126 deletions(-) diff --git a/dom/canvas/WebGL2Context.h b/dom/canvas/WebGL2Context.h index d424a765f6c..6949c7aab10 100644 --- a/dom/canvas/WebGL2Context.h +++ b/dom/canvas/WebGL2Context.h @@ -18,7 +18,6 @@ class WebGLVertexArrayObject; namespace dom { class OwningUnsignedLongOrUint32ArrayOrBoolean; class OwningWebGLBufferOrLongLong; -class ArrayBufferViewOrSharedArrayBufferView; } // namespace dom class WebGL2Context @@ -97,11 +96,11 @@ public: void TexImage3D(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum unpackFormat, GLenum unpackType, - const dom::Nullable& pixels); + const dom::Nullable& pixels); void TexSubImage3D(GLenum target, GLint level, GLint xOffset, GLint yOffset, GLint zOffset, GLsizei width, GLsizei height, GLsizei depth, GLenum unpackFormat, GLenum unpackType, - const dom::Nullable& pixels, + const dom::Nullable& pixels, ErrorResult& out_rv); void TexSubImage3D(GLenum target, GLint level, GLint xOffset, GLint yOffset, GLint zOffset, GLenum unpackFormat, GLenum unpackType, @@ -126,11 +125,11 @@ public: void CompressedTexImage3D(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, - const dom::ArrayBufferViewOrSharedArrayBufferView& data); + const dom::ArrayBufferView& data); void CompressedTexSubImage3D(GLenum target, GLint level, GLint xOffset, GLint yOffset, GLint zOffset, GLsizei width, GLsizei height, GLsizei depth, GLenum sizedUnpackFormat, - const dom::ArrayBufferViewOrSharedArrayBufferView& data); + const dom::ArrayBufferView& data); // ------------------------------------------------------------------------- diff --git a/dom/canvas/WebGL2ContextBuffers.cpp b/dom/canvas/WebGL2ContextBuffers.cpp index 97a08e5c584..7e77a40f59f 100644 --- a/dom/canvas/WebGL2ContextBuffers.cpp +++ b/dom/canvas/WebGL2ContextBuffers.cpp @@ -171,7 +171,7 @@ WebGL2Context::GetBufferSubDataT(GLenum target, GLintptr offset, const BufferT& // of the buffer an INVALID_VALUE error is generated. data.ComputeLengthAndData(); - CheckedInt neededByteLength = CheckedInt(offset) + data.Length(); + CheckedInt neededByteLength = CheckedInt(offset) + data.LengthAllowShared(); if (!neededByteLength.isValid()) { ErrorInvalidValue("getBufferSubData: Integer overflow computing the needed" " byte length."); @@ -213,8 +213,9 @@ WebGL2Context::GetBufferSubDataT(GLenum target, GLintptr offset, const BufferT& * bound to a transform feedback binding point. */ - void* ptr = gl->fMapBufferRange(target, offset, data.Length(), LOCAL_GL_MAP_READ_BIT); - memcpy(data.Data(), ptr, data.Length()); + void* ptr = gl->fMapBufferRange(target, offset, data.LengthAllowShared(), LOCAL_GL_MAP_READ_BIT); + // Warning: Possibly shared memory. See bug 1225033. + memcpy(data.DataAllowShared(), ptr, data.LengthAllowShared()); gl->fUnmapBuffer(target); if (target == LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER && currentTF) { diff --git a/dom/canvas/WebGL2ContextTextures.cpp b/dom/canvas/WebGL2ContextTextures.cpp index e41a9aee43e..aba16ecd5aa 100644 --- a/dom/canvas/WebGL2ContextTextures.cpp +++ b/dom/canvas/WebGL2ContextTextures.cpp @@ -45,7 +45,7 @@ void WebGL2Context::TexImage3D(GLenum rawTexImageTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum unpackFormat, GLenum unpackType, - const dom::Nullable& maybeView) + const dom::Nullable& maybeView) { const char funcName[] = "texImage3D"; const uint8_t funcDims = 3; @@ -71,7 +71,7 @@ void WebGL2Context::TexSubImage3D(GLenum rawTexImageTarget, GLint level, GLint xOffset, GLint yOffset, GLint zOffset, GLsizei width, GLsizei height, GLsizei depth, GLenum unpackFormat, GLenum unpackType, - const dom::Nullable& maybeView, + const dom::Nullable& maybeView, ErrorResult& /*out_rv*/) { const char funcName[] = "texSubImage3D"; @@ -143,7 +143,7 @@ void WebGL2Context::CompressedTexImage3D(GLenum rawTexImageTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, - const dom::ArrayBufferViewOrSharedArrayBufferView& view) + const dom::ArrayBufferView& view) { const char funcName[] = "compressedTexImage3D"; const uint8_t funcDims = 3; @@ -165,7 +165,7 @@ WebGL2Context::CompressedTexSubImage3D(GLenum rawTexImageTarget, GLint level, GLint xOffset, GLint yOffset, GLint zOffset, GLsizei width, GLsizei height, GLsizei depth, GLenum sizedUnpackFormat, - const dom::ArrayBufferViewOrSharedArrayBufferView& view) + const dom::ArrayBufferView& view) { const char funcName[] = "compressedTexSubImage3D"; const uint8_t funcDims = 3; diff --git a/dom/canvas/WebGLContext.h b/dom/canvas/WebGLContext.h index 54bfd886de9..66b40716de3 100644 --- a/dom/canvas/WebGLContext.h +++ b/dom/canvas/WebGLContext.h @@ -48,7 +48,6 @@ #include "mozilla/dom/HTMLCanvasElement.h" #include "nsWrapperCache.h" #include "nsLayoutUtils.h" -#include "mozilla/dom/UnionTypes.h" class nsIDocShell; @@ -111,7 +110,6 @@ class Element; class ImageData; class OwningHTMLCanvasElementOrOffscreenCanvas; struct WebGLContextAttributes; -class ArrayBufferViewOrSharedArrayBufferView; template struct Nullable; } // namespace dom @@ -545,7 +543,7 @@ protected: public: void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, - const dom::Nullable& pixels, + const dom::Nullable& pixels, ErrorResult& rv); void RenderbufferStorage(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height); @@ -777,8 +775,6 @@ public: GLenum usage); void BufferData(GLenum target, const dom::SharedArrayBuffer& data, GLenum usage); - void BufferData(GLenum target, const dom::SharedArrayBufferView& data, - GLenum usage); private: template @@ -792,8 +788,6 @@ public: const dom::Nullable& maybeData); void BufferSubData(GLenum target, WebGLsizeiptr byteOffset, const dom::SharedArrayBuffer& data); - void BufferSubData(GLenum target, WebGLsizeiptr byteOffset, - const dom::SharedArrayBufferView& data); already_AddRefed CreateBuffer(); void DeleteBuffer(WebGLBuffer* buf); bool IsBuffer(WebGLBuffer* buf); @@ -890,10 +884,10 @@ protected: public: void CompressedTexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, - const dom::ArrayBufferViewOrSharedArrayBufferView& view); + const dom::ArrayBufferView& view); void CompressedTexSubImage2D(GLenum texImageTarget, GLint level, GLint xOffset, GLint yOffset, GLsizei width, GLsizei height, - GLenum unpackFormat, const dom::ArrayBufferViewOrSharedArrayBufferView& view); + GLenum unpackFormat, const dom::ArrayBufferView& view); void CopyTexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); @@ -904,7 +898,7 @@ public: void TexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLenum unpackFormat, GLenum unpackType, - const dom::Nullable& maybeView, + const dom::Nullable& maybeView, ErrorResult&); void TexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat, GLenum unpackFormat, GLenum unpackType, dom::ImageData* imageData, @@ -916,7 +910,7 @@ public: void TexSubImage2D(GLenum texImageTarget, GLint level, GLint xOffset, GLint yOffset, GLsizei width, GLsizei height, GLenum unpackFormat, GLenum unpackType, - const dom::Nullable& maybeView, + const dom::Nullable& maybeView, ErrorResult&); void TexSubImage2D(GLenum texImageTarget, GLint level, GLint xOffset, GLint yOffset, GLenum unpackFormat, GLenum unpackType, dom::ImageData* imageData, diff --git a/dom/canvas/WebGLContextBuffers.cpp b/dom/canvas/WebGLContextBuffers.cpp index 1404ab42d56..7a221782e8d 100644 --- a/dom/canvas/WebGLContextBuffers.cpp +++ b/dom/canvas/WebGLContextBuffers.cpp @@ -186,7 +186,6 @@ WebGLContext::BufferData(GLenum target, WebGLsizeiptr size, GLenum usage) // const dom::ArrayBuffer& // const dom::SharedArrayBuffer& // const dom::ArrayBufferView& -// const dom::SharedArrayBufferView& template void WebGLContext::BufferDataT(GLenum target, @@ -205,7 +204,7 @@ WebGLContext::BufferDataT(GLenum target, // Careful: data.Length() could conceivably be any uint32_t, but GLsizeiptr // is like intptr_t. - if (!CheckedInt(data.Length()).isValid()) + if (!CheckedInt(data.LengthAllowShared()).isValid()) return ErrorOutOfMemory("bufferData: bad size"); if (!ValidateBufferUsageEnum(usage, "bufferData: usage")) @@ -219,15 +218,17 @@ WebGLContext::BufferDataT(GLenum target, MakeContextCurrent(); InvalidateBufferFetching(); - GLenum error = CheckedBufferData(target, data.Length(), data.Data(), usage); + // Warning: Possibly shared memory. See bug 1225033. + GLenum error = CheckedBufferData(target, data.LengthAllowShared(), data.DataAllowShared(), usage); if (error) { GenerateWarning("bufferData generated error %s", ErrorName(error)); return; } - boundBuffer->SetByteLength(data.Length()); - if (!boundBuffer->ElementArrayCacheBufferData(data.Data(), data.Length())) + boundBuffer->SetByteLength(data.LengthAllowShared()); + // Warning: Possibly shared memory. See bug 1225033. + if (!boundBuffer->ElementArrayCacheBufferData(data.DataAllowShared(), data.LengthAllowShared())) return ErrorOutOfMemory("bufferData: out of memory"); } @@ -258,18 +259,10 @@ WebGLContext::BufferData(GLenum target, const dom::ArrayBufferView& data, BufferDataT(target, data, usage); } -void -WebGLContext::BufferData(GLenum target, const dom::SharedArrayBufferView& data, - GLenum usage) -{ - BufferDataT(target, data, usage); -} - // BufferT may be one of // const dom::ArrayBuffer& // const dom::SharedArrayBuffer& // const dom::ArrayBufferView& -// const dom::SharedArrayBufferView& template void WebGLContext::BufferSubDataT(GLenum target, @@ -294,7 +287,7 @@ WebGLContext::BufferSubDataT(GLenum target, data.ComputeLengthAndData(); CheckedInt checked_neededByteLength = - CheckedInt(byteOffset) + data.Length(); + CheckedInt(byteOffset) + data.LengthAllowShared(); if (!checked_neededByteLength.isValid()) { ErrorInvalidValue("bufferSubData: Integer overflow computing the needed" @@ -310,11 +303,13 @@ WebGLContext::BufferSubDataT(GLenum target, return; } - boundBuffer->ElementArrayCacheBufferSubData(byteOffset, data.Data(), - data.Length()); + // Warning: Possibly shared memory. See bug 1225033. + boundBuffer->ElementArrayCacheBufferSubData(byteOffset, data.DataAllowShared(), + data.LengthAllowShared()); MakeContextCurrent(); - gl->fBufferSubData(target, byteOffset, data.Length(), data.Data()); + // Warning: Possibly shared memory. See bug 1225033. + gl->fBufferSubData(target, byteOffset, data.LengthAllowShared(), data.DataAllowShared()); } void @@ -342,13 +337,6 @@ WebGLContext::BufferSubData(GLenum target, WebGLsizeiptr byteOffset, BufferSubDataT(target, byteOffset, data); } -void -WebGLContext::BufferSubData(GLenum target, WebGLsizeiptr byteOffset, - const dom::SharedArrayBufferView& data) -{ - BufferSubDataT(target, byteOffset, data); -} - already_AddRefed WebGLContext::CreateBuffer() { diff --git a/dom/canvas/WebGLContextGL.cpp b/dom/canvas/WebGLContextGL.cpp index 3fd68a6fb8a..325f107b3aa 100644 --- a/dom/canvas/WebGLContextGL.cpp +++ b/dom/canvas/WebGLContextGL.cpp @@ -1369,33 +1369,10 @@ WebGLContext::GetPackSize(uint32_t width, uint32_t height, uint8_t bytesPerPixel return bytesNeeded; } -// This function is temporary, and will be removed once https://bugzilla.mozilla.org/show_bug.cgi?id=1176214 lands, which will -// collapse the SharedArrayBufferView and ArrayBufferView into one. -void -ComputeLengthAndData(const dom::ArrayBufferViewOrSharedArrayBufferView& view, - void** const out_data, size_t* const out_length, - js::Scalar::Type* const out_type) -{ - if (view.IsArrayBufferView()) { - const auto& view2 = view.GetAsArrayBufferView(); - view2.ComputeLengthAndData(); - - *out_length = view2.Length(); - *out_data = view2.Data(); - *out_type = JS_GetArrayBufferViewType(view2.Obj()); - } else { - const auto& view2 = view.GetAsSharedArrayBufferView(); - view2.ComputeLengthAndData(); - *out_length = view2.Length(); - *out_data = view2.Data(); - *out_type = JS_GetSharedArrayBufferViewType(view2.Obj()); - } -} - void WebGLContext::ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, - const dom::Nullable& pixels, + const dom::Nullable& pixels, ErrorResult& out_error) { if (IsContextLost()) @@ -1469,12 +1446,13 @@ WebGLContext::ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum } const auto& view = pixels.Value(); + // Compute length and data. Don't reenter after this point, lest the // precomputed go out of sync with the instant length/data. - void* data; - size_t bytesAvailable; - js::Scalar::Type dataType; - ComputeLengthAndData(view, &data, &bytesAvailable, &dataType); + view.ComputeLengthAndData(); + void* data = view.DataAllowShared(); + size_t bytesAvailable = view.LengthAllowShared(); + js::Scalar::Type dataType = JS_GetArrayBufferViewType(view.Obj()); // Check the pixels param type if (dataType != requiredDataType) @@ -1545,6 +1523,7 @@ WebGLContext::ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum Intersect(srcHeight, y, height, &readY, &writeY, &rwHeight); if (rwWidth == uint32_t(width) && rwHeight == uint32_t(height)) { + // Warning: Possibly shared memory. See bug 1225033. DoReadPixelsAndConvert(x, y, width, height, format, type, data, auxReadFormat, auxReadType); return; diff --git a/dom/canvas/WebGLContextTextures.cpp b/dom/canvas/WebGLContextTextures.cpp index d3eef6c9a8a..18764bb0c1d 100644 --- a/dom/canvas/WebGLContextTextures.cpp +++ b/dom/canvas/WebGLContextTextures.cpp @@ -315,7 +315,7 @@ void WebGLContext::TexImage2D(GLenum rawTexImageTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLenum unpackFormat, GLenum unpackType, - const dom::Nullable& maybeView, + const dom::Nullable& maybeView, ErrorResult&) { const char funcName[] = "texImage2D"; @@ -394,7 +394,7 @@ void WebGLContext::TexSubImage2D(GLenum rawTexImageTarget, GLint level, GLint xOffset, GLint yOffset, GLsizei width, GLsizei height, GLenum unpackFormat, GLenum unpackType, - const dom::Nullable& maybeView, + const dom::Nullable& maybeView, ErrorResult&) { const char funcName[] = "texSubImage2D"; @@ -471,7 +471,7 @@ void WebGLContext::CompressedTexImage2D(GLenum rawTexImageTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, - const dom::ArrayBufferViewOrSharedArrayBufferView& view) + const dom::ArrayBufferView& view) { const char funcName[] = "compressedTexImage2D"; const uint8_t funcDims = 2; @@ -494,7 +494,7 @@ void WebGLContext::CompressedTexSubImage2D(GLenum rawTexImageTarget, GLint level, GLint xOffset, GLint yOffset, GLsizei width, GLsizei height, GLenum sizedUnpackFormat, - const dom::ArrayBufferViewOrSharedArrayBufferView& view) + const dom::ArrayBufferView& view) { const char funcName[] = "compressedTexSubImage2D"; const uint8_t funcDims = 2; diff --git a/dom/canvas/WebGLElementArrayCache.cpp b/dom/canvas/WebGLElementArrayCache.cpp index f4795852fab..1c939a546c9 100644 --- a/dom/canvas/WebGLElementArrayCache.cpp +++ b/dom/canvas/WebGLElementArrayCache.cpp @@ -488,6 +488,9 @@ WebGLElementArrayCache::BufferSubData(size_t pos, const void* ptr, if (!updateByteLength) return true; + // Note, using memcpy on shared racy data is not well-defined, this + // will need to use safe-for-races operations when those become available. + // See bug 1225033. if (ptr) memcpy(mBytes.Elements() + pos, ptr, updateByteLength); else diff --git a/dom/canvas/WebGLTexture.h b/dom/canvas/WebGLTexture.h index da29cecc9f2..8d1f62caae6 100644 --- a/dom/canvas/WebGLTexture.h +++ b/dom/canvas/WebGLTexture.h @@ -224,7 +224,7 @@ public: GLint level, GLenum internalFormat, GLint xOffset, GLint yOffset, GLint zOffset, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum unpackFormat, GLenum unpackType, - const dom::Nullable& maybeView); + const dom::Nullable& maybeView); void TexOrSubImage(bool isSubImage, const char* funcName, TexImageTarget target, GLint level, GLenum internalFormat, GLint xOffset, GLint yOffset, @@ -266,11 +266,11 @@ public: void CompressedTexImage(const char* funcName, TexImageTarget target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, - const dom::ArrayBufferViewOrSharedArrayBufferView& view); + const dom::ArrayBufferView& view); void CompressedTexSubImage(const char* funcName, TexImageTarget target, GLint level, GLint xOffset, GLint yOffset, GLint zOffset, GLsizei width, GLsizei height, GLsizei depth, GLenum sizedUnpackFormat, - const dom::ArrayBufferViewOrSharedArrayBufferView& view); + const dom::ArrayBufferView& view); void CopyTexImage2D(TexImageTarget target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); void CopyTexSubImage(const char* funcName, TexImageTarget target, GLint level, diff --git a/dom/canvas/WebGLTextureUpload.cpp b/dom/canvas/WebGLTextureUpload.cpp index 2e1b90909c3..b51086304ed 100644 --- a/dom/canvas/WebGLTextureUpload.cpp +++ b/dom/canvas/WebGLTextureUpload.cpp @@ -119,7 +119,7 @@ ValidateUnpackArrayType(WebGLContext* webgl, const char* funcName, GLenum unpack static UniquePtr UnpackBlobFromMaybeView(WebGLContext* webgl, const char* funcName, GLsizei width, GLsizei height, GLsizei depth, GLenum unpackType, - const dom::Nullable& maybeView) + const dom::Nullable& maybeView) { size_t dataSize; const void* data; @@ -128,16 +128,16 @@ UnpackBlobFromMaybeView(WebGLContext* webgl, const char* funcName, GLsizei width data = nullptr; } else { const auto& view = maybeView.Value(); - void* mutData; - js::Scalar::Type jsType; - ComputeLengthAndData(view, &mutData, &dataSize, &jsType); - data = mutData; - + view.ComputeLengthAndData(); + data = view.DataAllowShared(); + dataSize = view.LengthAllowShared(); + js::Scalar::Type jsType = JS_GetArrayBufferViewType(view.Obj()); if (!ValidateUnpackArrayType(webgl, funcName, unpackType, jsType)) return nullptr; } UniquePtr ret; + // Warning: Possibly shared memory. See bug 1225033. ret.reset(new webgl::TexUnpackBytes(width, height, depth, dataSize, data)); return Move(ret); } @@ -148,7 +148,7 @@ WebGLTexture::TexOrSubImage(bool isSubImage, const char* funcName, TexImageTarge GLint yOffset, GLint zOffset, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum unpackFormat, GLenum unpackType, - const dom::Nullable& maybeView) + const dom::Nullable& maybeView) { UniquePtr blob; blob = UnpackBlobFromMaybeView(mContext, funcName, width, height, depth, unpackType, @@ -1246,7 +1246,7 @@ void WebGLTexture::CompressedTexImage(const char* funcName, TexImageTarget target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, - const dom::ArrayBufferViewOrSharedArrayBufferView& view) + const dom::ArrayBufferView& view) { //////////////////////////////////// // Get dest info @@ -1279,11 +1279,9 @@ WebGLTexture::CompressedTexImage(const char* funcName, TexImageTarget target, GL //////////////////////////////////// // Get source info - void* mutData; - size_t dataSize; - js::Scalar::Type jsType; - ComputeLengthAndData(view, &mutData, &dataSize, &jsType); - const void* data = mutData; + view.ComputeLengthAndData(); + const void* data = view.DataAllowShared(); + size_t dataSize = view.LengthAllowShared(); if (!ValidateCompressedTexUnpack(mContext, funcName, width, height, depth, format, dataSize)) @@ -1305,6 +1303,7 @@ WebGLTexture::CompressedTexImage(const char* funcName, TexImageTarget target, GL mContext->gl->MakeCurrent(); + // Warning: Possibly shared memory. See bug 1225033. GLenum error = DoCompressedTexImage(mContext->gl, target, level, internalFormat, width, height, depth, border, dataSize, data); if (error == LOCAL_GL_OUT_OF_MEMORY) { @@ -1353,7 +1352,7 @@ WebGLTexture::CompressedTexSubImage(const char* funcName, TexImageTarget target, GLint level, GLint xOffset, GLint yOffset, GLint zOffset, GLsizei width, GLsizei height, GLsizei depth, GLenum sizedUnpackFormat, - const dom::ArrayBufferViewOrSharedArrayBufferView& view) + const dom::ArrayBufferView& view) { //////////////////////////////////// // Get dest info @@ -1372,11 +1371,9 @@ WebGLTexture::CompressedTexSubImage(const char* funcName, TexImageTarget target, //////////////////////////////////// // Get source info - void* mutData; - size_t dataSize; - js::Scalar::Type jsType; - ComputeLengthAndData(view, &mutData, &dataSize, &jsType); - const void* data = mutData; + view.ComputeLengthAndData(); + size_t dataSize = view.LengthAllowShared(); + const void* data = view.DataAllowShared(); auto srcUsage = mContext->mFormatUsage->GetSizedTexUsage(sizedUnpackFormat); if (!srcUsage->format->compression) { @@ -1450,6 +1447,7 @@ WebGLTexture::CompressedTexSubImage(const char* funcName, TexImageTarget target, return; } + // Warning: Possibly shared memory. See bug 1225033. GLenum error = DoCompressedTexSubImage(mContext->gl, target, level, xOffset, yOffset, zOffset, width, height, depth, sizedUnpackFormat, dataSize, data); diff --git a/dom/canvas/test/webgl-mochitest/test_sab_with_webgl.html b/dom/canvas/test/webgl-mochitest/test_sab_with_webgl.html index e92a6568259..3a8e829255b 100644 --- a/dom/canvas/test/webgl-mochitest/test_sab_with_webgl.html +++ b/dom/canvas/test/webgl-mochitest/test_sab_with_webgl.html @@ -21,7 +21,7 @@ function RGBAToString(arr) { function TestScreenColor(gl, r, g, b, a) { var arr = new SharedArrayBuffer(4); - var view = new SharedUint8Array(arr); + var view = new Uint8Array(arr); gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, view); var err = gl.getError(); @@ -64,10 +64,6 @@ function TestScreenColor(gl, r, g, b, a) { todo(false, 'SharedArrayBuffer is unavailable.'); return; } - if (SharedFloat32Array === 'undefined') { - todo(false, 'SharedFloat32Array is unavailable.'); - return; - } var vs = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vs, "attribute vec2 aVertCoord; void main(void) { gl_Position = vec4(aVertCoord, 0.0, 1.0); }"); @@ -99,7 +95,7 @@ function TestScreenColor(gl, r, g, b, a) { // Test gl.bufferData(), gl.bufferSubData() and gl.readPixels() APIs with SAB as input. var arr = new SharedArrayBuffer(8*4); - var view = new SharedFloat32Array(arr); + var view = new Float32Array(arr); view.set(new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1])); var vb = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, vb); @@ -123,7 +119,7 @@ function TestScreenColor(gl, r, g, b, a) { var height = 4; var numChannels = 4; var sab = new SharedArrayBuffer(width * height * numChannels); - var data = new SharedUint8Array(sab); + var data = new Uint8Array(sab); for (var i = 0; i < data.length; ++i) { data[i] = i; } @@ -151,13 +147,9 @@ function TestScreenColor(gl, r, g, b, a) { todo(false, 'SharedArrayBuffer is unavailable.'); return; } - if (SharedFloat32Array === 'undefined') { - todo(false, 'SharedFloat32Array is unavailable.'); - return; - } var arr = new SharedArrayBuffer(8*4); - var view = new SharedFloat32Array(arr); + var view = new Float32Array(arr); view.set(new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1])); var vb = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, vb); @@ -165,7 +157,7 @@ function TestScreenColor(gl, r, g, b, a) { var arr2 = new SharedArrayBuffer(8*4); gl.getBufferSubData(gl.ARRAY_BUFFER, 0, arr2); - var view2 = new SharedFloat32Array(arr2); + var view2 = new Float32Array(arr2); var equal = true; for(var i = 0; i < 8; ++i) { if (view[i] != view2[i]) equal = false; @@ -180,7 +172,7 @@ function TestScreenColor(gl, r, g, b, a) { var depth = 4; var numChannels = 4; var sab = new SharedArrayBuffer(width * height * depth* numChannels); - var data = new SharedUint8Array(sab); + var data = new Uint8Array(sab); for (var i = 0; i < data.length; ++i) { data[i] = i; } diff --git a/dom/webidl/WebGL2RenderingContext.webidl b/dom/webidl/WebGL2RenderingContext.webidl index 2bff8aed5a6..5af0f0cd26b 100644 --- a/dom/webidl/WebGL2RenderingContext.webidl +++ b/dom/webidl/WebGL2RenderingContext.webidl @@ -347,12 +347,12 @@ interface WebGL2RenderingContext : WebGLRenderingContext void texImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, - GLenum type, (ArrayBufferView or SharedArrayBufferView)? pixels); + GLenum type, ArrayBufferView? pixels); [Throws] // Can't actually throw. void texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, - (ArrayBufferView or SharedArrayBufferView)? pixels); + ArrayBufferView? pixels); [Throws] // Can't actually throw. void texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLenum format, GLenum type, ImageData? data); @@ -373,11 +373,11 @@ interface WebGL2RenderingContext : WebGLRenderingContext void compressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, - (ArrayBufferView or SharedArrayBufferView) data); + ArrayBufferView data); void compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, - (ArrayBufferView or SharedArrayBufferView) data); + ArrayBufferView data); /* Programs and shaders */ [WebGLHandlesContextLoss] GLint getFragDataLocation(WebGLProgram? program, DOMString name); diff --git a/dom/webidl/WebGLRenderingContext.webidl b/dom/webidl/WebGLRenderingContext.webidl index 0242293df5f..35693ae3988 100644 --- a/dom/webidl/WebGLRenderingContext.webidl +++ b/dom/webidl/WebGLRenderingContext.webidl @@ -552,11 +552,9 @@ interface WebGLRenderingContext { void bufferData(GLenum target, GLsizeiptr size, GLenum usage); void bufferData(GLenum target, ArrayBufferView data, GLenum usage); - void bufferData(GLenum target, SharedArrayBufferView data, GLenum usage); void bufferData(GLenum target, ArrayBuffer? data, GLenum usage); void bufferData(GLenum target, SharedArrayBuffer data, GLenum usage); void bufferSubData(GLenum target, GLintptr offset, ArrayBufferView data); - void bufferSubData(GLenum target, GLintptr offset, SharedArrayBufferView data); void bufferSubData(GLenum target, GLintptr offset, ArrayBuffer? data); void bufferSubData(GLenum target, GLintptr offset, SharedArrayBuffer data); @@ -570,11 +568,11 @@ interface WebGLRenderingContext { void compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, - (ArrayBufferView or SharedArrayBufferView) data); + ArrayBufferView data); void compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, - (ArrayBufferView or SharedArrayBufferView) data); + ArrayBufferView data); void copyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, @@ -677,7 +675,7 @@ interface WebGLRenderingContext { [Throws] void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, - GLenum format, GLenum type, (ArrayBufferView or SharedArrayBufferView)? pixels); + GLenum format, GLenum type, ArrayBufferView? pixels); void renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); @@ -698,7 +696,7 @@ interface WebGLRenderingContext { [Throws] // Can't actually throw. void texImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, - GLenum type, (ArrayBufferView or SharedArrayBufferView)? pixels); + GLenum type, ArrayBufferView? pixels); [Throws] // Can't actually throw. void texImage2D(GLenum target, GLint level, GLenum internalformat, GLenum format, GLenum type, ImageData? pixels); @@ -718,7 +716,7 @@ interface WebGLRenderingContext { [Throws] // Can't actually throw. void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, - (ArrayBufferView or SharedArrayBufferView)? pixels); + ArrayBufferView? pixels); [Throws] // Can't actually throw. void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLenum format, GLenum type, ImageData? pixels);