103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file.
403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/common/gpu/client/gpu_memory_buffer_impl_ozone_native_buffer.h"
603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/atomic_sequence_num.h"
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/bind.h"
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/common/gpu/client/gpu_memory_buffer_factory_host.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/gl/gl_bindings.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace content {
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace {
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)base::StaticAtomicSequenceNumber g_next_buffer_id;
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid Noop() {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GpuMemoryBufferCreated(
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::Size& size,
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    unsigned internalformat,
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GpuMemoryBufferImpl::CreationCallback& callback,
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::GpuMemoryBufferHandle& handle) {
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_EQ(gfx::OZONE_NATIVE_BUFFER, handle.type);
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  callback.Run(GpuMemoryBufferImplOzoneNativeBuffer::CreateFromHandle(
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      handle, size, internalformat, base::Bind(&Noop)));
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GpuMemoryBufferCreatedForChildProcess(
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GpuMemoryBufferImpl::AllocationCallback& callback,
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::GpuMemoryBufferHandle& handle) {
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_EQ(gfx::OZONE_NATIVE_BUFFER, handle.type);
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  callback.Run(handle);
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)GpuMemoryBufferImplOzoneNativeBuffer::GpuMemoryBufferImplOzoneNativeBuffer(
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const gfx::Size& size,
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    unsigned internalformat,
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const DestructionCallback& callback,
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::GpuMemoryBufferId& id)
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : GpuMemoryBufferImpl(size, internalformat, callback), id_(id) {
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)GpuMemoryBufferImplOzoneNativeBuffer::~GpuMemoryBufferImplOzoneNativeBuffer() {
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GpuMemoryBufferImplOzoneNativeBuffer::Create(
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::Size& size,
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    unsigned internalformat,
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    unsigned usage,
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int client_id,
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const CreationCallback& callback) {
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::GpuMemoryBufferHandle handle;
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  handle.global_id.primary_id = g_next_buffer_id.GetNext();
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  handle.global_id.secondary_id = client_id;
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  handle.type = gfx::OZONE_NATIVE_BUFFER;
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GpuMemoryBufferFactoryHost::GetInstance()->CreateGpuMemoryBuffer(
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      handle,
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      size,
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      internalformat,
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      usage,
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&GpuMemoryBufferCreated, size, internalformat, callback));
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GpuMemoryBufferImplOzoneNativeBuffer::AllocateForChildProcess(
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const gfx::Size& size,
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    unsigned internalformat,
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    unsigned usage,
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int child_client_id,
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const AllocationCallback& callback) {
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::GpuMemoryBufferHandle handle;
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  handle.global_id.primary_id = g_next_buffer_id.GetNext();
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  handle.global_id.secondary_id = child_client_id;
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  handle.type = gfx::OZONE_NATIVE_BUFFER;
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  GpuMemoryBufferFactoryHost::GetInstance()->CreateGpuMemoryBuffer(
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      handle,
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      size,
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      internalformat,
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      usage,
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&GpuMemoryBufferCreatedForChildProcess, callback));
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<GpuMemoryBufferImpl>
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciGpuMemoryBufferImplOzoneNativeBuffer::CreateFromHandle(
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::GpuMemoryBufferHandle& handle,
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::Size& size,
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    unsigned internalformat,
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const DestructionCallback& callback) {
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(IsFormatSupported(internalformat));
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return make_scoped_ptr<GpuMemoryBufferImpl>(
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new GpuMemoryBufferImplOzoneNativeBuffer(
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          size, internalformat, callback, handle.global_id));
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool GpuMemoryBufferImplOzoneNativeBuffer::IsFormatSupported(
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    unsigned internalformat) {
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  switch (internalformat) {
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case GL_RGBA8_OES:
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case GL_RGB8_OES:
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return true;
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    default:
11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return false;
11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool GpuMemoryBufferImplOzoneNativeBuffer::IsUsageSupported(unsigned usage) {
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  switch (usage) {
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case GL_IMAGE_SCANOUT_CHROMIUM:
12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return true;
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    default:
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return false;
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool GpuMemoryBufferImplOzoneNativeBuffer::IsConfigurationSupported(
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    unsigned internalformat,
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    unsigned usage) {
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return IsFormatSupported(internalformat) && IsUsageSupported(usage);
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void* GpuMemoryBufferImplOzoneNativeBuffer::Map() {
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  NOTREACHED();
13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return NULL;
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void GpuMemoryBufferImplOzoneNativeBuffer::Unmap() {
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  NOTREACHED();
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)uint32 GpuMemoryBufferImplOzoneNativeBuffer::GetStride() const {
14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  NOTREACHED();
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return 0;
14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)gfx::GpuMemoryBufferHandle GpuMemoryBufferImplOzoneNativeBuffer::GetHandle()
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const {
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::GpuMemoryBufferHandle handle;
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  handle.type = gfx::OZONE_NATIVE_BUFFER;
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  handle.global_id = id_;
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return handle;
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace content
156