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 "WebGL2Context.h" 8 9 #include "GLContext.h" 10 #include "WebGLBuffer.h" 11 #include "WebGLContextUtils.h" 12 #include "WebGLFramebuffer.h" 13 #include "WebGLSampler.h" 14 #include "WebGLTransformFeedback.h" 15 #include "WebGLVertexArray.h" 16 17 namespace mozilla { 18 GetParameter(GLenum pname)19Maybe<double> WebGL2Context::GetParameter(GLenum pname) { 20 const FuncScope funcScope(*this, "getParameter"); 21 // The following cases are handled in WebGLContext::GetParameter(): 22 // case LOCAL_GL_MAX_COLOR_ATTACHMENTS: 23 // case LOCAL_GL_MAX_DRAW_BUFFERS: 24 // case LOCAL_GL_DRAW_BUFFERi: 25 26 if (IsContextLost()) return Nothing(); 27 28 switch (pname) { 29 /* GLboolean */ 30 case LOCAL_GL_RASTERIZER_DISCARD: 31 case LOCAL_GL_SAMPLE_ALPHA_TO_COVERAGE: 32 case LOCAL_GL_SAMPLE_COVERAGE: { 33 realGLboolean b = 0; 34 gl->fGetBooleanv(pname, &b); 35 return Some(bool(b)); 36 } 37 38 case LOCAL_GL_TRANSFORM_FEEDBACK_ACTIVE: 39 return Some(mBoundTransformFeedback->mIsActive); 40 case LOCAL_GL_TRANSFORM_FEEDBACK_PAUSED: 41 return Some(mBoundTransformFeedback->mIsPaused); 42 43 /* GLenum */ 44 case LOCAL_GL_READ_BUFFER: { 45 if (!mBoundReadFramebuffer) return Some(mDefaultFB_ReadBuffer); 46 47 if (!mBoundReadFramebuffer->ColorReadBuffer()) return Some(LOCAL_GL_NONE); 48 49 return Some(mBoundReadFramebuffer->ColorReadBuffer()->mAttachmentPoint); 50 } 51 52 case LOCAL_GL_FRAGMENT_SHADER_DERIVATIVE_HINT: 53 /* fall through */ 54 55 /* GLint */ 56 case LOCAL_GL_MAX_COMBINED_UNIFORM_BLOCKS: 57 case LOCAL_GL_MAX_ELEMENTS_INDICES: 58 case LOCAL_GL_MAX_ELEMENTS_VERTICES: 59 case LOCAL_GL_MAX_FRAGMENT_INPUT_COMPONENTS: 60 case LOCAL_GL_MAX_FRAGMENT_UNIFORM_BLOCKS: 61 case LOCAL_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: 62 case LOCAL_GL_MAX_PROGRAM_TEXEL_OFFSET: 63 case LOCAL_GL_MAX_SAMPLES: 64 case LOCAL_GL_MAX_TEXTURE_LOD_BIAS: 65 case LOCAL_GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: 66 case LOCAL_GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: 67 case LOCAL_GL_MAX_VERTEX_OUTPUT_COMPONENTS: 68 case LOCAL_GL_MAX_VERTEX_UNIFORM_BLOCKS: 69 case LOCAL_GL_MAX_VERTEX_UNIFORM_COMPONENTS: 70 case LOCAL_GL_MIN_PROGRAM_TEXEL_OFFSET: 71 case LOCAL_GL_PACK_ROW_LENGTH: 72 case LOCAL_GL_PACK_SKIP_PIXELS: 73 case LOCAL_GL_PACK_SKIP_ROWS: 74 case LOCAL_GL_UNPACK_IMAGE_HEIGHT: 75 case LOCAL_GL_UNPACK_ROW_LENGTH: { 76 GLint val; 77 gl->fGetIntegerv(pname, &val); 78 return Some(val); 79 } 80 81 case LOCAL_GL_UNPACK_SKIP_IMAGES: 82 return Some(mPixelStore.mUnpackSkipImages); 83 84 case LOCAL_GL_UNPACK_SKIP_PIXELS: 85 return Some(mPixelStore.mUnpackSkipPixels); 86 87 case LOCAL_GL_UNPACK_SKIP_ROWS: 88 return Some(mPixelStore.mUnpackSkipRows); 89 90 case LOCAL_GL_MAX_VARYING_COMPONENTS: { 91 // On OS X Core Profile this is buggy. The spec says that the 92 // value is 4 * GL_MAX_VARYING_VECTORS 93 GLint val; 94 gl->fGetIntegerv(LOCAL_GL_MAX_VARYING_VECTORS, &val); 95 return Some(4 * val); 96 } 97 98 /* GLint64 */ 99 case LOCAL_GL_MAX_CLIENT_WAIT_TIMEOUT_WEBGL: 100 return Some(kMaxClientWaitSyncTimeoutNS); 101 102 case LOCAL_GL_MAX_ELEMENT_INDEX: 103 // GL_MAX_ELEMENT_INDEX becomes available in GL 4.3 or via ES3 104 // compatibility 105 if (!gl->IsSupported(gl::GLFeature::ES3_compatibility)) 106 return Some(UINT32_MAX); 107 108 /*** fall through to fGetInteger64v ***/ 109 [[fallthrough]]; 110 111 case LOCAL_GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: 112 case LOCAL_GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: 113 case LOCAL_GL_MAX_UNIFORM_BLOCK_SIZE: { 114 GLint64 val; 115 gl->fGetInteger64v(pname, &val); 116 return Some(static_cast<double>(val)); 117 } 118 119 /* GLuint64 */ 120 case LOCAL_GL_MAX_SERVER_WAIT_TIMEOUT: { 121 GLuint64 val; 122 gl->fGetInteger64v(pname, (GLint64*)&val); 123 return Some(static_cast<double>(val)); 124 } 125 126 default: 127 return WebGLContext::GetParameter(pname); 128 } 129 } 130 131 } // namespace mozilla 132