Bug 1313541 - Texture impl. - r=ethlin draft
authorJeff Gilbert (:jgilbert) <jgilbert@mozilla.com>
Thu, 13 Oct 2016 16:13:50 -0700
changeset 430648 3005b6a073298e391e5be7a6815e432e39add60c
parent 430647 4f00518a90a3528ab3aba585edc69c6226795e98
child 430649 88e02d3fb01c82b67bbddab0285f78212b19ed05
push id33862
push userbmo:jgilbert@mozilla.com
push dateFri, 28 Oct 2016 02:14:30 +0000
reviewersethlin
bugs1313541
milestone52.0a1
Bug 1313541 - Texture impl. - r=ethlin MozReview-Commit-ID: DEyr93aD3IF
dom/canvas/WebGL2Context.h
dom/canvas/WebGL2ContextTextures.cpp
dom/canvas/WebGLContext.h
dom/canvas/WebGLContextTextures.cpp
dom/canvas/WebGLTextureUpload.cpp
--- a/dom/canvas/WebGL2Context.h
+++ b/dom/canvas/WebGL2Context.h
@@ -152,73 +152,25 @@ public:
                                  GLint zOffset, GLsizei width, GLsizei height,
                                  GLsizei depth, GLenum sizedUnpackFormat,
                                  const dom::ArrayBufferView& srcView,
                                  GLuint srcElemOffset);
 
     ////////////////
     // Texture PBOs
 
-    void TexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat,
-                    GLsizei width, GLsizei height, GLint border, GLenum unpackFormat,
-                    GLenum unpackType, WebGLsizeiptr offset, ErrorResult&);
-
-    void TexSubImage2D(GLenum texImageTarget, GLint level, GLint xOffset, GLint yOffset,
-                       GLsizei width, GLsizei height, GLenum unpackFormat,
-                       GLenum unpackType, WebGLsizeiptr offset, ErrorResult&);
-
     void TexImage3D(GLenum target, GLint level, GLenum internalFormat, GLsizei width,
                     GLsizei height, GLsizei depth, GLint border, GLenum unpackFormat,
                     GLenum unpackType, WebGLsizeiptr offset);
 
     void TexSubImage3D(GLenum target, GLint level, GLint xOffset, GLint yOffset,
                        GLint zOffset, GLsizei width, GLsizei height, GLsizei depth,
                        GLenum unpackFormat, GLenum unpackType, WebGLsizeiptr offset,
                        ErrorResult&);
 
-    ////////////////
-    // WebGL1 overloads
-
-    void
-    TexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat, GLsizei width,
-               GLsizei height, GLint border, GLenum unpackFormat, GLenum unpackType,
-               const dom::Nullable<dom::ArrayBufferView>& pixels, ErrorResult& out_rv)
-    {
-        WebGLContext::TexImage2D(texImageTarget, level, internalFormat, width, height,
-                                 border, unpackFormat, unpackType, pixels, out_rv);
-    }
-
-    template<typename T>
-    void
-    TexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat,
-               GLenum unpackFormat, GLenum unpackType, const T& any, ErrorResult& out_rv)
-    {
-        WebGLContext::TexImage2D(texImageTarget, level, internalFormat, unpackFormat,
-                                 unpackType, any, out_rv);
-    }
-
-    void
-    TexSubImage2D(GLenum texImageTarget, GLint level, GLint xOffset, GLint yOffset,
-                  GLsizei width, GLsizei height, GLenum unpackFormat, GLenum unpackType,
-                  const dom::ArrayBufferView& view, ErrorResult&)
-    {
-        WebGLContext::TexSubImage2D(texImageTarget, level, xOffset, yOffset, width,
-                                    height, unpackFormat, unpackType, view);
-    }
-
-    template<typename T>
-    inline void
-    TexSubImage2D(GLenum texImageTarget, GLint level, GLint xOffset, GLint yOffset,
-                  GLenum unpackFormat, GLenum unpackType, const T& any,
-                  ErrorResult& out_rv)
-    {
-        WebGLContext::TexSubImage2D(texImageTarget, level, xOffset, yOffset, unpackFormat,
-                                    unpackType, any, out_rv);
-    }
-
     // -------------------------------------------------------------------------
     // Programs and shaders - WebGL2ContextPrograms.cpp
     GLint GetFragDataLocation(WebGLProgram* program, const nsAString& name);
 
 
     // -------------------------------------------------------------------------
     // Uniforms and attributes - WebGL2ContextUniforms.cpp
     void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset);
