Bumping manifests a=b2g-bump
[gecko.git] / dom / canvas / WebGL2ContextBuffers.cpp
blob952ab5ac36d4e12f3fc9c22accea56b44b9c32e6
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"
8 #include "GLContext.h"
9 #include "WebGLBuffer.h"
11 using namespace mozilla;
12 using namespace mozilla::dom;
14 bool
15 WebGL2Context::ValidateBufferTarget(GLenum target, const char* info)
17 switch (target) {
18 case LOCAL_GL_ARRAY_BUFFER:
19 case LOCAL_GL_COPY_READ_BUFFER:
20 case LOCAL_GL_COPY_WRITE_BUFFER:
21 case LOCAL_GL_ELEMENT_ARRAY_BUFFER:
22 case LOCAL_GL_PIXEL_PACK_BUFFER:
23 case LOCAL_GL_PIXEL_UNPACK_BUFFER:
24 case LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER:
25 case LOCAL_GL_UNIFORM_BUFFER:
26 return true;
28 default:
29 ErrorInvalidEnumInfo(info, target);
30 return false;
34 bool
35 WebGL2Context::ValidateBufferIndexedTarget(GLenum target, const char* info)
37 switch (target) {
38 case LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER:
39 case LOCAL_GL_UNIFORM_BUFFER:
40 return true;
42 default:
43 ErrorInvalidEnumInfo(info, target);
44 return false;
48 bool
49 WebGL2Context::ValidateBufferForTarget(GLenum target, WebGLBuffer* buffer,
50 const char* info)
52 if (!buffer)
53 return true;
55 switch (target) {
56 case LOCAL_GL_COPY_READ_BUFFER:
57 case LOCAL_GL_COPY_WRITE_BUFFER:
58 return true;
60 case LOCAL_GL_ELEMENT_ARRAY_BUFFER:
61 return !buffer->HasEverBeenBound() ||
62 buffer->Target() == LOCAL_GL_ELEMENT_ARRAY_BUFFER;
64 case LOCAL_GL_ARRAY_BUFFER:
65 case LOCAL_GL_PIXEL_PACK_BUFFER:
66 case LOCAL_GL_PIXEL_UNPACK_BUFFER:
67 case LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER:
68 case LOCAL_GL_UNIFORM_BUFFER:
69 return !buffer->HasEverBeenBound() ||
70 buffer->Target() != LOCAL_GL_ELEMENT_ARRAY_BUFFER;
73 ErrorInvalidOperation("%s: buffer already bound to a incompatible target %s",
74 info, EnumName(buffer->Target().get()));
75 return false;
78 // -------------------------------------------------------------------------
79 // Buffer objects
81 void
82 WebGL2Context::CopyBufferSubData(GLenum readTarget, GLenum writeTarget,
83 GLintptr readOffset, GLintptr writeOffset,
84 GLsizeiptr size)
86 if (IsContextLost())
87 return;
89 if (!ValidateBufferTarget(readTarget, "copyBufferSubData") ||
90 !ValidateBufferTarget(writeTarget, "copyBufferSubData"))
92 return;
95 const WebGLRefPtr<WebGLBuffer>& readBufferSlot = GetBufferSlotByTarget(readTarget);
96 const WebGLRefPtr<WebGLBuffer>& writeBufferSlot = GetBufferSlotByTarget(writeTarget);
97 if (!readBufferSlot || !writeBufferSlot)
98 return;
100 const WebGLBuffer* readBuffer = readBufferSlot.get();
101 if (!readBuffer)
102 return ErrorInvalidOperation("copyBufferSubData: No buffer bound to readTarget");
104 const WebGLBuffer* writeBuffer = writeBufferSlot.get();
105 if (!writeBuffer)
106 return ErrorInvalidOperation("copyBufferSubData: No buffer bound to writeTarget");
108 if (!ValidateDataOffsetSize(readOffset, size, readBuffer->ByteLength(),
109 "copyBufferSubData"))
111 return;
114 if (!ValidateDataOffsetSize(writeOffset, size, writeBuffer->ByteLength(),
115 "copyBufferSubData"))
117 return;
120 if (readTarget == writeTarget &&
121 !ValidateDataRanges(readOffset, writeOffset, size, "copyBufferSubData"))
123 return;
126 WebGLContextUnchecked::CopyBufferSubData(readTarget, writeTarget, readOffset,
127 writeOffset, size);
130 void
131 WebGL2Context::GetBufferSubData(GLenum target, GLintptr offset,
132 const dom::ArrayBuffer& returnedData)
134 MOZ_CRASH("Not Implemented.");
137 void
138 WebGL2Context::GetBufferSubData(GLenum target, GLintptr offset,
139 const dom::ArrayBufferView& returnedData)
141 MOZ_CRASH("Not Implemented.");