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

Unified 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 side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698