Skip to content

Instantly share code, notes, and snippets.

@VirtuosoChris
Created April 23, 2019 20:27
Show Gist options
  • Save VirtuosoChris/c87180ab88afae9e37b004216c4b5d9c to your computer and use it in GitHub Desktop.
Save VirtuosoChris/c87180ab88afae9e37b004216c4b5d9c to your computer and use it in GitHub Desktop.
glutil.h
#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