Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(104)

Side by Side Diff: third_party/WebKit/Source/modules/webgl/WebGLTransformFeedback.cpp

Issue 2773843002: Fix state management of transform feedback buffers. (Closed)
Patch Set: Implemented proper attach/detach/unbind for WebGLTransformFeedback. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/modules/webgl/WebGLTransformFeedback.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/webgl/WebGLTransformFeedback.h" 5 #include "modules/webgl/WebGLTransformFeedback.h"
6 6
7 #include "gpu/command_buffer/client/gles2_interface.h" 7 #include "gpu/command_buffer/client/gles2_interface.h"
8 #include "modules/webgl/WebGL2RenderingContextBase.h" 8 #include "modules/webgl/WebGL2RenderingContextBase.h"
9 9
10 namespace blink { 10 namespace blink {
11 11
12 WebGLTransformFeedback* WebGLTransformFeedback::Create( 12 WebGLTransformFeedback* WebGLTransformFeedback::Create(
13 WebGL2RenderingContextBase* ctx) { 13 WebGL2RenderingContextBase* ctx,
14 return new WebGLTransformFeedback(ctx); 14 TFType type) {
15 return new WebGLTransformFeedback(ctx, type);
15 } 16 }
16 17
17 WebGLTransformFeedback::WebGLTransformFeedback(WebGL2RenderingContextBase* ctx) 18 WebGLTransformFeedback::WebGLTransformFeedback(WebGL2RenderingContextBase* ctx,
18 : WebGLSharedPlatform3DObject(ctx), target_(0), program_(nullptr) { 19 TFType type)
19 GLuint tf; 20 : WebGLContextObject(ctx),
20 ctx->ContextGL()->GenTransformFeedbacks(1, &tf); 21 object_(0),
21 SetObject(tf); 22 type_(type),
23 target_(0),
24 bound_transform_feedback_buffer_(this, nullptr),
25 program_(nullptr) {
26 GLint max_attribs = ctx->GetMaxTransformFeedbackSeparateAttribs();
27 DCHECK_GE(max_attribs, 0);
28 bound_indexed_transform_feedback_buffers_.Resize(max_attribs);
29
30 switch (type_) {
31 case TFTypeDefault:
32 break;
33 case TFTypeUser: {
34 GLuint tf;
35 ctx->ContextGL()->GenTransformFeedbacks(1, &tf);
36 object_ = tf;
37 break;
38 }
39 }
22 } 40 }
23 41
24 WebGLTransformFeedback::~WebGLTransformFeedback() { 42 WebGLTransformFeedback::~WebGLTransformFeedback() {
25 RunDestructor(); 43 RunDestructor();
26 } 44 }
27 45
46 void WebGLTransformFeedback::DispatchDetached(gpu::gles2::GLES2Interface* gl) {
47 if (bound_transform_feedback_buffer_)
48 bound_transform_feedback_buffer_->OnDetached(gl);
49
50 for (size_t i = 0; i < bound_indexed_transform_feedback_buffers_.size();
51 ++i) {
52 if (bound_indexed_transform_feedback_buffers_[i])
53 bound_indexed_transform_feedback_buffers_[i]->OnDetached(gl);
54 }
55 }
56
28 void WebGLTransformFeedback::DeleteObjectImpl(gpu::gles2::GLES2Interface* gl) { 57 void WebGLTransformFeedback::DeleteObjectImpl(gpu::gles2::GLES2Interface* gl) {
29 gl->DeleteTransformFeedbacks(1, &object_); 58 switch (type_) {
30 object_ = 0; 59 case TFTypeDefault:
60 break;
61 case TFTypeUser:
62 gl->DeleteTransformFeedbacks(1, &object_);
63 object_ = 0;
64 break;
65 }
66
67 // Member<> objects must not be accessed during the destruction,
68 // since they could have been already finalized.
69 // The finalizers of these objects will handle their detachment
70 // by themselves.
71 if (!DestructionInProgress())
72 DispatchDetached(gl);
31 } 73 }
32 74
33 void WebGLTransformFeedback::SetTarget(GLenum target) { 75 void WebGLTransformFeedback::SetTarget(GLenum target) {
34 if (target_) 76 if (target_)
35 return; 77 return;
36 if (target == GL_TRANSFORM_FEEDBACK) 78 if (target == GL_TRANSFORM_FEEDBACK)
37 target_ = target; 79 target_ = target;
38 } 80 }
39 81
40 void WebGLTransformFeedback::SetProgram(WebGLProgram* program) { 82 void WebGLTransformFeedback::SetProgram(WebGLProgram* program) {
41 program_ = program; 83 program_ = program;
42 } 84 }
43 85
86 void WebGLTransformFeedback::SetBoundTransformFeedbackBuffer(
87 WebGLBuffer* buffer) {
88 if (buffer)
89 buffer->OnAttached();
90 if (bound_transform_feedback_buffer_)
91 bound_transform_feedback_buffer_->OnDetached(Context()->ContextGL());
92 bound_transform_feedback_buffer_ = buffer;
93 }
94
95 WebGLBuffer* WebGLTransformFeedback::GetBoundTransformFeedbackBuffer() const {
96 return bound_transform_feedback_buffer_;
97 }
98
99 bool WebGLTransformFeedback::SetBoundIndexedTransformFeedbackBuffer(
100 GLuint index,
101 WebGLBuffer* buffer) {
102 if (index >= bound_indexed_transform_feedback_buffers_.size())
103 return false;
104 if (buffer)
105 buffer->OnAttached();
106 if (bound_indexed_transform_feedback_buffers_[index]) {
107 bound_indexed_transform_feedback_buffers_[index]->OnDetached(
108 Context()->ContextGL());
109 }
110 bound_indexed_transform_feedback_buffers_[index] =
111 TraceWrapperMember<WebGLBuffer>(this, buffer);
112 // This also sets the generic binding point in the OpenGL state.
113 SetBoundTransformFeedbackBuffer(buffer);
114 return true;
115 }
116
117 bool WebGLTransformFeedback::GetBoundIndexedTransformFeedbackBuffer(
118 GLuint index,
119 WebGLBuffer** outBuffer) const {
120 if (index >= bound_indexed_transform_feedback_buffers_.size())
121 return false;
122 *outBuffer = bound_indexed_transform_feedback_buffers_[index].Get();
123 return true;
124 }
125
126 bool WebGLTransformFeedback::IsBufferBoundToTransformFeedback(
127 WebGLBuffer* buffer) {
128 if (bound_transform_feedback_buffer_ == buffer)
129 return true;
130
131 for (size_t i = 0; i < bound_indexed_transform_feedback_buffers_.size();
132 ++i) {
133 if (bound_indexed_transform_feedback_buffers_[i] == buffer)
134 return true;
135 }
136 return false;
137 }
138
139 void WebGLTransformFeedback::UnbindBuffer(WebGLBuffer* buffer) {
140 if (bound_transform_feedback_buffer_ == buffer) {
141 bound_transform_feedback_buffer_->OnDetached(Context()->ContextGL());
142 bound_transform_feedback_buffer_ = nullptr;
143 }
144 for (size_t i = 0; i < bound_indexed_transform_feedback_buffers_.size();
145 ++i) {
146 if (bound_indexed_transform_feedback_buffers_[i] == buffer) {
147 bound_indexed_transform_feedback_buffers_[i]->OnDetached(
148 Context()->ContextGL());
149 bound_indexed_transform_feedback_buffers_[i] = nullptr;
150 }
151 }
152 }
153
44 DEFINE_TRACE(WebGLTransformFeedback) { 154 DEFINE_TRACE(WebGLTransformFeedback) {
155 visitor->Trace(bound_transform_feedback_buffer_);
156 visitor->Trace(bound_indexed_transform_feedback_buffers_);
45 visitor->Trace(program_); 157 visitor->Trace(program_);
46 WebGLSharedPlatform3DObject::Trace(visitor); 158 WebGLContextObject::Trace(visitor);
159 }
160
161 DEFINE_TRACE_WRAPPERS(WebGLTransformFeedback) {
162 visitor->TraceWrappers(bound_transform_feedback_buffer_);
163 for (auto& buf : bound_indexed_transform_feedback_buffers_) {
164 visitor->TraceWrappers(buf);
165 }
166 WebGLContextObject::TraceWrappers(visitor);
47 } 167 }
48 168
49 } // namespace blink 169 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/modules/webgl/WebGLTransformFeedback.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698