11/*
2- * Copyright 2019-2024 Diligent Graphics LLC
2+ * Copyright 2019-2025 Diligent Graphics LLC
33 * Copyright 2015-2019 Egor Yusov
44 *
55 * Licensed under the Apache License, Version 2.0 (the "License");
@@ -192,7 +192,7 @@ class GLBufferObjCreateReleaseHelper
192192private:
193193 GLuint m_ExternalGLBufferHandle;
194194};
195- typedef GLObjWrapper<GLBufferObjCreateReleaseHelper> GLBufferObj ;
195+ using GLBufferObj = GLObjWrapper<GLBufferObjCreateReleaseHelper>;
196196
197197
198198class GLProgramObjCreateReleaseHelper
@@ -204,7 +204,7 @@ class GLProgramObjCreateReleaseHelper
204204 static const char * Name;
205205 static GLenum Type;
206206};
207- typedef GLObjWrapper<GLProgramObjCreateReleaseHelper> GLProgramObj ;
207+ using GLProgramObj = GLObjWrapper<GLProgramObjCreateReleaseHelper>;
208208
209209
210210class GLShaderObjCreateReleaseHelper
@@ -221,7 +221,7 @@ class GLShaderObjCreateReleaseHelper
221221private:
222222 GLenum m_ShaderType;
223223};
224- typedef GLObjWrapper<GLShaderObjCreateReleaseHelper> GLShaderObj ;
224+ using GLShaderObj = GLObjWrapper<GLShaderObjCreateReleaseHelper>;
225225
226226
227227class GLPipelineObjCreateReleaseHelper
@@ -233,7 +233,7 @@ class GLPipelineObjCreateReleaseHelper
233233 static const char * Name;
234234 static GLenum Type;
235235};
236- typedef GLObjWrapper<GLPipelineObjCreateReleaseHelper> GLPipelineObj ;
236+ using GLPipelineObj = GLObjWrapper<GLPipelineObjCreateReleaseHelper>;
237237
238238
239239class GLVAOCreateReleaseHelper
@@ -245,7 +245,7 @@ class GLVAOCreateReleaseHelper
245245 static const char * Name;
246246 static GLenum Type;
247247};
248- typedef GLObjWrapper<GLVAOCreateReleaseHelper> GLVertexArrayObj ;
248+ using GLVertexArrayObj = GLObjWrapper<GLVAOCreateReleaseHelper>;
249249
250250
251251class GLTextureCreateReleaseHelper
@@ -277,7 +277,7 @@ class GLTextureCreateReleaseHelper
277277private:
278278 GLuint m_ExternalGLTextureHandle;
279279};
280- typedef GLObjWrapper<GLTextureCreateReleaseHelper> GLTextureObj ;
280+ using GLTextureObj = GLObjWrapper<GLTextureCreateReleaseHelper>;
281281
282282class GLSamplerCreateReleaseHelper
283283{
@@ -288,7 +288,7 @@ class GLSamplerCreateReleaseHelper
288288 static const char * Name;
289289 static GLenum Type;
290290};
291- typedef GLObjWrapper<GLSamplerCreateReleaseHelper> GLSamplerObj ;
291+ using GLSamplerObj = GLObjWrapper<GLSamplerCreateReleaseHelper>;
292292
293293
294294class GLFBOCreateReleaseHelper
@@ -320,7 +320,71 @@ class GLFBOCreateReleaseHelper
320320private:
321321 GLuint m_ExternalFBOHandle;
322322};
323- typedef GLObjWrapper<GLFBOCreateReleaseHelper> GLFrameBufferObj;
323+
324+ class GLFrameBufferObj : public GLObjWrapper <GLFBOCreateReleaseHelper>
325+ {
326+ public:
327+ using TBase = GLObjWrapper<GLFBOCreateReleaseHelper>;
328+
329+ explicit GLFrameBufferObj (bool CreateObject, GLFBOCreateReleaseHelper CreateReleaseHelper = GLFBOCreateReleaseHelper{}) :
330+ TBase{CreateObject, CreateReleaseHelper}
331+ {}
332+
333+ GLFrameBufferObj (GLFrameBufferObj&& Wrapper) noexcept :
334+ TBase{std::move (Wrapper)},
335+ m_NumDrawBuffers{Wrapper.m_NumDrawBuffers },
336+ m_DrawBuffersMask{Wrapper.m_DrawBuffersMask }
337+ {
338+ Wrapper.m_NumDrawBuffers = 0 ;
339+ Wrapper.m_DrawBuffersMask = 0 ;
340+ }
341+
342+ GLFrameBufferObj& operator =(GLFrameBufferObj&& Wrapper) noexcept
343+ {
344+ TBase::operator =(std::move (Wrapper));
345+
346+ m_NumDrawBuffers = Wrapper.m_NumDrawBuffers ;
347+ m_DrawBuffersMask = Wrapper.m_DrawBuffersMask ;
348+
349+ Wrapper.m_NumDrawBuffers = 0 ;
350+ Wrapper.m_DrawBuffersMask = 0 ;
351+ return *this ;
352+ }
353+
354+ // clang-format off
355+ GLFrameBufferObj (const GLFrameBufferObj&) = delete ;
356+ GLFrameBufferObj& operator =(const GLFrameBufferObj&) = delete ;
357+ // clang-format on
358+
359+ void SetDrawBuffers (uint32_t NumDrawBuffers, uint32_t DrawBuffersMask = ~0u )
360+ {
361+ if (!*this )
362+ return ;
363+
364+ if (NumDrawBuffers == 0 )
365+ return ;
366+
367+ DrawBuffersMask &= (1u << NumDrawBuffers) - 1u ;
368+ if (m_NumDrawBuffers == NumDrawBuffers && m_DrawBuffersMask == DrawBuffersMask)
369+ return ;
370+
371+ m_NumDrawBuffers = NumDrawBuffers;
372+ m_DrawBuffersMask = DrawBuffersMask;
373+
374+ GLenum DrawBuffers[8 ];
375+ VERIFY_EXPR (m_NumDrawBuffers <= _countof (DrawBuffers));
376+ for (uint32_t rt = 0 ; rt < m_NumDrawBuffers; ++rt)
377+ DrawBuffers[rt] = (m_DrawBuffersMask & (1u << rt)) ? GL_COLOR_ATTACHMENT0 + rt : GL_NONE;
378+
379+ // The state set by glDrawBuffers() is part of the state of the framebuffer.
380+ glDrawBuffers (m_NumDrawBuffers, DrawBuffers);
381+ DEV_CHECK_ERR (glGetError () == GL_NO_ERROR, " Failed to set draw buffers via glDrawBuffers()" );
382+ }
383+
384+ private:
385+ uint32_t m_NumDrawBuffers = 0 ;
386+ uint32_t m_DrawBuffersMask = 0 ;
387+ };
324388
325389
326390class GLRBOCreateReleaseHelper
@@ -332,7 +396,7 @@ class GLRBOCreateReleaseHelper
332396 static const char * Name;
333397 static GLenum Type;
334398};
335- typedef GLObjWrapper<GLRBOCreateReleaseHelper> GLRenderBufferObj ;
399+ using GLRenderBufferObj = GLObjWrapper<GLRBOCreateReleaseHelper>;
336400
337401struct GLSyncObj
338402{
@@ -386,6 +450,6 @@ class GLQueryCreateReleaseHelper
386450 static const char * Name;
387451 static GLenum Type;
388452};
389- typedef GLObjWrapper<GLQueryCreateReleaseHelper> GLQueryObj ;
453+ using GLQueryObj = GLObjWrapper<GLQueryCreateReleaseHelper>;
390454
391455} // namespace GLObjectWrappers
0 commit comments