Title: [113915] trunk/Source/WebCore
- Revision
- 113915
- Author
- z...@google.com
- Date
- 2012-04-11 15:12:37 -0700 (Wed, 11 Apr 2012)
Log Message
WebGLRenderingContext should defer caching program info
https://bugs.webkit.org/show_bug.cgi?id=83513
Reviewed by Kenneth Russell.
* html/canvas/WebGLProgram.cpp:
(WebCore::WebGLProgram::WebGLProgram):
(WebCore::WebGLProgram::numActiveAttribLocations): call cacheInfoIfNeeded();
(WebCore::WebGLProgram::getActiveAttribLocation): Ditto.
(WebCore::WebGLProgram::isUsingVertexAttrib0): Ditto.
(WebCore::WebGLProgram::getLinkStatus): Ditto.
(WebCore):
(WebCore::WebGLProgram::cacheActiveAttribLocations):
(WebCore::WebGLProgram::cacheInfoIfNeeded): Cache link status, active attire locations, etc if needed.
(WebCore::WebGLProgram::increaseLinkCount): also invalidate cached info.
* html/canvas/WebGLProgram.h:
(WebGLProgram):
* html/canvas/WebGLRenderingContext.cpp:
(WebCore):
(WebCore::WebGLRenderingContext::linkProgram): Do not cache program info immediately.
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (113914 => 113915)
--- trunk/Source/WebCore/ChangeLog 2012-04-11 22:04:01 UTC (rev 113914)
+++ trunk/Source/WebCore/ChangeLog 2012-04-11 22:12:37 UTC (rev 113915)
@@ -1,3 +1,26 @@
+2012-04-10 Zhenyao Mo <z...@google.com>
+
+ WebGLRenderingContext should defer caching program info
+ https://bugs.webkit.org/show_bug.cgi?id=83513
+
+ Reviewed by Kenneth Russell.
+
+ * html/canvas/WebGLProgram.cpp:
+ (WebCore::WebGLProgram::WebGLProgram):
+ (WebCore::WebGLProgram::numActiveAttribLocations): call cacheInfoIfNeeded();
+ (WebCore::WebGLProgram::getActiveAttribLocation): Ditto.
+ (WebCore::WebGLProgram::isUsingVertexAttrib0): Ditto.
+ (WebCore::WebGLProgram::getLinkStatus): Ditto.
+ (WebCore):
+ (WebCore::WebGLProgram::cacheActiveAttribLocations):
+ (WebCore::WebGLProgram::cacheInfoIfNeeded): Cache link status, active attire locations, etc if needed.
+ (WebCore::WebGLProgram::increaseLinkCount): also invalidate cached info.
+ * html/canvas/WebGLProgram.h:
+ (WebGLProgram):
+ * html/canvas/WebGLRenderingContext.cpp:
+ (WebCore):
+ (WebCore::WebGLRenderingContext::linkProgram): Do not cache program info immediately.
+
2012-04-11 David Dorwin <ddor...@chromium.org>
Add keySystem attribute to canPlayType() for Encrypted Media Extensions
Modified: trunk/Source/WebCore/html/canvas/WebGLProgram.cpp (113914 => 113915)
--- trunk/Source/WebCore/html/canvas/WebGLProgram.cpp 2012-04-11 22:04:01 UTC (rev 113914)
+++ trunk/Source/WebCore/html/canvas/WebGLProgram.cpp 2012-04-11 22:12:37 UTC (rev 113915)
@@ -43,6 +43,7 @@
: WebGLSharedObject(ctx)
, m_linkStatus(false)
, m_linkCount(0)
+ , m_infoValid(true)
{
setObject(ctx->graphicsContext3D()->createProgram());
}
@@ -65,42 +66,23 @@
}
}
-bool WebGLProgram::cacheActiveAttribLocations(GraphicsContext3D* context3d)
+unsigned WebGLProgram::numActiveAttribLocations()
{
- m_activeAttribLocations.clear();
- if (!object())
- return false;
-
- // 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
-{
+ 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;
@@ -108,6 +90,24 @@
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) {
@@ -160,6 +160,39 @@
}
}
+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* context = getAGraphicsContext3D();
+ if (!context)
+ return;
+ GC3Dint linkStatus = 0;
+ context->getProgramiv(object(), GraphicsContext3D::LINK_STATUS, &linkStatus);
+ m_linkStatus = linkStatus;
+ if (m_linkStatus)
+ cacheActiveAttribLocations(context);
+ m_infoValid = true;
+}
+
+}
+
#endif // ENABLE(WEBGL)
Modified: trunk/Source/WebCore/html/canvas/WebGLProgram.h (113914 => 113915)
--- trunk/Source/WebCore/html/canvas/WebGLProgram.h 2012-04-11 22:04:01 UTC (rev 113914)
+++ trunk/Source/WebCore/html/canvas/WebGLProgram.h 2012-04-11 22:12:37 UTC (rev 113915)
@@ -42,23 +42,21 @@
static PassRefPtr<WebGLProgram> create(WebGLRenderingContext*);
- // cacheActiveAttribLocation() is only called once after linkProgram()
- // succeeds.
- bool cacheActiveAttribLocations(GraphicsContext3D*);
- unsigned numActiveAttribLocations() const;
- GC3Dint getActiveAttribLocation(GC3Duint index) const;
+ unsigned numActiveAttribLocations();
+ GC3Dint getActiveAttribLocation(GC3Duint index);
- bool isUsingVertexAttrib0() const;
+ bool isUsingVertexAttrib0();
- bool getLinkStatus() const { return m_linkStatus; }
- void setLinkStatus(bool status) { m_linkStatus = status; }
+ bool getLinkStatus();
+ void setLinkStatus(bool);
unsigned getLinkCount() const { return m_linkCount; }
// This is to be called everytime after the program is successfully linked.
// We don't deal with integer overflow here, assuming in reality a program
// will never be linked so many times.
- void increaseLinkCount() { ++m_linkCount; }
+ // Also, we invalidate the cached program info.
+ void increaseLinkCount();
WebGLShader* getAttachedShader(GC3Denum);
bool attachShader(WebGLShader*);
@@ -72,6 +70,9 @@
private:
virtual bool isProgram() const { return true; }
+ void cacheActiveAttribLocations(GraphicsContext3D*);
+ void cacheInfoIfNeeded();
+
Vector<GC3Dint> m_activeAttribLocations;
GC3Dint m_linkStatus;
@@ -82,6 +83,8 @@
RefPtr<WebGLShader> m_vertexShader;
RefPtr<WebGLShader> m_fragmentShader;
+
+ bool m_infoValid;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp (113914 => 113915)
--- trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp 2012-04-11 22:04:01 UTC (rev 113914)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp 2012-04-11 22:12:37 UTC (rev 113915)
@@ -3139,12 +3139,6 @@
m_context->linkProgram(objectOrZero(program));
program->increaseLinkCount();
- // cache link status
- GC3Dint value = 0;
- m_context->getProgramiv(objectOrZero(program), GraphicsContext3D::LINK_STATUS, &value);
- program->setLinkStatus(static_cast<bool>(value));
- // Need to cache link status before caching active attribute locations.
- program->cacheActiveAttribLocations(graphicsContext3D());
cleanupAfterGraphicsCall(false);
}
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes