Created
April 23, 2019 20:27
-
-
Save VirtuosoChris/c87180ab88afae9e37b004216c4b5d9c to your computer and use it in GitHub Desktop.
glutil.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef VIRTUOSO_GL_UTIL_H_INCLUDED | |
#define VIRTUOSO_GL_UTIL_H_INCLUDED | |
namespace Virtuoso | |
{ | |
namespace GL | |
{ | |
#ifdef GL_ALT_FUNDEF_CopyImageSubDataEXT | |
inline void copyMonoFrameToEyeBuffers(GLint monoTexture, GLint leftEyeTex, GLint rightEyeTex, GLint rtWidth, GLint rtHeight, unsigned int border=1, bool invalidateAfter=true) | |
{ | |
glCopyImageSubDataEXT( | |
monoTexture, | |
GL_TEXTURE_2D, | |
0, //srclevel | |
border, //srcx | |
border, //srcy | |
0, //srcz | |
leftEyeTex, | |
GL_TEXTURE_2D, | |
0, //dst level | |
border, //dst x | |
border, //dst y | |
0, //dst z | |
rtWidth-2*border, | |
rtHeight-2*border, | |
1); //srcdepth | |
glCopyImageSubDataEXT( | |
monoTexture, | |
GL_TEXTURE_2D, | |
0, //srclevel | |
border, //srcx | |
border, //srcy | |
0, //srcz | |
rightEyeTex, | |
GL_TEXTURE_2D, | |
0, //dst level | |
border, //dst x | |
border, //dst y | |
0, //dst z | |
rtWidth-2*border, | |
rtHeight-2*border, | |
1); //srcdepth | |
#ifdef GL_ALT_FUNDEF_InvalidateFramebuffer | |
if (invalidateAfter) | |
{ | |
// we have copied the eye buffers, so we don't need the side by side framebuffer anymore | |
GLenum invalidateTarget = GL_COLOR_ATTACHMENT0; | |
glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, &invalidateTarget); | |
} | |
#endif | |
} | |
#endif | |
#ifdef GL_ALT_FUNDEF_CopyImageSubDataEXT | |
inline void copySBSFrameToEyeBuffers(GLint sbsTexture, GLint leftEyeTex, GLint rightEyeTex, GLint rtWidth, GLint rtHeight, unsigned int border=1, bool invalidateAfter=true) | |
{ | |
glCopyImageSubDataEXT( | |
sbsTexture, | |
GL_TEXTURE_2D, | |
0, //srclevel | |
border, //srcx | |
border, //srcy | |
0, //srcz | |
leftEyeTex, | |
GL_TEXTURE_2D, | |
0, //dst level | |
border, //dst x | |
border, //dst y | |
0, //dst z | |
rtWidth-2*border, | |
rtHeight-2*border, | |
1); //srcdepth | |
glCopyImageSubDataEXT( | |
sbsTexture, | |
GL_TEXTURE_2D, | |
0, //srclevel | |
rtWidth+border, //srcx | |
border, //srcy | |
0, //srcz | |
rightEyeTex, | |
GL_TEXTURE_2D, | |
0, //dst level | |
border, //dst x | |
border, //dst y | |
0, //dst z | |
rtWidth-2*border, | |
rtHeight-2*border, | |
1); //srcdepth | |
#ifdef GL_ALT_FUNDEF_InvalidateFramebuffer | |
if (invalidateAfter) | |
{ | |
// we have copied the eye buffers, so we don't need the side by side framebuffer anymore | |
GLenum invalidateTarget = GL_COLOR_ATTACHMENT0; | |
glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, &invalidateTarget); | |
} | |
#endif | |
} | |
#endif | |
#ifdef GL_ALT_FUNDEF_CopyImageSubDataEXT | |
inline void copyArrayFrameToEyeBuffers(GLint arrTexture, GLint leftEyeTex, GLint rightEyeTex, GLint rtWidth, GLint rtHeight, unsigned int border=1, bool invalidateAfter=true) | |
{ | |
glCopyImageSubDataEXT( | |
arrTexture, | |
GL_TEXTURE_2D_ARRAY, | |
0, //srclevel | |
border, //srcx | |
border, //srcy | |
0, //srcz | |
leftEyeTex, | |
GL_TEXTURE_2D, | |
0, //dst level | |
border, //dst x | |
border, //dst y | |
0, //dst z | |
rtWidth-2*border, | |
rtHeight-2*border, | |
1); //srcdepth | |
glCopyImageSubDataEXT( | |
arrTexture, | |
GL_TEXTURE_2D_ARRAY, | |
0, //srclevel | |
border, //srcx | |
border, //srcy | |
1, //srcz | |
rightEyeTex, | |
GL_TEXTURE_2D, | |
0, //dst level | |
border, //dst x | |
border, //dst y | |
0, //dst z | |
rtWidth-2*border, | |
rtHeight-2*border, | |
1); //srcdepth | |
#ifdef GL_ALT_FUNDEF_InvalidateFramebuffer | |
if (invalidateAfter) | |
{ | |
// we have copied the eye buffers, so we don't need the side by side framebuffer anymore | |
GLenum invalidateTarget = GL_COLOR_ATTACHMENT0; | |
glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, &invalidateTarget); | |
} | |
#endif | |
} | |
#endif | |
inline std::size_t getSizeGLDataType(GLenum type) | |
{ | |
switch (type) | |
{ | |
case GL_UNSIGNED_INT: return sizeof(GLuint); | |
case GL_INT: return sizeof(GLint); | |
case GL_SHORT: return sizeof(GLshort); | |
case GL_BYTE: return sizeof(GLbyte); | |
case GL_FLOAT: return sizeof(GLfloat); | |
#ifdef GL_HALF_FLOAT | |
case GL_HALF_FLOAT: return sizeof(GLhalf); | |
#endif | |
#ifdef GL_DOUBLE | |
case GL_DOUBLE: return sizeof(GLdouble); | |
#endif | |
#ifdef GL_FIXED | |
case GL_FIXED: return sizeof(GLfixed); | |
#endif | |
case GL_UNSIGNED_SHORT: return sizeof(GLushort); | |
case GL_UNSIGNED_BYTE: return sizeof(GLubyte); | |
default: return 0; | |
} | |
} | |
inline void checkFramebuffer() | |
{ | |
GLenum val; | |
if ((val = glCheckFramebufferStatus(GL_FRAMEBUFFER)) != GL_FRAMEBUFFER_COMPLETE) | |
{ | |
switch (val) | |
{ | |
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: | |
throw std::runtime_error("fbo incomplete attach"); | |
break; | |
#ifdef GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS | |
case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: | |
throw std::runtime_error("fbo incomplete dimensions"); | |
break; | |
#endif | |
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: | |
throw std::runtime_error("fbo incomplete missing"); | |
break; | |
#ifdef GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER | |
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER: | |
throw std::runtime_error("fbo incomplete draw"); | |
break; | |
#endif | |
#ifdef GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER | |
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: | |
throw std::runtime_error("fbo incomplete read buffer"); | |
break; | |
#endif | |
case GL_FRAMEBUFFER_UNSUPPORTED: | |
throw std::runtime_error("fbo framebuffer unsupported"); | |
break; | |
#ifdef GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE | |
case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: | |
throw std::runtime_error("fbo incomplete multisample"); | |
break; | |
#endif | |
#ifdef GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS | |
case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS: | |
throw std::runtime_error("incomplete layer targets"); | |
break; | |
#endif | |
#ifdef GL_FRAMEBUFFER_UNDEFINED | |
case GL_FRAMEBUFFER_UNDEFINED: | |
throw std::runtime_error("fbo undefined"); | |
break; | |
#endif | |
case GL_FRAMEBUFFER_COMPLETE: | |
throw std::runtime_error("fbo complete"); | |
break; | |
} | |
throw std::runtime_error("FBO incomplete"); | |
} | |
} | |
inline int logGLErrors(std::ostream& log) | |
{ | |
int numErrors = 0; | |
log << "\nOpenGL Error Check\n=============================\n"; | |
while (true) | |
{ | |
switch (glGetError()) | |
{ | |
case GL_NO_ERROR: | |
{ | |
if (!numErrors) | |
{ | |
log << "No errors found\n"; | |
} | |
log << std::endl; | |
return numErrors; | |
} | |
case GL_INVALID_ENUM: | |
{ | |
numErrors++; | |
log << "GL_INVALID_ENUM: Enum argument is out of range\n"; | |
break; | |
} | |
case GL_INVALID_VALUE: | |
{ | |
numErrors++; | |
log << "GL_INVALID_VALUE: Numeric value argument out of range\n"; | |
break; | |
} | |
case GL_INVALID_OPERATION: | |
{ | |
numErrors++; | |
log << "GL_INVALID_OPERATION: Operation is invalid in current state\n"; | |
break; | |
} | |
case GL_OUT_OF_MEMORY: | |
{ | |
numErrors++; | |
log << "GL_OUT_OF_MEMORY error\n"; | |
break; | |
} | |
} | |
} | |
} | |
} | |
} | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment