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

Reply via email to