1 /* 2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 28 #include "core/html/canvas/WebGLVertexArrayObjectOES.h" 29 30 #include "core/html/canvas/WebGLRenderingContext.h" 31 #include "core/platform/graphics/Extensions3D.h" 32 33 namespace WebCore { 34 35 PassRefPtr<WebGLVertexArrayObjectOES> WebGLVertexArrayObjectOES::create(WebGLRenderingContext* ctx, VaoType type) 36 { 37 return adoptRef(new WebGLVertexArrayObjectOES(ctx, type)); 38 } 39 40 WebGLVertexArrayObjectOES::WebGLVertexArrayObjectOES(WebGLRenderingContext* ctx, VaoType type) 41 : WebGLContextObject(ctx) 42 , m_type(type) 43 , m_hasEverBeenBound(false) 44 , m_boundElementArrayBuffer(0) 45 { 46 ScriptWrappable::init(this); 47 m_vertexAttribState.resize(ctx->getMaxVertexAttribs()); 48 49 Extensions3D* extensions = context()->graphicsContext3D()->getExtensions(); 50 switch (m_type) { 51 case VaoTypeDefault: 52 break; 53 default: 54 setObject(extensions->createVertexArrayOES()); 55 break; 56 } 57 } 58 59 WebGLVertexArrayObjectOES::~WebGLVertexArrayObjectOES() 60 { 61 deleteObject(0); 62 } 63 64 void WebGLVertexArrayObjectOES::deleteObjectImpl(GraphicsContext3D* context3d, Platform3DObject object) 65 { 66 Extensions3D* extensions = context3d->getExtensions(); 67 switch (m_type) { 68 case VaoTypeDefault: 69 break; 70 default: 71 extensions->deleteVertexArrayOES(object); 72 break; 73 } 74 75 if (m_boundElementArrayBuffer) 76 m_boundElementArrayBuffer->onDetached(context3d); 77 78 for (size_t i = 0; i < m_vertexAttribState.size(); ++i) { 79 VertexAttribState& state = m_vertexAttribState[i]; 80 if (state.bufferBinding) 81 state.bufferBinding->onDetached(context3d); 82 } 83 } 84 85 void WebGLVertexArrayObjectOES::setElementArrayBuffer(PassRefPtr<WebGLBuffer> buffer) 86 { 87 if (buffer) 88 buffer->onAttached(); 89 if (m_boundElementArrayBuffer) 90 m_boundElementArrayBuffer->onDetached(context()->graphicsContext3D()); 91 m_boundElementArrayBuffer = buffer; 92 93 } 94 95 void WebGLVertexArrayObjectOES::setVertexAttribState( 96 GC3Duint index, GC3Dsizei bytesPerElement, GC3Dint size, GC3Denum type, GC3Dboolean normalized, GC3Dsizei stride, GC3Dintptr offset, PassRefPtr<WebGLBuffer> buffer) 97 { 98 GC3Dsizei validatedStride = stride ? stride : bytesPerElement; 99 100 VertexAttribState& state = m_vertexAttribState[index]; 101 102 if (buffer) 103 buffer->onAttached(); 104 if (state.bufferBinding) 105 state.bufferBinding->onDetached(context()->graphicsContext3D()); 106 107 state.bufferBinding = buffer; 108 state.bytesPerElement = bytesPerElement; 109 state.size = size; 110 state.type = type; 111 state.normalized = normalized; 112 state.stride = validatedStride; 113 state.originalStride = stride; 114 state.offset = offset; 115 } 116 117 void WebGLVertexArrayObjectOES::unbindBuffer(PassRefPtr<WebGLBuffer> buffer) 118 { 119 if (m_boundElementArrayBuffer == buffer) { 120 m_boundElementArrayBuffer->onDetached(context()->graphicsContext3D()); 121 m_boundElementArrayBuffer = 0; 122 } 123 124 for (size_t i = 0; i < m_vertexAttribState.size(); ++i) { 125 VertexAttribState& state = m_vertexAttribState[i]; 126 if (state.bufferBinding == buffer) { 127 buffer->onDetached(context()->graphicsContext3D()); 128 state.bufferBinding = 0; 129 } 130 } 131 } 132 133 void WebGLVertexArrayObjectOES::setVertexAttribDivisor(GC3Duint index, GC3Duint divisor) 134 { 135 VertexAttribState& state = m_vertexAttribState[index]; 136 state.divisor = divisor; 137 } 138 139 } 140