15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_image.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h"
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gl/gl_image_android_native_buffer.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/gl/gl_image_shm.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_image_stub.h"
114ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "ui/gl/gl_image_surface_texture.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_implementation.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<GLImage> GLImage::CreateGLImage(gfx::PluginWindowHandle window) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRACE_EVENT0("gpu", "GLImage::CreateGLImage");
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (GetGLImplementation()) {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case kGLImplementationEGLGLES2:
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return NULL;
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case kGLImplementationMockGL:
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return new GLImageStub;
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default:
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTREACHED();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_refptr<GLImage> GLImage::CreateGLImageForGpuMemoryBuffer(
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    gfx::GpuMemoryBufferHandle buffer,
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    gfx::Size size,
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    unsigned internalformat) {
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TRACE_EVENT0("gpu", "GLImage::CreateGLImageForGpuMemoryBuffer");
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (GetGLImplementation()) {
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    case kGLImplementationEGLGLES2:
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      switch (buffer.type) {
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        case SHARED_MEMORY_BUFFER: {
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          scoped_refptr<GLImageShm> image(
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)              new GLImageShm(size, internalformat));
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          if (!image->Initialize(buffer))
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            return NULL;
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          return image;
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        }
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        case ANDROID_NATIVE_BUFFER: {
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          scoped_refptr<GLImageAndroidNativeBuffer> image(
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              new GLImageAndroidNativeBuffer(size));
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          if (!image->Initialize(buffer))
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            return NULL;
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          return image;
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        }
534ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        case SURFACE_TEXTURE_BUFFER: {
544ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          scoped_refptr<GLImageSurfaceTexture> image(
554ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch              new GLImageSurfaceTexture(size));
564ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          if (!image->Initialize(buffer))
574ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch            return NULL;
584ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
594ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch          return image;
604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        }
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        default:
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          NOTREACHED();
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          return NULL;
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kGLImplementationMockGL:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new GLImageStub;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
74