WebGL2ContextState.cpp (3667B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "GLContext.h" 8 #include "WebGL2Context.h" 9 #include "WebGLBuffer.h" 10 #include "WebGLContextUtils.h" 11 #include "WebGLFramebuffer.h" 12 #include "WebGLSampler.h" 13 #include "WebGLTransformFeedback.h" 14 #include "WebGLVertexArray.h" 15 16 namespace mozilla { 17 18 Maybe<double> WebGL2Context::GetParameter(GLenum pname) { 19 const FuncScope funcScope(*this, "getParameter"); 20 // The following cases are handled in WebGLContext::GetParameter(): 21 // case LOCAL_GL_MAX_COLOR_ATTACHMENTS: 22 // case LOCAL_GL_MAX_DRAW_BUFFERS: 23 // case LOCAL_GL_DRAW_BUFFERi: 24 25 if (IsContextLost()) return Nothing(); 26 27 switch (pname) { 28 /* GLboolean */ 29 case LOCAL_GL_RASTERIZER_DISCARD: 30 case LOCAL_GL_SAMPLE_ALPHA_TO_COVERAGE: 31 case LOCAL_GL_SAMPLE_COVERAGE: { 32 realGLboolean b = 0; 33 gl->fGetBooleanv(pname, &b); 34 return Some(bool(b)); 35 } 36 37 case LOCAL_GL_TRANSFORM_FEEDBACK_ACTIVE: 38 return Some(mBoundTransformFeedback->mIsActive); 39 case LOCAL_GL_TRANSFORM_FEEDBACK_PAUSED: 40 return Some(mBoundTransformFeedback->mIsPaused); 41 42 /* GLenum */ 43 case LOCAL_GL_READ_BUFFER: { 44 if (!mBoundReadFramebuffer) return Some(mDefaultFB_ReadBuffer); 45 46 if (!mBoundReadFramebuffer->ColorReadBuffer()) return Some(LOCAL_GL_NONE); 47 48 return Some(mBoundReadFramebuffer->ColorReadBuffer()->mAttachmentPoint); 49 } 50 51 case LOCAL_GL_FRAGMENT_SHADER_DERIVATIVE_HINT: 52 /* fall through */ 53 54 /* GLint */ 55 case LOCAL_GL_MAX_COMBINED_UNIFORM_BLOCKS: 56 case LOCAL_GL_MAX_ELEMENTS_INDICES: 57 case LOCAL_GL_MAX_ELEMENTS_VERTICES: 58 case LOCAL_GL_MAX_FRAGMENT_INPUT_COMPONENTS: 59 case LOCAL_GL_MAX_FRAGMENT_UNIFORM_BLOCKS: 60 case LOCAL_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: 61 case LOCAL_GL_MAX_PROGRAM_TEXEL_OFFSET: 62 case LOCAL_GL_MAX_SAMPLES: 63 case LOCAL_GL_MAX_TEXTURE_LOD_BIAS: 64 case LOCAL_GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: 65 case LOCAL_GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: 66 case LOCAL_GL_MAX_VERTEX_OUTPUT_COMPONENTS: 67 case LOCAL_GL_MAX_VERTEX_UNIFORM_BLOCKS: 68 case LOCAL_GL_MAX_VERTEX_UNIFORM_COMPONENTS: 69 case LOCAL_GL_MIN_PROGRAM_TEXEL_OFFSET: { 70 GLint val; 71 gl->fGetIntegerv(pname, &val); 72 return Some(val); 73 } 74 75 case LOCAL_GL_MAX_VARYING_COMPONENTS: { 76 // On OS X Core Profile this is buggy. The spec says that the 77 // value is 4 * GL_MAX_VARYING_VECTORS 78 GLint val; 79 gl->fGetIntegerv(LOCAL_GL_MAX_VARYING_VECTORS, &val); 80 return Some(4 * val); 81 } 82 83 case LOCAL_GL_MAX_ELEMENT_INDEX: 84 // GL_MAX_ELEMENT_INDEX becomes available in GL 4.3 or via ES3 85 // compatibility 86 if (!gl->IsSupported(gl::GLFeature::ES3_compatibility)) 87 return Some(UINT32_MAX); 88 89 /*** fall through to fGetInteger64v ***/ 90 [[fallthrough]]; 91 92 case LOCAL_GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: 93 case LOCAL_GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: 94 case LOCAL_GL_MAX_UNIFORM_BLOCK_SIZE: { 95 GLint64 val; 96 gl->fGetInteger64v(pname, &val); 97 return Some(static_cast<double>(val)); 98 } 99 100 /* GLuint64 */ 101 case LOCAL_GL_MAX_SERVER_WAIT_TIMEOUT: { 102 GLuint64 val; 103 gl->fGetInteger64v(pname, (GLint64*)&val); 104 return Some(static_cast<double>(val)); 105 } 106 107 default: 108 return WebGLContext::GetParameter(pname); 109 } 110 } 111 112 } // namespace mozilla