--- a/dom/canvas/WebGL2ContextTextures.cpp
+++ b/dom/canvas/WebGL2ContextTextures.cpp
@@ -40,17 +40,17 @@ WebGL2Context::TexStorage3D(GLenum rawTe
 
     tex->TexStorage(funcName, target, levels, internalFormat, width, height, depth);
 }
 
 void
 WebGL2Context::TexImage3D(GLenum rawTexImageTarget, GLint level, GLenum internalFormat,
                           GLsizei width, GLsizei height, GLsizei depth, GLint border,
                           GLenum unpackFormat, GLenum unpackType,
-                          const dom::ArrayBufferView>* srcView, GLuint srcElemOffset)
+                          const dom::ArrayBufferView* srcView, GLuint srcElemOffset)
 {
     const char funcName[] = "texImage3D";
     const uint8_t funcDims = 3;
 
     TexImageTarget target;
     WebGLTexture* tex;
     if (!ValidateTexImageTarget(this, funcName, funcDims, rawTexImageTarget, &target,
                                 &tex))
@@ -59,17 +59,17 @@ WebGL2Context::TexImage3D(GLenum rawTexI
     }
 
     const bool isSubImage = false;
     const GLint xOffset = 0;
     const GLint yOffset = 0;
     const GLint zOffset = 0;
     tex->TexOrSubImage(isSubImage, funcName, target, level, internalFormat, xOffset,
                        yOffset, zOffset, width, height, depth, border, unpackFormat,
-                       unpackType, view, srcElemOffset);
+                       unpackType, srcView, srcElemOffset);
 }
 
 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::ArrayBufferView& srcView, GLuint srcElemOffset,
                              ErrorResult&)
