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"
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;
22 case LOCAL_GL_FRONT_AND_BACK
:
24 maxDrawbuffer
= mGLMaxDrawBuffers
- 1;
28 case LOCAL_GL_STENCIL
:
34 ErrorInvalidEnumInfo(info
, buffer
);
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
);
44 if (elemCount
< requiredElements
) {
45 ErrorInvalidValue("%s: Not enough elements. Require %u. Given %u.",
46 info
, requiredElements
, elemCount
);
52 // Common base functionality. These a good candidates to be moved into WebGLContextUnchecked.cpp
54 WebGL2Context::ClearBufferiv_base(GLenum buffer
, GLint drawbuffer
, const GLint
* value
)
57 gl
->fClearBufferiv(buffer
, drawbuffer
, value
);
61 WebGL2Context::ClearBufferuiv_base(GLenum buffer
, GLint drawbuffer
, const GLuint
* value
)
64 gl
->fClearBufferuiv(buffer
, drawbuffer
, value
);
68 WebGL2Context::ClearBufferfv_base(GLenum buffer
, GLint drawbuffer
, const GLfloat
* value
)
71 gl
->fClearBufferfv(buffer
, drawbuffer
, value
);
75 WebGL2Context::ClearBufferiv(GLenum buffer
, GLint drawbuffer
, const dom::Int32Array
& value
)
77 if (!ValidateClearBuffer("clearBufferiv", buffer
, drawbuffer
, value
.Length())) {
81 ClearBufferiv_base(buffer
, drawbuffer
, value
.Data());
85 WebGL2Context::ClearBufferiv(GLenum buffer
, GLint drawbuffer
, const dom::Sequence
<GLint
>& value
)
87 if (!ValidateClearBuffer("clearBufferiv", buffer
, drawbuffer
, value
.Length())) {
91 ClearBufferiv_base(buffer
, drawbuffer
, value
.Elements());
95 WebGL2Context::ClearBufferuiv(GLenum buffer
, GLint drawbuffer
, const dom::Uint32Array
& value
)
97 if (!ValidateClearBuffer("clearBufferuiv", buffer
, drawbuffer
, value
.Length())) {
101 ClearBufferuiv_base(buffer
, drawbuffer
, value
.Data());
105 WebGL2Context::ClearBufferuiv(GLenum buffer
, GLint drawbuffer
, const dom::Sequence
<GLuint
>& value
)
107 if (!ValidateClearBuffer("clearBufferuiv", buffer
, drawbuffer
, value
.Length())) {
111 ClearBufferuiv_base(buffer
, drawbuffer
, value
.Elements());
115 WebGL2Context::ClearBufferfv(GLenum buffer
, GLint drawbuffer
, const dom::Float32Array
& value
)
117 if (!ValidateClearBuffer("clearBufferfv", buffer
, drawbuffer
, value
.Length())) {
121 ClearBufferfv_base(buffer
, drawbuffer
, value
.Data());
125 WebGL2Context::ClearBufferfv(GLenum buffer
, GLint drawbuffer
, const dom::Sequence
<GLfloat
>& value
)
127 if (!ValidateClearBuffer("clearBufferfv", buffer
, drawbuffer
, value
.Length())) {
131 ClearBufferfv_base(buffer
, drawbuffer
, value
.Elements());
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
);