blob: 2a23ac93076fdb9f51336c4605963b8c4678a19c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "WebGL2Context.h"
#include "GLContext.h"
#include "js/Array.h" // JS::NewArrayObject
#include "mozilla/dom/WebGL2RenderingContextBinding.h"
#include "mozilla/RefPtr.h"
#include "WebGLBuffer.h"
#include "WebGLContext.h"
#include "WebGLProgram.h"
#include "WebGLTransformFeedback.h"
#include "WebGLVertexArray.h"
namespace mozilla {
// -------------------------------------------------------------------------
// Uniform Buffer Objects and Transform Feedback Buffers
Maybe<double> WebGL2Context::GetIndexedParameter(const GLenum pname,
const uint32_t index) const {
const FuncScope funcScope(*this, "getIndexedParameter");
if (IsContextLost()) return {};
const auto* bindings = &mIndexedUniformBufferBindings;
const char* limitStr = "MAX_UNIFORM_BUFFER_BINDINGS";
switch (pname) {
case LOCAL_GL_UNIFORM_BUFFER_START:
case LOCAL_GL_UNIFORM_BUFFER_SIZE:
break;
case LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER_START:
case LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
bindings = &(mBoundTransformFeedback->mIndexedBindings);
limitStr = "MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS";
break;
default:
ErrorInvalidEnumInfo("pname", pname);
return {};
}
if (index >= bindings->size()) {
ErrorInvalidValue("`index` must be < %s.", limitStr);
return {};
}
const auto& binding = (*bindings)[index];
switch (pname) {
case LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER_START:
case LOCAL_GL_UNIFORM_BUFFER_START:
return Some(binding.mRangeStart);
break;
case LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
case LOCAL_GL_UNIFORM_BUFFER_SIZE:
return Some(binding.mRangeSize);
default:
MOZ_CRASH("impossible");
}
}
void WebGL2Context::UniformBlockBinding(WebGLProgram& program,
GLuint uniformBlockIndex,
GLuint uniformBlockBinding) {
const FuncScope funcScope(*this, "uniformBlockBinding");
if (IsContextLost()) return;
if (!ValidateObject("program", program)) return;
program.UniformBlockBinding(uniformBlockIndex, uniformBlockBinding);
}
} // namespace mozilla
|