Home | History | Annotate | Download | only in gpu
      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 "core/platform/graphics/gpu/SharedGraphicsContext3D.h"
     30 
     31 #include "core/platform/graphics/Extensions3D.h"
     32 #include "core/platform/graphics/GraphicsContext3D.h"
     33 #include "public/platform/Platform.h"
     34 #include "public/platform/WebGraphicsContext3D.h"
     35 #include "public/platform/WebGraphicsContext3DProvider.h"
     36 #include "wtf/MainThread.h"
     37 
     38 namespace WebCore {
     39 
     40 class SharedGraphicsContext3DImpl {
     41 public:
     42     SharedGraphicsContext3DImpl() : m_context(0) { }
     43 
     44     PassRefPtr<GraphicsContext3D> getOrCreateContext()
     45     {
     46         bool wasCreated = false;
     47 
     48         OwnPtr<WebKit::WebGraphicsContext3DProvider> provider = adoptPtr(WebKit::Platform::current()->createSharedOffscreenGraphicsContext3DProvider());
     49 
     50         WebKit::WebGraphicsContext3D* webContext = 0;
     51         GrContext* grContext = 0;
     52 
     53         if (provider) {
     54             webContext = provider->context3d();
     55             grContext = provider->grContext();
     56         }
     57 
     58         if (webContext && grContext) {
     59             WebKit::WebGraphicsContext3D* oldWebContext = m_context ? m_context->webContext() : 0;
     60             GrContext* oldGrContext = m_context ? m_context->grContext() : 0;
     61             if (webContext != oldWebContext || grContext != oldGrContext)
     62                 m_context.clear();
     63 
     64             if (!m_context) {
     65                 m_context = GraphicsContext3D::createGraphicsContextFromProvider(provider.release());
     66                 wasCreated = true;
     67             }
     68         }
     69 
     70         if (m_context && wasCreated)
     71             m_context->getExtensions()->pushGroupMarkerEXT("SharedGraphicsContext");
     72         return m_context;
     73     }
     74 
     75 private:
     76     RefPtr<GraphicsContext3D> m_context;
     77 };
     78 
     79 PassRefPtr<GraphicsContext3D> SharedGraphicsContext3D::get()
     80 {
     81     DEFINE_STATIC_LOCAL(SharedGraphicsContext3DImpl, impl, ());
     82     return impl.getOrCreateContext();
     83 }
     84 
     85 }  // namespace WebCore
     86 
     87