15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/common/gpu/gpu_memory_buffer_factory.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/logging.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gl/gl_image.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gl/gl_image_shared_memory.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gl/gl_image_surface_texture.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace content {
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace {
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory {
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Overridden from GpuMemoryBufferFactory:
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer(
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const gfx::GpuMemoryBufferHandle& handle,
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const gfx::Size& size,
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      unsigned internalformat,
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      unsigned usage) OVERRIDE {
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    NOTREACHED();
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return gfx::GpuMemoryBufferHandle();
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void DestroyGpuMemoryBuffer(
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const gfx::GpuMemoryBufferHandle& handle) OVERRIDE {
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    NOTREACHED();
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual scoped_refptr<gfx::GLImage> CreateImageForGpuMemoryBuffer(
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const gfx::GpuMemoryBufferHandle& handle,
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const gfx::Size& size,
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      unsigned internalformat,
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      int client_id) OVERRIDE {
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    switch (handle.type) {
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      case gfx::SHARED_MEMORY_BUFFER: {
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        scoped_refptr<gfx::GLImageSharedMemory> image(
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            new gfx::GLImageSharedMemory(size, internalformat));
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (!image->Initialize(handle))
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          return NULL;
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return image;
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      }
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      case gfx::SURFACE_TEXTURE_BUFFER: {
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        scoped_refptr<gfx::GLImageSurfaceTexture> image(
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            new gfx::GLImageSurfaceTexture(size));
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (!image->Initialize(handle))
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          return NULL;
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return image;
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      }
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      default:
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        NOTREACHED();
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return scoped_refptr<gfx::GLImage>();
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)scoped_ptr<GpuMemoryBufferFactory> GpuMemoryBufferFactory::Create() {
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return make_scoped_ptr<GpuMemoryBufferFactory>(
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new GpuMemoryBufferFactoryImpl);
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace content
68