26 #include "UniqueIdentifier.h" 31 template<
class CreateReleaseHelperType>
35 GLObjWrapper(
bool CreateObject, CreateReleaseHelperType CreateReleaseHelper = CreateReleaseHelperType()) :
37 m_CreateReleaseHelper(CreateReleaseHelper)
44 LOG_ERROR_AND_THROW(
"Failed to create ", m_CreateReleaseHelper.Name,
" GL object");
54 GLObjWrapper(GLObjWrapper&& Wrapper) :
55 m_uiHandle(Wrapper.m_uiHandle),
56 m_CreateReleaseHelper(
std::move( Wrapper.m_CreateReleaseHelper ) ),
57 m_UniqueId(
std::move(Wrapper.m_UniqueId) )
59 Wrapper.m_uiHandle = 0;
62 GLObjWrapper& operator = (GLObjWrapper&& Wrapper)
65 m_uiHandle = Wrapper.m_uiHandle;
66 Wrapper.m_uiHandle = 0;
67 m_CreateReleaseHelper = std::move( Wrapper.m_CreateReleaseHelper );
68 m_UniqueId = std::move(Wrapper.m_UniqueId);
74 VERIFY(m_uiHandle == 0,
"GL object is already initialized");
76 m_CreateReleaseHelper.Create(m_uiHandle);
77 VERIFY(m_uiHandle,
"Failed to initialize GL object" );
84 m_CreateReleaseHelper.Release(m_uiHandle);
89 Diligent::UniqueIdentifier GetUniqueID()
const 95 return m_UniqueId.GetID();
98 operator GLuint()
const{
return m_uiHandle;}
101 GLObjWrapper(
const GLObjWrapper&);
102 GLObjWrapper& operator = (
const GLObjWrapper&);
105 CreateReleaseHelperType m_CreateReleaseHelper;
108 Diligent::UniqueIdHelper<CreateReleaseHelperType> m_UniqueId;
111 class GLBufferObjCreateReleaseHelper
114 explicit GLBufferObjCreateReleaseHelper(GLuint ExternalGLBufferHandle = 0) :
115 m_ExternalGLBufferHandle(ExternalGLBufferHandle)
118 void Create(GLuint &BuffObj)
120 if (m_ExternalGLBufferHandle != 0)
121 BuffObj = m_ExternalGLBufferHandle;
123 glGenBuffers(1, &BuffObj);
126 void Release(GLuint BuffObj)
128 if (m_ExternalGLBufferHandle != 0)
129 m_ExternalGLBufferHandle = 0;
131 glDeleteBuffers(1, &BuffObj);
133 static const char *Name;
136 GLuint m_ExternalGLBufferHandle;
138 typedef GLObjWrapper<GLBufferObjCreateReleaseHelper> GLBufferObj;
141 class GLProgramObjCreateReleaseHelper
144 static void Create(GLuint &ProgObj){ ProgObj = glCreateProgram(); }
145 static void Release(GLuint ProgObj){ glDeleteProgram(ProgObj); }
146 static const char *Name;
148 typedef GLObjWrapper<GLProgramObjCreateReleaseHelper> GLProgramObj;
151 class GLShaderObjCreateReleaseHelper
154 GLShaderObjCreateReleaseHelper(GLenum ShaderType) : m_ShaderType(ShaderType){}
155 void Create(GLuint &ShaderObj){ ShaderObj = glCreateShader(m_ShaderType); }
156 void Release(GLuint ShaderObj){ glDeleteShader(ShaderObj); }
157 static const char *Name;
161 typedef GLObjWrapper<GLShaderObjCreateReleaseHelper> GLShaderObj;
164 class GLPipelineObjCreateReleaseHelper
167 void Create(GLuint &Pipeline) { glGenProgramPipelines(1, &Pipeline); }
168 void Release(GLuint Pipeline) { glDeleteProgramPipelines(1, &Pipeline); }
169 static const char *Name;
171 typedef GLObjWrapper<GLPipelineObjCreateReleaseHelper> GLPipelineObj;
174 class GLVAOCreateReleaseHelper
177 void Create(GLuint &VAO) { glGenVertexArrays(1, &VAO); }
178 void Release(GLuint VAO) { glDeleteVertexArrays(1, &VAO); }
179 static const char *Name;
181 typedef GLObjWrapper<GLVAOCreateReleaseHelper> GLVertexArrayObj;
184 class GLTextureCreateReleaseHelper
187 explicit GLTextureCreateReleaseHelper(GLuint ExternalGLTextureHandle = 0) :
188 m_ExternalGLTextureHandle(ExternalGLTextureHandle)
191 void Create(GLuint &Tex)
193 if (m_ExternalGLTextureHandle != 0)
194 Tex = m_ExternalGLTextureHandle;
196 glGenTextures(1, &Tex);
199 void Release(GLuint Tex)
201 if (m_ExternalGLTextureHandle != 0)
202 m_ExternalGLTextureHandle = 0;
204 glDeleteTextures(1, &Tex);
207 static const char *Name;
210 GLuint m_ExternalGLTextureHandle;
212 typedef GLObjWrapper<GLTextureCreateReleaseHelper> GLTextureObj;
214 class GLSamplerCreateReleaseHelper
217 void Create(GLuint &Sampler) { glGenSamplers(1, &Sampler); }
218 void Release(GLuint Sampler) { glDeleteSamplers(1, &Sampler); }
219 static const char *Name;
221 typedef GLObjWrapper<GLSamplerCreateReleaseHelper> GLSamplerObj;
224 class GLFBOCreateReleaseHelper
227 void Create(GLuint &FBO) { glGenFramebuffers(1, &FBO); }
228 void Release(GLuint FBO) { glDeleteFramebuffers(1, &FBO); }
229 static const char *Name;
231 typedef GLObjWrapper<GLFBOCreateReleaseHelper> GLFrameBufferObj;
Definition: GLObjectWrapper.h:28
Definition: AdvancedMath.h:316