Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / html / canvas / WebGLContextGroup.cpp
1 /*
2  * Copyright (C) 2011 Apple 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/WebGLContextGroup.h"
29
30 #include "core/html/canvas/WebGLSharedObject.h"
31
32 namespace blink {
33
34 PassRefPtr<WebGLContextGroup> WebGLContextGroup::create()
35 {
36     RefPtr<WebGLContextGroup> contextGroup = adoptRef(new WebGLContextGroup());
37     return contextGroup.release();
38 }
39
40 WebGLContextGroup::WebGLContextGroup()
41 {
42 }
43
44 WebGLContextGroup::~WebGLContextGroup()
45 {
46     detachAndRemoveAllObjects();
47 }
48
49 blink::WebGraphicsContext3D* WebGLContextGroup::getAWebGraphicsContext3D()
50 {
51     ASSERT(!m_contexts.isEmpty());
52     HashSet<WebGLRenderingContextBase*>::iterator it = m_contexts.begin();
53     return (*it)->webContext();
54 }
55
56 void WebGLContextGroup::addContext(WebGLRenderingContextBase* context)
57 {
58     m_contexts.add(context);
59 }
60
61 void WebGLContextGroup::removeContext(WebGLRenderingContextBase* context)
62 {
63     // We must call detachAndRemoveAllObjects before removing the last context.
64     if (m_contexts.size() == 1 && m_contexts.contains(context))
65         detachAndRemoveAllObjects();
66
67     m_contexts.remove(context);
68 }
69
70 void WebGLContextGroup::removeObject(WebGLSharedObject* object)
71 {
72     m_groupObjects.remove(object);
73 }
74
75 void WebGLContextGroup::addObject(WebGLSharedObject* object)
76 {
77     m_groupObjects.add(object);
78 }
79
80 void WebGLContextGroup::detachAndRemoveAllObjects()
81 {
82     while (!m_groupObjects.isEmpty()) {
83         HashSet<WebGLSharedObject*>::iterator it = m_groupObjects.begin();
84         (*it)->detachContextGroup();
85     }
86 }
87
88 void WebGLContextGroup::loseContextGroup(WebGLRenderingContextBase::LostContextMode mode, WebGLRenderingContextBase::AutoRecoveryMethod autoRecoveryMethod)
89 {
90     // Detach must happen before loseContextImpl, which destroys the GraphicsContext3D
91     // and prevents groupObjects from being properly deleted.
92     detachAndRemoveAllObjects();
93
94     for (HashSet<WebGLRenderingContextBase*>::iterator it = m_contexts.begin(); it != m_contexts.end(); ++it)
95         (*it)->loseContextImpl(mode, autoRecoveryMethod);
96 }
97
98 } // namespace blink