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)19 Maybe<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