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 #include "WebGLBuffer.h"
11 using namespace mozilla
;
12 using namespace mozilla::dom
;
15 WebGL2Context::ValidateBufferTarget(GLenum target
, const char* info
)
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
:
29 ErrorInvalidEnumInfo(info
, target
);
35 WebGL2Context::ValidateBufferIndexedTarget(GLenum target
, const char* info
)
38 case LOCAL_GL_TRANSFORM_FEEDBACK_BUFFER
:
39 case LOCAL_GL_UNIFORM_BUFFER
:
43 ErrorInvalidEnumInfo(info
, target
);
49 WebGL2Context::ValidateBufferForTarget(GLenum target
, WebGLBuffer
* buffer
,
56 case LOCAL_GL_COPY_READ_BUFFER
:
57 case LOCAL_GL_COPY_WRITE_BUFFER
:
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()));
78 // -------------------------------------------------------------------------
82 WebGL2Context::CopyBufferSubData(GLenum readTarget
, GLenum writeTarget
,
83 GLintptr readOffset
, GLintptr writeOffset
,
89 if (!ValidateBufferTarget(readTarget
, "copyBufferSubData") ||
90 !ValidateBufferTarget(writeTarget
, "copyBufferSubData"))
95 const WebGLRefPtr
<WebGLBuffer
>& readBufferSlot
= GetBufferSlotByTarget(readTarget
);
96 const WebGLRefPtr
<WebGLBuffer
>& writeBufferSlot
= GetBufferSlotByTarget(writeTarget
);
97 if (!readBufferSlot
|| !writeBufferSlot
)
100 const WebGLBuffer
* readBuffer
= readBufferSlot
.get();
102 return ErrorInvalidOperation("copyBufferSubData: No buffer bound to readTarget");
104 const WebGLBuffer
* writeBuffer
= writeBufferSlot
.get();
106 return ErrorInvalidOperation("copyBufferSubData: No buffer bound to writeTarget");
108 if (!ValidateDataOffsetSize(readOffset
, size
, readBuffer
->ByteLength(),
109 "copyBufferSubData"))
114 if (!ValidateDataOffsetSize(writeOffset
, size
, writeBuffer
->ByteLength(),
115 "copyBufferSubData"))
120 if (readTarget
== writeTarget
&&
121 !ValidateDataRanges(readOffset
, writeOffset
, size
, "copyBufferSubData"))
126 WebGLContextUnchecked::CopyBufferSubData(readTarget
, writeTarget
, readOffset
,
131 WebGL2Context::GetBufferSubData(GLenum target
, GLintptr offset
,
132 const dom::ArrayBuffer
& returnedData
)
134 MOZ_CRASH("Not Implemented.");
138 WebGL2Context::GetBufferSubData(GLenum target
, GLintptr offset
,
139 const dom::ArrayBufferView
& returnedData
)
141 MOZ_CRASH("Not Implemented.");