Changeset 113915 in webkit
- Timestamp:
- Apr 11, 2012, 3:12:37 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r113914 r113915 1 2012-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 1 24 2012-04-11 David Dorwin <ddorwin@chromium.org> 2 25 -
trunk/Source/WebCore/html/canvas/WebGLProgram.cpp
r104954 r113915 44 44 , m_linkStatus(false) 45 45 , m_linkCount(0) 46 , m_infoValid(true) 46 47 { 47 48 setObject(ctx->graphicsContext3D()->createProgram()); … … 66 67 } 67 68 68 bool WebGLProgram::cacheActiveAttribLocations(GraphicsContext3D* context3d)69 unsigned WebGLProgram::numActiveAttribLocations() 69 70 { 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(); 92 72 return m_activeAttribLocations.size(); 93 73 } 94 74 95 GC3Dint WebGLProgram::getActiveAttribLocation(GC3Duint index) const75 GC3Dint WebGLProgram::getActiveAttribLocation(GC3Duint index) 96 76 { 77 cacheInfoIfNeeded(); 97 78 if (index >= numActiveAttribLocations()) 98 79 return -1; … … 100 81 } 101 82 102 bool WebGLProgram::isUsingVertexAttrib0() const83 bool WebGLProgram::isUsingVertexAttrib0() 103 84 { 85 cacheInfoIfNeeded(); 104 86 for (unsigned ii = 0; ii < numActiveAttribLocations(); ++ii) { 105 87 if (!getActiveAttribLocation(ii)) … … 107 89 } 108 90 return false; 91 } 92 93 bool WebGLProgram::getLinkStatus() 94 { 95 cacheInfoIfNeeded(); 96 return m_linkStatus; 97 } 98 99 void WebGLProgram::setLinkStatus(bool status) 100 { 101 cacheInfoIfNeeded(); 102 m_linkStatus = status; 103 } 104 105 void WebGLProgram::increaseLinkCount() 106 { 107 ++m_linkCount; 108 m_infoValid = false; 109 109 } 110 110 … … 161 161 } 162 162 163 void 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 177 void 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 163 196 } 164 197 -
trunk/Source/WebCore/html/canvas/WebGLProgram.h
r104954 r113915 43 43 static PassRefPtr<WebGLProgram> create(WebGLRenderingContext*); 44 44 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); 50 47 51 bool isUsingVertexAttrib0() const;48 bool isUsingVertexAttrib0(); 52 49 53 bool getLinkStatus() const { return m_linkStatus; }54 void setLinkStatus(bool status) { m_linkStatus = status; }50 bool getLinkStatus(); 51 void setLinkStatus(bool); 55 52 56 53 unsigned getLinkCount() const { return m_linkCount; } … … 59 56 // We don't deal with integer overflow here, assuming in reality a program 60 57 // will never be linked so many times. 61 void increaseLinkCount() { ++m_linkCount; } 58 // Also, we invalidate the cached program info. 59 void increaseLinkCount(); 62 60 63 61 WebGLShader* getAttachedShader(GC3Denum); … … 73 71 virtual bool isProgram() const { return true; } 74 72 73 void cacheActiveAttribLocations(GraphicsContext3D*); 74 void cacheInfoIfNeeded(); 75 75 76 Vector<GC3Dint> m_activeAttribLocations; 76 77 … … 83 84 RefPtr<WebGLShader> m_vertexShader; 84 85 RefPtr<WebGLShader> m_fragmentShader; 86 87 bool m_infoValid; 85 88 }; 86 89 -
trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp
r113634 r113915 3140 3140 m_context->linkProgram(objectOrZero(program)); 3141 3141 program->increaseLinkCount(); 3142 // cache link status3143 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());3148 3142 cleanupAfterGraphicsCall(false); 3149 3143 }
Note:
See TracChangeset
for help on using the changeset viewer.