Bumping manifests a=b2g-bump
[gecko.git] / dom / canvas / WebGL2ContextMRTs.cpp
blob28494a2fdedcc5d6ab1bd0380495076cd2752fab
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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/. */
6 #include "WebGL2Context.h"
7 #include "GLContext.h"
9 using namespace mozilla;
10 using namespace mozilla::dom;
12 bool WebGL2Context::ValidateClearBuffer(const char* info, GLenum buffer, GLint drawbuffer, size_t elemCount)
14 size_t requiredElements = -1;
15 GLint maxDrawbuffer = -1;
16 switch (buffer) {
17 case LOCAL_GL_COLOR:
18 case LOCAL_GL_FRONT:
19 case LOCAL_GL_BACK:
20 case LOCAL_GL_LEFT:
21 case LOCAL_GL_RIGHT:
22 case LOCAL_GL_FRONT_AND_BACK:
23 requiredElements = 4;
24 maxDrawbuffer = mGLMaxDrawBuffers - 1;
25 break;
27 case LOCAL_GL_DEPTH:
28 case LOCAL_GL_STENCIL:
29 requiredElements = 1;
30 maxDrawbuffer = 0;
31 break;
33 default:
34 ErrorInvalidEnumInfo(info, buffer);
35 return false;
38 if (drawbuffer < 0 || drawbuffer > maxDrawbuffer) {
39 ErrorInvalidValue("%s: invalid drawbuffer %d. This buffer only supports drawbuffer values between 0 and %d",
40 info, drawbuffer, maxDrawbuffer);
41 return false;
44 if (elemCount < requiredElements) {
45 ErrorInvalidValue("%s: Not enough elements. Require %u. Given %u.",
46 info, requiredElements, elemCount);
47 return false;
49 return true;
52 // Common base functionality. These a good candidates to be moved into WebGLContextUnchecked.cpp
53 void
54 WebGL2Context::ClearBufferiv_base(GLenum buffer, GLint drawbuffer, const GLint* value)
56 MakeContextCurrent();
57 gl->fClearBufferiv(buffer, drawbuffer, value);
60 void
61 WebGL2Context::ClearBufferuiv_base(GLenum buffer, GLint drawbuffer, const GLuint* value)
63 MakeContextCurrent();
64 gl->fClearBufferuiv(buffer, drawbuffer, value);
67 void
68 WebGL2Context::ClearBufferfv_base(GLenum buffer, GLint drawbuffer, const GLfloat* value)
70 MakeContextCurrent();
71 gl->fClearBufferfv(buffer, drawbuffer, value);
74 void
75 WebGL2Context::ClearBufferiv(GLenum buffer, GLint drawbuffer, const dom::Int32Array& value)
77 if (!ValidateClearBuffer("clearBufferiv", buffer, drawbuffer, value.Length())) {
78 return;
81 ClearBufferiv_base(buffer, drawbuffer, value.Data());
84 void
85 WebGL2Context::ClearBufferiv(GLenum buffer, GLint drawbuffer, const dom::Sequence<GLint>& value)
87 if (!ValidateClearBuffer("clearBufferiv", buffer, drawbuffer, value.Length())) {
88 return;
91 ClearBufferiv_base(buffer, drawbuffer, value.Elements());
94 void
95 WebGL2Context::ClearBufferuiv(GLenum buffer, GLint drawbuffer, const dom::Uint32Array& value)
97 if (!ValidateClearBuffer("clearBufferuiv", buffer, drawbuffer, value.Length())) {
98 return;
101 ClearBufferuiv_base(buffer, drawbuffer, value.Data());
104 void
105 WebGL2Context::ClearBufferuiv(GLenum buffer, GLint drawbuffer, const dom::Sequence<GLuint>& value)
107 if (!ValidateClearBuffer("clearBufferuiv", buffer, drawbuffer, value.Length())) {
108 return;
111 ClearBufferuiv_base(buffer, drawbuffer, value.Elements());
114 void
115 WebGL2Context::ClearBufferfv(GLenum buffer, GLint drawbuffer, const dom::Float32Array& value)
117 if (!ValidateClearBuffer("clearBufferfv", buffer, drawbuffer, value.Length())) {
118 return;
121 ClearBufferfv_base(buffer, drawbuffer, value.Data());
124 void
125 WebGL2Context::ClearBufferfv(GLenum buffer, GLint drawbuffer, const dom::Sequence<GLfloat>& value)
127 if (!ValidateClearBuffer("clearBufferfv", buffer, drawbuffer, value.Length())) {
128 return;
131 ClearBufferfv_base(buffer, drawbuffer, value.Elements());
134 void
135 WebGL2Context::ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
137 if (buffer != LOCAL_GL_DEPTH_STENCIL) {
138 return ErrorInvalidEnumInfo("clearBufferfi: buffer", buffer);
140 MakeContextCurrent();
141 gl->fClearBufferfi(buffer, drawbuffer, depth, stencil);