Home | History | Annotate | Download | only in gpu
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "webkit/common/gpu/grcontext_for_webgraphicscontext3d.h"
      6 
      7 #include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
      8 #include "third_party/skia/include/gpu/GrContext.h"
      9 #include "third_party/skia/include/gpu/gl/GrGLInterface.h"
     10 
     11 namespace webkit {
     12 namespace gpu {
     13 
     14 static void BindWebGraphicsContext3DGLContextCallback(
     15     const GrGLInterface* interface) {
     16   reinterpret_cast<WebKit::WebGraphicsContext3D*>(
     17       interface->fCallbackData)->makeContextCurrent();
     18 }
     19 
     20 GrContextForWebGraphicsContext3D::GrContextForWebGraphicsContext3D(
     21     WebKit::WebGraphicsContext3D* context3d) {
     22   if (!context3d)
     23     return;
     24 
     25   skia::RefPtr<GrGLInterface> interface = skia::AdoptRef(
     26       context3d->createGrGLInterface());
     27   if (!interface)
     28     return;
     29 
     30   interface->fCallback = BindWebGraphicsContext3DGLContextCallback;
     31   interface->fCallbackData =
     32       reinterpret_cast<GrGLInterfaceCallbackData>(context3d);
     33 
     34   gr_context_ = skia::AdoptRef(GrContext::Create(
     35       kOpenGL_GrBackend,
     36       reinterpret_cast<GrBackendContext>(interface.get())));
     37   if (!gr_context_)
     38     return;
     39 
     40   bool nonzero_allocation = true;
     41   SetMemoryLimit(nonzero_allocation);
     42 }
     43 
     44 GrContextForWebGraphicsContext3D::~GrContextForWebGraphicsContext3D() {
     45   if (gr_context_)
     46     gr_context_->contextDestroyed();
     47 }
     48 
     49 void GrContextForWebGraphicsContext3D::SetMemoryLimit(bool nonzero_allocation) {
     50   if (!gr_context_)
     51     return;
     52 
     53   if (nonzero_allocation) {
     54     // The limit of the number of textures we hold in the GrContext's
     55     // bitmap->texture cache.
     56     static const int kMaxGaneshTextureCacheCount = 2048;
     57     // The limit of the bytes allocated toward textures in the GrContext's
     58     // bitmap->texture cache.
     59     static const size_t kMaxGaneshTextureCacheBytes = 96 * 1024 * 1024;
     60 
     61     gr_context_->setTextureCacheLimits(
     62         kMaxGaneshTextureCacheCount, kMaxGaneshTextureCacheBytes);
     63   } else {
     64     gr_context_->freeGpuResources();
     65     gr_context_->setTextureCacheLimits(0, 0);
     66   }
     67 }
     68 
     69 }  // namespace gpu
     70 }  // namespace webkit
     71