Changeset 62396 in webkit


Ignore:
Timestamp:
Jul 2, 2010 12:06:12 PM (14 years ago)
Author:
zmo@google.com
Message:

2010-07-02 Zhenyao Mo <zmo@google.com>

Reviewed by Dimitri Glazkov.

linkProgram should fail when vertex/fragment shaders are not both present
https://bugs.webkit.org/show_bug.cgi?id=41380

  • fast/canvas/webgl/program-test-expected.txt: Added.
  • fast/canvas/webgl/program-test.html: Added.

2010-07-02 Zhenyao Mo <zmo@google.com>

Reviewed by Dimitri Glazkov.

linkProgram should fail when vertex/fragment shaders are not both present
https://bugs.webkit.org/show_bug.cgi?id=41380

Test: fast/canvas/webgl/program-test.html

  • html/canvas/WebGLProgram.cpp: Add flag for link failure due to missing shaders. (WebCore::WebGLProgram::WebGLProgram):
  • html/canvas/WebGLProgram.h: Add interface for linkFailure flag. (WebCore::WebGLProgram::isLinkFailureFlagSet): (WebCore::WebGLProgram::setLinkFailureFlag):
  • html/canvas/WebGLRenderingContext.cpp: (WebCore::WebGLRenderingContext::getProgramParameter): Intercept when linkFailureFlag is set. (WebCore::WebGLRenderingContext::linkProgram): Check if there are missing shaders and don't link if yes.
  • html/canvas/WebGLShader.cpp: Cache shader type. (WebCore::WebGLShader::WebGLShader):
  • html/canvas/WebGLShader.h: Ditto. (WebCore::WebGLShader::getType):
Location:
trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r62394 r62396  
     12010-07-02  Zhenyao Mo  <zmo@google.com>
     2
     3        Reviewed by Dimitri Glazkov.
     4
     5        linkProgram should fail when vertex/fragment shaders are not both present
     6        https://bugs.webkit.org/show_bug.cgi?id=41380
     7
     8        * fast/canvas/webgl/program-test-expected.txt: Added.
     9        * fast/canvas/webgl/program-test.html: Added.
     10
    1112010-07-02  Qi Zhang  <qi.2.zhang@nokia.com>
    212
  • trunk/WebCore/ChangeLog

    r62394 r62396  
     12010-07-02  Zhenyao Mo  <zmo@google.com>
     2
     3        Reviewed by Dimitri Glazkov.
     4
     5        linkProgram should fail when vertex/fragment shaders are not both present
     6        https://bugs.webkit.org/show_bug.cgi?id=41380
     7
     8        Test: fast/canvas/webgl/program-test.html
     9
     10        * html/canvas/WebGLProgram.cpp: Add flag for link failure due to missing shaders.
     11        (WebCore::WebGLProgram::WebGLProgram):
     12        * html/canvas/WebGLProgram.h: Add interface for linkFailure flag.
     13        (WebCore::WebGLProgram::isLinkFailureFlagSet):
     14        (WebCore::WebGLProgram::setLinkFailureFlag):
     15        * html/canvas/WebGLRenderingContext.cpp:
     16        (WebCore::WebGLRenderingContext::getProgramParameter): Intercept when linkFailureFlag is set.
     17        (WebCore::WebGLRenderingContext::linkProgram): Check if there are missing shaders and don't link if yes.
     18        * html/canvas/WebGLShader.cpp: Cache shader type.
     19        (WebCore::WebGLShader::WebGLShader):
     20        * html/canvas/WebGLShader.h: Ditto.
     21        (WebCore::WebGLShader::getType):
     22
    1232010-07-02  Qi Zhang  <qi.2.zhang@nokia.com>
    224
  • trunk/WebCore/html/canvas/WebGLProgram.cpp

    r62385 r62396  
    4040WebGLProgram::WebGLProgram(WebGLRenderingContext* ctx)
    4141    : CanvasObject(ctx)
     42    , m_linkFailure(false)
    4243{
    4344    setObject(context()->graphicsContext3D()->createProgram());
  • trunk/WebCore/html/canvas/WebGLProgram.h

    r62385 r62396  
    4949        bool isUsingVertexAttrib0() const;
    5050
     51        // Return true means getProgramParameter(LINK_STATUS) should return
     52        // false; return false means we should actually call
     53        // getProgramParameter(LINK_STATUS) to find out.
     54        bool isLinkFailureFlagSet() const { return m_linkFailure; }
     55        void setLinkFailureFlag(bool failed) { m_linkFailure = failed; }
     56
    5157    protected:
    5258        WebGLProgram(WebGLRenderingContext*);
     
    5864
    5965        Vector<int> m_activeAttribLocations;
     66
     67        bool m_linkFailure;
    6068    };
    6169   
  • trunk/WebCore/html/canvas/WebGLRenderingContext.cpp

    r62385 r62396  
    14111411    switch (pname) {
    14121412    case GraphicsContext3D::DELETE_STATUS:
     1413    case GraphicsContext3D::VALIDATE_STATUS:
     1414        m_context->getProgramiv(program, pname, &value);
     1415        return WebGLGetInfo(static_cast<bool>(value));
    14131416    case GraphicsContext3D::LINK_STATUS:
    1414     case GraphicsContext3D::VALIDATE_STATUS:
     1417        if (program->isLinkFailureFlagSet())
     1418            return WebGLGetInfo(false);
    14151419        m_context->getProgramiv(program, pname, &value);
    14161420        return WebGLGetInfo(static_cast<bool>(value));
     
    18301834    if (!validateWebGLObject(program))
    18311835        return;
     1836    if (!isGLES2Compliant()) {
     1837        Vector<WebGLShader*> shaders;
     1838        bool succeed = getAttachedShaders(program, shaders, ec);
     1839        if (succeed) {
     1840            bool vShader = false;
     1841            bool fShader = false;
     1842            for (size_t ii = 0; ii < shaders.size() && (!vShader || !fShader); ++ii) {
     1843                if (shaders[ii]->getType() == GraphicsContext3D::VERTEX_SHADER)
     1844                    vShader = true;
     1845                else if (shaders[ii]->getType() == GraphicsContext3D::FRAGMENT_SHADER)
     1846                    fShader = true;
     1847            }
     1848            if (!vShader || !fShader)
     1849                succeed = false;
     1850        }
     1851        if (!succeed) {
     1852            program->setLinkFailureFlag(true);
     1853            return;
     1854        }
     1855        program->setLinkFailureFlag(false);
     1856    }
     1857
    18321858    m_context->linkProgram(program);
    18331859    program->cacheActiveAttribLocations();
  • trunk/WebCore/html/canvas/WebGLShader.cpp

    r51327 r62396  
    4040WebGLShader::WebGLShader(WebGLRenderingContext* ctx, GraphicsContext3D::WebGLEnumType type)
    4141    : CanvasObject(ctx)
     42    , m_type(type)
    4243{
    4344    setObject(context()->graphicsContext3D()->createShader(type));
  • trunk/WebCore/html/canvas/WebGLShader.h

    r58790 r62396  
    4040        static PassRefPtr<WebGLShader> create(WebGLRenderingContext*, GraphicsContext3D::WebGLEnumType);
    4141
     42        GraphicsContext3D::WebGLEnumType getType() const { return m_type; }
     43
    4244    private:
    4345        WebGLShader(WebGLRenderingContext*, GraphicsContext3D::WebGLEnumType);
     
    4648
    4749        virtual bool isShader() const { return true; }
     50
     51        GraphicsContext3D::WebGLEnumType m_type;
    4852    };
    4953   
Note: See TracChangeset for help on using the changeset viewer.