tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

WebGL2ContextUniforms.cpp (3400B)


      1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 #include "GLContext.h"
      7 #include "WebGL2Context.h"
      8 #include "WebGLBuffer.h"
      9 #include "WebGLContext.h"
     10 #include "WebGLProgram.h"
     11 #include "WebGLTransformFeedback.h"
     12 #include "WebGLVertexArray.h"
     13 #include "js/Array.h"  // JS::NewArrayObject
     14 #include "mozilla/dom/WebGL2RenderingContextBinding.h"
     15 
     16 namespace mozilla {
     17 
     18 // -------------------------------------------------------------------------
     19 // Uniform Buffer Objects and Transform Feedback Buffers
     20 
     21 Maybe<double> WebGL2Context::GetIndexedParameter(const GLenum pname,
     22                                                 const uint32_t index) const {
     23  const FuncScope funcScope(*this, "getIndexedParameter");
     24  if (IsContextLost()) return {};
     25 
     26  if (IsExtensionEnabled(WebGLExtensionID::OES_draw_buffers_indexed)) {
     27    switch (pname) {
     28      case LOCAL_GL_BLEND_EQUATION_RGB:
     29      case LOCAL_GL_BLEND_EQUATION_ALPHA:
     30      case LOCAL_GL_BLEND_SRC_RGB:
     31      case LOCAL_GL_BLEND_SRC_ALPHA:
     32      case LOCAL_GL_BLEND_DST_RGB:
     33      case LOCAL_GL_BLEND_DST_ALPHA:
     34      case LOCAL_GL_COLOR_WRITEMASK: {
     35        const auto limit = MaxValidDrawBuffers();
     36        if (index >= limit) {
     37          ErrorInvalidValue("`index` (%u) must be < %s (%u)", index,
     38                            "MAX_DRAW_BUFFERS", limit);
     39          return {};
     40        }
     41 
     42        std::array<GLint, 4> data = {};
     43        gl->fGetIntegeri_v(pname, index, data.data());
     44        auto val = data[0];
     45        if (pname == LOCAL_GL_COLOR_WRITEMASK) {
     46          val = (bool(data[0]) << 0 | bool(data[1]) << 1 | bool(data[2]) << 2 |
     47                 bool(data[3]) << 3);
     48        }
     49        return Some(val);
     50      }
     51    }
     52  }
     53 
     54  const auto* bindings = &mIndexedUniformBufferBindings;
     55  const char* limitStr = "MAX_UNIFORM_BUFFER_BINDINGS";
     56  switch (pname) {
     57    case LOCAL_GL_UNIFORM_BUFFER_START:
     58    case LOCAL_GL_UNIFORM_BUFFER_SIZE:
     59      break;
     60 
     61    case LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER_START:
     62    case LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
     63      bindings = &(mBoundTransformFeedback->mIndexedBindings);
     64      limitStr = "MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS";
     65      break;
     66 
     67    default:
     68      ErrorInvalidEnumArg("pname", pname);
     69      return {};
     70  }
     71 
     72  if (index >= bindings->size()) {
     73    ErrorInvalidValue("`index` must be < %s.", limitStr);
     74    return {};
     75  }
     76  const auto& binding = (*bindings)[index];
     77 
     78  switch (pname) {
     79    case LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER_START:
     80    case LOCAL_GL_UNIFORM_BUFFER_START:
     81      return Some(binding.mRangeStart);
     82      break;
     83 
     84    case LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
     85    case LOCAL_GL_UNIFORM_BUFFER_SIZE:
     86      return Some(binding.mRangeSize);
     87 
     88    default:
     89      MOZ_CRASH("impossible");
     90  }
     91 }
     92 
     93 void WebGL2Context::UniformBlockBinding(WebGLProgram& program,
     94                                        GLuint uniformBlockIndex,
     95                                        GLuint uniformBlockBinding) {
     96  const FuncScope funcScope(*this, "uniformBlockBinding");
     97  if (IsContextLost()) return;
     98 
     99  if (!ValidateObject("program", program)) return;
    100 
    101  program.UniformBlockBinding(uniformBlockIndex, uniformBlockBinding);
    102 }
    103 
    104 }  // namespace mozilla