Diligent Engine  v.2.4.g
GLObjectWrapper.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2019-2021 Diligent Graphics LLC
3  * Copyright 2015-2019 Egor Yusov
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * In no event and under no legal theory, whether in tort (including negligence),
18  * contract, or otherwise, unless required by applicable law (such as deliberate
19  * and grossly negligent acts) or agreed to in writing, shall any Contributor be
20  * liable for any damages, including any direct, indirect, special, incidental,
21  * or consequential damages of any character arising as a result of this License or
22  * out of the use or inability to use the software (including but not limited to damages
23  * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
24  * all other commercial damages or losses), even if such Contributor has been advised
25  * of the possibility of such damages.
26  */
27 
28 #pragma once
29 
30 #include "UniqueIdentifier.hpp"
31 
33 {
34 
35 template <class CreateReleaseHelperType>
37 {
38 public:
39  explicit GLObjWrapper(bool CreateObject, CreateReleaseHelperType CreateReleaseHelper = CreateReleaseHelperType()) :
40  // clang-format off
41  m_uiHandle {0 },
42  m_CreateReleaseHelper{CreateReleaseHelper}
43  // clang-format on
44  {
45  if (CreateObject)
46  {
47  Create();
48  if (!m_uiHandle)
49  {
50  LOG_ERROR_AND_THROW("Failed to create ", m_CreateReleaseHelper.Name, " GL object");
51  }
52  }
53  }
54 
56  {
57  Release();
58  }
59 
60  // clang-format off
61  GLObjWrapper (const GLObjWrapper&) = delete;
62  GLObjWrapper& operator=(const GLObjWrapper&) = delete;
63  // clang-format on
64 
66  // clang-format off
67  m_uiHandle {Wrapper.m_uiHandle },
68  m_CreateReleaseHelper{std::move(Wrapper.m_CreateReleaseHelper)},
69  m_UniqueId {std::move(Wrapper.m_UniqueId) }
70  // clang-format on
71  {
72  Wrapper.m_uiHandle = 0;
73  }
74 
76  {
77  Release();
78 
79  m_uiHandle = Wrapper.m_uiHandle;
80  m_CreateReleaseHelper = std::move(Wrapper.m_CreateReleaseHelper);
81  m_UniqueId = std::move(Wrapper.m_UniqueId);
82 
83  Wrapper.m_uiHandle = 0;
84 
85  return *this;
86  }
87 
88  void Create()
89  {
90  VERIFY(m_uiHandle == 0, "GL object is already initialized");
91  Release();
92  m_CreateReleaseHelper.Create(m_uiHandle);
93  VERIFY(m_uiHandle, "Failed to initialize GL object");
94  }
95 
96  void Release()
97  {
98  if (m_uiHandle)
99  {
100  m_CreateReleaseHelper.Release(m_uiHandle);
101  m_uiHandle = 0;
102  }
103  }
104 
106  {
107  // This unique ID is used to unambiguously identify the object for
108  // tracking purposes.
109  // Niether GL handle nor pointer could be safely used for this purpose
110  // as both GL reuses released handles and the OS reuses released pointers
111  return m_UniqueId.GetID();
112  }
113 
114  operator GLuint() const { return m_uiHandle; }
115 
117  {
118  return GLObjWrapper{false};
119  }
120 
121 private:
122  GLuint m_uiHandle;
123  CreateReleaseHelperType m_CreateReleaseHelper;
124 
125  // Have separate counter for every type of wrappers
127 };
128 
130 {
131 public:
132  explicit GLBufferObjCreateReleaseHelper(GLuint ExternalGLBufferHandle = 0) :
133  m_ExternalGLBufferHandle{ExternalGLBufferHandle}
134  {}
135 
136  void Create(GLuint& BuffObj)
137  {
138  if (m_ExternalGLBufferHandle != 0)
139  BuffObj = m_ExternalGLBufferHandle; // Attach to external GL buffer handle
140  else
141  glGenBuffers(1, &BuffObj);
142  }
143 
144  void Release(GLuint BuffObj)
145  {
146  if (m_ExternalGLBufferHandle != 0)
147  m_ExternalGLBufferHandle = 0; // Detach from external GL buffer. DO NOT delete the buffer
148  else
149  glDeleteBuffers(1, &BuffObj);
150  }
151  static const char* Name;
152 
153 private:
154  GLuint m_ExternalGLBufferHandle;
155 };
157 
158 
160 {
161 public:
162  static void Create(GLuint& ProgObj) { ProgObj = glCreateProgram(); }
163  static void Release(GLuint ProgObj) { glDeleteProgram(ProgObj); }
164 
165  static const char* Name;
166 };
168 
169 
171 {
172 public:
174  m_ShaderType(ShaderType) {}
175  void Create(GLuint& ShaderObj) { ShaderObj = glCreateShader(m_ShaderType); }
176  void Release(GLuint ShaderObj) { glDeleteShader(ShaderObj); }
177 
178  static const char* Name;
179 
180 private:
181  GLenum m_ShaderType;
182 };
184 
185 
187 {
188 public:
189  void Create(GLuint& Pipeline) { glGenProgramPipelines(1, &Pipeline); }
190  void Release(GLuint Pipeline) { glDeleteProgramPipelines(1, &Pipeline); }
191 
192  static const char* Name;
193 };
195 
196 
198 {
199 public:
200  void Create(GLuint& VAO) { glGenVertexArrays(1, &VAO); }
201  void Release(GLuint VAO) { glDeleteVertexArrays(1, &VAO); }
202 
203  static const char* Name;
204 };
206 
207 
209 {
210 public:
211  explicit GLTextureCreateReleaseHelper(GLuint ExternalGLTextureHandle = 0) :
212  m_ExternalGLTextureHandle(ExternalGLTextureHandle)
213  {}
214 
215  void Create(GLuint& Tex)
216  {
217  if (m_ExternalGLTextureHandle != 0)
218  Tex = m_ExternalGLTextureHandle; // Attach to the external texture
219  else
220  glGenTextures(1, &Tex);
221  }
222 
223  void Release(GLuint Tex)
224  {
225  if (m_ExternalGLTextureHandle != 0)
226  m_ExternalGLTextureHandle = 0; // Detach from the external texture. DO NOT delete it!
227  else
228  glDeleteTextures(1, &Tex);
229  }
230 
231  static const char* Name;
232 
233 private:
234  GLuint m_ExternalGLTextureHandle;
235 };
237 
239 {
240 public:
241  void Create(GLuint& Sampler) { glGenSamplers(1, &Sampler); }
242  void Release(GLuint Sampler) { glDeleteSamplers(1, &Sampler); }
243 
244  static const char* Name;
245 };
247 
248 
250 {
251 public:
252  explicit GLFBOCreateReleaseHelper(GLuint ExternalFBOHandle = 0) :
253  m_ExternalFBOHandle(ExternalFBOHandle)
254  {}
255 
256  void Create(GLuint& FBO)
257  {
258  if (m_ExternalFBOHandle != 0)
259  FBO = m_ExternalFBOHandle; // Attach to external FBO handle
260  else
261  glGenFramebuffers(1, &FBO);
262  }
263 
264  void Release(GLuint FBO)
265  {
266  if (m_ExternalFBOHandle != 0)
267  m_ExternalFBOHandle = 0; // DO NOT delete the FBO
268  else
269  glDeleteFramebuffers(1, &FBO);
270  }
271 
272  static const char* Name;
273 
274 private:
275  GLuint m_ExternalFBOHandle;
276 };
278 
279 
281 {
282 public:
283  void Create(GLuint& RBO) { glGenRenderbuffers(1, &RBO); }
284  void Release(GLuint RBO) { glDeleteRenderbuffers(1, &RBO); }
285 
286  static const char* Name;
287 };
289 
290 struct GLSyncObj
291 {
293  GLSyncObj(GLsync _SyncHandle) :
294  SyncHandle{_SyncHandle} {}
295 
296  // clang-format off
297  GLSyncObj (const GLSyncObj&) = delete;
298  GLSyncObj& operator = (const GLSyncObj&) = delete;
299  // clang-format on
300 
302  {
303  SyncHandle = rhs.SyncHandle;
304  rhs.SyncHandle = GLsync{};
305  }
306 
308  {
309  Release();
310  SyncHandle = rhs.SyncHandle;
311  rhs.SyncHandle = GLsync{};
312  return *this;
313  }
314 
315  void Release()
316  {
317  if (SyncHandle != GLsync{})
318  glDeleteSync(SyncHandle);
319  SyncHandle = GLsync{};
320  }
321 
323  {
324  Release();
325  }
326 
327  operator GLsync() const { return SyncHandle; }
328 
329 private:
330  GLsync SyncHandle = {};
331 };
332 
334 {
335 public:
336  void Create(GLuint& Query) { glGenQueries(1, &Query); }
337  void Release(GLuint Query) { glDeleteQueries(1, &Query); }
338 
339  static const char* Name;
340 };
342 
343 } // namespace GLObjectWrappers
GLObjectWrappers::GLShaderObjCreateReleaseHelper::Name
static const char * Name
Definition: GLObjectWrapper.hpp:178
GLObjectWrappers::GLVertexArrayObj
GLObjWrapper< GLVAOCreateReleaseHelper > GLVertexArrayObj
Definition: GLObjectWrapper.hpp:205
GLObjectWrappers::GLFBOCreateReleaseHelper::Release
void Release(GLuint FBO)
Definition: GLObjectWrapper.hpp:264
GLObjectWrappers::GLBufferObjCreateReleaseHelper::Name
static const char * Name
Definition: GLObjectWrapper.hpp:151
GLObjectWrappers::GLShaderObjCreateReleaseHelper::Create
void Create(GLuint &ShaderObj)
Definition: GLObjectWrapper.hpp:175
GLObjectWrappers::GLRBOCreateReleaseHelper::Create
void Create(GLuint &RBO)
Definition: GLObjectWrapper.hpp:283
Diligent::UniqueIdHelper< CreateReleaseHelperType >
LOG_ERROR_AND_THROW
#define LOG_ERROR_AND_THROW(...)
Definition: Errors.hpp:101
GLObjectWrappers::GLVAOCreateReleaseHelper::Release
void Release(GLuint VAO)
Definition: GLObjectWrapper.hpp:201
glGenProgramPipelines
PFNGLGENPROGRAMPIPELINESPROC glGenProgramPipelines
GLObjectWrappers::GLObjWrapper::Release
void Release()
Definition: GLObjectWrapper.hpp:96
GLObjectWrappers::GLSyncObj::GLSyncObj
GLSyncObj()
Definition: GLObjectWrapper.hpp:292
GLObjectWrappers::GLRBOCreateReleaseHelper::Release
void Release(GLuint RBO)
Definition: GLObjectWrapper.hpp:284
GLObjectWrappers::GLObjWrapper::operator=
GLObjWrapper & operator=(const GLObjWrapper &)=delete
GLObjectWrappers::GLSyncObj::~GLSyncObj
~GLSyncObj()
Definition: GLObjectWrapper.hpp:322
GLObjectWrappers::GLTextureCreateReleaseHelper::Create
void Create(GLuint &Tex)
Definition: GLObjectWrapper.hpp:215
GLObjectWrappers::GLShaderObjCreateReleaseHelper
Definition: GLObjectWrapper.hpp:170
GLObjectWrappers::GLPipelineObjCreateReleaseHelper::Release
void Release(GLuint Pipeline)
Definition: GLObjectWrapper.hpp:190
GLObjectWrappers::GLObjWrapper::~GLObjWrapper
~GLObjWrapper()
Definition: GLObjectWrapper.hpp:55
GLObjectWrappers::GLObjWrapper::GetUniqueID
Diligent::UniqueIdentifier GetUniqueID() const
Definition: GLObjectWrapper.hpp:105
GLObjectWrappers::GLBufferObjCreateReleaseHelper::GLBufferObjCreateReleaseHelper
GLBufferObjCreateReleaseHelper(GLuint ExternalGLBufferHandle=0)
Definition: GLObjectWrapper.hpp:132
GLObjectWrappers::GLFBOCreateReleaseHelper::Create
void Create(GLuint &FBO)
Definition: GLObjectWrapper.hpp:256
GLObjectWrappers::GLSyncObj::operator=
GLSyncObj & operator=(const GLSyncObj &)=delete
GLObjectWrappers::GLBufferObjCreateReleaseHelper
Definition: GLObjectWrapper.hpp:129
GLObjectWrappers::GLQueryObj
GLObjWrapper< GLQueryCreateReleaseHelper > GLQueryObj
Definition: GLObjectWrapper.hpp:341
GLObjectWrappers::GLQueryCreateReleaseHelper::Release
void Release(GLuint Query)
Definition: GLObjectWrapper.hpp:337
GLObjectWrappers::GLPipelineObjCreateReleaseHelper::Create
void Create(GLuint &Pipeline)
Definition: GLObjectWrapper.hpp:189
GLObjectWrappers::GLTextureCreateReleaseHelper::Name
static const char * Name
Definition: GLObjectWrapper.hpp:231
GLObjectWrappers::GLObjWrapper::GLObjWrapper
GLObjWrapper(GLObjWrapper &&Wrapper)
Definition: GLObjectWrapper.hpp:65
GLObjectWrappers::GLShaderObjCreateReleaseHelper::Release
void Release(GLuint ShaderObj)
Definition: GLObjectWrapper.hpp:176
GLObjectWrappers::GLSamplerCreateReleaseHelper
Definition: GLObjectWrapper.hpp:238
GLObjectWrappers::GLBufferObjCreateReleaseHelper::Create
void Create(GLuint &BuffObj)
Definition: GLObjectWrapper.hpp:136
GLObjectWrappers
Definition: GLObjectWrapper.hpp:32
GLObjectWrappers::GLPipelineObj
GLObjWrapper< GLPipelineObjCreateReleaseHelper > GLPipelineObj
Definition: GLObjectWrapper.hpp:194
UniqueIdentifier.hpp
GLObjectWrappers::GLBufferObj
GLObjWrapper< GLBufferObjCreateReleaseHelper > GLBufferObj
Definition: GLObjectWrapper.hpp:156
GLObjectWrappers::GLSyncObj::operator=
GLSyncObj & operator=(GLSyncObj &&rhs)
Definition: GLObjectWrapper.hpp:307
GLObjectWrappers::GLTextureCreateReleaseHelper::Release
void Release(GLuint Tex)
Definition: GLObjectWrapper.hpp:223
GLObjectWrappers::GLObjWrapper::Null
static GLObjWrapper Null()
Definition: GLObjectWrapper.hpp:116
GLObjectWrappers::GLVAOCreateReleaseHelper::Name
static const char * Name
Definition: GLObjectWrapper.hpp:203
GLObjectWrappers::GLObjWrapper::operator=
GLObjWrapper & operator=(GLObjWrapper &&Wrapper)
Definition: GLObjectWrapper.hpp:75
GLObjectWrappers::GLVAOCreateReleaseHelper
Definition: GLObjectWrapper.hpp:197
GLObjectWrappers::GLRenderBufferObj
GLObjWrapper< GLRBOCreateReleaseHelper > GLRenderBufferObj
Definition: GLObjectWrapper.hpp:288
GLObjectWrappers::GLBufferObjCreateReleaseHelper::Release
void Release(GLuint BuffObj)
Definition: GLObjectWrapper.hpp:144
Diligent::UniqueIdHelper::GetID
UniqueIdentifier GetID() const noexcept
Definition: UniqueIdentifier.hpp:64
GLObjectWrappers::GLSyncObj::Release
void Release()
Definition: GLObjectWrapper.hpp:315
GLObjectWrappers::GLProgramObj
GLObjWrapper< GLProgramObjCreateReleaseHelper > GLProgramObj
Definition: GLObjectWrapper.hpp:167
GLObjectWrappers::GLSamplerObj
GLObjWrapper< GLSamplerCreateReleaseHelper > GLSamplerObj
Definition: GLObjectWrapper.hpp:246
GLObjectWrappers::GLFrameBufferObj
GLObjWrapper< GLFBOCreateReleaseHelper > GLFrameBufferObj
Definition: GLObjectWrapper.hpp:277
GLObjectWrappers::GLQueryCreateReleaseHelper::Name
static const char * Name
Definition: GLObjectWrapper.hpp:339
GLObjectWrappers::GLPipelineObjCreateReleaseHelper
Definition: GLObjectWrapper.hpp:186
GLObjectWrappers::GLSyncObj::GLSyncObj
GLSyncObj(GLSyncObj &&rhs)
Definition: GLObjectWrapper.hpp:301
GLObjectWrappers::GLTextureObj
GLObjWrapper< GLTextureCreateReleaseHelper > GLTextureObj
Definition: GLObjectWrapper.hpp:236
GLObjectWrappers::GLProgramObjCreateReleaseHelper::Release
static void Release(GLuint ProgObj)
Definition: GLObjectWrapper.hpp:163
GLObjectWrappers::GLProgramObjCreateReleaseHelper::Create
static void Create(GLuint &ProgObj)
Definition: GLObjectWrapper.hpp:162
glDeleteProgramPipelines
PFNGLDELETEPROGRAMPIPELINESPROC glDeleteProgramPipelines
GLObjectWrappers::GLSyncObj
Definition: GLObjectWrapper.hpp:290
GLObjectWrappers::GLObjWrapper
Definition: GLObjectWrapper.hpp:36
GLObjectWrappers::GLSamplerCreateReleaseHelper::Create
void Create(GLuint &Sampler)
Definition: GLObjectWrapper.hpp:241
GLObjectWrappers::GLTextureCreateReleaseHelper
Definition: GLObjectWrapper.hpp:208
GLObjectWrappers::GLPipelineObjCreateReleaseHelper::Name
static const char * Name
Definition: GLObjectWrapper.hpp:192
GLObjectWrappers::GLSamplerCreateReleaseHelper::Release
void Release(GLuint Sampler)
Definition: GLObjectWrapper.hpp:242
GLObjectWrappers::GLProgramObjCreateReleaseHelper
Definition: GLObjectWrapper.hpp:159
VERIFY
#define VERIFY(...)
Definition: DebugUtilities.hpp:76
GLObjectWrappers::GLFBOCreateReleaseHelper::Name
static const char * Name
Definition: GLObjectWrapper.hpp:272
GLObjectWrappers::GLRBOCreateReleaseHelper
Definition: GLObjectWrapper.hpp:280
GLObjectWrappers::GLRBOCreateReleaseHelper::Name
static const char * Name
Definition: GLObjectWrapper.hpp:286
GLObjectWrappers::GLSyncObj::GLSyncObj
GLSyncObj(GLsync _SyncHandle)
Definition: GLObjectWrapper.hpp:293
GLObjectWrappers::GLVAOCreateReleaseHelper::Create
void Create(GLuint &VAO)
Definition: GLObjectWrapper.hpp:200
Diligent::UniqueIdentifier
Int32 UniqueIdentifier
Definition: UniqueIdentifier.hpp:36
GLObjectWrappers::GLQueryCreateReleaseHelper::Create
void Create(GLuint &Query)
Definition: GLObjectWrapper.hpp:336
ShaderType
Uint16 ShaderType
Definition: DXBCUtils.cpp:70
GLObjectWrappers::GLQueryCreateReleaseHelper
Definition: GLObjectWrapper.hpp:333
GLObjectWrappers::GLSamplerCreateReleaseHelper::Name
static const char * Name
Definition: GLObjectWrapper.hpp:244
GLObjectWrappers::GLShaderObjCreateReleaseHelper::GLShaderObjCreateReleaseHelper
GLShaderObjCreateReleaseHelper(GLenum ShaderType)
Definition: GLObjectWrapper.hpp:173
GLObjectWrappers::GLObjWrapper::Create
void Create()
Definition: GLObjectWrapper.hpp:88
GLObjectWrappers::GLObjWrapper::GLObjWrapper
GLObjWrapper(bool CreateObject, CreateReleaseHelperType CreateReleaseHelper=CreateReleaseHelperType())
Definition: GLObjectWrapper.hpp:39
GLObjectWrappers::GLFBOCreateReleaseHelper::GLFBOCreateReleaseHelper
GLFBOCreateReleaseHelper(GLuint ExternalFBOHandle=0)
Definition: GLObjectWrapper.hpp:252
GLObjectWrappers::GLFBOCreateReleaseHelper
Definition: GLObjectWrapper.hpp:249
GLObjectWrappers::GLShaderObj
GLObjWrapper< GLShaderObjCreateReleaseHelper > GLShaderObj
Definition: GLObjectWrapper.hpp:183
GLObjectWrappers::GLProgramObjCreateReleaseHelper::Name
static const char * Name
Definition: GLObjectWrapper.hpp:165
GLObjectWrappers::GLTextureCreateReleaseHelper::GLTextureCreateReleaseHelper
GLTextureCreateReleaseHelper(GLuint ExternalGLTextureHandle=0)
Definition: GLObjectWrapper.hpp:211