1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-07 03:13:49 +00:00

Add compiler macro to produce backtrace on GL Error for all GL functions

This will also log the function name and the error number when the GL
error happens.
This commit is contained in:
Francisco Zurita 2017-02-12 14:29:18 -05:00 committed by Sergey Lipskiy
parent 6be8376db3
commit ab0e472014
6 changed files with 167 additions and 126 deletions

View File

@ -15,38 +15,53 @@
#endif #endif
#include <GL/glext.h> #include <GL/glext.h>
#include <stdexcept>
#include <sstream>
#include "Log.h"
#ifdef GL_ERROR_DEBUG
#define CHECKED_GL_FUNCTION(proc_name, ...) checked([&]() { proc_name(__VA_ARGS__);}, #proc_name)
#define CHECKED_GL_FUNCTION_WITH_RETURN(proc_name, ReturnType, ...) checkedWithReturn<ReturnType>([&]() { return proc_name(__VA_ARGS__);}, #proc_name)
#else
#define CHECKED_GL_FUNCTION(proc_name, ...) proc_name(__VA_ARGS__)
#define CHECKED_GL_FUNCTION_WITH_RETURN(proc_name, ReturnType, ...) proc_name(__VA_ARGS__)
#endif
#define IS_GL_FUNCTION_VALID(proc_name) g_##proc_name != nullptr
#define GET_GL_FUNCTION(proc_name) g_##proc_name
#ifdef EGL #ifdef EGL
#define glBlendFunc g_glBlendFunc
#define glPixelStorei g_glPixelStorei
#define glClearColor g_glClearColor
#define glCullFace g_glCullFace
#define glDepthFunc g_glDepthFunc
#define glDepthMask g_glDepthMask
#define glDisable g_glDisable
#define glEnable g_glEnable
#define glPolygonOffset g_glPolygonOffset
#define glScissor g_glScissor
#define glViewport g_glViewport
#define glBindTexture g_glBindTexture
#define glTexImage2D g_glTexImage2D
#define glTexParameteri g_glTexParameteri
#define glGetIntegerv g_glGetIntegerv
#define glGetString g_glGetString
#define glReadPixels g_glReadPixels
#define glTexSubImage2D g_glTexSubImage2D
#define glDrawArrays g_glDrawArrays
#define glGetError g_glGetError #define glGetError g_glGetError
#define glDrawElements g_glDrawElements #define glBlendFunc(...) CHECKED_GL_FUNCTION(g_glBlendFunc, __VA_ARGS__)
#define glLineWidth g_glLineWidth #define glPixelStorei(...) CHECKED_GL_FUNCTION(g_glPixelStorei, __VA_ARGS__)
#define glClear g_glClear #define glClearColor(...) CHECKED_GL_FUNCTION(g_glClearColor, __VA_ARGS__)
#define glGetFloatv g_glGetFloatv #define glCullFace(...) CHECKED_GL_FUNCTION(g_glCullFace, __VA_ARGS__)
#define glDeleteTextures g_glDeleteTextures #define glDepthFunc(...) CHECKED_GL_FUNCTION(g_glDepthFunc, __VA_ARGS__)
#define glGenTextures g_glGenTextures #define glDepthMask(...) CHECKED_GL_FUNCTION(g_glDepthMask, __VA_ARGS__)
#define glTexParameterf g_glTexParameterf #define glDisable(...) CHECKED_GL_FUNCTION(g_glDisable, __VA_ARGS__)
#define glActiveTexture g_glActiveTexture #define glEnable(...) CHECKED_GL_FUNCTION(g_glEnable, __VA_ARGS__)
#define glBlendColor g_glBlendColor #define glPolygonOffset(...) CHECKED_GL_FUNCTION(g_glPolygonOffset, __VA_ARGS__)
#define glReadBuffer g_glReadBuffer #define glScissor(...) CHECKED_GL_FUNCTION(g_glScissor, __VA_ARGS__)
#define glViewport(...) CHECKED_GL_FUNCTION(g_glViewport, __VA_ARGS__)
#define glBindTexture(...) CHECKED_GL_FUNCTION(g_glBindTexture, __VA_ARGS__)
#define glTexImage2D(...) CHECKED_GL_FUNCTION(g_glTexImage2D, __VA_ARGS__)
#define glTexParameteri(...) CHECKED_GL_FUNCTION(g_glTexParameteri, __VA_ARGS__)
#define glGetIntegerv(...) CHECKED_GL_FUNCTION(g_glGetIntegerv, __VA_ARGS__)
#define glGetString(...) CHECKED_GL_FUNCTION_WITH_RETURN(g_glGetString, const GLubyte*, __VA_ARGS__)
#define glReadPixels(...) CHECKED_GL_FUNCTION(g_glReadPixels, __VA_ARGS__)
#define glTexSubImage2D(...) CHECKED_GL_FUNCTION(g_glTexSubImage2D, __VA_ARGS__)
#define glDrawArrays(...) CHECKED_GL_FUNCTION(g_glDrawArrays, __VA_ARGS__)
#define glDrawElements(...) CHECKED_GL_FUNCTION(g_glDrawElements, __VA_ARGS__)
#define glLineWidth(...) CHECKED_GL_FUNCTION(g_glLineWidth, __VA_ARGS__)
#define glClear(...) CHECKED_GL_FUNCTION(g_glClear, __VA_ARGS__)
#define glGetFloatv(...) CHECKED_GL_FUNCTION(g_glGetFloatv, __VA_ARGS__)
#define glDeleteTextures(...) CHECKED_GL_FUNCTION(g_glDeleteTextures, __VA_ARGS__)
#define glGenTextures(...) CHECKED_GL_FUNCTION(g_glGenTextures, __VA_ARGS__)
#define glTexParameterf(...) CHECKED_GL_FUNCTION(g_glTexParameterf, __VA_ARGS__)
#define glActiveTexture(...) CHECKED_GL_FUNCTION(g_glActiveTexture, __VA_ARGS__)
#define glBlendColor(...) CHECKED_GL_FUNCTION(g_glBlendColor, __VA_ARGS__)
#define glReadBuffer(...) CHECKED_GL_FUNCTION(g_glReadBuffer, __VA_ARGS__)
extern PFNGLBLENDFUNCPROC g_glBlendFunc; extern PFNGLBLENDFUNCPROC g_glBlendFunc;
extern PFNGLPIXELSTOREIPROC g_glPixelStorei; extern PFNGLPIXELSTOREIPROC g_glPixelStorei;
@ -88,99 +103,99 @@ extern PFNGLACTIVETEXTUREPROC g_glActiveTexture;
extern PFNGLBLENDCOLORPROC g_glBlendColor; extern PFNGLBLENDCOLORPROC g_glBlendColor;
#endif #endif
#define glCreateShader g_glCreateShader #define glCreateShader(...) CHECKED_GL_FUNCTION_WITH_RETURN(g_glCreateShader, GLuint, __VA_ARGS__)
#define glCompileShader g_glCompileShader #define glCompileShader(...) CHECKED_GL_FUNCTION(g_glCompileShader, __VA_ARGS__)
#define glShaderSource g_glShaderSource #define glShaderSource(...) CHECKED_GL_FUNCTION(g_glShaderSource, __VA_ARGS__)
#define glCreateProgram g_glCreateProgram #define glCreateProgram(...) CHECKED_GL_FUNCTION_WITH_RETURN(g_glCreateProgram, GLuint, __VA_ARGS__)
#define glAttachShader g_glAttachShader #define glAttachShader(...) CHECKED_GL_FUNCTION(g_glAttachShader, __VA_ARGS__)
#define glLinkProgram g_glLinkProgram #define glLinkProgram(...) CHECKED_GL_FUNCTION(g_glLinkProgram, __VA_ARGS__)
#define glUseProgram g_glUseProgram #define glUseProgram(...) CHECKED_GL_FUNCTION(g_glUseProgram, __VA_ARGS__)
#define glGetUniformLocation g_glGetUniformLocation #define glGetUniformLocation(...) CHECKED_GL_FUNCTION_WITH_RETURN(g_glGetUniformLocation, GLint, __VA_ARGS__)
#define glUniform1i g_glUniform1i #define glUniform1i(...) CHECKED_GL_FUNCTION(g_glUniform1i, __VA_ARGS__)
#define glUniform1f g_glUniform1f #define glUniform1f(...) CHECKED_GL_FUNCTION(g_glUniform1f, __VA_ARGS__)
#define glUniform2f g_glUniform2f #define glUniform2f(...) CHECKED_GL_FUNCTION(g_glUniform2f, __VA_ARGS__)
#define glUniform2i g_glUniform2i #define glUniform2i(...) CHECKED_GL_FUNCTION(g_glUniform2i, __VA_ARGS__)
#define glUniform4i g_glUniform4i #define glUniform4i(...) CHECKED_GL_FUNCTION(g_glUniform4i, __VA_ARGS__)
#define glUniform4f g_glUniform4f #define glUniform4f(...) CHECKED_GL_FUNCTION(g_glUniform4f, __VA_ARGS__)
#define glUniform3fv g_glUniform3fv #define glUniform3fv(...) CHECKED_GL_FUNCTION(g_glUniform3fv, __VA_ARGS__)
#define glUniform4fv g_glUniform4fv #define glUniform4fv(...) CHECKED_GL_FUNCTION(g_glUniform4fv, __VA_ARGS__)
#define glDetachShader g_glDetachShader #define glDetachShader(...) CHECKED_GL_FUNCTION(g_glDetachShader, __VA_ARGS__)
#define glDeleteShader g_glDeleteShader #define glDeleteShader(...) CHECKED_GL_FUNCTION(g_glDeleteShader, __VA_ARGS__)
#define glDeleteProgram g_glDeleteProgram #define glDeleteProgram(...) CHECKED_GL_FUNCTION(g_glDeleteProgram, __VA_ARGS__)
#define glGetProgramInfoLog g_glGetProgramInfoLog #define glGetProgramInfoLog(...) CHECKED_GL_FUNCTION(g_glGetProgramInfoLog, __VA_ARGS__)
#define glGetShaderInfoLog g_glGetShaderInfoLog #define glGetShaderInfoLog(...) CHECKED_GL_FUNCTION(g_glGetShaderInfoLog, __VA_ARGS__)
#define glGetShaderiv g_glGetShaderiv #define glGetShaderiv(...) CHECKED_GL_FUNCTION(g_glGetShaderiv, __VA_ARGS__)
#define glGetProgramiv g_glGetProgramiv #define glGetProgramiv(...) CHECKED_GL_FUNCTION(g_glGetProgramiv, __VA_ARGS__)
#define glEnableVertexAttribArray g_glEnableVertexAttribArray #define glEnableVertexAttribArray(...) CHECKED_GL_FUNCTION(g_glEnableVertexAttribArray, __VA_ARGS__)
#define glDisableVertexAttribArray g_glDisableVertexAttribArray #define glDisableVertexAttribArray(...) CHECKED_GL_FUNCTION(g_glDisableVertexAttribArray, __VA_ARGS__)
#define glVertexAttribPointer g_glVertexAttribPointer #define glVertexAttribPointer(...) CHECKED_GL_FUNCTION(g_glVertexAttribPointer, __VA_ARGS__)
#define glBindAttribLocation g_glBindAttribLocation #define glBindAttribLocation(...) CHECKED_GL_FUNCTION(g_glBindAttribLocation, __VA_ARGS__)
#define glVertexAttrib1f g_glVertexAttrib1f #define glVertexAttrib1f(...) CHECKED_GL_FUNCTION(g_glVertexAttrib1f, __VA_ARGS__)
#define glVertexAttrib4f g_glVertexAttrib4f #define glVertexAttrib4f(...) CHECKED_GL_FUNCTION(g_glVertexAttrib4f, __VA_ARGS__)
#define glVertexAttrib4fv g_glVertexAttrib4fv #define glVertexAttrib4fv(...) CHECKED_GL_FUNCTION(g_glVertexAttrib4fv, __VA_ARGS__)
#define glDepthRangef g_glDepthRangef #define glDepthRangef(...) CHECKED_GL_FUNCTION(g_glDepthRangef, __VA_ARGS__)
#define glClearDepthf g_glClearDepthf #define glClearDepthf(...) CHECKED_GL_FUNCTION(g_glClearDepthf, __VA_ARGS__)
#define glDrawBuffers g_glDrawBuffers #define glBindBuffer(...) CHECKED_GL_FUNCTION(g_glBindBuffer, __VA_ARGS__)
#define glGenFramebuffers g_glGenFramebuffers #define glBindFramebuffer(...) CHECKED_GL_FUNCTION(g_glBindFramebuffer, __VA_ARGS__)
#define glBindFramebuffer g_glBindFramebuffer #define glBindRenderbuffer(...) CHECKED_GL_FUNCTION(g_glBindRenderbuffer, __VA_ARGS__)
#define glDeleteFramebuffers g_glDeleteFramebuffers #define glDrawBuffers(...) CHECKED_GL_FUNCTION(g_glDrawBuffers, __VA_ARGS__)
#define glFramebufferTexture2D g_glFramebufferTexture2D #define glGenFramebuffers(...) CHECKED_GL_FUNCTION(g_glGenFramebuffers, __VA_ARGS__)
#define glTexImage2DMultisample g_glTexImage2DMultisample #define glDeleteFramebuffers(...) CHECKED_GL_FUNCTION(g_glDeleteFramebuffers, __VA_ARGS__)
#define glTexStorage2DMultisample g_glTexStorage2DMultisample #define glFramebufferTexture2D(...) CHECKED_GL_FUNCTION(g_glFramebufferTexture2D, __VA_ARGS__)
#define glGenRenderbuffers g_glGenRenderbuffers #define glTexImage2DMultisample(...) CHECKED_GL_FUNCTION(g_glTexImage2DMultisample, __VA_ARGS__)
#define glBindRenderbuffer g_glBindRenderbuffer #define glTexStorage2DMultisample(...) CHECKED_GL_FUNCTION(g_glTexStorage2DMultisample, __VA_ARGS__)
#define glRenderbufferStorage g_glRenderbufferStorage #define glGenRenderbuffers(...) CHECKED_GL_FUNCTION(g_glGenRenderbuffers, __VA_ARGS__)
#define glDeleteRenderbuffers g_glDeleteRenderbuffers #define glRenderbufferStorage(...) CHECKED_GL_FUNCTION(g_glRenderbufferStorage, __VA_ARGS__)
#define glFramebufferRenderbuffer g_glFramebufferRenderbuffer #define glDeleteRenderbuffers(...) CHECKED_GL_FUNCTION(g_glDeleteRenderbuffers, __VA_ARGS__)
#define glCheckFramebufferStatus g_glCheckFramebufferStatus #define glFramebufferRenderbuffer(...) CHECKED_GL_FUNCTION(g_glFramebufferRenderbuffer, __VA_ARGS__)
#define glBlitFramebuffer g_glBlitFramebuffer #define glCheckFramebufferStatus(...) CHECKED_GL_FUNCTION_WITH_RETURN(g_glCheckFramebufferStatus, GLenum, __VA_ARGS__)
#define glGenVertexArrays g_glGenVertexArrays #define glBlitFramebuffer(...) CHECKED_GL_FUNCTION(g_glBlitFramebuffer, __VA_ARGS__)
#define glBindVertexArray g_glBindVertexArray #define glGenVertexArrays(...) CHECKED_GL_FUNCTION(g_glGenVertexArrays, __VA_ARGS__)
#define glDeleteVertexArrays g_glDeleteVertexArrays; #define glBindVertexArray(...) CHECKED_GL_FUNCTION(g_glBindVertexArray, __VA_ARGS__)
#define glGenBuffers g_glGenBuffers #define glDeleteVertexArrays(...) CHECKED_GL_FUNCTION(g_glDeleteVertexArrays, __VA_ARGS__);
#define glBindBuffer g_glBindBuffer #define glGenBuffers(...) CHECKED_GL_FUNCTION(g_glGenBuffers, __VA_ARGS__)
#define glBufferData g_glBufferData #define glBufferData(...) CHECKED_GL_FUNCTION(g_glBufferData, __VA_ARGS__)
#define glMapBuffer g_glMapBuffer #define glMapBuffer(...) CHECKED_GL_FUNCTION(g_glMapBuffer, __VA_ARGS__)
#define glMapBufferRange g_glMapBufferRange #define glMapBufferRange(...) CHECKED_GL_FUNCTION_WITH_RETURN(g_glMapBufferRange, void*, __VA_ARGS__)
#define glUnmapBuffer g_glUnmapBuffer #define glUnmapBuffer(...) CHECKED_GL_FUNCTION(g_glUnmapBuffer, __VA_ARGS__)
#define glDeleteBuffers g_glDeleteBuffers #define glDeleteBuffers(...) CHECKED_GL_FUNCTION(g_glDeleteBuffers, __VA_ARGS__)
#define glBindImageTexture g_glBindImageTexture #define glBindImageTexture(...) CHECKED_GL_FUNCTION(g_glBindImageTexture, __VA_ARGS__)
#define glMemoryBarrier g_glMemoryBarrier #define glMemoryBarrier(...) CHECKED_GL_FUNCTION(g_glMemoryBarrier, __VA_ARGS__)
#define glGetStringi g_glGetStringi #define glGetStringi(...) CHECKED_GL_FUNCTION_WITH_RETURN(g_glGetStringi, const GLubyte*, __VA_ARGS__)
#define glInvalidateFramebuffer g_glInvalidateFramebuffer #define glInvalidateFramebuffer(...) CHECKED_GL_FUNCTION(g_glInvalidateFramebuffer, __VA_ARGS__)
#define glBufferStorage g_glBufferStorage #define glBufferStorage(...) CHECKED_GL_FUNCTION(g_glBufferStorage, __VA_ARGS__)
#define glFenceSync g_glFenceSync #define glFenceSync(...) CHECKED_GL_FUNCTION_WITH_RETURN(g_glFenceSync, GLsync, __VA_ARGS__)
#define glClientWaitSync g_glClientWaitSync #define glClientWaitSync(...) CHECKED_GL_FUNCTION(g_glClientWaitSync, __VA_ARGS__)
#define glDeleteSync g_glDeleteSync #define glDeleteSync(...) CHECKED_GL_FUNCTION(g_glDeleteSync, __VA_ARGS__)
#define glGetUniformBlockIndex g_glGetUniformBlockIndex #define glGetUniformBlockIndex(...) CHECKED_GL_FUNCTION(g_glGetUniformBlockIndex, __VA_ARGS__)
#define glUniformBlockBinding g_glUniformBlockBinding #define glUniformBlockBinding(...) CHECKED_GL_FUNCTION(g_glUniformBlockBinding, __VA_ARGS__)
#define glGetActiveUniformBlockiv g_glGetActiveUniformBlockiv #define glGetActiveUniformBlockiv(...) CHECKED_GL_FUNCTION(g_glGetActiveUniformBlockiv, __VA_ARGS__)
#define glGetUniformIndices g_glGetUniformIndices #define glGetUniformIndices(...) CHECKED_GL_FUNCTION(g_glGetUniformIndices, __VA_ARGS__)
#define glGetActiveUniformsiv g_glGetActiveUniformsiv #define glGetActiveUniformsiv(...) CHECKED_GL_FUNCTION(g_glGetActiveUniformsiv, __VA_ARGS__)
#define glBindBufferBase g_glBindBufferBase #define glBindBufferBase(...) CHECKED_GL_FUNCTION(g_glBindBufferBase, __VA_ARGS__)
#define glBufferSubData g_glBufferSubData #define glBufferSubData(...) CHECKED_GL_FUNCTION(g_glBufferSubData, __VA_ARGS__)
#define glGetProgramBinary g_glGetProgramBinary #define glGetProgramBinary(...) CHECKED_GL_FUNCTION(g_glGetProgramBinary, __VA_ARGS__)
#define glProgramBinary g_glProgramBinary #define glProgramBinary(...) CHECKED_GL_FUNCTION(g_glProgramBinary, __VA_ARGS__)
#define glProgramParameteri g_glProgramParameteri #define glProgramParameteri(...) CHECKED_GL_FUNCTION(g_glProgramParameteri, __VA_ARGS__)
#define glTexStorage2D g_glTexStorage2D #define glTexStorage2D(...) CHECKED_GL_FUNCTION(g_glTexStorage2D, __VA_ARGS__)
#define glTextureStorage2D g_glTextureStorage2D #define glTextureStorage2D(...) CHECKED_GL_FUNCTION(g_glTextureStorage2D, __VA_ARGS__)
#define glTextureSubImage2D g_glTextureSubImage2D #define glTextureSubImage2D(...) CHECKED_GL_FUNCTION(g_glTextureSubImage2D, __VA_ARGS__)
#define glTextureStorage2DMultisample g_glTextureStorage2DMultisample #define glTextureStorage2DMultisample(...) CHECKED_GL_FUNCTION(g_glTextureStorage2DMultisample, __VA_ARGS__)
#define glTextureParameteri g_glTextureParameteri #define glTextureParameteri(...) CHECKED_GL_FUNCTION(g_glTextureParameteri, __VA_ARGS__)
#define glTextureParameterf g_glTextureParameterf #define glTextureParameterf(...) CHECKED_GL_FUNCTION(g_glTextureParameterf, __VA_ARGS__)
#define glCreateTextures g_glCreateTextures #define glCreateTextures(...) CHECKED_GL_FUNCTION(g_glCreateTextures, __VA_ARGS__)
#define glCreateBuffers g_glCreateBuffers #define glCreateBuffers(...) CHECKED_GL_FUNCTION(g_glCreateBuffers, __VA_ARGS__)
#define glCreateFramebuffers g_glCreateFramebuffers #define glCreateFramebuffers(...) CHECKED_GL_FUNCTION(g_glCreateFramebuffers, __VA_ARGS__)
#define glNamedFramebufferTexture g_glNamedFramebufferTexture #define glNamedFramebufferTexture(...) CHECKED_GL_FUNCTION(g_glNamedFramebufferTexture, __VA_ARGS__)
#define glDrawElementsBaseVertex g_glDrawElementsBaseVertex #define glDrawElementsBaseVertex(...) CHECKED_GL_FUNCTION(g_glDrawElementsBaseVertex, __VA_ARGS__)
#define glFlushMappedBufferRange g_glFlushMappedBufferRange #define glFlushMappedBufferRange(...) CHECKED_GL_FUNCTION(g_glFlushMappedBufferRange, __VA_ARGS__)
extern PFNGLCREATESHADERPROC g_glCreateShader; extern PFNGLCREATESHADERPROC g_glCreateShader;
extern PFNGLCOMPILESHADERPROC g_glCompileShader; extern PFNGLCOMPILESHADERPROC g_glCompileShader;
@ -278,4 +293,30 @@ extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC g_glFlushMappedBufferRange;
void initGLFunctions(); void initGLFunctions();
template<typename F> void checked(F fn, const char* _functionName)
{
fn();
auto error = glGetError();
if (error != GL_NO_ERROR) {
std::stringstream errorString;
errorString << _functionName << " OpenGL error: 0x" << std::hex << error;
LOG(LOG_ERROR, errorString.str().c_str());
throw std::runtime_error(errorString.str().c_str());
}
}
template<typename R, typename F> R checkedWithReturn(F fn, const char* _functionName)
{
R returnValue = fn();
auto error = glGetError();
if (error != GL_NO_ERROR) {
std::stringstream errorString;
errorString << _functionName << " OpenGL error: 0x" << std::hex << error;
LOG(LOG_ERROR, errorString.str().c_str());
throw std::runtime_error(errorString.str().c_str());
}
return returnValue;
}
#endif // GLFUNCTIONS_H #endif // GLFUNCTIONS_H