@@ -153,17 +153,17 @@ WebGL2Context::CompressedTexImage3D(GLen
     WebGLTexture* tex;
     if (!ValidateTexImageTarget(this, funcName, funcDims, rawTexImageTarget, &target,
                                 &tex))
     {
         return;
     }
 
     tex->CompressedTexImage(funcName, target, level, internalFormat, width, height, depth,
-                            border, view, srcElemOffset);
+                            border, srcView, srcElemOffset);
 }
 
 void
 WebGL2Context::CompressedTexSubImage3D(GLenum rawTexImageTarget, GLint level,
                                        GLint xOffset, GLint yOffset, GLint zOffset,
                                        GLsizei width, GLsizei height, GLsizei depth,
                                        GLenum sizedUnpackFormat,
                                        const dom::ArrayBufferView& srcView,
@@ -176,17 +176,17 @@ WebGL2Context::CompressedTexSubImage3D(G
     WebGLTexture* tex;
     if (!ValidateTexImageTarget(this, funcName, funcDims, rawTexImageTarget, &target,
                                 &tex))
     {
         return;
     }
 
     tex->CompressedTexSubImage(funcName, target, level, xOffset, yOffset, zOffset, width,
-                               height, depth, sizedUnpackFormat, view, srcElemOffset);
+                               height, depth, sizedUnpackFormat, srcView, srcElemOffset);
 }
 
 void
 WebGL2Context::CopyTexSubImage3D(GLenum rawTexImageTarget, GLint level, GLint xOffset,
                                  GLint yOffset, GLint zOffset, GLint x, GLint y,
                                  GLsizei width, GLsizei height)
 {
     const char funcName[] = "copyTexSubImage3D";
@@ -202,20 +202,20 @@ WebGL2Context::CopyTexSubImage3D(GLenum 
 
     tex->CopyTexSubImage(funcName, target, level, xOffset, yOffset, zOffset, x, y, width,
                          height);
 }
 
 ////////////////////
 
 void
-WebGL2Context::TexImage2D(GLenum rawTexImageTarget, GLint level, GLenum internalFormat,
-                          GLsizei width, GLsizei height, GLint border,
-                          GLenum unpackFormat, GLenum unpackType, WebGLsizeiptr offset,
-                          ErrorResult&)
+WebGLContext::TexImage2D(GLenum rawTexImageTarget, GLint level, GLenum internalFormat,
+                         GLsizei width, GLsizei height, GLint border,
+                         GLenum unpackFormat, GLenum unpackType, WebGLsizeiptr offset,
+                         ErrorResult&)
 {
     const char funcName[] = "texImage2D";
     const uint8_t funcDims = 2;
 
     TexImageTarget target;
     WebGLTexture* tex;
     if (!ValidateTexImageTarget(this, funcName, funcDims, rawTexImageTarget, &target,
                                 &tex))
@@ -229,20 +229,20 @@ WebGL2Context::TexImage2D(GLenum rawTexI
     const GLint zOffset = 0;
     const GLsizei depth = 1;
     tex->TexOrSubImage(isSubImage, funcName, target, level, internalFormat, xOffset,
                        yOffset, zOffset, width, height, depth, border, unpackFormat,
                        unpackType, offset);
 }
 
 void
-WebGL2Context::TexSubImage2D(GLenum rawTexImageTarget, GLint level, GLint xOffset,
-                             GLint yOffset, GLsizei width, GLsizei height,
-                             GLenum unpackFormat, GLenum unpackType, WebGLsizeiptr offset,
-                             ErrorResult&)
+WebGLContext::TexSubImage2D(GLenum rawTexImageTarget, GLint level, GLint xOffset,
+                            GLint yOffset, GLsizei width, GLsizei height,
+                            GLenum unpackFormat, GLenum unpackType, WebGLsizeiptr offset,
+                            ErrorResult&)
 {
     const char funcName[] = "texSubImage2D";
     const uint8_t funcDims = 2;
 
     TexImageTarget target;
     WebGLTexture* tex;
     if (!ValidateTexImageTarget(this, funcName, funcDims, rawTexImageTarget, &target,
                                 &tex))
--- a/dom/canvas/WebGLContext.h
+++ b/dom/canvas/WebGLContext.h
@@ -865,71 +865,84 @@ protected:
                            GLfloat* maybeFloatParam);
 
     virtual bool IsTexParamValid(GLenum pname) const;
 
     // Upload funcs
 public:
     void CompressedTexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat,
                               GLsizei width, GLsizei height, GLint border,
-                              const dom::ArrayBufferView& view);
+                              const dom::ArrayBufferView& view, GLuint srcElemOffset = 0);
     void CompressedTexSubImage2D(GLenum texImageTarget, GLint level, GLint xOffset,
                                  GLint yOffset, GLsizei width, GLsizei height,
-                                 GLenum unpackFormat, const dom::ArrayBufferView& view);
+                                 GLenum unpackFormat, const dom::ArrayBufferView& view,
+                                 GLuint srcElemOffset = 0);
 
     void CopyTexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat,
                         GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
     void CopyTexSubImage2D(GLenum texImageTarget, GLint level, GLint xOffset,
                            GLint yOffset, GLint x, GLint y, GLsizei width,
                            GLsizei height);
 
     ////
 
     void TexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat,
                     GLsizei width, GLsizei height, GLint border, GLenum unpackFormat,
                     GLenum unpackType,
                     const dom::Nullable<dom::ArrayBufferView>& maybeView,
-                    ErrorResult& out_error)
+                    ErrorResult&)
     {
-        if (IsContextLost())
-            return;
+        const dom::ArrayBufferView* view = nullptr;
+        if (!maybeView.IsNull()) {
+            view = &(maybeView.Value());
+        }
 
         TexImage2D(texImageTarget, level, internalFormat, width, height, border,
-                   unpackFormat, unpackType, maybeView, 0, out_error);
+                   unpackFormat, unpackType, view, 0);
     }
 
     void TexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat,
                     GLsizei width, GLsizei height, GLint border, GLenum unpackFormat,
