Changeset 90180 in webkit
- Timestamp:
- Jun 30, 2011, 4:24:26 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r90178 r90180 1 2011-06-30 Zhenyao Mo <zmo@google.com> 2 3 Reviewed by Kenneth Russell. 4 5 Improve WebGL object lifetime management in WebGLRenderingContext 6 https://bugs.webkit.org/show_bug.cgi?id=63635 7 8 * fast/canvas/webgl/gl-object-get-calls-expected.txt: 9 * fast/canvas/webgl/gl-object-get-calls.html: Fix a bug so getFramebufferAtatchmentParameter generates an error if nothing is attached and something other than TYPE is queried. 10 * fast/canvas/webgl/object-deletion-behaviour-expected.txt: 11 * fast/canvas/webgl/object-deletion-behaviour.html: Ditto. 12 * fast/canvas/webgl/program-test.html: Fix the test so the order of shaders returned by getAttachedShaders doesn't matter. 13 1 14 2011-06-27 Diego Gonzalez <diegohcg@webkit.org> 2 15 -
trunk/LayoutTests/fast/canvas/webgl/gl-object-get-calls-expected.txt
r77311 r90180 83 83 PASS gl.getVertexAttrib(1, gl.CURRENT_VERTEX_ATTRIB) is [5, 6, 7, 8] 84 84 PASS getError was expected value: NO_ERROR : 85 PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_ NAME) is null86 PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_ NAME) is null85 PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) is gl.NONE 86 PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) is gl.NONE 87 87 PASS gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) is null 88 88 PASS getError was expected value: NO_ERROR : -
trunk/LayoutTests/fast/canvas/webgl/gl-object-get-calls.html
r77311 r90180 1 <!DOCTYPE html> 1 2 <html> 2 3 <head> 4 <meta charset="utf-8"> 3 5 <link rel="stylesheet" href="../../js/resources/js-test-style.css"/> 4 6 <script src="../../js/resources/js-test-pre.js"></script> … … 236 238 // Test cases where name == 0 237 239 gl.deleteTexture(texture); 238 shouldBe Null('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)');240 shouldBe('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)', 'gl.NONE'); 239 241 gl.deleteRenderbuffer(renderbuffer); 240 shouldBe Null('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)');242 shouldBe('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)', 'gl.NONE'); 241 243 gl.deleteBuffer(buffer); 242 244 shouldBeNull('gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)'); -
trunk/LayoutTests/fast/canvas/webgl/object-deletion-behaviour-expected.txt
r77417 r90180 34 34 PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) is tex 35 35 PASS gl.deleteTexture(tex) was expected value: NO_ERROR. 36 PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) is null 36 PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) is gl.NONE 37 PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) was expected value: INVALID_ENUM. 37 38 PASS gl.isTexture(tex) is false 38 39 PASS gl.getParameter(gl.TEXTURE_BINDING_2D) is null … … 53 54 PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) is rbo 54 55 PASS gl.deleteRenderbuffer(rbo) was expected value: NO_ERROR. 55 PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) is null 56 PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) is gl.NONE 57 PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) was expected value: INVALID_ENUM. 56 58 PASS gl.isRenderbuffer(rbo) is false 57 59 PASS gl.getParameter(gl.RENDERBUFFER_BINDING) is null -
trunk/LayoutTests/fast/canvas/webgl/object-deletion-behaviour.html
r77417 r90180 1 <!DOCTYPE html> 1 2 <html> 2 3 <head> 4 <meta charset="utf-8"> 3 5 <link rel="stylesheet" href="../../js/resources/js-test-style.css"/> 4 6 <script src="../../js/resources/js-test-pre.js"></script> … … 60 62 // Deleting a texture bound to the currently-bound fbo is the same as 61 63 // detaching the textue from fbo first, then delete the texture. 62 shouldBeNull("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); 64 shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE"); 65 shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); 63 66 shouldBeFalse("gl.isTexture(tex)"); 64 67 shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_2D)"); … … 86 89 // Deleting a renderbuffer bound to the currently-bound fbo is the same as 87 90 // detaching the renderbuffer from fbo first, then delete the renderbuffer. 88 shouldBeNull("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); 91 shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE"); 92 shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); 89 93 shouldBeFalse("gl.isRenderbuffer(rbo)"); 90 94 shouldBeNull("gl.getParameter(gl.RENDERBUFFER_BINDING)"); -
trunk/LayoutTests/fast/canvas/webgl/program-test.html
r65330 r90180 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 2 "http://www.w3.org/TR/html4/loose.dtd"> 1 <!DOCTYPE html> 3 2 <html> 4 3 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>4 <meta charset="utf-8"> 6 5 <title>WebGL Program Compiling/Linking Conformance Test</title> 7 6 <link rel="stylesheet" href="../../js/resources/js-test-style.css"/> … … 31 30 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); 32 31 32 function doArraysHaveSameContents(a, b) { 33 var flags = []; 34 function hasUnusedValue(a, value) { 35 for (var ii = 0; ii < a.length; ++ii) { 36 if (a[ii] === value && !flags[ii]) { 37 flags[ii] = true; 38 return true; 39 } 40 } 41 return false; 42 } 43 44 try { 45 if (a.length !== b.length) { 46 return false; 47 } 48 for (var ii = 0; ii < a.length; ii++) { 49 if (!hasUnusedValue(b, a[ii])) { 50 return false; 51 } 52 } 53 } catch (ex) { 54 return false; 55 } 56 return true; 57 } 33 58 34 59 /////// Check compileShader() ///////////////////////////// … … 56 81 57 82 var fs = gl.createShader(gl.FRAGMENT_SHADER); 58 gl.shaderSource(fs, " #ifdef GL_ES\nprecision mediump float;\n#endif\nvarying vec4 vColor; void main() { gl_FragColor = vColor; }");83 gl.shaderSource(fs, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor; }"); 59 84 gl.compileShader(fs); 60 85 … … 63 88 64 89 var fs2 = gl.createShader(gl.FRAGMENT_SHADER); 65 gl.shaderSource(fs2, " #ifdef GL_ES\nprecision mediump float;\n#endif\nvarying vec4 vColor; void main() { gl_FragColor = vColor * 0.5; }");90 gl.shaderSource(fs2, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor * 0.5; }"); 66 91 gl.compileShader(fs2); 67 92 … … 132 157 if(gl.getError() != gl.NO_ERROR) 133 158 assertMsg(false, "unexpected error in detachShader()"); 134 assertMsg( areArraysEqual(gl.getAttachedShaders(prog), expected_shaders), errmsg);159 assertMsg(doArraysHaveSameContents(gl.getAttachedShaders(prog), expected_shaders), errmsg); 135 160 } 136 161 checkGetAttachedShaders([], [], [], "getAttachedShaders should return an empty list by default"); … … 243 268 244 269 var fs3 = gl.createShader(gl.FRAGMENT_SHADER); 245 gl.shaderSource(fs3, " #ifdef GL_ES\nprecision mediump float;\n#endif\nvarying vec4 vColor; void main() { gl_FragColor = vColor; }");270 gl.shaderSource(fs3, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor; }"); 246 271 gl.compileShader(fs3); 247 272 … … 254 279 255 280 fs3 = gl.createShader(gl.FRAGMENT_SHADER); 256 gl.shaderSource(fs3, " #ifdef GL_ES\nprecision mediump float;\n#endif\nvarying vec4 vColor; void main() { gl_FragColor = vColor; }");281 gl.shaderSource(fs3, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor; }"); 257 282 gl.compileShader(fs3); 258 283 -
trunk/Source/WebCore/ChangeLog
r90174 r90180 1 2011-06-30 Zhenyao Mo <zmo@google.com> 2 3 Reviewed by Kenneth Russell. 4 5 Improve WebGL object lifetime management in WebGLRenderingContext 6 https://bugs.webkit.org/show_bug.cgi?id=63635 7 8 * html/canvas/WebGLRenderingContext.cpp: 9 (WebCore::WebGLRenderingContext::getAttachedShaders): Use cached objects instead of querying the underlying GL. 10 (WebCore::WebGLRenderingContext::getFramebufferAttachmentParameter): Ditto. 11 (WebCore::WebGLRenderingContext::detachAndRemoveAllObjects): Multiple loop because objects might be removed from the table within an iteration. 12 * html/canvas/WebGLRenderingContext.h: 13 1 14 2011-06-30 Rafael Brandao <rafael.lobo@openbossa.org> 2 15 -
trunk/Source/WebCore/html/canvas/WebGLObject.cpp
r76603 r90180 67 67 } 68 68 69 void WebGLObject::detachContext() 70 { 71 m_attachmentCount = 0; // Make sure OpenGL resource is deleted. 72 if (m_context) { 73 deleteObject(); 74 m_context->removeObject(this); 75 m_context = 0; 76 } 77 } 78 69 79 } 70 80 -
trunk/Source/WebCore/html/canvas/WebGLObject.h
r73406 r90180 47 47 void deleteObject(); 48 48 49 void detachContext() 50 { 51 m_attachmentCount = 0; // Make sure OpenGL resource is deleted. 52 deleteObject(); 53 m_context = 0; 54 } 49 void detachContext(); 55 50 56 51 WebGLRenderingContext* context() const { return m_context; } -
trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp
r89650 r90180 1919 1919 if (isContextLost() || !validateWebGLObject(program)) 1920 1920 return false; 1921 GC3Dint numShaders = 0; 1922 m_context->getProgramiv(objectOrZero(program), GraphicsContext3D::ATTACHED_SHADERS, &numShaders); 1923 if (numShaders) { 1924 OwnArrayPtr<Platform3DObject> shaders = adoptArrayPtr(new Platform3DObject[numShaders]); 1925 GC3Dsizei count = 0; 1926 m_context->getAttachedShaders(objectOrZero(program), numShaders, &count, shaders.get()); 1927 if (count != numShaders) 1928 return false; 1929 shaderObjects.resize(numShaders); 1930 for (GC3Dint ii = 0; ii < numShaders; ++ii) { 1931 WebGLShader* shader = findShader(shaders[ii]); 1932 if (!shader) { 1933 shaderObjects.clear(); 1934 return false; 1935 } 1936 shaderObjects[ii] = shader; 1937 } 1921 1922 const GC3Denum shaderType[] = { 1923 GraphicsContext3D::VERTEX_SHADER, 1924 GraphicsContext3D::FRAGMENT_SHADER 1925 }; 1926 for (unsigned i = 0; i < sizeof(shaderType) / sizeof(GC3Denum); ++i) { 1927 WebGLShader* shader = program->getAttachedShader(shaderType[i]); 1928 if (shader) 1929 shaderObjects.append(shader); 1938 1930 } 1939 1931 return true; … … 2029 2021 if (isContextLost() || !validateFramebufferFuncParameters(target, attachment)) 2030 2022 return WebGLGetInfo(); 2031 switch (pname) {2032 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:2033 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:2034 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:2035 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:2036 break;2037 default:2038 m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM);2039 return WebGLGetInfo();2040 }2041 2023 2042 2024 if (!m_framebufferBinding || !m_framebufferBinding->object() || m_framebufferBinding->isIncomplete(false)) { … … 2045 2027 } 2046 2028 2047 if (pname != GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) { 2048 WebGLStateRestorer(this, false); 2049 GC3Dint value = 0; 2050 m_context->getFramebufferAttachmentParameteriv(target, attachment, pname, &value); 2029 WebGLObject* object = m_framebufferBinding->getAttachment(attachment); 2030 if (!object) { 2051 2031 if (pname == GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) 2052 return WebGLGetInfo(static_cast<unsigned int>(value)); 2053 return WebGLGetInfo(value); 2054 } 2055 2056 WebGLStateRestorer(this, false); 2057 GC3Dint type = 0; 2058 m_context->getFramebufferAttachmentParameteriv(target, attachment, GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type); 2059 if (!type) 2032 return WebGLGetInfo(GraphicsContext3D::NONE); 2033 // OpenGL ES 2.0 specifies INVALID_ENUM in this case, while desktop GL 2034 // specifies INVALID_OPERATION. 2035 m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM); 2060 2036 return WebGLGetInfo(); 2061 GC3Dint value = 0; 2062 m_context->getFramebufferAttachmentParameteriv(target, attachment, GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &value); 2063 switch (type) { 2064 case GraphicsContext3D::RENDERBUFFER: 2065 return WebGLGetInfo(PassRefPtr<WebGLRenderbuffer>(findRenderbuffer(static_cast<Platform3DObject>(value)))); 2066 case GraphicsContext3D::TEXTURE: 2067 return WebGLGetInfo(PassRefPtr<WebGLTexture>(findTexture(static_cast<Platform3DObject>(value)))); 2068 default: 2069 // FIXME: raise exception? 2070 return WebGLGetInfo(); 2037 } 2038 2039 ASSERT(object->isTexture() || object->isRenderbuffer()); 2040 if (object->isTexture()) { 2041 switch (pname) { 2042 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 2043 return WebGLGetInfo(GraphicsContext3D::TEXTURE); 2044 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 2045 return WebGLGetInfo(PassRefPtr<WebGLTexture>(reinterpret_cast<WebGLTexture*>(object))); 2046 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 2047 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 2048 { 2049 WebGLStateRestorer(this, false); 2050 GC3Dint value = 0; 2051 m_context->getFramebufferAttachmentParameteriv(target, attachment, pname, &value); 2052 return WebGLGetInfo(value); 2053 } 2054 default: 2055 m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM); 2056 return WebGLGetInfo(); 2057 } 2058 } else { 2059 switch (pname) { 2060 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 2061 return WebGLGetInfo(GraphicsContext3D::RENDERBUFFER); 2062 case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 2063 return WebGLGetInfo(PassRefPtr<WebGLRenderbuffer>(reinterpret_cast<WebGLRenderbuffer*>(object))); 2064 default: 2065 m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM); 2066 return WebGLGetInfo(); 2067 } 2071 2068 } 2072 2069 } … … 3992 3989 void WebGLRenderingContext::detachAndRemoveAllObjects() 3993 3990 { 3994 HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end();3995 for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it)3991 while (m_canvasObjects.size() > 0) { 3992 HashSet<WebGLObject*>::iterator it = m_canvasObjects.begin(); 3996 3993 (*it)->detachContext(); 3997 3998 m_canvasObjects.clear(); 3999 } 4000 4001 WebGLTexture* WebGLRenderingContext::findTexture(Platform3DObject obj) 4002 { 4003 if (!obj) 4004 return 0; 4005 HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end(); 4006 for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { 4007 if ((*it)->isTexture() && (*it)->object() == obj) 4008 return reinterpret_cast<WebGLTexture*>((*it).get()); 4009 } 4010 return 0; 4011 } 4012 4013 WebGLRenderbuffer* WebGLRenderingContext::findRenderbuffer(Platform3DObject obj) 4014 { 4015 if (!obj) 4016 return 0; 4017 HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end(); 4018 for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { 4019 if ((*it)->isRenderbuffer() && (*it)->object() == obj) 4020 return reinterpret_cast<WebGLRenderbuffer*>((*it).get()); 4021 } 4022 return 0; 4023 } 4024 4025 WebGLBuffer* WebGLRenderingContext::findBuffer(Platform3DObject obj) 4026 { 4027 if (!obj) 4028 return 0; 4029 HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end(); 4030 for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { 4031 if ((*it)->isBuffer() && (*it)->object() == obj) 4032 return reinterpret_cast<WebGLBuffer*>((*it).get()); 4033 } 4034 return 0; 4035 } 4036 4037 WebGLShader* WebGLRenderingContext::findShader(Platform3DObject obj) 4038 { 4039 if (!obj) 4040 return 0; 4041 HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end(); 4042 for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { 4043 if ((*it)->isShader() && (*it)->object() == obj) 4044 return reinterpret_cast<WebGLShader*>((*it).get()); 4045 } 4046 return 0; 3994 } 4047 3995 } 4048 3996 -
trunk/Source/WebCore/html/canvas/WebGLRenderingContext.h
r89393 r90180 307 307 void addObject(WebGLObject*); 308 308 void detachAndRemoveAllObjects(); 309 WebGLTexture* findTexture(Platform3DObject);310 WebGLRenderbuffer* findRenderbuffer(Platform3DObject);311 WebGLBuffer* findBuffer(Platform3DObject);312 WebGLShader* findShader(Platform3DObject);313 309 314 310 void markContextChanged(); … … 365 361 bool m_needsUpdate; 366 362 bool m_markedCanvasDirty; 367 HashSet< RefPtr<WebGLObject>> m_canvasObjects;363 HashSet<WebGLObject*> m_canvasObjects; 368 364 369 365 // List of bound VBO's. Used to maintain info about sizes for ARRAY_BUFFER and stored values for ELEMENT_ARRAY_BUFFER
Note:
See TracChangeset
for help on using the changeset viewer.