Chromium Code Reviews| 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 |