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

Side by Side Diff: third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.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
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/WebGL2RenderingContextBase.h" 5 #include "modules/webgl/WebGL2RenderingContextBase.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include "bindings/modules/v8/WebGLAny.h" 8 #include "bindings/modules/v8/WebGLAny.h"
9 #include "core/frame/ImageBitmap.h" 9 #include "core/frame/ImageBitmap.h"
10 #include "core/html/HTMLCanvasElement.h" 10 #include "core/html/HTMLCanvasElement.h"
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 : WebGLRenderingContextBase(passed_canvas, 147 : WebGLRenderingContextBase(passed_canvas,
148 std::move(context_provider), 148 std::move(context_provider),
149 requested_attributes, 149 requested_attributes,
150 2), 150 2),
151 read_framebuffer_binding_(this, nullptr), 151 read_framebuffer_binding_(this, nullptr),
152 transform_feedback_binding_(this, nullptr), 152 transform_feedback_binding_(this, nullptr),
153 bound_copy_read_buffer_(this, nullptr), 153 bound_copy_read_buffer_(this, nullptr),
154 bound_copy_write_buffer_(this, nullptr), 154 bound_copy_write_buffer_(this, nullptr),
155 bound_pixel_pack_buffer_(this, nullptr), 155 bound_pixel_pack_buffer_(this, nullptr),
156 bound_pixel_unpack_buffer_(this, nullptr), 156 bound_pixel_unpack_buffer_(this, nullptr),
157 bound_transform_feedback_buffer_(this, nullptr),
158 bound_uniform_buffer_(this, nullptr), 157 bound_uniform_buffer_(this, nullptr),
159 current_boolean_occlusion_query_(this, nullptr), 158 current_boolean_occlusion_query_(this, nullptr),
160 current_transform_feedback_primitives_written_query_(this, nullptr), 159 current_transform_feedback_primitives_written_query_(this, nullptr),
161 current_elapsed_query_(this, nullptr) { 160 current_elapsed_query_(this, nullptr) {
162 supported_internal_formats_storage_.insert( 161 supported_internal_formats_storage_.insert(
163 kSupportedInternalFormatsStorage, 162 kSupportedInternalFormatsStorage,
164 kSupportedInternalFormatsStorage + 163 kSupportedInternalFormatsStorage +
165 WTF_ARRAY_LENGTH(kSupportedInternalFormatsStorage)); 164 WTF_ARRAY_LENGTH(kSupportedInternalFormatsStorage));
166 } 165 }
167 166
168 WebGL2RenderingContextBase::WebGL2RenderingContextBase( 167 WebGL2RenderingContextBase::WebGL2RenderingContextBase(
169 OffscreenCanvas* passed_offscreen_canvas, 168 OffscreenCanvas* passed_offscreen_canvas,
170 std::unique_ptr<WebGraphicsContext3DProvider> context_provider, 169 std::unique_ptr<WebGraphicsContext3DProvider> context_provider,
171 const CanvasContextCreationAttributes& requested_attributes) 170 const CanvasContextCreationAttributes& requested_attributes)
172 : WebGLRenderingContextBase(passed_offscreen_canvas, 171 : WebGLRenderingContextBase(passed_offscreen_canvas,
173 std::move(context_provider), 172 std::move(context_provider),
174 requested_attributes, 173 requested_attributes,
175 2), 174 2),
176 read_framebuffer_binding_(this, nullptr), 175 read_framebuffer_binding_(this, nullptr),
177 transform_feedback_binding_(this, nullptr), 176 transform_feedback_binding_(this, nullptr),
178 bound_copy_read_buffer_(this, nullptr), 177 bound_copy_read_buffer_(this, nullptr),
179 bound_copy_write_buffer_(this, nullptr), 178 bound_copy_write_buffer_(this, nullptr),
180 bound_pixel_pack_buffer_(this, nullptr), 179 bound_pixel_pack_buffer_(this, nullptr),
181 bound_pixel_unpack_buffer_(this, nullptr), 180 bound_pixel_unpack_buffer_(this, nullptr),
182 bound_transform_feedback_buffer_(this, nullptr),
183 bound_uniform_buffer_(this, nullptr), 181 bound_uniform_buffer_(this, nullptr),
184 current_boolean_occlusion_query_(this, nullptr), 182 current_boolean_occlusion_query_(this, nullptr),
185 current_transform_feedback_primitives_written_query_(this, nullptr), 183 current_transform_feedback_primitives_written_query_(this, nullptr),
186 current_elapsed_query_(this, nullptr) { 184 current_elapsed_query_(this, nullptr) {
187 supported_internal_formats_storage_.insert( 185 supported_internal_formats_storage_.insert(
188 kSupportedInternalFormatsStorage, 186 kSupportedInternalFormatsStorage,
189 kSupportedInternalFormatsStorage + 187 kSupportedInternalFormatsStorage +
190 WTF_ARRAY_LENGTH(kSupportedInternalFormatsStorage)); 188 WTF_ARRAY_LENGTH(kSupportedInternalFormatsStorage));
191 } 189 }
192 190
193 void WebGL2RenderingContextBase::DestroyContext() { 191 void WebGL2RenderingContextBase::DestroyContext() {
194 for (auto& callback : get_buffer_sub_data_async_callbacks_) { 192 for (auto& callback : get_buffer_sub_data_async_callbacks_) {
195 callback->Destroy(); 193 callback->Destroy();
196 } 194 }
197 get_buffer_sub_data_async_callbacks_.Clear(); 195 get_buffer_sub_data_async_callbacks_.Clear();
198 196
199 WebGLRenderingContextBase::DestroyContext(); 197 WebGLRenderingContextBase::DestroyContext();
200 } 198 }
201 199
202 void WebGL2RenderingContextBase::InitializeNewContext() { 200 void WebGL2RenderingContextBase::InitializeNewContext() {
203 ASSERT(!isContextLost()); 201 ASSERT(!isContextLost());
204 ASSERT(GetDrawingBuffer()); 202 ASSERT(GetDrawingBuffer());
205 203
206 read_framebuffer_binding_ = nullptr; 204 read_framebuffer_binding_ = nullptr;
207 205
208 bound_copy_read_buffer_ = nullptr; 206 bound_copy_read_buffer_ = nullptr;
209 bound_copy_write_buffer_ = nullptr; 207 bound_copy_write_buffer_ = nullptr;
210 bound_pixel_pack_buffer_ = nullptr; 208 bound_pixel_pack_buffer_ = nullptr;
211 bound_pixel_unpack_buffer_ = nullptr; 209 bound_pixel_unpack_buffer_ = nullptr;
212 bound_transform_feedback_buffer_ = nullptr;
213 bound_uniform_buffer_ = nullptr; 210 bound_uniform_buffer_ = nullptr;
214 211
215 current_boolean_occlusion_query_ = nullptr; 212 current_boolean_occlusion_query_ = nullptr;
216 current_transform_feedback_primitives_written_query_ = nullptr; 213 current_transform_feedback_primitives_written_query_ = nullptr;
217 current_elapsed_query_ = nullptr; 214 current_elapsed_query_ = nullptr;
218 215
219 GLint num_combined_texture_image_units = 0; 216 GLint num_combined_texture_image_units = 0;
220 ContextGL()->GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, 217 ContextGL()->GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,
221 &num_combined_texture_image_units); 218 &num_combined_texture_image_units);
222 sampler_units_.clear(); 219 sampler_units_.clear();
223 sampler_units_.Resize(num_combined_texture_image_units); 220 sampler_units_.Resize(num_combined_texture_image_units);
224 221
225 max_transform_feedback_separate_attribs_ = 0; 222 max_transform_feedback_separate_attribs_ = 0;
223 // This must be queried before instantiating any transform feedback
224 // objects.
226 ContextGL()->GetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, 225 ContextGL()->GetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,
227 &max_transform_feedback_separate_attribs_); 226 &max_transform_feedback_separate_attribs_);
228 bound_indexed_transform_feedback_buffers_.clear(); 227 // Create a default transform feedback object so there is a place to
229 bound_indexed_transform_feedback_buffers_.Resize( 228 // hold any bound buffers.
230 max_transform_feedback_separate_attribs_); 229 default_transform_feedback_ = WebGLTransformFeedback::Create(
230 this, WebGLTransformFeedback::TFTypeDefault);
231 transform_feedback_binding_ = default_transform_feedback_;
231 232
232 GLint max_uniform_buffer_bindings = 0; 233 GLint max_uniform_buffer_bindings = 0;
233 ContextGL()->GetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, 234 ContextGL()->GetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS,
234 &max_uniform_buffer_bindings); 235 &max_uniform_buffer_bindings);
235 bound_indexed_uniform_buffers_.clear(); 236 bound_indexed_uniform_buffers_.clear();
236 bound_indexed_uniform_buffers_.Resize(max_uniform_buffer_bindings); 237 bound_indexed_uniform_buffers_.Resize(max_uniform_buffer_bindings);
237 max_bound_uniform_buffer_index_ = 0; 238 max_bound_uniform_buffer_index_ = 0;
238 239
239 pack_row_length_ = 0; 240 pack_row_length_ = 0;
240 pack_skip_pixels_ = 0; 241 pack_skip_pixels_ = 0;
(...skipping 3904 matching lines...) Expand 10 before | Expand all | Expand 10 after
4145 default: 4146 default:
4146 SynthesizeGLError(GL_INVALID_ENUM, "getSyncParameter", 4147 SynthesizeGLError(GL_INVALID_ENUM, "getSyncParameter",
4147 "invalid parameter name"); 4148 "invalid parameter name");
4148 return ScriptValue::CreateNull(script_state); 4149 return ScriptValue::CreateNull(script_state);
4149 } 4150 }
4150 } 4151 }
4151 4152
4152 WebGLTransformFeedback* WebGL2RenderingContextBase::createTransformFeedback() { 4153 WebGLTransformFeedback* WebGL2RenderingContextBase::createTransformFeedback() {
4153 if (isContextLost()) 4154 if (isContextLost())
4154 return nullptr; 4155 return nullptr;
4155 return WebGLTransformFeedback::Create(this); 4156 return WebGLTransformFeedback::Create(this,
4157 WebGLTransformFeedback::TFTypeUser);
4156 } 4158 }
4157 4159
4158 void WebGL2RenderingContextBase::deleteTransformFeedback( 4160 void WebGL2RenderingContextBase::deleteTransformFeedback(
4159 WebGLTransformFeedback* feedback) { 4161 WebGLTransformFeedback* feedback) {
4160 if (feedback == transform_feedback_binding_) 4162 if (feedback == transform_feedback_binding_)
4161 transform_feedback_binding_ = nullptr; 4163 transform_feedback_binding_ = default_transform_feedback_;
4162 4164
4163 DeleteObject(feedback); 4165 DeleteObject(feedback);
4164 } 4166 }
4165 4167
4166 GLboolean WebGL2RenderingContextBase::isTransformFeedback( 4168 GLboolean WebGL2RenderingContextBase::isTransformFeedback(
4167 WebGLTransformFeedback* feedback) { 4169 WebGLTransformFeedback* feedback) {
4168 if (isContextLost() || !feedback) 4170 if (isContextLost() || !feedback)
4169 return 0; 4171 return 0;
4170 4172
4171 if (!feedback->HasEverBeenBound()) 4173 if (!feedback->HasEverBeenBound())
(...skipping 13 matching lines...) Expand all
4185 "attempted to bind a deleted transform feedback object"); 4187 "attempted to bind a deleted transform feedback object");
4186 return; 4188 return;
4187 } 4189 }
4188 4190
4189 if (target != GL_TRANSFORM_FEEDBACK) { 4191 if (target != GL_TRANSFORM_FEEDBACK) {
4190 SynthesizeGLError(GL_INVALID_ENUM, "bindTransformFeedback", 4192 SynthesizeGLError(GL_INVALID_ENUM, "bindTransformFeedback",
4191 "target must be TRANSFORM_FEEDBACK"); 4193 "target must be TRANSFORM_FEEDBACK");
4192 return; 4194 return;
4193 } 4195 }
4194 4196
4195 transform_feedback_binding_ = feedback; 4197 WebGLTransformFeedback* feedback_to_be_bound;
4198 if (feedback) {
4199 feedback_to_be_bound = feedback;
4200 feedback_to_be_bound->SetTarget(target);
4201 } else {
4202 feedback_to_be_bound = default_transform_feedback_.Get();
4203 }
4196 4204
4197 ContextGL()->BindTransformFeedback(target, ObjectOrZero(feedback)); 4205 transform_feedback_binding_ = feedback_to_be_bound;
4198 if (feedback) { 4206 ContextGL()->BindTransformFeedback(target,
4199 feedback->SetTarget(target); 4207 ObjectOrZero(feedback_to_be_bound));
4200 }
4201 } 4208 }
4202 4209
4203 void WebGL2RenderingContextBase::beginTransformFeedback(GLenum primitive_mode) { 4210 void WebGL2RenderingContextBase::beginTransformFeedback(GLenum primitive_mode) {
4204 if (isContextLost()) 4211 if (isContextLost())
4205 return; 4212 return;
4206 if (!ValidateTransformFeedbackPrimitiveMode("beginTransformFeedback", 4213 if (!ValidateTransformFeedbackPrimitiveMode("beginTransformFeedback",
4207 primitive_mode)) 4214 primitive_mode))
4208 return; 4215 return;
4209 4216
4210 ContextGL()->BeginTransformFeedback(primitive_mode); 4217 ContextGL()->BeginTransformFeedback(primitive_mode);
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
4392 } 4399 }
4393 4400
4394 ScriptValue WebGL2RenderingContextBase::getIndexedParameter( 4401 ScriptValue WebGL2RenderingContextBase::getIndexedParameter(
4395 ScriptState* script_state, 4402 ScriptState* script_state,
4396 GLenum target, 4403 GLenum target,
4397 GLuint index) { 4404 GLuint index) {
4398 if (isContextLost()) 4405 if (isContextLost())
4399 return ScriptValue::CreateNull(script_state); 4406 return ScriptValue::CreateNull(script_state);
4400 4407
4401 switch (target) { 4408 switch (target) {
4402 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 4409 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: {
4403 if (index >= bound_indexed_transform_feedback_buffers_.size()) { 4410 WebGLBuffer* buffer = nullptr;
4411 if (!transform_feedback_binding_->GetBoundIndexedTransformFeedbackBuffer(
4412 index, &buffer)) {
4404 SynthesizeGLError(GL_INVALID_VALUE, "getIndexedParameter", 4413 SynthesizeGLError(GL_INVALID_VALUE, "getIndexedParameter",
4405 "index out of range"); 4414 "index out of range");
4406 return ScriptValue::CreateNull(script_state); 4415 return ScriptValue::CreateNull(script_state);
4407 } 4416 }
4408 return WebGLAny(script_state, 4417 return WebGLAny(script_state, buffer);
4409 bound_indexed_transform_feedback_buffers_[index].Get()); 4418 }
4410 case GL_UNIFORM_BUFFER_BINDING: 4419 case GL_UNIFORM_BUFFER_BINDING:
4411 if (index >= bound_indexed_uniform_buffers_.size()) { 4420 if (index >= bound_indexed_uniform_buffers_.size()) {
4412 SynthesizeGLError(GL_INVALID_VALUE, "getIndexedParameter", 4421 SynthesizeGLError(GL_INVALID_VALUE, "getIndexedParameter",
4413 "index out of range"); 4422 "index out of range");
4414 return ScriptValue::CreateNull(script_state); 4423 return ScriptValue::CreateNull(script_state);
4415 } 4424 }
4416 return WebGLAny(script_state, 4425 return WebGLAny(script_state,
4417 bound_indexed_uniform_buffers_[index].Get()); 4426 bound_indexed_uniform_buffers_[index].Get());
4418 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: 4427 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
4419 case GL_TRANSFORM_FEEDBACK_BUFFER_START: 4428 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
4882 return WebGLAny( 4891 return WebGLAny(
4883 script_state, 4892 script_state,
4884 texture_units_[active_texture_unit_].texture2d_array_binding_.Get()); 4893 texture_units_[active_texture_unit_].texture2d_array_binding_.Get());
4885 case GL_TEXTURE_BINDING_3D: 4894 case GL_TEXTURE_BINDING_3D:
4886 return WebGLAny( 4895 return WebGLAny(
4887 script_state, 4896 script_state,
4888 texture_units_[active_texture_unit_].texture3d_binding_.Get()); 4897 texture_units_[active_texture_unit_].texture3d_binding_.Get());
4889 case GL_TRANSFORM_FEEDBACK_ACTIVE: 4898 case GL_TRANSFORM_FEEDBACK_ACTIVE:
4890 return GetBooleanParameter(script_state, pname); 4899 return GetBooleanParameter(script_state, pname);
4891 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 4900 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
4892 return WebGLAny(script_state, bound_transform_feedback_buffer_.Get()); 4901 return WebGLAny(
4902 script_state,
4903 transform_feedback_binding_->GetBoundTransformFeedbackBuffer());
4893 case GL_TRANSFORM_FEEDBACK_BINDING: 4904 case GL_TRANSFORM_FEEDBACK_BINDING:
4894 return WebGLAny(script_state, transform_feedback_binding_.Get()); 4905 if (!transform_feedback_binding_->IsDefaultObject()) {
4906 return WebGLAny(script_state, transform_feedback_binding_.Get());
4907 }
4908 return ScriptValue::CreateNull(script_state);
4895 case GL_TRANSFORM_FEEDBACK_PAUSED: 4909 case GL_TRANSFORM_FEEDBACK_PAUSED:
4896 return GetBooleanParameter(script_state, pname); 4910 return GetBooleanParameter(script_state, pname);
4897 case GL_UNIFORM_BUFFER_BINDING: 4911 case GL_UNIFORM_BUFFER_BINDING:
4898 return WebGLAny(script_state, bound_uniform_buffer_.Get()); 4912 return WebGLAny(script_state, bound_uniform_buffer_.Get());
4899 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: 4913 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
4900 return GetIntParameter(script_state, pname); 4914 return GetIntParameter(script_state, pname);
4901 case GL_UNPACK_IMAGE_HEIGHT: 4915 case GL_UNPACK_IMAGE_HEIGHT:
4902 return GetIntParameter(script_state, pname); 4916 return GetIntParameter(script_state, pname);
4903 case GL_UNPACK_ROW_LENGTH: 4917 case GL_UNPACK_ROW_LENGTH:
4904 return GetIntParameter(script_state, pname); 4918 return GetIntParameter(script_state, pname);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
4945 case GL_RASTERIZER_DISCARD: 4959 case GL_RASTERIZER_DISCARD:
4946 return true; 4960 return true;
4947 default: 4961 default:
4948 return WebGLRenderingContextBase::ValidateCapability(function_name, cap); 4962 return WebGLRenderingContextBase::ValidateCapability(function_name, cap);
4949 } 4963 }
4950 } 4964 }
4951 4965
4952 bool WebGL2RenderingContextBase::IsBufferBoundToTransformFeedback( 4966 bool WebGL2RenderingContextBase::IsBufferBoundToTransformFeedback(
4953 WebGLBuffer* buffer) { 4967 WebGLBuffer* buffer) {
4954 ASSERT(buffer); 4968 ASSERT(buffer);
4955 4969 return transform_feedback_binding_->IsBufferBoundToTransformFeedback(buffer);
4956 if (bound_transform_feedback_buffer_ == buffer)
4957 return true;
4958
4959 for (size_t i = 0; i < bound_indexed_transform_feedback_buffers_.size();
4960 ++i) {
4961 if (bound_indexed_transform_feedback_buffers_[i] == buffer)
4962 return true;
4963 }
4964
4965 return false;
4966 } 4970 }
4967 4971
4968 bool WebGL2RenderingContextBase::IsBufferBoundToNonTransformFeedback( 4972 bool WebGL2RenderingContextBase::IsBufferBoundToNonTransformFeedback(
4969 WebGLBuffer* buffer) { 4973 WebGLBuffer* buffer) {
4970 ASSERT(buffer); 4974 ASSERT(buffer);
4971 4975
4972 if (bound_array_buffer_ == buffer || 4976 if (bound_array_buffer_ == buffer ||
4973 bound_vertex_array_object_->BoundElementArrayBuffer() == buffer || 4977 bound_vertex_array_object_->BoundElementArrayBuffer() == buffer ||
4974 bound_copy_read_buffer_ == buffer || bound_copy_write_buffer_ == buffer || 4978 bound_copy_read_buffer_ == buffer || bound_copy_write_buffer_ == buffer ||
4975 bound_pixel_pack_buffer_ == buffer || 4979 bound_pixel_pack_buffer_ == buffer ||
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
5085 case GL_ELEMENT_ARRAY_BUFFER: 5089 case GL_ELEMENT_ARRAY_BUFFER:
5086 bound_vertex_array_object_->SetElementArrayBuffer(buffer); 5090 bound_vertex_array_object_->SetElementArrayBuffer(buffer);
5087 break; 5091 break;
5088 case GL_PIXEL_PACK_BUFFER: 5092 case GL_PIXEL_PACK_BUFFER:
5089 bound_pixel_pack_buffer_ = buffer; 5093 bound_pixel_pack_buffer_ = buffer;
5090 break; 5094 break;
5091 case GL_PIXEL_UNPACK_BUFFER: 5095 case GL_PIXEL_UNPACK_BUFFER:
5092 bound_pixel_unpack_buffer_ = buffer; 5096 bound_pixel_unpack_buffer_ = buffer;
5093 break; 5097 break;
5094 case GL_TRANSFORM_FEEDBACK_BUFFER: 5098 case GL_TRANSFORM_FEEDBACK_BUFFER:
5095 bound_transform_feedback_buffer_ = buffer; 5099 transform_feedback_binding_->SetBoundTransformFeedbackBuffer(buffer);
5096 break; 5100 break;
5097 case GL_UNIFORM_BUFFER: 5101 case GL_UNIFORM_BUFFER:
5098 bound_uniform_buffer_ = buffer; 5102 bound_uniform_buffer_ = buffer;
5099 break; 5103 break;
5100 default: 5104 default:
5101 NOTREACHED(); 5105 NOTREACHED();
5102 break; 5106 break;
5103 } 5107 }
5104 5108
5105 if (buffer && !buffer->GetInitialTarget()) 5109 if (buffer && !buffer->GetInitialTarget())
(...skipping 21 matching lines...) Expand all
5127 WebGLBuffer* buffer) { 5131 WebGLBuffer* buffer) {
5128 if (!ValidateBufferBaseTarget(function_name, target)) 5132 if (!ValidateBufferBaseTarget(function_name, target))
5129 return false; 5133 return false;
5130 5134
5131 if (buffer && 5135 if (buffer &&
5132 !ValidateBufferTargetCompatibility(function_name, target, buffer)) 5136 !ValidateBufferTargetCompatibility(function_name, target, buffer))
5133 return false; 5137 return false;
5134 5138
5135 switch (target) { 5139 switch (target) {
5136 case GL_TRANSFORM_FEEDBACK_BUFFER: 5140 case GL_TRANSFORM_FEEDBACK_BUFFER:
5137 if (index >= bound_indexed_transform_feedback_buffers_.size()) { 5141 if (!transform_feedback_binding_->SetBoundIndexedTransformFeedbackBuffer(
5142 index, buffer)) {
5138 SynthesizeGLError(GL_INVALID_VALUE, function_name, 5143 SynthesizeGLError(GL_INVALID_VALUE, function_name,
5139 "index out of range"); 5144 "index out of range");
5140 return false; 5145 return false;
5141 } 5146 }
5142 bound_indexed_transform_feedback_buffers_[index] =
5143 TraceWrapperMember<WebGLBuffer>(this, buffer);
5144 bound_transform_feedback_buffer_ = buffer;
5145 break; 5147 break;
5146 case GL_UNIFORM_BUFFER: 5148 case GL_UNIFORM_BUFFER:
5147 if (index >= bound_indexed_uniform_buffers_.size()) { 5149 if (index >= bound_indexed_uniform_buffers_.size()) {
5148 SynthesizeGLError(GL_INVALID_VALUE, function_name, 5150 SynthesizeGLError(GL_INVALID_VALUE, function_name,
5149 "index out of range"); 5151 "index out of range");
5150 return false; 5152 return false;
5151 } 5153 }
5152 bound_indexed_uniform_buffers_[index] = 5154 bound_indexed_uniform_buffers_[index] =
5153 TraceWrapperMember<WebGLBuffer>(this, buffer); 5155 TraceWrapperMember<WebGLBuffer>(this, buffer);
5154 bound_uniform_buffer_ = buffer; 5156 bound_uniform_buffer_ = buffer;
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
5484 default: 5486 default:
5485 break; 5487 break;
5486 } 5488 }
5487 SynthesizeGLError(GL_INVALID_ENUM, kFunctionName, "invalid parameter name"); 5489 SynthesizeGLError(GL_INVALID_ENUM, kFunctionName, "invalid parameter name");
5488 return ScriptValue::CreateNull(script_state); 5490 return ScriptValue::CreateNull(script_state);
5489 } 5491 }
5490 5492
5491 DEFINE_TRACE(WebGL2RenderingContextBase) { 5493 DEFINE_TRACE(WebGL2RenderingContextBase) {
5492 visitor->Trace(read_framebuffer_binding_); 5494 visitor->Trace(read_framebuffer_binding_);
5493 visitor->Trace(transform_feedback_binding_); 5495 visitor->Trace(transform_feedback_binding_);
5496 visitor->Trace(default_transform_feedback_);
5494 visitor->Trace(bound_copy_read_buffer_); 5497 visitor->Trace(bound_copy_read_buffer_);
5495 visitor->Trace(bound_copy_write_buffer_); 5498 visitor->Trace(bound_copy_write_buffer_);
5496 visitor->Trace(bound_pixel_pack_buffer_); 5499 visitor->Trace(bound_pixel_pack_buffer_);
5497 visitor->Trace(bound_pixel_unpack_buffer_); 5500 visitor->Trace(bound_pixel_unpack_buffer_);
5498 visitor->Trace(bound_transform_feedback_buffer_);
5499 visitor->Trace(bound_uniform_buffer_); 5501 visitor->Trace(bound_uniform_buffer_);
5500 visitor->Trace(bound_indexed_transform_feedback_buffers_);
5501 visitor->Trace(bound_indexed_uniform_buffers_); 5502 visitor->Trace(bound_indexed_uniform_buffers_);
5502 visitor->Trace(current_boolean_occlusion_query_); 5503 visitor->Trace(current_boolean_occlusion_query_);
5503 visitor->Trace(current_transform_feedback_primitives_written_query_); 5504 visitor->Trace(current_transform_feedback_primitives_written_query_);
5504 visitor->Trace(current_elapsed_query_); 5505 visitor->Trace(current_elapsed_query_);
5505 visitor->Trace(sampler_units_); 5506 visitor->Trace(sampler_units_);
5506 visitor->Trace(get_buffer_sub_data_async_callbacks_); 5507 visitor->Trace(get_buffer_sub_data_async_callbacks_);
5507 WebGLRenderingContextBase::Trace(visitor); 5508 WebGLRenderingContextBase::Trace(visitor);
5508 } 5509 }
5509 5510
5510 DEFINE_TRACE_WRAPPERS(WebGL2RenderingContextBase) { 5511 DEFINE_TRACE_WRAPPERS(WebGL2RenderingContextBase) {
5512 visitor->TraceWrappers(read_framebuffer_binding_);
5511 visitor->TraceWrappers(transform_feedback_binding_); 5513 visitor->TraceWrappers(transform_feedback_binding_);
5512 visitor->TraceWrappers(read_framebuffer_binding_);
5513 visitor->TraceWrappers(bound_copy_read_buffer_); 5514 visitor->TraceWrappers(bound_copy_read_buffer_);
5514 visitor->TraceWrappers(bound_copy_write_buffer_); 5515 visitor->TraceWrappers(bound_copy_write_buffer_);
5515 visitor->TraceWrappers(bound_pixel_pack_buffer_); 5516 visitor->TraceWrappers(bound_pixel_pack_buffer_);
5516 visitor->TraceWrappers(bound_pixel_unpack_buffer_); 5517 visitor->TraceWrappers(bound_pixel_unpack_buffer_);
5517 visitor->TraceWrappers(bound_transform_feedback_buffer_);
5518 visitor->TraceWrappers(bound_uniform_buffer_); 5518 visitor->TraceWrappers(bound_uniform_buffer_);
5519 for (auto& buf : bound_indexed_transform_feedback_buffers_) {
5520 visitor->TraceWrappers(buf);
5521 }
5522 for (auto& buf : bound_indexed_uniform_buffers_) { 5519 for (auto& buf : bound_indexed_uniform_buffers_) {
5523 visitor->TraceWrappers(buf); 5520 visitor->TraceWrappers(buf);
5524 } 5521 }
5525 visitor->TraceWrappers(current_boolean_occlusion_query_); 5522 visitor->TraceWrappers(current_boolean_occlusion_query_);
5526 visitor->TraceWrappers(current_transform_feedback_primitives_written_query_); 5523 visitor->TraceWrappers(current_transform_feedback_primitives_written_query_);
5527 visitor->TraceWrappers(current_elapsed_query_); 5524 visitor->TraceWrappers(current_elapsed_query_);
5528 for (auto& unit : sampler_units_) { 5525 for (auto& unit : sampler_units_) {
5529 visitor->TraceWrappers(unit); 5526 visitor->TraceWrappers(unit);
5530 } 5527 }
5531 WebGLRenderingContextBase::TraceWrappers(visitor); 5528 WebGLRenderingContextBase::TraceWrappers(visitor);
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
5619 case GL_COPY_WRITE_BUFFER: 5616 case GL_COPY_WRITE_BUFFER:
5620 buffer = bound_copy_write_buffer_.Get(); 5617 buffer = bound_copy_write_buffer_.Get();
5621 break; 5618 break;
5622 case GL_PIXEL_PACK_BUFFER: 5619 case GL_PIXEL_PACK_BUFFER:
5623 buffer = bound_pixel_pack_buffer_.Get(); 5620 buffer = bound_pixel_pack_buffer_.Get();
5624 break; 5621 break;
5625 case GL_PIXEL_UNPACK_BUFFER: 5622 case GL_PIXEL_UNPACK_BUFFER:
5626 buffer = bound_pixel_unpack_buffer_.Get(); 5623 buffer = bound_pixel_unpack_buffer_.Get();
5627 break; 5624 break;
5628 case GL_TRANSFORM_FEEDBACK_BUFFER: 5625 case GL_TRANSFORM_FEEDBACK_BUFFER:
5629 buffer = bound_transform_feedback_buffer_.Get(); 5626 buffer = transform_feedback_binding_->GetBoundTransformFeedbackBuffer();
5630 break; 5627 break;
5631 case GL_UNIFORM_BUFFER: 5628 case GL_UNIFORM_BUFFER:
5632 buffer = bound_uniform_buffer_.Get(); 5629 buffer = bound_uniform_buffer_.Get();
5633 break; 5630 break;
5634 default: 5631 default:
5635 SynthesizeGLError(GL_INVALID_ENUM, function_name, "invalid target"); 5632 SynthesizeGLError(GL_INVALID_ENUM, function_name, "invalid target");
5636 return nullptr; 5633 return nullptr;
5637 } 5634 }
5638 if (!buffer) { 5635 if (!buffer) {
5639 SynthesizeGLError(GL_INVALID_OPERATION, function_name, "no buffer"); 5636 SynthesizeGLError(GL_INVALID_OPERATION, function_name, "no buffer");
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
5718 5715
5719 void WebGL2RenderingContextBase::RemoveBoundBuffer(WebGLBuffer* buffer) { 5716 void WebGL2RenderingContextBase::RemoveBoundBuffer(WebGLBuffer* buffer) {
5720 if (bound_copy_read_buffer_ == buffer) 5717 if (bound_copy_read_buffer_ == buffer)
5721 bound_copy_read_buffer_ = nullptr; 5718 bound_copy_read_buffer_ = nullptr;
5722 if (bound_copy_write_buffer_ == buffer) 5719 if (bound_copy_write_buffer_ == buffer)
5723 bound_copy_write_buffer_ = nullptr; 5720 bound_copy_write_buffer_ = nullptr;
5724 if (bound_pixel_pack_buffer_ == buffer) 5721 if (bound_pixel_pack_buffer_ == buffer)
5725 bound_pixel_pack_buffer_ = nullptr; 5722 bound_pixel_pack_buffer_ = nullptr;
5726 if (bound_pixel_unpack_buffer_ == buffer) 5723 if (bound_pixel_unpack_buffer_ == buffer)
5727 bound_pixel_unpack_buffer_ = nullptr; 5724 bound_pixel_unpack_buffer_ = nullptr;
5728 if (bound_transform_feedback_buffer_ == buffer)
5729 bound_transform_feedback_buffer_ = nullptr;
5730 if (bound_uniform_buffer_ == buffer) 5725 if (bound_uniform_buffer_ == buffer)
5731 bound_uniform_buffer_ = nullptr; 5726 bound_uniform_buffer_ = nullptr;
5732 5727
5728 if (transform_feedback_binding_)
5729 transform_feedback_binding_->UnbindBuffer(buffer);
5730
5733 WebGLRenderingContextBase::RemoveBoundBuffer(buffer); 5731 WebGLRenderingContextBase::RemoveBoundBuffer(buffer);
5734 } 5732 }
5735 5733
5736 void WebGL2RenderingContextBase::RestoreCurrentFramebuffer() { 5734 void WebGL2RenderingContextBase::RestoreCurrentFramebuffer() {
5737 bindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer_binding_.Get()); 5735 bindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer_binding_.Get());
5738 bindFramebuffer(GL_READ_FRAMEBUFFER, read_framebuffer_binding_.Get()); 5736 bindFramebuffer(GL_READ_FRAMEBUFFER, read_framebuffer_binding_.Get());
5739 } 5737 }
5740 5738
5739 GLint WebGL2RenderingContextBase::GetMaxTransformFeedbackSeparateAttribs()
5740 const {
5741 return max_transform_feedback_separate_attribs_;
5742 }
5743
5741 WebGLImageConversion::PixelStoreParams 5744 WebGLImageConversion::PixelStoreParams
5742 WebGL2RenderingContextBase::GetPackPixelStoreParams() { 5745 WebGL2RenderingContextBase::GetPackPixelStoreParams() {
5743 WebGLImageConversion::PixelStoreParams params; 5746 WebGLImageConversion::PixelStoreParams params;
5744 params.alignment = pack_alignment_; 5747 params.alignment = pack_alignment_;
5745 params.row_length = pack_row_length_; 5748 params.row_length = pack_row_length_;
5746 params.skip_pixels = pack_skip_pixels_; 5749 params.skip_pixels = pack_skip_pixels_;
5747 params.skip_rows = pack_skip_rows_; 5750 params.skip_rows = pack_skip_rows_;
5748 return params; 5751 return params;
5749 } 5752 }
5750 5753
(...skipping 14 matching lines...) Expand all
5765 5768
5766 void WebGL2RenderingContextBase:: 5769 void WebGL2RenderingContextBase::
5767 DrawingBufferClientRestorePixelUnpackBufferBinding() { 5770 DrawingBufferClientRestorePixelUnpackBufferBinding() {
5768 if (!ContextGL()) 5771 if (!ContextGL())
5769 return; 5772 return;
5770 ContextGL()->BindBuffer(GL_PIXEL_UNPACK_BUFFER, 5773 ContextGL()->BindBuffer(GL_PIXEL_UNPACK_BUFFER,
5771 ObjectOrZero(bound_pixel_unpack_buffer_.Get())); 5774 ObjectOrZero(bound_pixel_unpack_buffer_.Get()));
5772 } 5775 }
5773 5776
5774 } // namespace blink 5777 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698