-                    GLenum unpackType,
-                    const dom::Nullable<dom::ArrayBufferView>& maybeSrc,
-                    GLuint srcElemOffset, ErrorResult&);
+                    GLenum unpackType, const dom::ArrayBufferView& srcView,
+                    GLuint srcElemOffset, ErrorResult&)
+    {
+        TexImage2D(texImageTarget, level, internalFormat, width, height, border,
+                   unpackFormat, unpackType, &srcView, srcElemOffset);
+    }
 
 protected:
     void TexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat,
+                    GLsizei width, GLsizei height, GLint border, GLenum unpackFormat,
+                    GLenum unpackType, const dom::ArrayBufferView* srcView,
+                    GLuint srcElemOffset);
+
+public:
+    void TexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat,
                     GLenum unpackFormat, GLenum unpackType,
                     const dom::ImageData& imageData, ErrorResult& out_error);
-public:
     void TexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat,
                     GLenum unpackFormat, GLenum unpackType, const dom::Element& elem,
                     ErrorResult& out_error);
+    void TexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat,
+                    GLsizei width, GLsizei height, GLint border, GLenum unpackFormat,
+                    GLenum unpackType, WebGLsizeiptr offset, ErrorResult&);
 
     ////
 
-protected:
-    void TexSubImage2D(GLenum texImageTarget, GLint level, GLint xOffset, GLint yOffset,
-                       GLsizei width, GLsizei height, GLenum unpackFormat,
-                       GLenum unpackType, const dom::ArrayBufferView& view);
     void TexSubImage2D(GLenum texImageTarget, GLint level, GLint xOffset, GLint yOffset,
                        GLenum unpackFormat, GLenum unpackType,
                        const dom::ImageData& imageData, ErrorResult& out_error);
-public:
     void TexSubImage2D(GLenum texImageTarget, GLint level, GLint xOffset, GLint yOffset,
                        GLenum unpackFormat, GLenum unpackType, const dom::Element& elem,
                        ErrorResult& out_error);
 
+    void TexSubImage2D(GLenum texImageTarget, GLint level, GLint xOffset, GLint yOffset,
+                       GLsizei width, GLsizei height, GLenum unpackFormat,
+                       GLenum unpackType, WebGLsizeiptr offset, ErrorResult&);
+
     ////////////////
     // dom::ImageData
 
     void TexImage2D(GLenum texImageTarget, GLint level, GLenum internalFormat,
                     GLenum unpackFormat, GLenum unpackType,
                     const dom::ImageData* imageData, ErrorResult& out_error)
     {
         const char funcName[] = "texImage2D";
@@ -968,17 +981,17 @@ public:
         const char funcName[] = "texSubImage2D";
         if (IsContextLost())
             return;
 
         if (maybeSrc.IsNull())
             return ErrorInvalidValue("%s: `data` must not be null.", funcName);
 
         TexSubImage2D(texImageTarget, level, xOffset, yOffset, width, height,
-                      unpackFormat, unpackType, maybeView.Value(), 0, out_error);
+                      unpackFormat, unpackType, maybeSrc.Value(), 0, out_error);
     }
 
     void TexSubImage2D(GLenum texImageTarget, GLint level, GLint xOffset, GLint yOffset,
                        GLsizei width, GLsizei height, GLenum unpackFormat,
                        GLenum unpackType,
                        const dom::ArrayBufferView& srcView, GLuint srcElemOffset,
                        ErrorResult&);
 
