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,68 @@ 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 (NumDrawBuffers == 0 )
362+ return ;
363+
364+ DrawBuffersMask &= (1u << NumDrawBuffers) - 1u ;
365+ if (m_NumDrawBuffers == NumDrawBuffers && m_DrawBuffersMask == DrawBuffersMask)
366+ return ;
367+
368+ m_NumDrawBuffers = NumDrawBuffers;
369+ m_DrawBuffersMask = DrawBuffersMask;
370+
371+ GLenum DrawBuffers[8 ];
372+ VERIFY_EXPR (m_NumDrawBuffers <= _countof (DrawBuffers));
373+ for (uint32_t rt = 0 ; rt < m_NumDrawBuffers; ++rt)
374+ DrawBuffers[rt] = (m_DrawBuffersMask & (1u << rt)) ? GL_COLOR_ATTACHMENT0 + rt : GL_NONE;
375+
376+ // The state set by glDrawBuffers() is part of the state of the framebuffer.
377+ glDrawBuffers (m_NumDrawBuffers, DrawBuffers);
378+ DEV_CHECK_ERR (glGetError () == GL_NO_ERROR, " Failed to set draw buffers via glDrawBuffers()" );
379+ }
380+
381+ private:
382+ uint32_t m_NumDrawBuffers = 0 ;
383+ uint32_t m_DrawBuffersMask = 0 ;
384+ };
324385
325386
326387class GLRBOCreateReleaseHelper
@@ -332,7 +393,7 @@ class GLRBOCreateReleaseHelper
332393 static const char * Name;
333394 static GLenum Type;
334395};
335- typedef GLObjWrapper<GLRBOCreateReleaseHelper> GLRenderBufferObj ;
396+ using GLRenderBufferObj = GLObjWrapper<GLRBOCreateReleaseHelper>;
336397
337398struct GLSyncObj
338399{
@@ -386,6 +447,6 @@ class GLQueryCreateReleaseHelper
386447 static const char * Name;
387448 static GLenum Type;
388449};
389- typedef GLObjWrapper<GLQueryCreateReleaseHelper> GLQueryObj ;
450+ using GLQueryObj = GLObjWrapper<GLQueryCreateReleaseHelper>;
390451
391452} // namespace GLObjectWrappers
0 commit comments