Changeset 113915 in webkit


Ignore:
Timestamp:
Apr 11, 2012 3:12:37 PM (12 years ago)
Author:
zmo@google.com
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.

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r113914 r113915  
     12012-04-10  Zhenyao Mo  <zmo@google.com>
     2
     3        WebGLRenderingContext should defer caching program info
     4        https://bugs.webkit.org/show_bug.cgi?id=83513
     5
     6        Reviewed by Kenneth Russell.
     7
     8        * html/canvas/WebGLProgram.cpp:
     9        (WebCore::WebGLProgram::WebGLProgram):
     10        (WebCore::WebGLProgram::numActiveAttribLocations): call cacheInfoIfNeeded();
     11        (WebCore::WebGLProgram::getActiveAttribLocation): Ditto.
     12        (WebCore::WebGLProgram::isUsingVertexAttrib0): Ditto.
     13        (WebCore::WebGLProgram::getLinkStatus): Ditto.
     14        (WebCore):
     15        (WebCore::WebGLProgram::cacheActiveAttribLocations):
     16        (WebCore::WebGLProgram::cacheInfoIfNeeded): Cache link status, active attire locations, etc if needed.
     17        (WebCore::WebGLProgram::increaseLinkCount): also invalidate cached info.
     18        * html/canvas/WebGLProgram.h:
     19        (WebGLProgram):
     20        * html/canvas/WebGLRenderingContext.cpp:
     21        (WebCore):
     22        (WebCore::WebGLRenderingContext::linkProgram): Do not cache program info immediately.
     23
    1242012-04-11  David Dorwin  <ddorwin@chromium.org>
    225
  • trunk/Source/WebCore/html/canvas/WebGLProgram.cpp

    r104954 r113915  
    4444    , m_linkStatus(false)
    4545    , m_linkCount(0)
     46    , m_infoValid(true)
    4647{
    4748    setObject(ctx->graphicsContext3D()->createProgram());
     
    6667}
    6768
    68 bool WebGLProgram::cacheActiveAttribLocations(GraphicsContext3D* context3d)
     69unsigned WebGLProgram::numActiveAttribLocations()
    6970{
    70     m_activeAttribLocations.clear();
    71     if (!object())
    72         return false;
    73 
    74     // Assume link status has already been cached.
    75     if (!m_linkStatus)
    76         return false;
    77 
    78     GC3Dint numAttribs = 0;
    79     context3d->getProgramiv(object(), GraphicsContext3D::ACTIVE_ATTRIBUTES, &numAttribs);
    80     m_activeAttribLocations.resize(static_cast<size_t>(numAttribs));
    81     for (int i = 0; i < numAttribs; ++i) {
    82         ActiveInfo info;
    83         context3d->getActiveAttrib(object(), i, info);
    84         m_activeAttribLocations[i] = context3d->getAttribLocation(object(), info.name.charactersWithNullTermination());
    85     }
    86 
    87     return true;
    88 }
    89 
    90 unsigned WebGLProgram::numActiveAttribLocations() const
    91 {
     71    cacheInfoIfNeeded();
    9272    return m_activeAttribLocations.size();
    9373}
    9474
    95 GC3Dint WebGLProgram::getActiveAttribLocation(GC3Duint index) const
     75GC3Dint WebGLProgram::getActiveAttribLocation(GC3Duint index)
    9676{
     77    cacheInfoIfNeeded();
    9778    if (index >= numActiveAttribLocations())
    9879        return -1;
     
    10081}
    10182
    102 bool WebGLProgram::isUsingVertexAttrib0() const
     83bool WebGLProgram::isUsingVertexAttrib0()
    10384{
     85    cacheInfoIfNeeded();
    10486    for (unsigned ii = 0; ii < numActiveAttribLocations(); ++ii) {
    10587        if (!getActiveAttribLocation(ii))
     
    10789    }
    10890    return false;
     91}
     92
     93bool WebGLProgram::getLinkStatus()
     94{
     95    cacheInfoIfNeeded();
     96    return m_linkStatus;
     97}
     98
     99void WebGLProgram::setLinkStatus(bool status)
     100{
     101    cacheInfoIfNeeded();
     102    m_linkStatus = status;
     103}
     104
     105void WebGLProgram::increaseLinkCount()
     106{
     107    ++m_linkCount;
     108    m_infoValid = false;
    109109}
    110110
     
    161161}
    162162
     163void WebGLProgram::cacheActiveAttribLocations(GraphicsContext3D* context3d)
     164{
     165    m_activeAttribLocations.clear();
     166
     167    GC3Dint numAttribs = 0;
     168    context3d->getProgramiv(object(), GraphicsContext3D::ACTIVE_ATTRIBUTES, &numAttribs);
     169    m_activeAttribLocations.resize(static_cast<size_t>(numAttribs));
     170    for (int i = 0; i < numAttribs; ++i) {
     171        ActiveInfo info;
     172        context3d->getActiveAttrib(object(), i, info);
     173        m_activeAttribLocations[i] = context3d->getAttribLocation(object(), info.name.charactersWithNullTermination());
     174    }
     175}
     176
     177void WebGLProgram::cacheInfoIfNeeded()
     178{
     179    if (m_infoValid)
     180        return;
     181
     182    if (!object())
     183        return;
     184
     185    GraphicsContext3D* context = getAGraphicsContext3D();
     186    if (!context)
     187        return;
     188    GC3Dint linkStatus = 0;
     189    context->getProgramiv(object(), GraphicsContext3D::LINK_STATUS, &linkStatus);
     190    m_linkStatus = linkStatus;
     191    if (m_linkStatus)
     192        cacheActiveAttribLocations(context);
     193    m_infoValid = true;
     194}
     195
    163196}
    164197
  • trunk/Source/WebCore/html/canvas/WebGLProgram.h

    r104954 r113915  
    4343    static PassRefPtr<WebGLProgram> create(WebGLRenderingContext*);
    4444
    45     // cacheActiveAttribLocation() is only called once after linkProgram()
    46     // succeeds.
    47     bool cacheActiveAttribLocations(GraphicsContext3D*);
    48     unsigned numActiveAttribLocations() const;
    49     GC3Dint getActiveAttribLocation(GC3Duint index) const;
     45    unsigned numActiveAttribLocations();
     46    GC3Dint getActiveAttribLocation(GC3Duint index);
    5047
    51     bool isUsingVertexAttrib0() const;
     48    bool isUsingVertexAttrib0();
    5249
    53     bool getLinkStatus() const { return m_linkStatus; }
    54     void setLinkStatus(bool status) { m_linkStatus = status; }
     50    bool getLinkStatus();
     51    void setLinkStatus(bool);
    5552
    5653    unsigned getLinkCount() const { return m_linkCount; }
     
    5956    // We don't deal with integer overflow here, assuming in reality a program
    6057    // will never be linked so many times.
    61     void increaseLinkCount() { ++m_linkCount; }
     58    // Also, we invalidate the cached program info.
     59    void increaseLinkCount();
    6260
    6361    WebGLShader* getAttachedShader(GC3Denum);
     
    7371    virtual bool isProgram() const { return true; }
    7472
     73    void cacheActiveAttribLocations(GraphicsContext3D*);
     74    void cacheInfoIfNeeded();
     75
    7576    Vector<GC3Dint> m_activeAttribLocations;
    7677
     
    8384    RefPtr<WebGLShader> m_vertexShader;
    8485    RefPtr<WebGLShader> m_fragmentShader;
     86
     87    bool m_infoValid;
    8588};
    8689
  • trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp

    r113634 r113915  
    31403140    m_context->linkProgram(objectOrZero(program));
    31413141    program->increaseLinkCount();
    3142     // cache link status
    3143     GC3Dint value = 0;
    3144     m_context->getProgramiv(objectOrZero(program), GraphicsContext3D::LINK_STATUS, &value);
    3145     program->setLinkStatus(static_cast<bool>(value));
    3146     // Need to cache link status before caching active attribute locations.
    3147     program->cacheActiveAttribLocations(graphicsContext3D());
    31483142    cleanupAfterGraphicsCall(false);
    31493143}
Note: See TracChangeset for help on using the changeset viewer.