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

Unified Diff: third_party/WebKit/Source/modules/webgl/WebGLTransformFeedback.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
« no previous file with comments | « third_party/WebKit/Source/modules/webgl/WebGLTransformFeedback.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/modules/webgl/WebGLTransformFeedback.cpp
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLTransformFeedback.cpp b/third_party/WebKit/Source/modules/webgl/WebGLTransformFeedback.cpp
index 9af838153358e6208b6b3cd9298d6dc0824e388a..6cc76389d2c40a9668b2dd8ff7e891f683219a16 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLTransformFeedback.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLTransformFeedback.cpp
@@ -10,15 +10,32 @@
namespace blink {
WebGLTransformFeedback* WebGLTransformFeedback::create(
- WebGL2RenderingContextBase* ctx) {
- return new WebGLTransformFeedback(ctx);
+ WebGL2RenderingContextBase* ctx,
+ TFType type) {
+ return new WebGLTransformFeedback(ctx, type);
}
-WebGLTransformFeedback::WebGLTransformFeedback(WebGL2RenderingContextBase* ctx)
- : WebGLSharedPlatform3DObject(ctx), m_target(0), m_program(nullptr) {
- GLuint tf;
- ctx->contextGL()->GenTransformFeedbacks(1, &tf);
- setObject(tf);
+WebGLTransformFeedback::WebGLTransformFeedback(WebGL2RenderingContextBase* ctx,
+ TFType type)
+ : WebGLSharedPlatform3DObject(ctx),
+ m_type(type),
+ m_target(0),
+ m_boundTransformFeedbackBuffer(this, nullptr),
+ m_program(nullptr) {
+ GLint maxAttribs = ctx->getMaxTransformFeedbackSeparateAttribs();
+ DCHECK_GE(maxAttribs, 0);
+ m_boundIndexedTransformFeedbackBuffers.resize(maxAttribs);
+
+ switch (m_type) {
+ case TFTypeDefault:
+ break;
+ default: {
+ GLuint tf;
+ ctx->contextGL()->GenTransformFeedbacks(1, &tf);
+ setObject(tf);
+ break;
+ }
+ }
}
WebGLTransformFeedback::~WebGLTransformFeedback() {
@@ -26,8 +43,14 @@ WebGLTransformFeedback::~WebGLTransformFeedback() {
}
void WebGLTransformFeedback::deleteObjectImpl(gpu::gles2::GLES2Interface* gl) {
- gl->DeleteTransformFeedbacks(1, &m_object);
- m_object = 0;
+ switch (m_type) {
+ case TFTypeDefault:
+ break;
+ default:
Kai Ninomiya 2017/03/23 23:26:34 "default:" seems unclear to me. Why not do either
Ken Russell (switch to Gerrit) 2017/03/23 23:31:32 Good point; this was sloppy on my part. I copied t
+ gl->DeleteTransformFeedbacks(1, &m_object);
+ m_object = 0;
+ break;
+ }
}
void WebGLTransformFeedback::setTarget(GLenum target) {
@@ -41,9 +64,61 @@ void WebGLTransformFeedback::setProgram(WebGLProgram* program) {
m_program = program;
}
+void WebGLTransformFeedback::setBoundTransformFeedbackBuffer(
+ WebGLBuffer* buffer) {
+ m_boundTransformFeedbackBuffer = buffer;
+}
+
+WebGLBuffer* WebGLTransformFeedback::getBoundTransformFeedbackBuffer() const {
+ return m_boundTransformFeedbackBuffer;
+}
+
+bool WebGLTransformFeedback::setBoundIndexedTransformFeedbackBuffer(
+ GLuint index,
+ WebGLBuffer* buffer) {
+ if (index >= m_boundIndexedTransformFeedbackBuffers.size())
+ return false;
+ m_boundIndexedTransformFeedbackBuffers[index] =
+ TraceWrapperMember<WebGLBuffer>(this, buffer);
+ // This also sets the generic binding point in the OpenGL state.
+ m_boundTransformFeedbackBuffer = buffer;
+ return true;
+}
+
+bool WebGLTransformFeedback::getBoundIndexedTransformFeedbackBuffer(
+ GLuint index,
+ WebGLBuffer** outBuffer) const {
+ if (index >= m_boundIndexedTransformFeedbackBuffers.size())
+ return false;
+ *outBuffer = m_boundIndexedTransformFeedbackBuffers[index].get();
+ return true;
+}
+
+bool WebGLTransformFeedback::isBufferBoundToTransformFeedback(
+ WebGLBuffer* 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;
+}
+
DEFINE_TRACE(WebGLTransformFeedback) {
+ visitor->trace(m_boundTransformFeedbackBuffer);
+ visitor->trace(m_boundIndexedTransformFeedbackBuffers);
visitor->trace(m_program);
WebGLSharedPlatform3DObject::trace(visitor);
}
+DEFINE_TRACE_WRAPPERS(WebGLTransformFeedback) {
+ visitor->traceWrappers(m_boundTransformFeedbackBuffer);
+ for (auto& buf : m_boundIndexedTransformFeedbackBuffers) {
+ visitor->traceWrappers(buf);
+ }
+ WebGLSharedPlatform3DObject::traceWrappers(visitor);
+}
+
} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/modules/webgl/WebGLTransformFeedback.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698