1b40a295947823876485de534a95d136bdf3a867
[WebKit-https.git] / Source / WebCore / platform / graphics / gpu / SharedGraphicsContext3D.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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26
27 #include "config.h"
28
29 #include "SharedGraphicsContext3D.h"
30
31 #include "Extensions3D.h"
32 #if PLATFORM(CHROMIUM)
33 #include "GraphicsContext3DPrivate.h"
34 #include <public/Platform.h>
35 #include <public/WebGraphicsContext3D.h>
36 #endif
37 #include <wtf/MainThread.h>
38
39 namespace WebCore {
40
41 class SharedGraphicsContext3DImpl {
42 public:
43     SharedGraphicsContext3DImpl() : m_context(0) { }
44     PassRefPtr<GraphicsContext3D> getOrCreateContext()
45     {
46         bool wasCreated = false;
47
48         // If we lost the context, or can't make it current, create a new one.
49         if (m_context && (!m_context->makeContextCurrent() || (m_context->getExtensions()->getGraphicsResetStatusARB() != GraphicsContext3D::NO_ERROR)))
50             m_context.clear();
51
52         if (!m_context) {
53             createContext();
54             wasCreated = true;
55         }
56
57         if (m_context && !m_context->makeContextCurrent())
58             m_context.clear();
59
60         if (m_context && wasCreated)
61             m_context->getExtensions()->pushGroupMarkerEXT("SharedGraphicsContext");
62         return m_context;
63     }
64
65     PassRefPtr<GraphicsContext3D> getContext()
66     {
67         return m_context;
68     }
69
70     PassRefPtr<GraphicsContext3D> createContext()
71     {
72         GraphicsContext3D::Attributes attributes;
73         attributes.depth = false;
74         attributes.stencil = true;
75         attributes.antialias = false;
76         attributes.shareResources = true;
77         m_context = GraphicsContext3D::create(attributes, 0);
78         return m_context;
79     }
80 private:
81     RefPtr<GraphicsContext3D> m_context;
82 };
83
84 PassRefPtr<GraphicsContext3D> SharedGraphicsContext3D::get()
85 {
86     DEFINE_STATIC_LOCAL(SharedGraphicsContext3DImpl, impl, ());
87     return impl.getOrCreateContext();
88 }
89
90 enum ContextOperation {
91     Get, Create
92 };
93
94 static PassRefPtr<GraphicsContext3D> getOrCreateContextForImplThread(ContextOperation op)
95 {
96     DEFINE_STATIC_LOCAL(SharedGraphicsContext3DImpl, impl, ());
97     return op == Create ? impl.createContext() : impl.getContext();
98 }
99
100 PassRefPtr<GraphicsContext3D> SharedGraphicsContext3D::getForImplThread()
101 {
102     return getOrCreateContextForImplThread(Get);
103 }
104
105 bool SharedGraphicsContext3D::haveForImplThread()
106 {
107     ASSERT(isMainThread());
108     return getOrCreateContextForImplThread(Get);
109 }
110
111 bool SharedGraphicsContext3D::createForImplThread()
112 {
113     ASSERT(isMainThread());
114     return getOrCreateContextForImplThread(Create);
115 }
116
117 }
118