View File

@ -139,9 +139,9 @@ void CachedTextureUnpackAlignment::setTextureUnpackAlignment(s32 _param)
/*---------------CachedFunctions-------------*/ /*---------------CachedFunctions-------------*/
CachedFunctions::CachedFunctions(const GLInfo & _glinfo) CachedFunctions::CachedFunctions(const GLInfo & _glinfo)
: m_bindFramebuffer(glBindFramebuffer) : m_bindFramebuffer(GET_GL_FUNCTION(glBindFramebuffer))
, m_bindRenderbuffer(glBindRenderbuffer) , m_bindRenderbuffer(GET_GL_FUNCTION(glBindRenderbuffer))
, m_bindBuffer(glBindBuffer) { , m_bindBuffer(GET_GL_FUNCTION(glBindBuffer)) {
if (_glinfo.isGLESX) { if (_glinfo.isGLESX) {
// Disable parameters, not avalible for GLESX // Disable parameters, not avalible for GLESX
m_enables.emplace(GL_DEPTH_CLAMP, Parameter()); m_enables.emplace(GL_DEPTH_CLAMP, Parameter());

View File

@ -123,11 +123,11 @@ namespace opengl {
Bind m_bind; Bind m_bind;
}; };
typedef CachedBind<decltype(glBindFramebuffer)> CachedBindFramebuffer; typedef CachedBind<decltype(GET_GL_FUNCTION(glBindFramebuffer))> CachedBindFramebuffer;
typedef CachedBind<decltype(glBindRenderbuffer)> CachedBindRenderbuffer; typedef CachedBind<decltype(GET_GL_FUNCTION(glBindRenderbuffer))> CachedBindRenderbuffer;
typedef CachedBind<decltype(glBindBuffer)> CachedBindBuffer; typedef CachedBind<decltype(GET_GL_FUNCTION(glBindBuffer))> CachedBindBuffer;
class CachedBindTexture : public Cached2<graphics::Parameter, graphics::ObjectHandle> class CachedBindTexture : public Cached2<graphics::Parameter, graphics::ObjectHandle>
{ {

View File

@ -216,7 +216,7 @@ s32 ContextImpl::getMaxTextureSize() const
void ContextImpl::bindImageTexture(const graphics::Context::BindImageTextureParameters & _params) void ContextImpl::bindImageTexture(const graphics::Context::BindImageTextureParameters & _params)
{ {
if (glBindImageTexture != nullptr) if (IS_GL_FUNCTION_VALID(glBindImageTexture))
glBindImageTexture(GLuint(_params.imageUnit), GLuint(_params.texture), 0, GL_FALSE, 0, GLenum(_params.accessMode), GLenum(_params.textureFormat)); glBindImageTexture(GLuint(_params.imageUnit), GLuint(_params.texture), 0, GL_FALSE, 0, GLenum(_params.accessMode), GLenum(_params.textureFormat));
} }

View File

@ -34,11 +34,11 @@ void GLInfo::init() {
imageTextures = false; imageTextures = false;
msaa = false; msaa = false;
} else if (isGLESX) { } else if (isGLESX) {
imageTextures = (numericVersion >= 31) && (glBindImageTexture != nullptr); imageTextures = (numericVersion >= 31) && IS_GL_FUNCTION_VALID(glBindImageTexture);
msaa = numericVersion >= 31; msaa = numericVersion >= 31;
} else { } else {
imageTextures = ((numericVersion >= 43) || (Utils::isExtensionSupported(*this, "GL_ARB_shader_image_load_store") && imageTextures = ((numericVersion >= 43) || (Utils::isExtensionSupported(*this, "GL_ARB_shader_image_load_store") &&
Utils::isExtensionSupported(*this, "GL_ARB_compute_shader"))) && (glBindImageTexture != nullptr); Utils::isExtensionSupported(*this, "GL_ARB_compute_shader"))) && IS_GL_FUNCTION_VALID(glBindImageTexture);
msaa = true; msaa = true;
} }
if (!imageTextures && config.frameBufferEmulation.N64DepthCompare != 0) { if (!imageTextures && config.frameBufferEmulation.N64DepthCompare != 0) {

View File

@ -193,7 +193,7 @@ namespace opengl {
} }
if (_params.ImageUnit.isValid()) { if (_params.ImageUnit.isValid()) {
assert(glBindImageTexture != nullptr); assert(IS_GL_FUNCTION_VALID(glBindImageTexture));
glBindImageTexture(GLuint(_params.ImageUnit), GLuint(_params.handle), glBindImageTexture(GLuint(_params.ImageUnit), GLuint(_params.handle),
0, GL_FALSE, GL_FALSE, GL_READ_ONLY, GLuint(_params.internalFormat)); 0, GL_FALSE, GL_FALSE, GL_READ_ONLY, GLuint(_params.internalFormat));
} }
@ -276,7 +276,7 @@ namespace opengl {
_params.data); _params.data);
if (_params.ImageUnit.isValid() && _params.internalFormat.isValid()) { if (_params.ImageUnit.isValid() && _params.internalFormat.isValid()) {
assert(glBindImageTexture != nullptr); assert(IS_GL_FUNCTION_VALID(glBindImageTexture));
glBindImageTexture(GLuint(_params.ImageUnit), GLuint(_params.handle), glBindImageTexture(GLuint(_params.ImageUnit), GLuint(_params.handle),
0, GL_FALSE, GL_FALSE, GL_READ_ONLY, GLuint(_params.internalFormat)); 0, GL_FALSE, GL_FALSE, GL_READ_ONLY, GLuint(_params.internalFormat));
} }