kodi
GBMUtils.h
1 /*
2  * Copyright (C) 2005-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include <memory>
12 #include <queue>
13 
14 #include <gbm.h>
15 
16 namespace KODI
17 {
18 namespace WINDOWING
19 {
20 namespace GBM
21 {
22 
27 class CGBMUtils
28 {
29 public:
30  CGBMUtils(const CGBMUtils&) = delete;
31  CGBMUtils& operator=(const CGBMUtils&) = delete;
32  CGBMUtils() = default;
33  ~CGBMUtils() = default;
34 
42  bool CreateDevice(int fd);
43 
48  class CGBMDevice
49  {
50  public:
51  CGBMDevice(const CGBMDevice&) = delete;
52  CGBMDevice& operator=(const CGBMDevice&) = delete;
53  explicit CGBMDevice(gbm_device* device);
54  ~CGBMDevice() = default;
55 
67  bool CreateSurface(int width,
68  int height,
69  uint32_t format,
70  const uint64_t* modifiers,
71  const int modifiers_count);
72 
78  gbm_device* Get() const { return m_device; }
79 
85  {
86  public:
87  CGBMSurface(const CGBMSurface&) = delete;
88  CGBMSurface& operator=(const CGBMSurface&) = delete;
89  explicit CGBMSurface(gbm_surface* surface);
90  ~CGBMSurface() = default;
91 
97  gbm_surface* Get() const { return m_surface; }
98 
104  {
105  public:
106  CGBMSurfaceBuffer(const CGBMSurfaceBuffer&) = delete;
107  CGBMSurfaceBuffer& operator=(const CGBMSurfaceBuffer&) = delete;
108  explicit CGBMSurfaceBuffer(gbm_surface* surface);
110 
116  gbm_bo* Get() const { return m_buffer; }
117 
118  private:
119  gbm_surface* m_surface{nullptr};
120  gbm_bo* m_buffer{nullptr};
121  };
122 
129 
130  private:
131  gbm_surface* m_surface{nullptr};
132  std::queue<std::unique_ptr<CGBMSurfaceBuffer>> m_buffers;
133  };
134 
140  CGBMDevice::CGBMSurface& GetSurface() const { return *m_surface; }
141 
142  private:
143  gbm_device* m_device{nullptr};
144 
145  struct CGBMSurfaceDeleter
146  {
147  void operator()(CGBMSurface* p) const
148  {
149  if (p)
150  gbm_surface_destroy(p->Get());
151  }
152  };
153  std::unique_ptr<CGBMSurface, CGBMSurfaceDeleter> m_surface;
154  };
155 
161  CGBMUtils::CGBMDevice& GetDevice() const { return *m_device; }
162 
163 private:
164  struct CGBMDeviceDeleter
165  {
166  void operator()(CGBMDevice* p) const
167  {
168  if (p)
169  gbm_device_destroy(p->Get());
170  }
171  };
172  std::unique_ptr<CGBMDevice, CGBMDeviceDeleter> m_device;
173 };
174 
175 }
176 }
177 }
A wrapper for gbm_surface to allow OOP and RAII.
Definition: GBMUtils.h:84
A wrapper for gbm c classes to allow OOP and RAII.
Definition: GBMUtils.h:27
gbm_bo * Get() const
Get the underlying gbm_bo.
Definition: GBMUtils.h:116
gbm_device * Get() const
Get the underlying gbm_device.
Definition: GBMUtils.h:78
A wrapper for gbm_bo to allow OOP and RAII.
Definition: GBMUtils.h:103
bool CreateDevice(int fd)
Create a gbm device for allocating buffers.
Definition: GBMUtils.cpp:22
Definition: AudioDecoder.h:18
CGBMDevice::CGBMSurface & GetSurface() const
Get the CGBMSurface object.
Definition: GBMUtils.h:140
CGBMSurfaceBuffer & LockFrontBuffer()
Lock the surface&#39;s current front buffer.
Definition: GBMUtils.cpp:78
CGBMUtils::CGBMDevice & GetDevice() const
Get the CGBMDevice object.
Definition: GBMUtils.h:161
A wrapper for gbm_device to allow OOP and RAII.
Definition: GBMUtils.h:48
bool CreateSurface(int width, int height, uint32_t format, const uint64_t *modifiers, const int modifiers_count)
Create a gbm surface.
Definition: GBMUtils.cpp:41
gbm_surface * Get() const
Get the underlying gbm_surface.
Definition: GBMUtils.h:97