1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#ifndef UI_GFX_GPU_MEMORY_BUFFER_H_
6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define UI_GFX_GPU_MEMORY_BUFFER_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/memory/shared_memory.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "build/build_config.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/gfx_export.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(USE_X11)
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gfx/x/x11_types.h"
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace gfx {
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)enum GpuMemoryBufferType {
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EMPTY_BUFFER,
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SHARED_MEMORY_BUFFER,
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IO_SURFACE_BUFFER,
224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ANDROID_NATIVE_BUFFER,
234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SURFACE_TEXTURE_BUFFER,
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  X11_PIXMAP_BUFFER,
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  OZONE_NATIVE_BUFFER,
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GPU_MEMORY_BUFFER_TYPE_LAST = OZONE_NATIVE_BUFFER
274ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch};
284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// TODO(alexst): Merge this with GpuMemoryBufferId as part of switchover to
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// the new API for GpuMemoryBuffer allocation when it's done.
314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#if defined(OS_ANDROID)
324ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochstruct SurfaceTextureId {
334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SurfaceTextureId() : primary_id(0), secondary_id(0) {}
344ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SurfaceTextureId(int32 primary_id, int32 secondary_id)
354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      : primary_id(primary_id), secondary_id(secondary_id) {}
364ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  int32 primary_id;
374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  int32 secondary_id;
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
394ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#endif
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct GpuMemoryBufferId {
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GpuMemoryBufferId() : primary_id(0), secondary_id(0) {}
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GpuMemoryBufferId(int32 primary_id, int32 secondary_id)
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      : primary_id(primary_id), secondary_id(secondary_id) {}
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int32 primary_id;
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int32 secondary_id;
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct GFX_EXPORT GpuMemoryBufferHandle {
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GpuMemoryBufferHandle();
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool is_null() const { return type == EMPTY_BUFFER; }
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  GpuMemoryBufferType type;
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::SharedMemoryHandle handle;
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GpuMemoryBufferId global_id;
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_MACOSX)
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 io_surface_id;
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
584ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#if defined(OS_ANDROID)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  long buffer_id;
604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  SurfaceTextureId surface_texture_id;
614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#endif
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(USE_X11)
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  XID pixmap;
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// This interface typically correspond to a type of shared memory that is also
68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// shared with the GPU. A GPU memory buffer can be written to directly by
69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// regular CPU code, but can also be read by the GPU.
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class GFX_EXPORT GpuMemoryBuffer {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  GpuMemoryBuffer();
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual ~GpuMemoryBuffer();
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Maps the buffer into the client's address space so it can be written to by
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // the CPU. This call may block, for instance if the GPU needs to finish
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // accessing the buffer or if CPU caches need to be synchronized. Returns NULL
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // on failure.
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void* Map() = 0;
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Unmaps the buffer. It's illegal to use the pointer returned by Map() after
82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // this has been called.
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Unmap() = 0;
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true iff the buffer is mapped.
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual bool IsMapped() const = 0;
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Returns the stride in bytes for the buffer.
89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual uint32 GetStride() const = 0;
90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Returns a platform specific handle for this buffer.
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual GpuMemoryBufferHandle GetHandle() const = 0;
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace gfx
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif  // UI_GFX_GPU_MEMORY_BUFFER_H_
98