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