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

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

Issue 2773843002: Fix state management of transform feedback buffers. (Closed)
Patch Set: Created 3 years, 9 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 "bindings/modules/v8/WebGLAny.h" 7 #include "bindings/modules/v8/WebGLAny.h"
8 #include "core/frame/ImageBitmap.h" 8 #include "core/frame/ImageBitmap.h"
9 #include "core/html/HTMLCanvasElement.h" 9 #include "core/html/HTMLCanvasElement.h"
10 #include "core/html/HTMLImageElement.h" 10 #include "core/html/HTMLImageElement.h"
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 : WebGLRenderingContextBase(passedCanvas, 147 : WebGLRenderingContextBase(passedCanvas,
148 std::move(contextProvider), 148 std::move(contextProvider),
149 requestedAttributes, 149 requestedAttributes,
150 2), 150 2),
151 m_readFramebufferBinding(this, nullptr), 151 m_readFramebufferBinding(this, nullptr),
152 m_transformFeedbackBinding(this, nullptr), 152 m_transformFeedbackBinding(this, nullptr),
153 m_boundCopyReadBuffer(this, nullptr), 153 m_boundCopyReadBuffer(this, nullptr),
154 m_boundCopyWriteBuffer(this, nullptr), 154 m_boundCopyWriteBuffer(this, nullptr),
155 m_boundPixelPackBuffer(this, nullptr), 155 m_boundPixelPackBuffer(this, nullptr),
156 m_boundPixelUnpackBuffer(this, nullptr), 156 m_boundPixelUnpackBuffer(this, nullptr),
157 m_boundTransformFeedbackBuffer(this, nullptr),
158 m_boundUniformBuffer(this, nullptr), 157 m_boundUniformBuffer(this, nullptr),
159 m_currentBooleanOcclusionQuery(this, nullptr), 158 m_currentBooleanOcclusionQuery(this, nullptr),
160 m_currentTransformFeedbackPrimitivesWrittenQuery(this, nullptr), 159 m_currentTransformFeedbackPrimitivesWrittenQuery(this, nullptr),
161 m_currentElapsedQuery(this, nullptr) { 160 m_currentElapsedQuery(this, nullptr) {
162 m_supportedInternalFormatsStorage.insert( 161 m_supportedInternalFormatsStorage.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* passedOffscreenCanvas, 168 OffscreenCanvas* passedOffscreenCanvas,
170 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider, 169 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider,
171 const CanvasContextCreationAttributes& requestedAttributes) 170 const CanvasContextCreationAttributes& requestedAttributes)
172 : WebGLRenderingContextBase(passedOffscreenCanvas, 171 : WebGLRenderingContextBase(passedOffscreenCanvas,
173 std::move(contextProvider), 172 std::move(contextProvider),
174 requestedAttributes, 173 requestedAttributes,
175 2), 174 2),
176 m_readFramebufferBinding(this, nullptr), 175 m_readFramebufferBinding(this, nullptr),
177 m_transformFeedbackBinding(this, nullptr), 176 m_transformFeedbackBinding(this, nullptr),
178 m_boundCopyReadBuffer(this, nullptr), 177 m_boundCopyReadBuffer(this, nullptr),
179 m_boundCopyWriteBuffer(this, nullptr), 178 m_boundCopyWriteBuffer(this, nullptr),
180 m_boundPixelPackBuffer(this, nullptr), 179 m_boundPixelPackBuffer(this, nullptr),
181 m_boundPixelUnpackBuffer(this, nullptr), 180 m_boundPixelUnpackBuffer(this, nullptr),
182 m_boundTransformFeedbackBuffer(this, nullptr),
183 m_boundUniformBuffer(this, nullptr), 181 m_boundUniformBuffer(this, nullptr),
184 m_currentBooleanOcclusionQuery(this, nullptr), 182 m_currentBooleanOcclusionQuery(this, nullptr),
185 m_currentTransformFeedbackPrimitivesWrittenQuery(this, nullptr), 183 m_currentTransformFeedbackPrimitivesWrittenQuery(this, nullptr),
186 m_currentElapsedQuery(this, nullptr) { 184 m_currentElapsedQuery(this, nullptr) {
187 m_supportedInternalFormatsStorage.insert( 185 m_supportedInternalFormatsStorage.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 : m_getBufferSubDataAsyncCallbacks) { 192 for (auto& callback : m_getBufferSubDataAsyncCallbacks) {
195 callback->destroy(); 193 callback->destroy();
196 } 194 }
197 m_getBufferSubDataAsyncCallbacks.clear(); 195 m_getBufferSubDataAsyncCallbacks.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(drawingBuffer()); 202 ASSERT(drawingBuffer());
205 203
206 m_readFramebufferBinding = nullptr; 204 m_readFramebufferBinding = nullptr;
207 205
208 m_boundCopyReadBuffer = nullptr; 206 m_boundCopyReadBuffer = nullptr;
209 m_boundCopyWriteBuffer = nullptr; 207 m_boundCopyWriteBuffer = nullptr;
210 m_boundPixelPackBuffer = nullptr; 208 m_boundPixelPackBuffer = nullptr;
211 m_boundPixelUnpackBuffer = nullptr; 209 m_boundPixelUnpackBuffer = nullptr;
212 m_boundTransformFeedbackBuffer = nullptr;
213 m_boundUniformBuffer = nullptr; 210 m_boundUniformBuffer = nullptr;
214 211
215 m_currentBooleanOcclusionQuery = nullptr; 212 m_currentBooleanOcclusionQuery = nullptr;
216 m_currentTransformFeedbackPrimitivesWrittenQuery = nullptr; 213 m_currentTransformFeedbackPrimitivesWrittenQuery = nullptr;
217 m_currentElapsedQuery = nullptr; 214 m_currentElapsedQuery = nullptr;
218 215
219 GLint numCombinedTextureImageUnits = 0; 216 GLint numCombinedTextureImageUnits = 0;
220 contextGL()->GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, 217 contextGL()->GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,
221 &numCombinedTextureImageUnits); 218 &numCombinedTextureImageUnits);
222 m_samplerUnits.clear(); 219 m_samplerUnits.clear();
223 m_samplerUnits.resize(numCombinedTextureImageUnits); 220 m_samplerUnits.resize(numCombinedTextureImageUnits);
224 221
225 m_maxTransformFeedbackSeparateAttribs = 0; 222 m_maxTransformFeedbackSeparateAttribs = 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 &m_maxTransformFeedbackSeparateAttribs); 226 &m_maxTransformFeedbackSeparateAttribs);
228 m_boundIndexedTransformFeedbackBuffers.clear(); 227 // Create a default transform feedback object so there is a place to
229 m_boundIndexedTransformFeedbackBuffers.resize( 228 // hold any bound buffers.
230 m_maxTransformFeedbackSeparateAttribs); 229 m_defaultTransformFeedback = WebGLTransformFeedback::create(
230 this, WebGLTransformFeedback::TFTypeDefault);
231 m_transformFeedbackBinding = m_defaultTransformFeedback;
231 232
232 GLint maxUniformBufferBindings = 0; 233 GLint maxUniformBufferBindings = 0;
233 contextGL()->GetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, 234 contextGL()->GetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS,
234 &maxUniformBufferBindings); 235 &maxUniformBufferBindings);
235 m_boundIndexedUniformBuffers.clear(); 236 m_boundIndexedUniformBuffers.clear();
236 m_boundIndexedUniformBuffers.resize(maxUniformBufferBindings); 237 m_boundIndexedUniformBuffers.resize(maxUniformBufferBindings);
237 m_maxBoundUniformBufferIndex = 0; 238 m_maxBoundUniformBufferIndex = 0;
238 239
239 m_packRowLength = 0; 240 m_packRowLength = 0;
240 m_packSkipPixels = 0; 241 m_packSkipPixels = 0;
(...skipping 3812 matching lines...) Expand 10 before | Expand all | Expand 10 after
4053 default: 4054 default:
4054 synthesizeGLError(GL_INVALID_ENUM, "getSyncParameter", 4055 synthesizeGLError(GL_INVALID_ENUM, "getSyncParameter",
4055 "invalid parameter name"); 4056 "invalid parameter name");
4056 return ScriptValue::createNull(scriptState); 4057 return ScriptValue::createNull(scriptState);
4057 } 4058 }
4058 } 4059 }
4059 4060
4060 WebGLTransformFeedback* WebGL2RenderingContextBase::createTransformFeedback() { 4061 WebGLTransformFeedback* WebGL2RenderingContextBase::createTransformFeedback() {
4061 if (isContextLost()) 4062 if (isContextLost())
4062 return nullptr; 4063 return nullptr;
4063 return WebGLTransformFeedback::create(this); 4064 return WebGLTransformFeedback::create(this,
4065 WebGLTransformFeedback::TFTypeUser);
4064 } 4066 }
4065 4067
4066 void WebGL2RenderingContextBase::deleteTransformFeedback( 4068 void WebGL2RenderingContextBase::deleteTransformFeedback(
4067 WebGLTransformFeedback* feedback) { 4069 WebGLTransformFeedback* feedback) {
4068 if (feedback == m_transformFeedbackBinding) 4070 if (feedback == m_transformFeedbackBinding)
4069 m_transformFeedbackBinding = nullptr; 4071 m_transformFeedbackBinding = m_defaultTransformFeedback;
4070 4072
4071 deleteObject(feedback); 4073 deleteObject(feedback);
4072 } 4074 }
4073 4075
4074 GLboolean WebGL2RenderingContextBase::isTransformFeedback( 4076 GLboolean WebGL2RenderingContextBase::isTransformFeedback(
4075 WebGLTransformFeedback* feedback) { 4077 WebGLTransformFeedback* feedback) {
4076 if (isContextLost() || !feedback) 4078 if (isContextLost() || !feedback)
4077 return 0; 4079 return 0;
4078 4080
4079 if (!feedback->hasEverBeenBound()) 4081 if (!feedback->hasEverBeenBound())
(...skipping 13 matching lines...) Expand all
4093 "attempted to bind a deleted transform feedback object"); 4095 "attempted to bind a deleted transform feedback object");
4094 return; 4096 return;
4095 } 4097 }
4096 4098
4097 if (target != GL_TRANSFORM_FEEDBACK) { 4099 if (target != GL_TRANSFORM_FEEDBACK) {
4098 synthesizeGLError(GL_INVALID_ENUM, "bindTransformFeedback", 4100 synthesizeGLError(GL_INVALID_ENUM, "bindTransformFeedback",
4099 "target must be TRANSFORM_FEEDBACK"); 4101 "target must be TRANSFORM_FEEDBACK");
4100 return; 4102 return;
4101 } 4103 }
4102 4104
4103 m_transformFeedbackBinding = feedback; 4105 WebGLTransformFeedback* feedbackToBeBound;
4106 if (feedback) {
4107 feedbackToBeBound = feedback;
4108 feedbackToBeBound->setTarget(target);
4109 } else {
4110 feedbackToBeBound = m_defaultTransformFeedback.get();
4111 }
4104 4112
4105 contextGL()->BindTransformFeedback(target, objectOrZero(feedback)); 4113 m_transformFeedbackBinding = feedbackToBeBound;
4106 if (feedback) { 4114 contextGL()->BindTransformFeedback(target, objectOrZero(feedbackToBeBound));
4107 feedback->setTarget(target);
4108 }
4109 } 4115 }
4110 4116
4111 void WebGL2RenderingContextBase::beginTransformFeedback(GLenum primitiveMode) { 4117 void WebGL2RenderingContextBase::beginTransformFeedback(GLenum primitiveMode) {
4112 if (isContextLost()) 4118 if (isContextLost())
4113 return; 4119 return;
4114 if (!validateTransformFeedbackPrimitiveMode("beginTransformFeedback", 4120 if (!validateTransformFeedbackPrimitiveMode("beginTransformFeedback",
4115 primitiveMode)) 4121 primitiveMode))
4116 return; 4122 return;
4117 4123
4118 contextGL()->BeginTransformFeedback(primitiveMode); 4124 contextGL()->BeginTransformFeedback(primitiveMode);
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
4300 } 4306 }
4301 4307
4302 ScriptValue WebGL2RenderingContextBase::getIndexedParameter( 4308 ScriptValue WebGL2RenderingContextBase::getIndexedParameter(
4303 ScriptState* scriptState, 4309 ScriptState* scriptState,
4304 GLenum target, 4310 GLenum target,
4305 GLuint index) { 4311 GLuint index) {
4306 if (isContextLost()) 4312 if (isContextLost())
4307 return ScriptValue::createNull(scriptState); 4313 return ScriptValue::createNull(scriptState);
4308 4314
4309 switch (target) { 4315 switch (target) {
4310 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 4316 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: {
4311 if (index >= m_boundIndexedTransformFeedbackBuffers.size()) { 4317 WebGLBuffer* buffer = nullptr;
4318 if (!m_transformFeedbackBinding->getBoundIndexedTransformFeedbackBuffer(
4319 index, &buffer)) {
4312 synthesizeGLError(GL_INVALID_VALUE, "getIndexedParameter", 4320 synthesizeGLError(GL_INVALID_VALUE, "getIndexedParameter",
4313 "index out of range"); 4321 "index out of range");
4314 return ScriptValue::createNull(scriptState); 4322 return ScriptValue::createNull(scriptState);
4315 } 4323 }
4316 return WebGLAny(scriptState, 4324 return WebGLAny(scriptState, buffer);
4317 m_boundIndexedTransformFeedbackBuffers[index].get()); 4325 }
4318 case GL_UNIFORM_BUFFER_BINDING: 4326 case GL_UNIFORM_BUFFER_BINDING:
4319 if (index >= m_boundIndexedUniformBuffers.size()) { 4327 if (index >= m_boundIndexedUniformBuffers.size()) {
4320 synthesizeGLError(GL_INVALID_VALUE, "getIndexedParameter", 4328 synthesizeGLError(GL_INVALID_VALUE, "getIndexedParameter",
4321 "index out of range"); 4329 "index out of range");
4322 return ScriptValue::createNull(scriptState); 4330 return ScriptValue::createNull(scriptState);
4323 } 4331 }
4324 return WebGLAny(scriptState, m_boundIndexedUniformBuffers[index].get()); 4332 return WebGLAny(scriptState, m_boundIndexedUniformBuffers[index].get());
4325 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: 4333 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
4326 case GL_TRANSFORM_FEEDBACK_BUFFER_START: 4334 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
4327 case GL_UNIFORM_BUFFER_SIZE: 4335 case GL_UNIFORM_BUFFER_SIZE:
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
4786 return WebGLAny( 4794 return WebGLAny(
4787 scriptState, 4795 scriptState,
4788 m_textureUnits[m_activeTextureUnit].m_texture2DArrayBinding.get()); 4796 m_textureUnits[m_activeTextureUnit].m_texture2DArrayBinding.get());
4789 case GL_TEXTURE_BINDING_3D: 4797 case GL_TEXTURE_BINDING_3D:
4790 return WebGLAny( 4798 return WebGLAny(
4791 scriptState, 4799 scriptState,
4792 m_textureUnits[m_activeTextureUnit].m_texture3DBinding.get()); 4800 m_textureUnits[m_activeTextureUnit].m_texture3DBinding.get());
4793 case GL_TRANSFORM_FEEDBACK_ACTIVE: 4801 case GL_TRANSFORM_FEEDBACK_ACTIVE:
4794 return getBooleanParameter(scriptState, pname); 4802 return getBooleanParameter(scriptState, pname);
4795 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: 4803 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
4796 return WebGLAny(scriptState, m_boundTransformFeedbackBuffer.get()); 4804 return WebGLAny(
4805 scriptState,
4806 m_transformFeedbackBinding->getBoundTransformFeedbackBuffer());
4797 case GL_TRANSFORM_FEEDBACK_BINDING: 4807 case GL_TRANSFORM_FEEDBACK_BINDING:
4798 return WebGLAny(scriptState, m_transformFeedbackBinding.get()); 4808 if (!m_transformFeedbackBinding->isDefaultObject()) {
4809 return WebGLAny(scriptState, m_transformFeedbackBinding.get());
4810 }
4811 return ScriptValue::createNull(scriptState);
4799 case GL_TRANSFORM_FEEDBACK_PAUSED: 4812 case GL_TRANSFORM_FEEDBACK_PAUSED:
4800 return getBooleanParameter(scriptState, pname); 4813 return getBooleanParameter(scriptState, pname);
4801 case GL_UNIFORM_BUFFER_BINDING: 4814 case GL_UNIFORM_BUFFER_BINDING:
4802 return WebGLAny(scriptState, m_boundUniformBuffer.get()); 4815 return WebGLAny(scriptState, m_boundUniformBuffer.get());
4803 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: 4816 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
4804 return getIntParameter(scriptState, pname); 4817 return getIntParameter(scriptState, pname);
4805 case GL_UNPACK_IMAGE_HEIGHT: 4818 case GL_UNPACK_IMAGE_HEIGHT:
4806 return getIntParameter(scriptState, pname); 4819 return getIntParameter(scriptState, pname);
4807 case GL_UNPACK_ROW_LENGTH: 4820 case GL_UNPACK_ROW_LENGTH:
4808 return getIntParameter(scriptState, pname); 4821 return getIntParameter(scriptState, pname);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
4849 case GL_RASTERIZER_DISCARD: 4862 case GL_RASTERIZER_DISCARD:
4850 return true; 4863 return true;
4851 default: 4864 default:
4852 return WebGLRenderingContextBase::validateCapability(functionName, cap); 4865 return WebGLRenderingContextBase::validateCapability(functionName, cap);
4853 } 4866 }
4854 } 4867 }
4855 4868
4856 bool WebGL2RenderingContextBase::isBufferBoundToTransformFeedback( 4869 bool WebGL2RenderingContextBase::isBufferBoundToTransformFeedback(
4857 WebGLBuffer* buffer) { 4870 WebGLBuffer* buffer) {
4858 ASSERT(buffer); 4871 ASSERT(buffer);
4859 4872 return m_transformFeedbackBinding->isBufferBoundToTransformFeedback(buffer);
4860 if (m_boundTransformFeedbackBuffer == buffer)
4861 return true;
4862
4863 for (size_t i = 0; i < m_boundIndexedTransformFeedbackBuffers.size(); ++i) {
4864 if (m_boundIndexedTransformFeedbackBuffers[i] == buffer)
4865 return true;
4866 }
4867
4868 return false;
4869 } 4873 }
4870 4874
4871 bool WebGL2RenderingContextBase::isBufferBoundToNonTransformFeedback( 4875 bool WebGL2RenderingContextBase::isBufferBoundToNonTransformFeedback(
4872 WebGLBuffer* buffer) { 4876 WebGLBuffer* buffer) {
4873 ASSERT(buffer); 4877 ASSERT(buffer);
4874 4878
4875 if (m_boundArrayBuffer == buffer || 4879 if (m_boundArrayBuffer == buffer ||
4876 m_boundVertexArrayObject->boundElementArrayBuffer() == buffer || 4880 m_boundVertexArrayObject->boundElementArrayBuffer() == buffer ||
4877 m_boundCopyReadBuffer == buffer || m_boundCopyWriteBuffer == buffer || 4881 m_boundCopyReadBuffer == buffer || m_boundCopyWriteBuffer == buffer ||
4878 m_boundPixelPackBuffer == buffer || m_boundPixelUnpackBuffer == buffer || 4882 m_boundPixelPackBuffer == buffer || m_boundPixelUnpackBuffer == buffer ||
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
4988 case GL_ELEMENT_ARRAY_BUFFER: 4992 case GL_ELEMENT_ARRAY_BUFFER:
4989 m_boundVertexArrayObject->setElementArrayBuffer(buffer); 4993 m_boundVertexArrayObject->setElementArrayBuffer(buffer);
4990 break; 4994 break;
4991 case GL_PIXEL_PACK_BUFFER: 4995 case GL_PIXEL_PACK_BUFFER:
4992 m_boundPixelPackBuffer = buffer; 4996 m_boundPixelPackBuffer = buffer;
4993 break; 4997 break;
4994 case GL_PIXEL_UNPACK_BUFFER: 4998 case GL_PIXEL_UNPACK_BUFFER:
4995 m_boundPixelUnpackBuffer = buffer; 4999 m_boundPixelUnpackBuffer = buffer;
4996 break; 5000 break;
4997 case GL_TRANSFORM_FEEDBACK_BUFFER: 5001 case GL_TRANSFORM_FEEDBACK_BUFFER:
4998 m_boundTransformFeedbackBuffer = buffer; 5002 m_transformFeedbackBinding->setBoundTransformFeedbackBuffer(buffer);
4999 break; 5003 break;
5000 case GL_UNIFORM_BUFFER: 5004 case GL_UNIFORM_BUFFER:
5001 m_boundUniformBuffer = buffer; 5005 m_boundUniformBuffer = buffer;
5002 break; 5006 break;
5003 default: 5007 default:
5004 ASSERT_NOT_REACHED(); 5008 ASSERT_NOT_REACHED();
5005 break; 5009 break;
5006 } 5010 }
5007 5011
5008 if (buffer && !buffer->getInitialTarget()) 5012 if (buffer && !buffer->getInitialTarget())
(...skipping 21 matching lines...) Expand all
5030 WebGLBuffer* buffer) { 5034 WebGLBuffer* buffer) {
5031 if (!validateBufferBaseTarget(functionName, target)) 5035 if (!validateBufferBaseTarget(functionName, target))
5032 return false; 5036 return false;
5033 5037
5034 if (buffer && 5038 if (buffer &&
5035 !validateBufferTargetCompatibility(functionName, target, buffer)) 5039 !validateBufferTargetCompatibility(functionName, target, buffer))
5036 return false; 5040 return false;
5037 5041
5038 switch (target) { 5042 switch (target) {
5039 case GL_TRANSFORM_FEEDBACK_BUFFER: 5043 case GL_TRANSFORM_FEEDBACK_BUFFER:
5040 if (index >= m_boundIndexedTransformFeedbackBuffers.size()) { 5044 if (!m_transformFeedbackBinding->setBoundIndexedTransformFeedbackBuffer(
5045 index, buffer)) {
5041 synthesizeGLError(GL_INVALID_VALUE, functionName, "index out of range"); 5046 synthesizeGLError(GL_INVALID_VALUE, functionName, "index out of range");
5042 return false; 5047 return false;
5043 } 5048 }
5044 m_boundIndexedTransformFeedbackBuffers[index] =
5045 TraceWrapperMember<WebGLBuffer>(this, buffer);
5046 m_boundTransformFeedbackBuffer = buffer;
5047 break; 5049 break;
5048 case GL_UNIFORM_BUFFER: 5050 case GL_UNIFORM_BUFFER:
5049 if (index >= m_boundIndexedUniformBuffers.size()) { 5051 if (index >= m_boundIndexedUniformBuffers.size()) {
5050 synthesizeGLError(GL_INVALID_VALUE, functionName, "index out of range"); 5052 synthesizeGLError(GL_INVALID_VALUE, functionName, "index out of range");
5051 return false; 5053 return false;
5052 } 5054 }
5053 m_boundIndexedUniformBuffers[index] = 5055 m_boundIndexedUniformBuffers[index] =
5054 TraceWrapperMember<WebGLBuffer>(this, buffer); 5056 TraceWrapperMember<WebGLBuffer>(this, buffer);
5055 m_boundUniformBuffer = buffer; 5057 m_boundUniformBuffer = buffer;
5056 5058
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
5386 default: 5388 default:
5387 break; 5389 break;
5388 } 5390 }
5389 synthesizeGLError(GL_INVALID_ENUM, kFunctionName, "invalid parameter name"); 5391 synthesizeGLError(GL_INVALID_ENUM, kFunctionName, "invalid parameter name");
5390 return ScriptValue::createNull(scriptState); 5392 return ScriptValue::createNull(scriptState);
5391 } 5393 }
5392 5394
5393 DEFINE_TRACE(WebGL2RenderingContextBase) { 5395 DEFINE_TRACE(WebGL2RenderingContextBase) {
5394 visitor->trace(m_readFramebufferBinding); 5396 visitor->trace(m_readFramebufferBinding);
5395 visitor->trace(m_transformFeedbackBinding); 5397 visitor->trace(m_transformFeedbackBinding);
5398 visitor->trace(m_defaultTransformFeedback);
5396 visitor->trace(m_boundCopyReadBuffer); 5399 visitor->trace(m_boundCopyReadBuffer);
5397 visitor->trace(m_boundCopyWriteBuffer); 5400 visitor->trace(m_boundCopyWriteBuffer);
5398 visitor->trace(m_boundPixelPackBuffer); 5401 visitor->trace(m_boundPixelPackBuffer);
5399 visitor->trace(m_boundPixelUnpackBuffer); 5402 visitor->trace(m_boundPixelUnpackBuffer);
5400 visitor->trace(m_boundTransformFeedbackBuffer);
5401 visitor->trace(m_boundUniformBuffer); 5403 visitor->trace(m_boundUniformBuffer);
5402 visitor->trace(m_boundIndexedTransformFeedbackBuffers);
5403 visitor->trace(m_boundIndexedUniformBuffers); 5404 visitor->trace(m_boundIndexedUniformBuffers);
5404 visitor->trace(m_currentBooleanOcclusionQuery); 5405 visitor->trace(m_currentBooleanOcclusionQuery);
5405 visitor->trace(m_currentTransformFeedbackPrimitivesWrittenQuery); 5406 visitor->trace(m_currentTransformFeedbackPrimitivesWrittenQuery);
5406 visitor->trace(m_currentElapsedQuery); 5407 visitor->trace(m_currentElapsedQuery);
5407 visitor->trace(m_samplerUnits); 5408 visitor->trace(m_samplerUnits);
5408 visitor->trace(m_getBufferSubDataAsyncCallbacks); 5409 visitor->trace(m_getBufferSubDataAsyncCallbacks);
5409 WebGLRenderingContextBase::trace(visitor); 5410 WebGLRenderingContextBase::trace(visitor);
5410 } 5411 }
5411 5412
5412 DEFINE_TRACE_WRAPPERS(WebGL2RenderingContextBase) { 5413 DEFINE_TRACE_WRAPPERS(WebGL2RenderingContextBase) {
5414 visitor->traceWrappers(m_readFramebufferBinding);
5413 visitor->traceWrappers(m_transformFeedbackBinding); 5415 visitor->traceWrappers(m_transformFeedbackBinding);
5414 visitor->traceWrappers(m_readFramebufferBinding);
5415 visitor->traceWrappers(m_boundCopyReadBuffer); 5416 visitor->traceWrappers(m_boundCopyReadBuffer);
5416 visitor->traceWrappers(m_boundCopyWriteBuffer); 5417 visitor->traceWrappers(m_boundCopyWriteBuffer);
5417 visitor->traceWrappers(m_boundPixelPackBuffer); 5418 visitor->traceWrappers(m_boundPixelPackBuffer);
5418 visitor->traceWrappers(m_boundPixelUnpackBuffer); 5419 visitor->traceWrappers(m_boundPixelUnpackBuffer);
5419 visitor->traceWrappers(m_boundTransformFeedbackBuffer);
5420 visitor->traceWrappers(m_boundUniformBuffer); 5420 visitor->traceWrappers(m_boundUniformBuffer);
5421 for (auto& buf : m_boundIndexedTransformFeedbackBuffers) {
5422 visitor->traceWrappers(buf);
5423 }
5424 for (auto& buf : m_boundIndexedUniformBuffers) { 5421 for (auto& buf : m_boundIndexedUniformBuffers) {
5425 visitor->traceWrappers(buf); 5422 visitor->traceWrappers(buf);
5426 } 5423 }
5427 visitor->traceWrappers(m_currentBooleanOcclusionQuery); 5424 visitor->traceWrappers(m_currentBooleanOcclusionQuery);
5428 visitor->traceWrappers(m_currentTransformFeedbackPrimitivesWrittenQuery); 5425 visitor->traceWrappers(m_currentTransformFeedbackPrimitivesWrittenQuery);
5429 visitor->traceWrappers(m_currentElapsedQuery); 5426 visitor->traceWrappers(m_currentElapsedQuery);
5430 for (auto& unit : m_samplerUnits) { 5427 for (auto& unit : m_samplerUnits) {
5431 visitor->traceWrappers(unit); 5428 visitor->traceWrappers(unit);
5432 } 5429 }
5433 WebGLRenderingContextBase::traceWrappers(visitor); 5430 WebGLRenderingContextBase::traceWrappers(visitor);
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
5521 case GL_COPY_WRITE_BUFFER: 5518 case GL_COPY_WRITE_BUFFER:
5522 buffer = m_boundCopyWriteBuffer.get(); 5519 buffer = m_boundCopyWriteBuffer.get();
5523 break; 5520 break;
5524 case GL_PIXEL_PACK_BUFFER: 5521 case GL_PIXEL_PACK_BUFFER:
5525 buffer = m_boundPixelPackBuffer.get(); 5522 buffer = m_boundPixelPackBuffer.get();
5526 break; 5523 break;
5527 case GL_PIXEL_UNPACK_BUFFER: 5524 case GL_PIXEL_UNPACK_BUFFER:
5528 buffer = m_boundPixelUnpackBuffer.get(); 5525 buffer = m_boundPixelUnpackBuffer.get();
5529 break; 5526 break;
5530 case GL_TRANSFORM_FEEDBACK_BUFFER: 5527 case GL_TRANSFORM_FEEDBACK_BUFFER:
5531 buffer = m_boundTransformFeedbackBuffer.get(); 5528 buffer = m_transformFeedbackBinding->getBoundTransformFeedbackBuffer();
5532 break; 5529 break;
5533 case GL_UNIFORM_BUFFER: 5530 case GL_UNIFORM_BUFFER:
5534 buffer = m_boundUniformBuffer.get(); 5531 buffer = m_boundUniformBuffer.get();
5535 break; 5532 break;
5536 default: 5533 default:
5537 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target"); 5534 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target");
5538 return nullptr; 5535 return nullptr;
5539 } 5536 }
5540 if (!buffer) { 5537 if (!buffer) {
5541 synthesizeGLError(GL_INVALID_OPERATION, functionName, "no buffer"); 5538 synthesizeGLError(GL_INVALID_OPERATION, functionName, "no buffer");
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
5620 5617
5621 void WebGL2RenderingContextBase::removeBoundBuffer(WebGLBuffer* buffer) { 5618 void WebGL2RenderingContextBase::removeBoundBuffer(WebGLBuffer* buffer) {
5622 if (m_boundCopyReadBuffer == buffer) 5619 if (m_boundCopyReadBuffer == buffer)
5623 m_boundCopyReadBuffer = nullptr; 5620 m_boundCopyReadBuffer = nullptr;
5624 if (m_boundCopyWriteBuffer == buffer) 5621 if (m_boundCopyWriteBuffer == buffer)
5625 m_boundCopyWriteBuffer = nullptr; 5622 m_boundCopyWriteBuffer = nullptr;
5626 if (m_boundPixelPackBuffer == buffer) 5623 if (m_boundPixelPackBuffer == buffer)
5627 m_boundPixelPackBuffer = nullptr; 5624 m_boundPixelPackBuffer = nullptr;
5628 if (m_boundPixelUnpackBuffer == buffer) 5625 if (m_boundPixelUnpackBuffer == buffer)
5629 m_boundPixelUnpackBuffer = nullptr; 5626 m_boundPixelUnpackBuffer = nullptr;
5630 if (m_boundTransformFeedbackBuffer == buffer)
5631 m_boundTransformFeedbackBuffer = nullptr;
5632 if (m_boundUniformBuffer == buffer) 5627 if (m_boundUniformBuffer == buffer)
5633 m_boundUniformBuffer = nullptr; 5628 m_boundUniformBuffer = nullptr;
5634 5629
5635 WebGLRenderingContextBase::removeBoundBuffer(buffer); 5630 WebGLRenderingContextBase::removeBoundBuffer(buffer);
5636 } 5631 }
5637 5632
5638 void WebGL2RenderingContextBase::restoreCurrentFramebuffer() { 5633 void WebGL2RenderingContextBase::restoreCurrentFramebuffer() {
5639 bindFramebuffer(GL_DRAW_FRAMEBUFFER, m_framebufferBinding.get()); 5634 bindFramebuffer(GL_DRAW_FRAMEBUFFER, m_framebufferBinding.get());
5640 bindFramebuffer(GL_READ_FRAMEBUFFER, m_readFramebufferBinding.get()); 5635 bindFramebuffer(GL_READ_FRAMEBUFFER, m_readFramebufferBinding.get());
5641 } 5636 }
5642 5637
5638 GLint WebGL2RenderingContextBase::getMaxTransformFeedbackSeparateAttribs()
5639 const {
5640 return m_maxTransformFeedbackSeparateAttribs;
5641 }
5642
5643 WebGLImageConversion::PixelStoreParams 5643 WebGLImageConversion::PixelStoreParams
5644 WebGL2RenderingContextBase::getPackPixelStoreParams() { 5644 WebGL2RenderingContextBase::getPackPixelStoreParams() {
5645 WebGLImageConversion::PixelStoreParams params; 5645 WebGLImageConversion::PixelStoreParams params;
5646 params.alignment = m_packAlignment; 5646 params.alignment = m_packAlignment;
5647 params.rowLength = m_packRowLength; 5647 params.rowLength = m_packRowLength;
5648 params.skipPixels = m_packSkipPixels; 5648 params.skipPixels = m_packSkipPixels;
5649 params.skipRows = m_packSkipRows; 5649 params.skipRows = m_packSkipRows;
5650 return params; 5650 return params;
5651 } 5651 }
5652 5652
(...skipping 14 matching lines...) Expand all
5667 5667
5668 void WebGL2RenderingContextBase:: 5668 void WebGL2RenderingContextBase::
5669 DrawingBufferClientRestorePixelUnpackBufferBinding() { 5669 DrawingBufferClientRestorePixelUnpackBufferBinding() {
5670 if (!contextGL()) 5670 if (!contextGL())
5671 return; 5671 return;
5672 contextGL()->BindBuffer(GL_PIXEL_UNPACK_BUFFER, 5672 contextGL()->BindBuffer(GL_PIXEL_UNPACK_BUFFER,
5673 objectOrZero(m_boundPixelUnpackBuffer.get())); 5673 objectOrZero(m_boundPixelUnpackBuffer.get()));
5674 } 5674 }
5675 5675
5676 } // namespace blink 5676 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698