| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |