Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / html / canvas / OESVertexArrayObject.cpp
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/OESVertexArrayObject.h"
29
30 #include "bindings/v8/ExceptionState.h"
31 #include "core/html/canvas/WebGLRenderingContext.h"
32 #include "core/html/canvas/WebGLVertexArrayObjectOES.h"
33
34 namespace WebCore {
35
36 OESVertexArrayObject::OESVertexArrayObject(WebGLRenderingContext* context)
37     : WebGLExtension(context)
38 {
39     ScriptWrappable::init(this);
40     context->extensionsUtil()->ensureExtensionEnabled("GL_OES_vertex_array_object");
41 }
42
43 OESVertexArrayObject::~OESVertexArrayObject()
44 {
45 }
46
47 WebGLExtension::ExtensionName OESVertexArrayObject::name() const
48 {
49     return OESVertexArrayObjectName;
50 }
51
52 PassRefPtr<OESVertexArrayObject> OESVertexArrayObject::create(WebGLRenderingContext* context)
53 {
54     return adoptRef(new OESVertexArrayObject(context));
55 }
56
57 PassRefPtr<WebGLVertexArrayObjectOES> OESVertexArrayObject::createVertexArrayOES()
58 {
59     if (isLost())
60         return 0;
61
62     RefPtr<WebGLVertexArrayObjectOES> o = WebGLVertexArrayObjectOES::create(m_context, WebGLVertexArrayObjectOES::VaoTypeUser);
63     m_context->addContextObject(o.get());
64     return o.release();
65 }
66
67 void OESVertexArrayObject::deleteVertexArrayOES(WebGLVertexArrayObjectOES* arrayObject)
68 {
69     if (!arrayObject || isLost())
70         return;
71
72     if (!arrayObject->isDefaultObject() && arrayObject == m_context->m_boundVertexArrayObject)
73         m_context->setBoundVertexArrayObject(0);
74
75     arrayObject->deleteObject(m_context->webGraphicsContext3D());
76 }
77
78 GLboolean OESVertexArrayObject::isVertexArrayOES(WebGLVertexArrayObjectOES* arrayObject)
79 {
80     if (!arrayObject || isLost())
81         return 0;
82
83     if (!arrayObject->hasEverBeenBound())
84         return 0;
85
86     return m_context->webGraphicsContext3D()->isVertexArrayOES(arrayObject->object());
87 }
88
89 void OESVertexArrayObject::bindVertexArrayOES(WebGLVertexArrayObjectOES* arrayObject)
90 {
91     if (isLost())
92         return;
93
94     if (arrayObject && (arrayObject->isDeleted() || !arrayObject->validate(0, context()))) {
95         m_context->webGraphicsContext3D()->synthesizeGLError(GL_INVALID_OPERATION);
96         return;
97     }
98
99     if (arrayObject && !arrayObject->isDefaultObject() && arrayObject->object()) {
100         m_context->webGraphicsContext3D()->bindVertexArrayOES(arrayObject->object());
101
102         arrayObject->setHasEverBeenBound();
103         m_context->setBoundVertexArrayObject(arrayObject);
104     } else {
105         m_context->webGraphicsContext3D()->bindVertexArrayOES(0);
106         m_context->setBoundVertexArrayObject(0);
107     }
108 }
109
110 bool OESVertexArrayObject::supported(WebGLRenderingContext* context)
111 {
112     return context->extensionsUtil()->supportsExtension("GL_OES_vertex_array_object");
113 }
114
115 const char* OESVertexArrayObject::extensionName()
116 {
117     return "OES_vertex_array_object";
118 }
119
120 } // namespace WebCore