diff options
Diffstat (limited to 'Source/WebCore/html/canvas/WebGLProgram.cpp')
-rw-r--r-- | Source/WebCore/html/canvas/WebGLProgram.cpp | 84 |
1 files changed, 58 insertions, 26 deletions
diff --git a/Source/WebCore/html/canvas/WebGLProgram.cpp b/Source/WebCore/html/canvas/WebGLProgram.cpp index d3efda4..ec99dc4 100644 --- a/Source/WebCore/html/canvas/WebGLProgram.cpp +++ b/Source/WebCore/html/canvas/WebGLProgram.cpp @@ -42,6 +42,7 @@ WebGLProgram::WebGLProgram(WebGLRenderingContext* ctx) : WebGLObject(ctx) , m_linkStatus(false) , m_linkCount(0) + , m_infoValid(true) { setObject(context()->graphicsContext3D()->createProgram()); } @@ -59,43 +60,23 @@ void WebGLProgram::deleteObjectImpl(Platform3DObject obj) } } -bool WebGLProgram::cacheActiveAttribLocations() -{ - m_activeAttribLocations.clear(); - if (!object()) - return false; - GraphicsContext3D* context3d = context()->graphicsContext3D(); - - // Assume link status has already been cached. - if (!m_linkStatus) - return false; - - GC3Dint numAttribs = 0; - context3d->getProgramiv(object(), GraphicsContext3D::ACTIVE_ATTRIBUTES, &numAttribs); - m_activeAttribLocations.resize(static_cast<size_t>(numAttribs)); - for (int i = 0; i < numAttribs; ++i) { - ActiveInfo info; - context3d->getActiveAttrib(object(), i, info); - m_activeAttribLocations[i] = context3d->getAttribLocation(object(), info.name.charactersWithNullTermination()); - } - - return true; -} - -unsigned WebGLProgram::numActiveAttribLocations() const +unsigned WebGLProgram::numActiveAttribLocations() { + cacheInfoIfNeeded(); return m_activeAttribLocations.size(); } -GC3Dint WebGLProgram::getActiveAttribLocation(GC3Duint index) const +GC3Dint WebGLProgram::getActiveAttribLocation(GC3Duint index) { + cacheInfoIfNeeded(); if (index >= numActiveAttribLocations()) return -1; return m_activeAttribLocations[index]; } -bool WebGLProgram::isUsingVertexAttrib0() const +bool WebGLProgram::isUsingVertexAttrib0() { + cacheInfoIfNeeded(); for (unsigned ii = 0; ii < numActiveAttribLocations(); ++ii) { if (!getActiveAttribLocation(ii)) return true; @@ -103,6 +84,24 @@ bool WebGLProgram::isUsingVertexAttrib0() const return false; } +bool WebGLProgram::getLinkStatus() +{ + cacheInfoIfNeeded(); + return m_linkStatus; +} + +void WebGLProgram::setLinkStatus(bool status) +{ + cacheInfoIfNeeded(); + m_linkStatus = status; +} + +void WebGLProgram::increaseLinkCount() +{ + ++m_linkCount; + m_infoValid = false; +} + WebGLShader* WebGLProgram::getAttachedShader(GC3Denum type) { switch (type) { @@ -155,6 +154,39 @@ bool WebGLProgram::detachShader(WebGLShader* shader) } } +void WebGLProgram::cacheActiveAttribLocations(GraphicsContext3D* context3d) +{ + m_activeAttribLocations.clear(); + + GC3Dint numAttribs = 0; + context3d->getProgramiv(object(), GraphicsContext3D::ACTIVE_ATTRIBUTES, &numAttribs); + m_activeAttribLocations.resize(static_cast<size_t>(numAttribs)); + for (int i = 0; i < numAttribs; ++i) { + ActiveInfo info; + context3d->getActiveAttrib(object(), i, info); + m_activeAttribLocations[i] = context3d->getAttribLocation(object(), info.name.charactersWithNullTermination()); + } +} + +void WebGLProgram::cacheInfoIfNeeded() +{ + if (m_infoValid) + return; + + if (!object()) + return; + + GraphicsContext3D* ctx = context()->graphicsContext3D(); + if (!ctx) + return; + GC3Dint linkStatus = 0; + ctx->getProgramiv(object(), GraphicsContext3D::LINK_STATUS, &linkStatus); + m_linkStatus = linkStatus; + if (m_linkStatus) + cacheActiveAttribLocations(ctx); + m_infoValid = true; +} + } #endif // ENABLE(WEBGL) |