--- a/dom/canvas/WebGLContextTextures.cpp
+++ b/dom/canvas/WebGLContextTextures.cpp
@@ -322,44 +322,38 @@ WebGLContext::TexParameter_base(GLenum r
 
 
 ////////////////////
 // TexImage
 
 void
 WebGLContext::TexImage2D(GLenum rawTexImageTarget, GLint level, GLenum internalFormat,
                          GLsizei width, GLsizei height, GLint border, GLenum unpackFormat,
-                         GLenum unpackType,
-                         const dom::Nullable<dom::ArrayBufferView>& maybeView,
-                         ErrorResult&)
+                         GLenum unpackType, const dom::ArrayBufferView* maybeView,
+                         GLuint elemOffset)
 {
     const char funcName[] = "texImage2D";
     const uint8_t funcDims = 2;
 
     TexImageTarget target;
     WebGLTexture* tex;
     if (!ValidateTexImageTarget(this, funcName, funcDims, rawTexImageTarget, &target,
                                 &tex))
     {
         return;
     }
 
-    const dom::ArrayBufferView* view = nullptr;
-    if (!maybeView.IsNull()) {
-        view = &maybeView.Value();
-    }
-
     const bool isSubImage = false;
     const GLint xOffset = 0;
     const GLint yOffset = 0;
     const GLint zOffset = 0;
     const GLsizei depth = 1;
     tex->TexOrSubImage(isSubImage, funcName, target, level, internalFormat, xOffset,
                        yOffset, zOffset, width, height, depth, border, unpackFormat,
-                       unpackType, view);
+                       unpackType, maybeView, elemOffset);
 }
 
 void
 WebGLContext::TexImage2D(GLenum rawTexImageTarget, GLint level, GLenum internalFormat,
                          GLenum unpackFormat, GLenum unpackType,
                          const dom::ImageData& imageData, ErrorResult&)
 {
     const char funcName[] = "texImage2D";
@@ -407,17 +401,18 @@ WebGLContext::TexImage2D(GLenum rawTexIm
 
 ////////////////////////////////////////
 // TexSubImage
 
 void
 WebGLContext::TexSubImage2D(GLenum rawTexImageTarget, GLint level, GLint xOffset,
                             GLint yOffset, GLsizei width, GLsizei height,
                             GLenum unpackFormat, GLenum unpackType,
-                            const dom::ArrayBufferView& view)
+                            const dom::ArrayBufferView& view, GLuint elemOffset,
+                            ErrorResult&)
 {
     const char funcName[] = "texSubImage2D";
     const uint8_t funcDims = 2;
 
     TexImageTarget target;
     WebGLTexture* tex;
     if (!ValidateTexImageTarget(this, funcName, funcDims, rawTexImageTarget, &target,
                                 &tex))
@@ -427,17 +422,17 @@ WebGLContext::TexSubImage2D(GLenum rawTe
 
     const bool isSubImage = true;
     const GLenum internalFormat = 0;
     const GLint zOffset = 0;
     const GLsizei depth = 1;
     const GLint border = 0;
     tex->TexOrSubImage(isSubImage, funcName, target, level, internalFormat, xOffset,
                        yOffset, zOffset, width, height, depth, border, unpackFormat,
-                       unpackType, &view);
+                       unpackType, &view, elemOffset);
 }
 
 void
 WebGLContext::TexSubImage2D(GLenum rawTexImageTarget, GLint level, GLint xOffset,
                             GLint yOffset, GLenum unpackFormat, GLenum unpackType,
                             const dom::ImageData& imageData, ErrorResult&)
 {
     const char funcName[] = "texSubImage2D";
@@ -482,58 +477,57 @@ WebGLContext::TexSubImage2D(GLenum rawTe
 }
 
 ////////////////////////////////////////
 // CompressedTex(Sub)Image
 
 void
 WebGLContext::CompressedTexImage2D(GLenum rawTexImageTarget, GLint level,
                                    GLenum internalFormat, GLsizei width, GLsizei height,
-                                   GLint border,
-                                   const dom::ArrayBufferView& view)
+                                   GLint border, const dom::ArrayBufferView& srcView,
+                                   GLuint srcElemOffset)
 {
     const char funcName[] = "compressedTexImage2D";
     const uint8_t funcDims = 2;
 
     TexImageTarget target;
     WebGLTexture* tex;
     if (!ValidateTexImageTarget(this, funcName, funcDims, rawTexImageTarget, &target,
                                 &tex))
     {
         return;
     }
 
     const GLsizei depth = 1;
-
     tex->CompressedTexImage(funcName, target, level, internalFormat, width, height, depth,
-                            border, view);
+                            border, srcView, srcElemOffset);
 }
 
 void
 WebGLContext::CompressedTexSubImage2D(GLenum rawTexImageTarget, GLint level,
                                       GLint xOffset, GLint yOffset, GLsizei width,
                                       GLsizei height, GLenum sizedUnpackFormat,
-                                      const dom::ArrayBufferView& view)
+                                      const dom::ArrayBufferView& srcView,
+                                      GLuint srcElemOffset)
 {
     const char funcName[] = "compressedTexSubImage2D";
     const uint8_t funcDims = 2;
 
     TexImageTarget target;
     WebGLTexture* tex;
     if (!ValidateTexImageTarget(this, funcName, funcDims, rawTexImageTarget, &target,
                                 &tex))
     {
         return;
     }
 
     const GLint zOffset = 0;
     const GLsizei depth = 1;
-
     tex->CompressedTexSubImage(funcName, target, level, xOffset, yOffset, zOffset, width,
-                               height, depth, sizedUnpackFormat, view);
+                               height, depth, sizedUnpackFormat, srcView, srcElemOffset);
 }
 
 ////////////////////////////////////////
 // CopyTex(Sub)Image
 
 void
 WebGLContext::CopyTexImage2D(GLenum rawTexImageTarget, GLint level, GLenum internalFormat,
                              GLint x, GLint y, GLsizei width, GLsizei height,
--- a/dom/canvas/WebGLTextureUpload.cpp
+++ b/dom/canvas/WebGLTextureUpload.cpp
@@ -263,17 +263,17 @@ WebGLTexture::TexOrSubImage(bool isSubIm
         const auto& jsType = srcView->Type();
         if (!DoesJSTypeMatchUnpackType(pi.type, jsType)) {
             mContext->ErrorInvalidOperation("%s: `pixels` not compatible with `type`.",
                                             funcName);
             return;
         }
 
         if (!mContext->ValidateArrayBufferView(funcName, *srcView, srcElemOffset, 0,
-                                               &bytes, &byteCount))
+                                               const_cast<uint8_t**>(&bytes), &byteCount))
         {
             return;
         }
     } else if (isSubImage) {
         mContext->ErrorInvalidValue("%s: `pixels` must not be null.", funcName);
         return;
     }
 
