Skip to content

Commit f9de166

Browse files
Added GLFrameBufferObj class
1 parent d12429a commit f9de166

File tree

2 files changed

+76
-38
lines changed

2 files changed

+76
-38
lines changed

Graphics/GraphicsEngineOpenGL/include/GLObjectWrapper.hpp

Lines changed: 75 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
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
192192
private:
193193
GLuint m_ExternalGLBufferHandle;
194194
};
195-
typedef GLObjWrapper<GLBufferObjCreateReleaseHelper> GLBufferObj;
195+
using GLBufferObj = GLObjWrapper<GLBufferObjCreateReleaseHelper>;
196196

197197

198198
class 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

210210
class GLShaderObjCreateReleaseHelper
@@ -221,7 +221,7 @@ class GLShaderObjCreateReleaseHelper
221221
private:
222222
GLenum m_ShaderType;
223223
};
224-
typedef GLObjWrapper<GLShaderObjCreateReleaseHelper> GLShaderObj;
224+
using GLShaderObj = GLObjWrapper<GLShaderObjCreateReleaseHelper>;
225225

226226

227227
class 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

239239
class 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

251251
class GLTextureCreateReleaseHelper
@@ -277,7 +277,7 @@ class GLTextureCreateReleaseHelper
277277
private:
278278
GLuint m_ExternalGLTextureHandle;
279279
};
280-
typedef GLObjWrapper<GLTextureCreateReleaseHelper> GLTextureObj;
280+
using GLTextureObj = GLObjWrapper<GLTextureCreateReleaseHelper>;
281281

282282
class 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

294294
class GLFBOCreateReleaseHelper
@@ -320,7 +320,71 @@ class GLFBOCreateReleaseHelper
320320
private:
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

326390
class 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

337401
struct 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

Graphics/GraphicsEngineOpenGL/src/FBOCache.cpp

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -189,33 +189,7 @@ GLObjectWrappers::GLFrameBufferObj FBOCache::CreateFBO(GLContextState& Contex
189189

190190
if (NumRenderTargets > 0)
191191
{
192-
// We now need to set mapping between shader outputs and
193-
// color attachments. This largely redundant step is performed
194-
// by glDrawBuffers()
195-
static constexpr GLenum DrawBuffers[] =
196-
{
197-
GL_COLOR_ATTACHMENT0,
198-
GL_COLOR_ATTACHMENT1,
199-
GL_COLOR_ATTACHMENT2,
200-
GL_COLOR_ATTACHMENT3,
201-
GL_COLOR_ATTACHMENT4,
202-
GL_COLOR_ATTACHMENT5,
203-
GL_COLOR_ATTACHMENT6,
204-
GL_COLOR_ATTACHMENT7,
205-
GL_COLOR_ATTACHMENT8,
206-
GL_COLOR_ATTACHMENT9,
207-
GL_COLOR_ATTACHMENT10,
208-
GL_COLOR_ATTACHMENT11,
209-
GL_COLOR_ATTACHMENT12,
210-
GL_COLOR_ATTACHMENT13,
211-
GL_COLOR_ATTACHMENT14,
212-
GL_COLOR_ATTACHMENT15,
213-
};
214-
215-
// The state set by glDrawBuffers() is part of the state of the framebuffer.
216-
// So it can be set up once and left it set.
217-
glDrawBuffers(NumRenderTargets, DrawBuffers);
218-
DEV_CHECK_GL_ERROR("Failed to set draw buffers via glDrawBuffers()");
192+
FBO.SetDrawBuffers(NumRenderTargets);
219193
}
220194
else if (pDSV == nullptr)
221195
{

0 commit comments

Comments
 (0)