1 // Copyright 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 #ifndef UI_GFX_GPU_MEMORY_BUFFER_H_ 6 #define UI_GFX_GPU_MEMORY_BUFFER_H_ 7 8 #include "base/memory/shared_memory.h" 9 #include "build/build_config.h" 10 #include "ui/gfx/gfx_export.h" 11 12 #if defined(OS_ANDROID) 13 #include <third_party/khronos/EGL/egl.h> 14 #endif 15 16 namespace gfx { 17 18 enum GpuMemoryBufferType { 19 EMPTY_BUFFER, 20 SHARED_MEMORY_BUFFER, 21 EGL_CLIENT_BUFFER, 22 IO_SURFACE_BUFFER 23 }; 24 25 struct GpuMemoryBufferHandle { 26 GpuMemoryBufferHandle() 27 : type(EMPTY_BUFFER), 28 handle(base::SharedMemory::NULLHandle()) 29 #if defined(OS_ANDROID) 30 , native_buffer(NULL) 31 #endif 32 #if defined(OS_MACOSX) 33 , io_surface_id(0) 34 #endif 35 { 36 } 37 bool is_null() const { return type == EMPTY_BUFFER; } 38 GpuMemoryBufferType type; 39 base::SharedMemoryHandle handle; 40 #if defined(OS_ANDROID) 41 EGLClientBuffer native_buffer; 42 #endif 43 #if defined(OS_MACOSX) 44 uint32 io_surface_id; 45 #endif 46 47 }; 48 49 // Interface for creating and accessing a zero-copy GPU memory buffer. 50 // This design evolved from the generalization of GraphicBuffer API 51 // of Android framework. 52 // 53 // THREADING CONSIDERATIONS: 54 // 55 // This interface is thread-safe. However, multiple threads mapping 56 // a buffer for Write or ReadOrWrite simultaneously may result in undefined 57 // behavior and is not allowed. 58 class GFX_EXPORT GpuMemoryBuffer { 59 public: 60 enum AccessMode { 61 READ_ONLY, 62 WRITE_ONLY, 63 READ_WRITE, 64 }; 65 66 GpuMemoryBuffer(); 67 virtual ~GpuMemoryBuffer(); 68 69 // Maps the buffer so the client can write the bitmap data in |*vaddr| 70 // subsequently. This call may block, for instance if the hardware needs 71 // to finish rendering or if CPU caches need to be synchronized. 72 virtual void Map(AccessMode mode, void** vaddr) = 0; 73 74 // Unmaps the buffer. Called after all changes to the buffer are 75 // completed. 76 virtual void Unmap() = 0; 77 78 // Returns true iff the buffer is mapped. 79 virtual bool IsMapped() const = 0; 80 81 // Returns the stride in bytes for the buffer. 82 virtual uint32 GetStride() const = 0; 83 84 // Returns a platform specific handle for this buffer. 85 virtual GpuMemoryBufferHandle GetHandle() const = 0; 86 }; 87 88 } // namespace gfx 89 90 #endif // UI_GFX_GPU_MEMORY_BUFFER_H_ 91