Bug 1313541 - ClearBuffer impl. - r=ethlin draft
authorJeff Gilbert (:jgilbert) <jgilbert@mozilla.com>
Thu, 13 Oct 2016 17:02:48 -0700
changeset 430653 b3718151f7cb1e320e4c00cce75cfd37def45e5d
parent 430652 37a99342024fa252c385939505c3d210d8f82f85
child 430654 b027abc096f3a8e0ccc5ec8f6a71e790228d82e8
child 431868 753538ce14a5ad045e2306be3879ee1bd595136c
push id33862
push userbmo:jgilbert@mozilla.com
push dateFri, 28 Oct 2016 02:14:30 +0000
reviewersethlin
bugs1313541
milestone52.0a1
Bug 1313541 - ClearBuffer impl. - r=ethlin MozReview-Commit-ID: BcniOSuYh6O
dom/canvas/WebGL2Context.h
dom/canvas/WebGL2ContextMRTs.cpp
--- a/dom/canvas/WebGL2Context.h
+++ b/dom/canvas/WebGL2Context.h
@@ -211,30 +211,45 @@ public:
 
 
     // ------------------------------------------------------------------------
     // Multiple Render Targets - WebGL2ContextMRTs.cpp
     /* Implemented in WebGLContext
     void DrawBuffers(const dom::Sequence<GLenum>& buffers);
     */
 
-    void ClearBufferiv_base(GLenum buffer, GLint drawbuffer, const GLint* value);
-    void ClearBufferuiv_base(GLenum buffer, GLint drawbuffer, const GLuint* value);
-    void ClearBufferfv_base(GLenum buffer, GLint drawbuffer, const GLfloat* value);
+private:
+    bool ValidateClearBuffer(const char* funcName, GLenum buffer, GLint drawBuffer,
+                             size_t availElemCount, GLuint elemOffset);
+
+    void ClearBufferfv(GLenum buffer, GLint drawBuffer, const Float32Arr& src,
+                       GLuint srcElemOffset);
+    void ClearBufferiv(GLenum buffer, GLint drawBuffer, const Int32Arr& src,
+                       GLuint srcElemOffset);
+    void ClearBufferuiv(GLenum buffer, GLint drawBuffer, const Uint32Arr& src,
+                        GLuint srcElemOffset);
 
-    void ClearBufferiv(GLenum buffer, GLint drawbuffer, const dom::Int32Array& value);
-    void ClearBufferiv(GLenum buffer, GLint drawbuffer, const dom::Sequence<GLint>& value);
-    void ClearBufferuiv(GLenum buffer, GLint drawbuffer, const dom::Uint32Array& value);
-    void ClearBufferuiv(GLenum buffer, GLint drawbuffer, const dom::Sequence<GLuint>& value);
-    void ClearBufferfv(GLenum buffer, GLint drawbuffer, const dom::Float32Array& value);
-    void ClearBufferfv(GLenum buffer, GLint drawbuffer, const dom::Sequence<GLfloat>& value);
-    void ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+public:
+    void ClearBufferfv(GLenum buffer, GLint drawBuffer, const Float32ListU& list,
+                       GLuint srcElemOffset)
+    {
+        ClearBufferfv(buffer, drawBuffer, Float32Arr::From(list), srcElemOffset);
+    }
+    void ClearBufferiv(GLenum buffer, GLint drawBuffer, const Int32ListU& list,
+                       GLuint srcElemOffset)
+    {
+        ClearBufferiv(buffer, drawBuffer, Int32Arr::From(list), srcElemOffset);
+    }
+    void ClearBufferuiv(GLenum buffer, GLint drawBuffer, const Uint32ListU& list,
+                        GLuint srcElemOffset)
+    {
+        ClearBufferuiv(buffer, drawBuffer, Uint32Arr::From(list), srcElemOffset);
+    }
 
-    bool ValidateClearBuffer(const char* info, GLenum buffer, GLint drawbuffer, size_t elemCount);
-
+    void ClearBufferfi(GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);
 
     // -------------------------------------------------------------------------
     // Query Objects - WebGL2ContextQueries.cpp
 
     already_AddRefed<WebGLQuery> CreateQuery();
     void DeleteQuery(WebGLQuery* query);
     bool IsQuery(WebGLQuery* query);
     void BeginQuery(GLenum target, WebGLQuery* query);