@@ -1489,20 +1489,20 @@ WebGLTexture::CompressedTexImage(const c
     }
 
     if (!ValidateTargetForFormat(funcName, mContext, target, format))
         return;
 
     ////////////////////////////////////
     // Get source info
 
-    uint8_t* bytes;
+    const uint8_t* bytes;
     size_t byteLen;
-    if (!mContext->ValidateArrayBufferView(funcName, srcView, srcElemOffset, 0, &bytes,
-                                           &byteLen))
+    if (!mContext->ValidateArrayBufferView(funcName, srcView, srcElemOffset, 0,
+                                           const_cast<uint8_t**>(&bytes), &byteLen))
     {
         return;
     }
 
     if (!ValidateCompressedTexUnpack(mContext, funcName, width, height, depth, format,
                                      byteLen))
     {
         return;
@@ -1593,20 +1593,20 @@ WebGLTexture::CompressedTexSubImage(cons
     MOZ_ASSERT(imageInfo);
 
     auto dstUsage = imageInfo->mFormat;
     auto dstFormat = dstUsage->format;
 
     ////////////////////////////////////
     // Get source info
 
-    uint8_t* bytes;
+    const uint8_t* bytes;
     size_t byteLen;
-    if (!mContext->ValidateArrayBufferView(funcName, srcView, srcElemOffset, 0, &bytes,
-                                           &byteLen))
+    if (!mContext->ValidateArrayBufferView(funcName, srcView, srcElemOffset, 0,
+                                           const_cast<uint8_t**>(&bytes), &byteLen))
     {
         return;
     }
 
     auto srcUsage = mContext->mFormatUsage->GetSizedTexUsage(sizedUnpackFormat);
     if (!srcUsage->format->compression) {
         mContext->ErrorInvalidEnum("%s: Specified format must be compressed.", funcName);
         return;