mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
Bug 1176214 - Part 12: Changes to WebGL. r=bz, r=clb
--HG-- extra : rebase_source : 65b6b69a0a5fd7987d390832cedf844588a41846
This commit is contained in:
parent
b62493634b
commit
49063542c0
@ -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<dom::ArrayBufferViewOrSharedArrayBufferView>& pixels);
|
||||
const dom::Nullable<dom::ArrayBufferView>& 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<dom::ArrayBufferViewOrSharedArrayBufferView>& pixels,
|
||||
const dom::Nullable<dom::ArrayBufferView>& 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);
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
@ -171,7 +171,7 @@ WebGL2Context::GetBufferSubDataT(GLenum target, GLintptr offset, const BufferT&
|
||||
// of the buffer an INVALID_VALUE error is generated.
|
||||
data.ComputeLengthAndData();
|
||||
|
||||
CheckedInt<WebGLsizeiptr> neededByteLength = CheckedInt<WebGLsizeiptr>(offset) + data.Length();
|
||||
CheckedInt<WebGLsizeiptr> neededByteLength = CheckedInt<WebGLsizeiptr>(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) {
|
||||
|
@ -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<dom::ArrayBufferViewOrSharedArrayBufferView>& maybeView)
|
||||
const dom::Nullable<dom::ArrayBufferView>& 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<dom::ArrayBufferViewOrSharedArrayBufferView>& maybeView,
|
||||
const dom::Nullable<dom::ArrayBufferView>& 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;
|
||||
|
@ -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<typename> 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<dom::ArrayBufferViewOrSharedArrayBufferView>& pixels,
|
||||
const dom::Nullable<dom::ArrayBufferView>& 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<typename BufferT>
|
||||
@ -792,8 +788,6 @@ public:
|
||||
const dom::Nullable<dom::ArrayBuffer>& maybeData);
|
||||
void BufferSubData(GLenum target, WebGLsizeiptr byteOffset,
|
||||
const dom::SharedArrayBuffer& data);
|
||||
void BufferSubData(GLenum target, WebGLsizeiptr byteOffset,
|
||||
const dom::SharedArrayBufferView& data);
|
||||
already_AddRefed<WebGLBuffer> 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<dom::ArrayBufferViewOrSharedArrayBufferView>& maybeView,
|
||||
const dom::Nullable<dom::ArrayBufferView>& 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<dom::ArrayBufferViewOrSharedArrayBufferView>& maybeView,
|
||||
const dom::Nullable<dom::ArrayBufferView>& maybeView,
|
||||
ErrorResult&);
|
||||
void TexSubImage2D(GLenum texImageTarget, GLint level, GLint xOffset, GLint yOffset,
|
||||
GLenum unpackFormat, GLenum unpackType, dom::ImageData* imageData,
|
||||
|
@ -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<typename BufferT>
|
||||
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<GLsizeiptr>(data.Length()).isValid())
|
||||
if (!CheckedInt<GLsizeiptr>(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<typename BufferT>
|
||||
void
|
||||
WebGLContext::BufferSubDataT(GLenum target,
|
||||
@ -294,7 +287,7 @@ WebGLContext::BufferSubDataT(GLenum target,
|
||||
data.ComputeLengthAndData();
|
||||
|
||||
CheckedInt<WebGLsizeiptr> checked_neededByteLength =
|
||||
CheckedInt<WebGLsizeiptr>(byteOffset) + data.Length();
|
||||
CheckedInt<WebGLsizeiptr>(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<WebGLBuffer>
|
||||
WebGLContext::CreateBuffer()
|
||||
{
|
||||
|
@ -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<dom::ArrayBufferViewOrSharedArrayBufferView>& pixels,
|
||||
const dom::Nullable<dom::ArrayBufferView>& 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;
|
||||
|
@ -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<dom::ArrayBufferViewOrSharedArrayBufferView>& maybeView,
|
||||
const dom::Nullable<dom::ArrayBufferView>& 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<dom::ArrayBufferViewOrSharedArrayBufferView>& maybeView,
|
||||
const dom::Nullable<dom::ArrayBufferView>& 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;
|
||||
|
@ -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
|
||||
|
@ -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<dom::ArrayBufferViewOrSharedArrayBufferView>& maybeView);
|
||||
const dom::Nullable<dom::ArrayBufferView>& 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,
|
||||
|
@ -119,7 +119,7 @@ ValidateUnpackArrayType(WebGLContext* webgl, const char* funcName, GLenum unpack
|
||||
static UniquePtr<webgl::TexUnpackBlob>
|
||||
UnpackBlobFromMaybeView(WebGLContext* webgl, const char* funcName, GLsizei width,
|
||||
GLsizei height, GLsizei depth, GLenum unpackType,
|
||||
const dom::Nullable<dom::ArrayBufferViewOrSharedArrayBufferView>& maybeView)
|
||||
const dom::Nullable<dom::ArrayBufferView>& 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<webgl::TexUnpackBlob> 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<dom::ArrayBufferViewOrSharedArrayBufferView>& maybeView)
|
||||
const dom::Nullable<dom::ArrayBufferView>& maybeView)
|
||||
{
|
||||
UniquePtr<webgl::TexUnpackBlob> 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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user