--- a/dom/canvas/WebGL2ContextMRTs.cpp
+++ b/dom/canvas/WebGL2ContextMRTs.cpp
@@ -6,195 +6,125 @@
 #include "WebGL2Context.h"
 
 #include "GLContext.h"
 #include "WebGLFramebuffer.h"
 
 namespace mozilla {
 
 bool
-WebGL2Context::ValidateClearBuffer(const char* info, GLenum buffer, GLint drawbuffer,
-                                   size_t elemCount)
+WebGL2Context::ValidateClearBuffer(const char* funcName, GLenum buffer, GLint drawBuffer,
+                                   size_t availElemCount, GLuint elemOffset)
 {
+    if (IsContextLost())
+        return false;
+
+    if (elemOffset > availElemCount) {
+        ErrorInvalidValue("%s: Offset too big for list.", funcName);
+        return false;
+    }
+    availElemCount -= elemOffset;
+
+    ////
+
     size_t requiredElements;
-    GLint maxDrawbuffer;
+    GLint maxDrawBuffer;
     switch (buffer) {
     case LOCAL_GL_COLOR:
     case LOCAL_GL_FRONT:
     case LOCAL_GL_BACK:
     case LOCAL_GL_LEFT:
     case LOCAL_GL_RIGHT:
     case LOCAL_GL_FRONT_AND_BACK:
           requiredElements = 4;
-          maxDrawbuffer = mGLMaxDrawBuffers - 1;
+          maxDrawBuffer = mGLMaxDrawBuffers - 1;
           break;
 
     case LOCAL_GL_DEPTH:
     case LOCAL_GL_STENCIL:
           requiredElements = 1;
-          maxDrawbuffer = 0;
+          maxDrawBuffer = 0;
           break;
 
     default:
-          ErrorInvalidEnumInfo(info, buffer);
+          ErrorInvalidEnumInfo(funcName, buffer);
           return false;
     }
 
-    if (drawbuffer < 0 || drawbuffer > maxDrawbuffer) {
-        ErrorInvalidValue("%s: invalid drawbuffer %d. This buffer only supports drawbuffer values between 0 and %d",
-                          info, drawbuffer, maxDrawbuffer);
+    if (drawBuffer < 0 || drawBuffer > maxDrawBuffer) {
+        ErrorInvalidValue("%s: Invalid drawbuffer %d. This buffer only supports"
+                          " `drawbuffer` values between 0 and %u.",
+                          funcName, drawBuffer, maxDrawBuffer);
         return false;
     }
 
-    if (elemCount < requiredElements) {
+    if (availElemCount < requiredElements) {
         ErrorInvalidValue("%s: Not enough elements. Require %u. Given %u.",
-                          info, requiredElements, elemCount);
+                          funcName, requiredElements, availElemCount);
         return false;
     }
 
+    ////
+
+    MakeContextCurrent();
+    if (mBoundDrawFramebuffer) {
+        if (!mBoundDrawFramebuffer->ValidateAndInitAttachments(funcName))
+            return false;
+    }
+
     return true;
 }
 
-// Common base functionality. These a good candidates to be moved into WebGLContextUnchecked.cpp
-void
-WebGL2Context::ClearBufferiv_base(GLenum buffer, GLint drawbuffer, const GLint* value)
-{
-    const char funcName[] = "clearBufferiv";
-
-    MakeContextCurrent();
-    if (mBoundDrawFramebuffer) {
-        if (!mBoundDrawFramebuffer->ValidateAndInitAttachments(funcName))
-            return;
-    }
-
-    gl->fClearBufferiv(buffer, drawbuffer, value);
-}
+////
 
 void
-WebGL2Context::ClearBufferuiv_base(GLenum buffer, GLint drawbuffer, const GLuint* value)
+WebGL2Context::ClearBufferfv(GLenum buffer, GLint drawBuffer, const Float32Arr& src,
+                             GLuint srcElemOffset)
 {
-    const char funcName[] = "clearBufferuiv";
+    const char funcName[] = "clearBufferfv";
+    if (!ValidateClearBuffer(funcName, buffer, drawBuffer, src.elemCount, srcElemOffset))
+        return;
 
-    MakeContextCurrent();
-    if (mBoundDrawFramebuffer) {
-        if (!mBoundDrawFramebuffer->ValidateAndInitAttachments(funcName))
-            return;
-    }
-
-    gl->fClearBufferuiv(buffer, drawbuffer, value);
+    const auto ptr = src.elemBytes + srcElemOffset;
+    gl->fClearBufferfv(buffer, drawBuffer, ptr);
 }
 
 void
-WebGL2Context::ClearBufferfv_base(GLenum buffer, GLint drawbuffer, const GLfloat* value)
+WebGL2Context::ClearBufferiv(GLenum buffer, GLint drawBuffer, const Int32Arr& src,
+                             GLuint srcElemOffset)
 {
-    const char funcName[] = "clearBufferfv";
-
-    MakeContextCurrent();
-    if (mBoundDrawFramebuffer) {
-        if (!mBoundDrawFramebuffer->ValidateAndInitAttachments(funcName))
-            return;
-    }
-
-    gl->fClearBufferfv(buffer, drawbuffer, value);
-}
-
-void
-WebGL2Context::ClearBufferiv(GLenum buffer, GLint drawbuffer, const dom::Int32Array& value)
-{
-    if (IsContextLost()) {
+    const char funcName[] = "clearBufferiv";
+    if (!ValidateClearBuffer(funcName, buffer, drawBuffer, src.elemCount, srcElemOffset))
         return;
-    }
 
-    value.ComputeLengthAndData();
-    if (!ValidateClearBuffer("clearBufferiv", buffer, drawbuffer, value.Length())) {
-        return;
-    }
-
-    ClearBufferiv_base(buffer, drawbuffer, value.Data());
-}
-
-void
-WebGL2Context::ClearBufferiv(GLenum buffer, GLint drawbuffer, const dom::Sequence<GLint>& value)
-{
-    if (IsContextLost()) {
-        return;
-    }
-
-    if (!ValidateClearBuffer("clearBufferiv", buffer, drawbuffer, value.Length())) {
-        return;
-    }
-
-    ClearBufferiv_base(buffer, drawbuffer, value.Elements());
+    const auto ptr = src.elemBytes + srcElemOffset;
+    gl->fClearBufferiv(buffer, drawBuffer, ptr);
 }
 
 void
-WebGL2Context::ClearBufferuiv(GLenum buffer, GLint drawbuffer, const dom::Uint32Array& value)
+WebGL2Context::ClearBufferuiv(GLenum buffer, GLint drawBuffer, const Uint32Arr& src,
+                             GLuint srcElemOffset)
 {
-    if (IsContextLost()) {
+    const char funcName[] = "clearBufferuiv";
+    if (!ValidateClearBuffer(funcName, buffer, drawBuffer, src.elemCount, srcElemOffset))
         return;
-    }
 
-    value.ComputeLengthAndData();
-    if (!ValidateClearBuffer("clearBufferuiv", buffer, drawbuffer, value.Length())) {
-        return;
-    }
-
-    ClearBufferuiv_base(buffer, drawbuffer, value.Data());
+    const auto ptr = src.elemBytes + srcElemOffset;
+    gl->fClearBufferuiv(buffer, drawBuffer, ptr);
 }
 
-void
-WebGL2Context::ClearBufferuiv(GLenum buffer, GLint drawbuffer, const dom::Sequence<GLuint>& value)
-{
-    if (IsContextLost()) {
-        return;
-    }
-
-    if (!ValidateClearBuffer("clearBufferuiv", buffer, drawbuffer, value.Length())) {
-        return;
-    }
-
-    ClearBufferuiv_base(buffer, drawbuffer, value.Elements());
-}
+////
 
 void
-WebGL2Context::ClearBufferfv(GLenum buffer, GLint drawbuffer, const dom::Float32Array& value)
+WebGL2Context::ClearBufferfi(GLenum buffer, GLint drawBuffer, GLfloat depth,
+                             GLint stencil)
 {
-    if (IsContextLost()) {
-        return;
-    }
-
-    value.ComputeLengthAndData();
-    if (!ValidateClearBuffer("clearBufferfv", buffer, drawbuffer, value.Length())) {
-        return;
-    }
-
-    ClearBufferfv_base(buffer, drawbuffer, value.Data());
-}
-
-void
-WebGL2Context::ClearBufferfv(GLenum buffer, GLint drawbuffer, const dom::Sequence<GLfloat>& value)
-{
-    if (IsContextLost()) {
+    const char funcName[] = "clearBufferfi";
+    if (!ValidateClearBuffer(funcName, LOCAL_GL_DEPTH, drawBuffer, 1, 0))
         return;
-    }
-
-    if (!ValidateClearBuffer("clearBufferfv", buffer, drawbuffer, value.Length())) {
-        return;
-    }
-
-    ClearBufferfv_base(buffer, drawbuffer, value.Elements());
-}
 
-void
-WebGL2Context::ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
-{
-    if (IsContextLost()) {
-        return;
-    }
+    if (buffer != LOCAL_GL_DEPTH_STENCIL)
+        return ErrorInvalidEnumInfo(funcName, buffer);
 
-    if (buffer != LOCAL_GL_DEPTH_STENCIL) {
-        return ErrorInvalidEnumInfo("clearBufferfi: buffer", buffer);
-    }
-    MakeContextCurrent();
-    gl->fClearBufferfi(buffer, drawbuffer, depth, stencil);
+    gl->fClearBufferfi(buffer, drawBuffer, depth, stencil);
 }
 
 } // namespace mozilla