| Index: third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
|
| diff --git a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
|
| index a3da846049bfe5db49feaba7ced2aecc5124e88d..40e0dab53083c62e83a904103b3dd734f3c82529 100644
|
| --- a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
|
| +++ b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
|
| @@ -154,7 +154,6 @@ WebGL2RenderingContextBase::WebGL2RenderingContextBase(
|
| m_boundCopyWriteBuffer(this, nullptr),
|
| m_boundPixelPackBuffer(this, nullptr),
|
| m_boundPixelUnpackBuffer(this, nullptr),
|
| - m_boundTransformFeedbackBuffer(this, nullptr),
|
| m_boundUniformBuffer(this, nullptr),
|
| m_currentBooleanOcclusionQuery(this, nullptr),
|
| m_currentTransformFeedbackPrimitivesWrittenQuery(this, nullptr),
|
| @@ -179,7 +178,6 @@ WebGL2RenderingContextBase::WebGL2RenderingContextBase(
|
| m_boundCopyWriteBuffer(this, nullptr),
|
| m_boundPixelPackBuffer(this, nullptr),
|
| m_boundPixelUnpackBuffer(this, nullptr),
|
| - m_boundTransformFeedbackBuffer(this, nullptr),
|
| m_boundUniformBuffer(this, nullptr),
|
| m_currentBooleanOcclusionQuery(this, nullptr),
|
| m_currentTransformFeedbackPrimitivesWrittenQuery(this, nullptr),
|
| @@ -209,7 +207,6 @@ void WebGL2RenderingContextBase::initializeNewContext() {
|
| m_boundCopyWriteBuffer = nullptr;
|
| m_boundPixelPackBuffer = nullptr;
|
| m_boundPixelUnpackBuffer = nullptr;
|
| - m_boundTransformFeedbackBuffer = nullptr;
|
| m_boundUniformBuffer = nullptr;
|
|
|
| m_currentBooleanOcclusionQuery = nullptr;
|
| @@ -223,11 +220,15 @@ void WebGL2RenderingContextBase::initializeNewContext() {
|
| m_samplerUnits.resize(numCombinedTextureImageUnits);
|
|
|
| m_maxTransformFeedbackSeparateAttribs = 0;
|
| + // This must be queried before instantiating any transform feedback
|
| + // objects.
|
| contextGL()->GetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,
|
| &m_maxTransformFeedbackSeparateAttribs);
|
| - m_boundIndexedTransformFeedbackBuffers.clear();
|
| - m_boundIndexedTransformFeedbackBuffers.resize(
|
| - m_maxTransformFeedbackSeparateAttribs);
|
| + // Create a default transform feedback object so there is a place to
|
| + // hold any bound buffers.
|
| + m_defaultTransformFeedback = WebGLTransformFeedback::create(
|
| + this, WebGLTransformFeedback::TFTypeDefault);
|
| + m_transformFeedbackBinding = m_defaultTransformFeedback;
|
|
|
| GLint maxUniformBufferBindings = 0;
|
| contextGL()->GetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS,
|
| @@ -4060,13 +4061,14 @@ ScriptValue WebGL2RenderingContextBase::getSyncParameter(
|
| WebGLTransformFeedback* WebGL2RenderingContextBase::createTransformFeedback() {
|
| if (isContextLost())
|
| return nullptr;
|
| - return WebGLTransformFeedback::create(this);
|
| + return WebGLTransformFeedback::create(this,
|
| + WebGLTransformFeedback::TFTypeUser);
|
| }
|
|
|
| void WebGL2RenderingContextBase::deleteTransformFeedback(
|
| WebGLTransformFeedback* feedback) {
|
| if (feedback == m_transformFeedbackBinding)
|
| - m_transformFeedbackBinding = nullptr;
|
| + m_transformFeedbackBinding = m_defaultTransformFeedback;
|
|
|
| deleteObject(feedback);
|
| }
|
| @@ -4100,12 +4102,16 @@ void WebGL2RenderingContextBase::bindTransformFeedback(
|
| return;
|
| }
|
|
|
| - m_transformFeedbackBinding = feedback;
|
| -
|
| - contextGL()->BindTransformFeedback(target, objectOrZero(feedback));
|
| + WebGLTransformFeedback* feedbackToBeBound;
|
| if (feedback) {
|
| - feedback->setTarget(target);
|
| + feedbackToBeBound = feedback;
|
| + feedbackToBeBound->setTarget(target);
|
| + } else {
|
| + feedbackToBeBound = m_defaultTransformFeedback.get();
|
| }
|
| +
|
| + m_transformFeedbackBinding = feedbackToBeBound;
|
| + contextGL()->BindTransformFeedback(target, objectOrZero(feedbackToBeBound));
|
| }
|
|
|
| void WebGL2RenderingContextBase::beginTransformFeedback(GLenum primitiveMode) {
|
| @@ -4307,14 +4313,16 @@ ScriptValue WebGL2RenderingContextBase::getIndexedParameter(
|
| return ScriptValue::createNull(scriptState);
|
|
|
| switch (target) {
|
| - case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
|
| - if (index >= m_boundIndexedTransformFeedbackBuffers.size()) {
|
| + case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: {
|
| + WebGLBuffer* buffer = nullptr;
|
| + if (!m_transformFeedbackBinding->getBoundIndexedTransformFeedbackBuffer(
|
| + index, &buffer)) {
|
| synthesizeGLError(GL_INVALID_VALUE, "getIndexedParameter",
|
| "index out of range");
|
| return ScriptValue::createNull(scriptState);
|
| }
|
| - return WebGLAny(scriptState,
|
| - m_boundIndexedTransformFeedbackBuffers[index].get());
|
| + return WebGLAny(scriptState, buffer);
|
| + }
|
| case GL_UNIFORM_BUFFER_BINDING:
|
| if (index >= m_boundIndexedUniformBuffers.size()) {
|
| synthesizeGLError(GL_INVALID_VALUE, "getIndexedParameter",
|
| @@ -4793,9 +4801,14 @@ ScriptValue WebGL2RenderingContextBase::getParameter(ScriptState* scriptState,
|
| case GL_TRANSFORM_FEEDBACK_ACTIVE:
|
| return getBooleanParameter(scriptState, pname);
|
| case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
|
| - return WebGLAny(scriptState, m_boundTransformFeedbackBuffer.get());
|
| + return WebGLAny(
|
| + scriptState,
|
| + m_transformFeedbackBinding->getBoundTransformFeedbackBuffer());
|
| case GL_TRANSFORM_FEEDBACK_BINDING:
|
| - return WebGLAny(scriptState, m_transformFeedbackBinding.get());
|
| + if (!m_transformFeedbackBinding->isDefaultObject()) {
|
| + return WebGLAny(scriptState, m_transformFeedbackBinding.get());
|
| + }
|
| + return ScriptValue::createNull(scriptState);
|
| case GL_TRANSFORM_FEEDBACK_PAUSED:
|
| return getBooleanParameter(scriptState, pname);
|
| case GL_UNIFORM_BUFFER_BINDING:
|
| @@ -4856,16 +4869,7 @@ bool WebGL2RenderingContextBase::validateCapability(const char* functionName,
|
| bool WebGL2RenderingContextBase::isBufferBoundToTransformFeedback(
|
| WebGLBuffer* buffer) {
|
| ASSERT(buffer);
|
| -
|
| - if (m_boundTransformFeedbackBuffer == buffer)
|
| - return true;
|
| -
|
| - for (size_t i = 0; i < m_boundIndexedTransformFeedbackBuffers.size(); ++i) {
|
| - if (m_boundIndexedTransformFeedbackBuffers[i] == buffer)
|
| - return true;
|
| - }
|
| -
|
| - return false;
|
| + return m_transformFeedbackBinding->isBufferBoundToTransformFeedback(buffer);
|
| }
|
|
|
| bool WebGL2RenderingContextBase::isBufferBoundToNonTransformFeedback(
|
| @@ -4995,7 +4999,7 @@ bool WebGL2RenderingContextBase::validateAndUpdateBufferBindTarget(
|
| m_boundPixelUnpackBuffer = buffer;
|
| break;
|
| case GL_TRANSFORM_FEEDBACK_BUFFER:
|
| - m_boundTransformFeedbackBuffer = buffer;
|
| + m_transformFeedbackBinding->setBoundTransformFeedbackBuffer(buffer);
|
| break;
|
| case GL_UNIFORM_BUFFER:
|
| m_boundUniformBuffer = buffer;
|
| @@ -5037,13 +5041,11 @@ bool WebGL2RenderingContextBase::validateAndUpdateBufferBindBaseTarget(
|
|
|
| switch (target) {
|
| case GL_TRANSFORM_FEEDBACK_BUFFER:
|
| - if (index >= m_boundIndexedTransformFeedbackBuffers.size()) {
|
| + if (!m_transformFeedbackBinding->setBoundIndexedTransformFeedbackBuffer(
|
| + index, buffer)) {
|
| synthesizeGLError(GL_INVALID_VALUE, functionName, "index out of range");
|
| return false;
|
| }
|
| - m_boundIndexedTransformFeedbackBuffers[index] =
|
| - TraceWrapperMember<WebGLBuffer>(this, buffer);
|
| - m_boundTransformFeedbackBuffer = buffer;
|
| break;
|
| case GL_UNIFORM_BUFFER:
|
| if (index >= m_boundIndexedUniformBuffers.size()) {
|
| @@ -5393,13 +5395,12 @@ ScriptValue WebGL2RenderingContextBase::getFramebufferAttachmentParameter(
|
| DEFINE_TRACE(WebGL2RenderingContextBase) {
|
| visitor->trace(m_readFramebufferBinding);
|
| visitor->trace(m_transformFeedbackBinding);
|
| + visitor->trace(m_defaultTransformFeedback);
|
| visitor->trace(m_boundCopyReadBuffer);
|
| visitor->trace(m_boundCopyWriteBuffer);
|
| visitor->trace(m_boundPixelPackBuffer);
|
| visitor->trace(m_boundPixelUnpackBuffer);
|
| - visitor->trace(m_boundTransformFeedbackBuffer);
|
| visitor->trace(m_boundUniformBuffer);
|
| - visitor->trace(m_boundIndexedTransformFeedbackBuffers);
|
| visitor->trace(m_boundIndexedUniformBuffers);
|
| visitor->trace(m_currentBooleanOcclusionQuery);
|
| visitor->trace(m_currentTransformFeedbackPrimitivesWrittenQuery);
|
| @@ -5410,17 +5411,13 @@ DEFINE_TRACE(WebGL2RenderingContextBase) {
|
| }
|
|
|
| DEFINE_TRACE_WRAPPERS(WebGL2RenderingContextBase) {
|
| - visitor->traceWrappers(m_transformFeedbackBinding);
|
| visitor->traceWrappers(m_readFramebufferBinding);
|
| + visitor->traceWrappers(m_transformFeedbackBinding);
|
| visitor->traceWrappers(m_boundCopyReadBuffer);
|
| visitor->traceWrappers(m_boundCopyWriteBuffer);
|
| visitor->traceWrappers(m_boundPixelPackBuffer);
|
| visitor->traceWrappers(m_boundPixelUnpackBuffer);
|
| - visitor->traceWrappers(m_boundTransformFeedbackBuffer);
|
| visitor->traceWrappers(m_boundUniformBuffer);
|
| - for (auto& buf : m_boundIndexedTransformFeedbackBuffers) {
|
| - visitor->traceWrappers(buf);
|
| - }
|
| for (auto& buf : m_boundIndexedUniformBuffers) {
|
| visitor->traceWrappers(buf);
|
| }
|
| @@ -5528,7 +5525,7 @@ WebGLBuffer* WebGL2RenderingContextBase::validateBufferDataTarget(
|
| buffer = m_boundPixelUnpackBuffer.get();
|
| break;
|
| case GL_TRANSFORM_FEEDBACK_BUFFER:
|
| - buffer = m_boundTransformFeedbackBuffer.get();
|
| + buffer = m_transformFeedbackBinding->getBoundTransformFeedbackBuffer();
|
| break;
|
| case GL_UNIFORM_BUFFER:
|
| buffer = m_boundUniformBuffer.get();
|
| @@ -5627,8 +5624,6 @@ void WebGL2RenderingContextBase::removeBoundBuffer(WebGLBuffer* buffer) {
|
| m_boundPixelPackBuffer = nullptr;
|
| if (m_boundPixelUnpackBuffer == buffer)
|
| m_boundPixelUnpackBuffer = nullptr;
|
| - if (m_boundTransformFeedbackBuffer == buffer)
|
| - m_boundTransformFeedbackBuffer = nullptr;
|
| if (m_boundUniformBuffer == buffer)
|
| m_boundUniformBuffer = nullptr;
|
|
|
| @@ -5640,6 +5635,11 @@ void WebGL2RenderingContextBase::restoreCurrentFramebuffer() {
|
| bindFramebuffer(GL_READ_FRAMEBUFFER, m_readFramebufferBinding.get());
|
| }
|
|
|
| +GLint WebGL2RenderingContextBase::getMaxTransformFeedbackSeparateAttribs()
|
| + const {
|
| + return m_maxTransformFeedbackSeparateAttribs;
|
| +}
|
| +
|
| WebGLImageConversion::PixelStoreParams
|
| WebGL2RenderingContextBase::getPackPixelStoreParams() {
|
| WebGLImageConversion::PixelStoreParams params;
|
|
|