1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
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/. */
5
6 #include "WebGL2Context.h"
7 #include "WebGLProgram.h"
8 #include "WebGLTransformFeedback.h"
9 #include "GLContext.h"
10
11 namespace mozilla {
12
13 // -------------------------------------------------------------------------
14 // Transform Feedback
15
CreateTransformFeedback()16 RefPtr<WebGLTransformFeedback> WebGL2Context::CreateTransformFeedback() {
17 const FuncScope funcScope(*this, "createTransformFeedback");
18 if (IsContextLost()) return nullptr;
19
20 GLuint tf = 0;
21 gl->fGenTransformFeedbacks(1, &tf);
22
23 return new WebGLTransformFeedback(this, tf);
24 }
25
BindTransformFeedback(WebGLTransformFeedback * tf)26 void WebGL2Context::BindTransformFeedback(WebGLTransformFeedback* tf) {
27 FuncScope funcScope(*this, "bindTransformFeedback");
28 if (IsContextLost()) return;
29 funcScope.mBindFailureGuard = true;
30
31 if (tf && !ValidateObject("tf", *tf)) return;
32
33 if (mBoundTransformFeedback->mIsActive &&
34 !mBoundTransformFeedback->mIsPaused) {
35 ErrorInvalidOperation(
36 "Currently bound transform feedback is active and not"
37 " paused.");
38 return;
39 }
40
41 ////
42
43 mBoundTransformFeedback = (tf ? tf : mDefaultTransformFeedback.get());
44
45 gl->fBindTransformFeedback(LOCAL_GL_TRANSFORM_FEEDBACK,
46 mBoundTransformFeedback->mGLName);
47
48 if (mBoundTransformFeedback) {
49 mBoundTransformFeedback->mHasBeenBound = true;
50 }
51
52 funcScope.mBindFailureGuard = false;
53 }
54
BeginTransformFeedback(GLenum primMode)55 void WebGL2Context::BeginTransformFeedback(GLenum primMode) {
56 const FuncScope funcScope(*this, "beginTransformFeedback");
57 if (IsContextLost()) return;
58
59 mBoundTransformFeedback->BeginTransformFeedback(primMode);
60 }
61
EndTransformFeedback()62 void WebGL2Context::EndTransformFeedback() {
63 const FuncScope funcScope(*this, "endTransformFeedback");
64 if (IsContextLost()) return;
65
66 mBoundTransformFeedback->EndTransformFeedback();
67 }
68
PauseTransformFeedback()69 void WebGL2Context::PauseTransformFeedback() {
70 const FuncScope funcScope(*this, "pauseTransformFeedback");
71 if (IsContextLost()) return;
72
73 mBoundTransformFeedback->PauseTransformFeedback();
74 }
75
ResumeTransformFeedback()76 void WebGL2Context::ResumeTransformFeedback() {
77 const FuncScope funcScope(*this, "resumeTransformFeedback");
78 if (IsContextLost()) return;
79
80 mBoundTransformFeedback->ResumeTransformFeedback();
81 }
82
TransformFeedbackVaryings(WebGLProgram & program,const std::vector<std::string> & varyings,GLenum bufferMode) const83 void WebGL2Context::TransformFeedbackVaryings(
84 WebGLProgram& program, const std::vector<std::string>& varyings,
85 GLenum bufferMode) const {
86 const FuncScope funcScope(*this, "transformFeedbackVaryings");
87 if (IsContextLost()) return;
88
89 if (!ValidateObject("program", program)) return;
90
91 program.TransformFeedbackVaryings(varyings, bufferMode);
92 }
93
94 } // namespace mozilla
95