From bc4762be48537d9c4dbd9940c0cacc75899d753d Mon Sep 17 00:00:00 2001 From: vlj Date: Wed, 3 Sep 2014 18:09:17 +0200 Subject: [PATCH 1/5] Use newer cmake in travis and download libGLEW --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a6bd4732b..b7f46447e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,13 +14,13 @@ before_install: # Update repos - sudo apt-get update -qq # Install dependencies - - sudo apt-get install build-essential cmake libogg-dev libvorbis-dev libopenal-dev libxxf86vm-dev libcurl4-openssl-dev libfribidi-dev libbluetooth-dev + - sudo apt-get install build-essential libogg-dev libvorbis-dev libopenal-dev libxxf86vm-dev libcurl4-openssl-dev libfribidi-dev libbluetooth-dev # Install mesa from an other repo (a newer version is required). Quantal is not supported anymore, saucy is only supported till July 2014, # so we try to use trusty (precise which is what traiv uses a too old mesa version which doesn't link) - sudo apt-add-repository "deb http://archive.ubuntu.com/ubuntu trusty main restricted" - sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 3B4FE6ACC0B21F32 - sudo apt-get update -qq - - sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev + - sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev libglew-dev cmake script: # First a debug build: - mkdir build-debug From b63654a40c9840975263ef1ac004ed6afdc6d102 Mon Sep 17 00:00:00 2001 From: vlj Date: Wed, 3 Sep 2014 17:38:14 +0200 Subject: [PATCH 2/5] Detect Glew in CMake --- CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 19ad08fbf..fd6fd4db7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -149,6 +149,10 @@ endif() find_package(OpenGL REQUIRED) include_directories(${OPENGL_INCLUDE_DIR}) +# Glew +find_package(GLEW REQUIRED) +include_directories(${GLEW_INCLUDE_DIR}) + if(UNIX AND NOT APPLE) if(USE_XRANDR) find_package(Xrandr REQUIRED) @@ -269,7 +273,8 @@ target_link_libraries(supertuxkart ${CURL_LIBRARIES} ${OGGVORBIS_LIBRARIES} ${OPENAL_LIBRARY} - ${OPENGL_LIBRARIES}) + ${OPENGL_LIBRARIES} + ${GLEW_LIBRARIES}) if(UNIX AND NOT APPLE) if(USE_XRANDR) From 8da557d1537d6fb11164ad2422392f101da476f1 Mon Sep 17 00:00:00 2001 From: vlj Date: Wed, 3 Sep 2014 17:59:52 +0200 Subject: [PATCH 3/5] Use GLEW for our GL function support. --- src/graphics/gl_headers.hpp | 113 +--------------- src/graphics/glwrap.cpp | 217 ++----------------------------- src/graphics/glwrap.hpp | 4 - src/graphics/gpuparticles.cpp | 1 + src/graphics/irr_driver.cpp | 20 +-- src/graphics/render.cpp | 12 +- src/physics/irr_debug_drawer.hpp | 2 +- 7 files changed, 28 insertions(+), 341 deletions(-) diff --git a/src/graphics/gl_headers.hpp b/src/graphics/gl_headers.hpp index baf7f828e..50069f23f 100644 --- a/src/graphics/gl_headers.hpp +++ b/src/graphics/gl_headers.hpp @@ -1,6 +1,12 @@ #ifndef GL_HEADER_HPP #define GL_HEADER_HPP +#define GLEW_STATIC +extern "C" { +#include +} +#include + #if defined(__APPLE__) # include # include @@ -15,10 +21,7 @@ # include #elif defined(WIN32) # define _WINSOCKAPI_ -// has to be included before gl.h because of WINGDIAPI and APIENTRY definitions # include -# include -# include "../../lib/irrlicht/source/Irrlicht/glext.h" #else #define GL_GLEXT_PROTOTYPES #define DEBUG_OUTPUT_DECLARED @@ -26,115 +29,11 @@ # include #endif -#ifdef WIN32 -extern PFNGLGENTRANSFORMFEEDBACKSPROC glGenTransformFeedbacks; -extern PFNGLBINDTRANSFORMFEEDBACKPROC glBindTransformFeedback; -extern PFNGLDRAWTRANSFORMFEEDBACKPROC glDrawTransformFeedback; -extern PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback; -extern PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback; -extern PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings; -extern PFNGLBINDBUFFERBASEPROC glBindBufferBase; -extern PFNGLGENBUFFERSPROC glGenBuffers; -extern PFNGLBINDBUFFERPROC glBindBuffer; -extern PFNGLBUFFERDATAPROC glBufferData; -extern PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; -extern PFNGLCREATESHADERPROC glCreateShader; -extern PFNGLCOMPILESHADERPROC glCompileShader; -extern PFNGLSHADERSOURCEPROC glShaderSource; -extern PFNGLCREATEPROGRAMPROC glCreateProgram; -extern PFNGLATTACHSHADERPROC glAttachShader; -extern PFNGLLINKPROGRAMPROC glLinkProgram; -extern PFNGLUSEPROGRAMPROC glUseProgram; -extern PFNGLDELETEPROGRAMPROC glDeleteProgram; -extern PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray; -extern PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray; -extern PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation; -extern PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv; -extern PFNGLUNIFORM1FPROC glUniform1f; -extern PFNGLUNIFORM3FPROC glUniform3f; -extern PFNGLUNIFORM1FVPROC glUniform1fv; -extern PFNGLUNIFORM4FVPROC glUniform4fv; -extern PFNGLDELETESHADERPROC glDeleteShader; -extern PFNGLGETSHADERIVPROC glGetShaderiv; -extern PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog; -extern PFNGLACTIVETEXTUREPROC glActiveTexture; -extern PFNGLUNIFORM2FPROC glUniform2f; -extern PFNGLUNIFORM1IPROC glUniform1i; -extern PFNGLUNIFORM3IPROC glUniform3i; -extern PFNGLUNIFORM4IPROC glUniform4i; -extern PFNGLGETPROGRAMIVPROC glGetProgramiv; -extern PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog; -extern PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation; -extern PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation; -extern PFNGLBLENDEQUATIONPROC glBlendEquation; -extern PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor; -extern PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced; -extern PFNGLDRAWELEMENTSBASEVERTEXPROC glDrawElementsBaseVertex; -extern PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced; -extern PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glDrawElementsInstancedBaseVertex; -extern PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glDrawElementsInstancedBaseVertexBaseInstance; -extern PFNGLDRAWELEMENTSINDIRECTPROC glDrawElementsIndirect; -extern PFNGLMULTIDRAWELEMENTSINDIRECTPROC glMultiDrawElementsIndirect; -extern PFNGLDELETEBUFFERSPROC glDeleteBuffers; -extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays; -extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray; -extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays; -extern PFNGLTEXBUFFERPROC glTexBuffer; -extern PFNGLBUFFERSUBDATAPROC glBufferSubData; -extern PFNGLMAPBUFFERPROC glMapBuffer; -extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange; -extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange; -extern PFNGLMEMORYBARRIERPROC glMemoryBarrier; -extern PFNGLBUFFERSTORAGEPROC glBufferStorage; -extern PFNGLUNMAPBUFFERPROC glUnmapBuffer; -extern PFNGLFENCESYNCPROC glFenceSync; -extern PFNGLCLIENTWAITSYNCPROC glClientWaitSync; -extern PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer; -extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; -extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; -extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; -extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; -extern PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture; -extern PFNGLTEXIMAGE3DPROC glTexImage3D; -extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap; -extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; -extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; -extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; -extern PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex; -extern PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding; -extern PFNGLBLENDCOLORPROC glBlendColor; -extern PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D; -extern PFNGLGETCOMPRESSEDTEXIMAGEPROC glGetCompressedTexImage; -extern PFNGLTEXSTORAGE1DPROC glTexStorage1D; -extern PFNGLTEXSTORAGE2DPROC glTexStorage2D; -extern PFNGLTEXSTORAGE3DPROC glTexStorage3D; -extern PFNGLBINDIMAGETEXTUREPROC glBindImageTexture; -extern PFNGLDISPATCHCOMPUTEPROC glDispatchCompute; -extern PFNGLGENSAMPLERSPROC glGenSamplers; -extern PFNGLDELETESAMPLERSPROC glDeleteSamplers; -extern PFNGLBINDSAMPLERPROC glBindSampler; -extern PFNGLSAMPLERPARAMETERFPROC glSamplerParameterf; -extern PFNGLSAMPLERPARAMETERIPROC glSamplerParameteri; -extern PFNGLGETTEXTURESAMPLERHANDLEARBPROC glGetTextureSamplerHandleARB; -extern PFNGLMAKETEXTUREHANDLERESIDENTARBPROC glMakeTextureHandleResidentARB; -extern PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC glMakeTextureHandleNonResidentARB; -extern PFNGLUNIFORMHANDLEUI64ARBPROC glUniformHandleui64ARB; -extern PFNGLISTEXTUREHANDLERESIDENTARBPROC glIsTextureHandleResidentARB; -extern PFNGLVERTEXATTRIBLPOINTERPROC glVertexAttribLPointer; -#ifdef DEBUG -extern PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB; -#endif -#endif - - -#ifdef WIN32 #define Bindless_Texture_Support #define Base_Instance_Support #define Buffer_Storage #define Multi_Draw_Indirect #define Draw_Indirect -#endif - struct DrawElementsIndirectCommand{ GLuint count; diff --git a/src/graphics/glwrap.cpp b/src/graphics/glwrap.cpp index 52f365c3a..15887a8f0 100644 --- a/src/graphics/glwrap.cpp +++ b/src/graphics/glwrap.cpp @@ -6,105 +6,8 @@ #include "utils/cpp2011.hpp" #include "graphics/stkmesh.hpp" -#ifdef _IRR_WINDOWS_API_ -#define IRR_OGL_LOAD_EXTENSION(X) wglGetProcAddress(reinterpret_cast(X)) -PFNGLGENTRANSFORMFEEDBACKSPROC glGenTransformFeedbacks; -PFNGLBINDTRANSFORMFEEDBACKPROC glBindTransformFeedback; -PFNGLDRAWTRANSFORMFEEDBACKPROC glDrawTransformFeedback; -PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback; -PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback; -PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings; -PFNGLBINDBUFFERBASEPROC glBindBufferBase; -PFNGLGENBUFFERSPROC glGenBuffers; -PFNGLBINDBUFFERPROC glBindBuffer; -PFNGLBUFFERDATAPROC glBufferData; -PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; -PFNGLCREATESHADERPROC glCreateShader; -PFNGLCOMPILESHADERPROC glCompileShader; -PFNGLSHADERSOURCEPROC glShaderSource; -PFNGLCREATEPROGRAMPROC glCreateProgram; -PFNGLATTACHSHADERPROC glAttachShader; -PFNGLLINKPROGRAMPROC glLinkProgram; -PFNGLUSEPROGRAMPROC glUseProgram; -PFNGLDELETEPROGRAMPROC glDeleteProgram; -PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray; -PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray; -PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation; -PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv; -PFNGLUNIFORM1FPROC glUniform1f; -PFNGLUNIFORM3FPROC glUniform3f; -PFNGLDELETESHADERPROC glDeleteShader; -PFNGLGETSHADERIVPROC glGetShaderiv; -PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog; -PFNGLACTIVETEXTUREPROC glActiveTexture; -PFNGLUNIFORM2FPROC glUniform2f; -PFNGLUNIFORM1IPROC glUniform1i; -PFNGLUNIFORM3IPROC glUniform3i; -PFNGLUNIFORM4IPROC glUniform4i; -PFNGLUNIFORM1FVPROC glUniform1fv; -PFNGLUNIFORM4FVPROC glUniform4fv; -PFNGLGETPROGRAMIVPROC glGetProgramiv; -PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog; -PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation; -PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation; -PFNGLBLENDEQUATIONPROC glBlendEquation; -PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor; -PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced; -PFNGLDRAWELEMENTSBASEVERTEXPROC glDrawElementsBaseVertex; -PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glDrawElementsInstancedBaseVertex; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glDrawElementsInstancedBaseVertexBaseInstance; -PFNGLDRAWELEMENTSINDIRECTPROC glDrawElementsIndirect; -PFNGLMULTIDRAWELEMENTSINDIRECTPROC glMultiDrawElementsIndirect; -PFNGLDELETEBUFFERSPROC glDeleteBuffers; -PFNGLGENVERTEXARRAYSPROC glGenVertexArrays; -PFNGLBINDVERTEXARRAYPROC glBindVertexArray; -PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays; -PFNGLTEXBUFFERPROC glTexBuffer; -PFNGLBUFFERSUBDATAPROC glBufferSubData; -PFNGLMAPBUFFERPROC glMapBuffer; -PFNGLMAPBUFFERRANGEPROC glMapBufferRange; -PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange; -PFNGLMEMORYBARRIERPROC glMemoryBarrier; -PFNGLBUFFERSTORAGEPROC glBufferStorage; -PFNGLUNMAPBUFFERPROC glUnmapBuffer; -PFNGLFENCESYNCPROC glFenceSync; -PFNGLCLIENTWAITSYNCPROC glClientWaitSync; -PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer; -PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB; -PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; -PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; -PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; -PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; -PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture; -PFNGLTEXIMAGE3DPROC glTexImage3D; -PFNGLGENERATEMIPMAPPROC glGenerateMipmap; -PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; -PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; -PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; -PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex; -PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding; -PFNGLBLENDCOLORPROC glBlendColor; -PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D; -PFNGLGETCOMPRESSEDTEXIMAGEPROC glGetCompressedTexImage; -PFNGLTEXSTORAGE1DPROC glTexStorage1D; -PFNGLTEXSTORAGE2DPROC glTexStorage2D; -PFNGLTEXSTORAGE3DPROC glTexStorage3D; -PFNGLBINDIMAGETEXTUREPROC glBindImageTexture; -PFNGLDISPATCHCOMPUTEPROC glDispatchCompute; -PFNGLGENSAMPLERSPROC glGenSamplers; -PFNGLDELETESAMPLERSPROC glDeleteSamplers; -PFNGLBINDSAMPLERPROC glBindSampler; -PFNGLSAMPLERPARAMETERFPROC glSamplerParameterf; -PFNGLSAMPLERPARAMETERIPROC glSamplerParameteri; -PFNGLGETSTRINGIPROC glGetStringi; -PFNGLGETTEXTURESAMPLERHANDLEARBPROC glGetTextureSamplerHandleARB; -PFNGLMAKETEXTUREHANDLERESIDENTARBPROC glMakeTextureHandleResidentARB; -PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC glMakeTextureHandleNonResidentARB; -PFNGLUNIFORMHANDLEUI64ARBPROC glUniformHandleui64ARB; -PFNGLISTEXTUREHANDLERESIDENTARBPROC glIsTextureHandleResidentARB; -PFNGLVERTEXATTRIBLPOINTERPROC glVertexAttribLPointer; -#endif + +#include "../../lib/irrlicht/source/Irrlicht/COpenGLTexture.h" static bool is_gl_init = false; @@ -195,106 +98,7 @@ void initGL() if (is_gl_init) return; is_gl_init = true; -#ifdef _IRR_WINDOWS_API_ - glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC)IRR_OGL_LOAD_EXTENSION("glGenTransformFeedbacks"); - glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC)IRR_OGL_LOAD_EXTENSION("glBindTransformFeedback"); - glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC)IRR_OGL_LOAD_EXTENSION("glDrawTransformFeedback"); - glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)IRR_OGL_LOAD_EXTENSION("glBeginTransformFeedback"); - glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)IRR_OGL_LOAD_EXTENSION("glEndTransformFeedback"); - glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)IRR_OGL_LOAD_EXTENSION("glBindBufferBase"); - glGenBuffers = (PFNGLGENBUFFERSPROC)IRR_OGL_LOAD_EXTENSION("glGenBuffers"); - glBindBuffer = (PFNGLBINDBUFFERPROC)IRR_OGL_LOAD_EXTENSION("glBindBuffer"); - glBufferData = (PFNGLBUFFERDATAPROC)IRR_OGL_LOAD_EXTENSION("glBufferData"); - glMapBuffer = (PFNGLMAPBUFFERPROC)IRR_OGL_LOAD_EXTENSION("glMapBuffer"); - glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)IRR_OGL_LOAD_EXTENSION("glMapBufferRange"); - glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)IRR_OGL_LOAD_EXTENSION("glFlushMappedBufferRange"); - glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)IRR_OGL_LOAD_EXTENSION("glMemoryBarrier"); - glBufferStorage = (PFNGLBUFFERSTORAGEPROC)IRR_OGL_LOAD_EXTENSION("glBufferStorage"); - glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)IRR_OGL_LOAD_EXTENSION("glUnmapBuffer"); - glFenceSync = (PFNGLFENCESYNCPROC)IRR_OGL_LOAD_EXTENSION("glFenceSync"); - glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)IRR_OGL_LOAD_EXTENSION("glClientWaitSync"); - glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)IRR_OGL_LOAD_EXTENSION("glVertexAttribPointer"); - glCreateShader = (PFNGLCREATESHADERPROC)IRR_OGL_LOAD_EXTENSION("glCreateShader"); - glCompileShader = (PFNGLCOMPILESHADERPROC)IRR_OGL_LOAD_EXTENSION("glCompileShader"); - glShaderSource = (PFNGLSHADERSOURCEPROC)IRR_OGL_LOAD_EXTENSION("glShaderSource"); - glCreateProgram = (PFNGLCREATEPROGRAMPROC)IRR_OGL_LOAD_EXTENSION("glCreateProgram"); - glAttachShader = (PFNGLATTACHSHADERPROC)IRR_OGL_LOAD_EXTENSION("glAttachShader"); - glLinkProgram = (PFNGLLINKPROGRAMPROC)IRR_OGL_LOAD_EXTENSION("glLinkProgram"); - glUseProgram = (PFNGLUSEPROGRAMPROC)IRR_OGL_LOAD_EXTENSION("glUseProgram"); - glDeleteProgram = (PFNGLDELETEPROGRAMPROC)IRR_OGL_LOAD_EXTENSION("glDeleteProgram"); - glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)IRR_OGL_LOAD_EXTENSION("glEnableVertexAttribArray"); - glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)IRR_OGL_LOAD_EXTENSION("glGetUniformLocation"); - glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)IRR_OGL_LOAD_EXTENSION("glUniformMatrix4fv"); - glUniform1f = (PFNGLUNIFORM1FPROC)IRR_OGL_LOAD_EXTENSION("glUniform1f"); - glUniform3f = (PFNGLUNIFORM3FPROC)IRR_OGL_LOAD_EXTENSION("glUniform3f"); - glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)IRR_OGL_LOAD_EXTENSION("glDisableVertexAttribArray"); - glDeleteShader = (PFNGLDELETESHADERPROC)IRR_OGL_LOAD_EXTENSION("glDeleteShader"); - glGetShaderiv = (PFNGLGETSHADERIVPROC)IRR_OGL_LOAD_EXTENSION("glGetShaderiv"); - glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)IRR_OGL_LOAD_EXTENSION("glGetShaderInfoLog"); - glActiveTexture = (PFNGLACTIVETEXTUREPROC)IRR_OGL_LOAD_EXTENSION("glActiveTexture"); - glUniform2f = (PFNGLUNIFORM2FPROC)IRR_OGL_LOAD_EXTENSION("glUniform2f"); - glUniform4i = (PFNGLUNIFORM4IPROC)IRR_OGL_LOAD_EXTENSION("glUniform4i"); - glUniform3i = (PFNGLUNIFORM3IPROC)IRR_OGL_LOAD_EXTENSION("glUniform3i"); - glUniform1i = (PFNGLUNIFORM1IPROC)IRR_OGL_LOAD_EXTENSION("glUniform1i"); - glGetProgramiv = (PFNGLGETPROGRAMIVPROC)IRR_OGL_LOAD_EXTENSION("glGetProgramiv"); - glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)IRR_OGL_LOAD_EXTENSION("glGetProgramInfoLog"); - glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)IRR_OGL_LOAD_EXTENSION("glTransformFeedbackVaryings"); - glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)IRR_OGL_LOAD_EXTENSION("glGetAttribLocation"); - glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)IRR_OGL_LOAD_EXTENSION("glBindAttribLocation"); - glBlendEquation = (PFNGLBLENDEQUATIONPROC)IRR_OGL_LOAD_EXTENSION("glBlendEquation"); - glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)IRR_OGL_LOAD_EXTENSION("glVertexAttribDivisor"); - glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)IRR_OGL_LOAD_EXTENSION("glDrawArraysInstanced"); - glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)IRR_OGL_LOAD_EXTENSION("glDrawElementsBaseVertex"); - glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)IRR_OGL_LOAD_EXTENSION("glDrawElementsInstanced"); - glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)IRR_OGL_LOAD_EXTENSION("glDrawElementsInstancedBaseVertex"); - glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)IRR_OGL_LOAD_EXTENSION("glDrawElementsInstancedBaseVertexBaseInstance"); - glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC)IRR_OGL_LOAD_EXTENSION("glDrawElementsIndirect"); - glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC)IRR_OGL_LOAD_EXTENSION("glMultiDrawElementsIndirect"); - glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)IRR_OGL_LOAD_EXTENSION("glDeleteBuffers"); - glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)IRR_OGL_LOAD_EXTENSION("glGenVertexArrays"); - glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)IRR_OGL_LOAD_EXTENSION("glBindVertexArray"); - glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)IRR_OGL_LOAD_EXTENSION("glDeleteVertexArrays"); - glTexBuffer = (PFNGLTEXBUFFERPROC)IRR_OGL_LOAD_EXTENSION("glTexBuffer"); - glUniform1fv = (PFNGLUNIFORM1FVPROC)IRR_OGL_LOAD_EXTENSION("glUniform1fv"); - glUniform4fv = (PFNGLUNIFORM4FVPROC)IRR_OGL_LOAD_EXTENSION("glUniform4fv"); - glBufferSubData = (PFNGLBUFFERSUBDATAPROC)IRR_OGL_LOAD_EXTENSION("glBufferSubData"); - glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)IRR_OGL_LOAD_EXTENSION("glVertexAttribIPointer"); - glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)IRR_OGL_LOAD_EXTENSION("glGenFramebuffers"); - glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)IRR_OGL_LOAD_EXTENSION("glDeleteFramebuffers"); - glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)IRR_OGL_LOAD_EXTENSION("glBindFramebuffer"); - glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)IRR_OGL_LOAD_EXTENSION("glFramebufferTexture2D"); - glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)IRR_OGL_LOAD_EXTENSION("glFramebufferTexture"); - glTexImage3D = (PFNGLTEXIMAGE3DPROC)IRR_OGL_LOAD_EXTENSION("glTexImage3D"); - glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)IRR_OGL_LOAD_EXTENSION("glGenerateMipmap"); - glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)IRR_OGL_LOAD_EXTENSION("glCheckFramebufferStatus"); - glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)IRR_OGL_LOAD_EXTENSION("glTexImage2DMultisample"); - glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)IRR_OGL_LOAD_EXTENSION("glBlitFramebuffer"); - glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)IRR_OGL_LOAD_EXTENSION("glGetUniformBlockIndex"); - glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)IRR_OGL_LOAD_EXTENSION("glUniformBlockBinding"); - glBlendColor = (PFNGLBLENDCOLORPROC)IRR_OGL_LOAD_EXTENSION("glBlendColor"); - glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)IRR_OGL_LOAD_EXTENSION("glCompressedTexImage2D"); - glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)IRR_OGL_LOAD_EXTENSION("glGetCompressedTexImage"); - glTexStorage1D = (PFNGLTEXSTORAGE1DPROC)IRR_OGL_LOAD_EXTENSION("glTexStorage1D"); - glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)IRR_OGL_LOAD_EXTENSION("glTexStorage2D"); - glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)IRR_OGL_LOAD_EXTENSION("glTexStorage3D"); - glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)IRR_OGL_LOAD_EXTENSION("glBindImageTexture"); - glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)IRR_OGL_LOAD_EXTENSION("glDispatchCompute"); - glGenSamplers = (PFNGLGENSAMPLERSPROC)IRR_OGL_LOAD_EXTENSION("glGenSamplers"); - glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)IRR_OGL_LOAD_EXTENSION("glDeleteSamplers"); - glBindSampler = (PFNGLBINDSAMPLERPROC)IRR_OGL_LOAD_EXTENSION("glBindSampler"); - glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)IRR_OGL_LOAD_EXTENSION("glSamplerParameterf"); - glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)IRR_OGL_LOAD_EXTENSION("glSamplerParameteri"); - glGetStringi = (PFNGLGETSTRINGIPROC)IRR_OGL_LOAD_EXTENSION("glGetstringi"); - glGetTextureSamplerHandleARB = (PFNGLGETTEXTURESAMPLERHANDLEARBPROC)IRR_OGL_LOAD_EXTENSION("glGetTextureSamplerHandleARB"); - glMakeTextureHandleResidentARB = (PFNGLMAKETEXTUREHANDLERESIDENTARBPROC)IRR_OGL_LOAD_EXTENSION("glMakeTextureHandleResidentARB"); - glMakeTextureHandleNonResidentARB = (PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC)IRR_OGL_LOAD_EXTENSION("glMakeTextureHandleNonResidentARB"); - glUniformHandleui64ARB = (PFNGLUNIFORMHANDLEUI64ARBPROC)IRR_OGL_LOAD_EXTENSION("glUniformHandleui64ARB"); - glIsTextureHandleResidentARB = (PFNGLISTEXTUREHANDLERESIDENTARBPROC)IRR_OGL_LOAD_EXTENSION("glIsTextureHandleResidentARB"); - glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC)IRR_OGL_LOAD_EXTENSION("glVertexAttribLPointer"); -#ifdef DEBUG - glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC)IRR_OGL_LOAD_EXTENSION("glDebugMessageCallbackARB"); -#endif -#endif + glewInit(); #ifdef ARB_DEBUG_OUTPUT if (glDebugMessageCallbackARB) glDebugMessageCallbackARB((GLDEBUGPROCARB)debugCallback, NULL); @@ -930,13 +734,12 @@ ScopedGPUTimer::ScopedGPUTimer(GPUTimer &t) : timer(t) if (profiler.isFrozen()) return; if (!timer.canSubmitQuery) return; #ifdef GL_TIME_ELAPSED - irr::video::COpenGLDriver *gl_driver = (irr::video::COpenGLDriver *)irr_driver->getDevice()->getVideoDriver(); if (!timer.initialised) { - gl_driver->extGlGenQueries(1, &timer.query); + glGenQueries(1, &timer.query); timer.initialised = true; } - gl_driver->extGlBeginQuery(GL_TIME_ELAPSED, timer.query); + glBeginQuery(GL_TIME_ELAPSED, timer.query); #endif } ScopedGPUTimer::~ScopedGPUTimer() @@ -945,8 +748,7 @@ ScopedGPUTimer::~ScopedGPUTimer() if (profiler.isFrozen()) return; if (!timer.canSubmitQuery) return; #ifdef GL_TIME_ELAPSED - irr::video::COpenGLDriver *gl_driver = (irr::video::COpenGLDriver *)irr_driver->getDevice()->getVideoDriver(); - gl_driver->extGlEndQuery(GL_TIME_ELAPSED); + glEndQuery(GL_TIME_ELAPSED); timer.canSubmitQuery = false; #endif } @@ -960,11 +762,10 @@ unsigned GPUTimer::elapsedTimeus() if (!initialised) return 0; GLuint result; - irr::video::COpenGLDriver *gl_driver = (irr::video::COpenGLDriver *)irr_driver->getDevice()->getVideoDriver(); - gl_driver->extGlGetQueryObjectuiv(query, GL_QUERY_RESULT_AVAILABLE, &result); + glGetQueryObjectuiv(query, GL_QUERY_RESULT_AVAILABLE, &result); if (result == GL_FALSE) return lastResult; - gl_driver->extGlGetQueryObjectuiv(query, GL_QUERY_RESULT, &result); + glGetQueryObjectuiv(query, GL_QUERY_RESULT, &result); lastResult = result / 1000; canSubmitQuery = true; return result / 1000; @@ -1023,7 +824,7 @@ void FrameBuffer::Bind() glViewport(0, 0, width, height); irr::video::COpenGLDriver *gl_driver = (irr::video::COpenGLDriver*)irr_driver->getDevice()->getVideoDriver(); GLenum bufs[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 }; - gl_driver->extGlDrawBuffers(RenderTargets.size(), bufs); + glDrawBuffers(RenderTargets.size(), bufs); } void FrameBuffer::Blit(const FrameBuffer &Src, FrameBuffer &Dst, GLbitfield mask, GLenum filter) diff --git a/src/graphics/glwrap.hpp b/src/graphics/glwrap.hpp index 75133a7da..cd4da2a20 100644 --- a/src/graphics/glwrap.hpp +++ b/src/graphics/glwrap.hpp @@ -7,10 +7,6 @@ #include "irr_driver.hpp" #include "utils/log.hpp" -// already includes glext.h, which defines useful GL constants. -// COpenGLDriver has already loaded the extension GL functions we use (e.g glBeginQuery) -#include "../../lib/irrlicht/source/Irrlicht/COpenGLDriver.h" - void initGL(); GLuint LoadTFBProgram(const char * vertex_file_path, const char **varyings, unsigned varyingscount); diff --git a/src/graphics/gpuparticles.cpp b/src/graphics/gpuparticles.cpp index 6108aa0a7..2c7656863 100644 --- a/src/graphics/gpuparticles.cpp +++ b/src/graphics/gpuparticles.cpp @@ -6,6 +6,7 @@ #include #include "guiengine/engine.hpp" #include "graphics/particle_emitter.hpp" +#include "../../lib/irrlicht/source/Irrlicht/os.h" #define COMPONENTCOUNT 8 scene::IParticleSystemSceneNode *ParticleSystemProxy::addParticleNode( diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index 16ff20163..4a5c601a7 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -490,6 +490,7 @@ void IrrDriver::initDevice() m_need_srgb_workaround = true; } m_glsl = (GLMajorVersion > 3 || (GLMajorVersion == 3 && GLMinorVersion >= 1)); + initGL(); // Parse extensions hasVSLayer = false; @@ -499,28 +500,22 @@ void IrrDriver::initDevice() // Default false value for hasVSLayer if --no-graphics argument is used if (!ProfileWorld::isNoGraphics()) { - if (hasGLExtension("GL_AMD_vertex_shader_layer")) { + if (GLEW_AMD_vertex_shader_layer) { hasVSLayer = true; Log::info("GLDriver", "AMD Vertex Shader Layer enabled"); } -#ifdef Buffer_Storage - if (hasGLExtension("GL_ARB_buffer_storage")) { + if (GLEW_ARB_buffer_storage) { hasBuffserStorage = true; Log::info("GLDriver", "ARB Buffer Storage enabled"); } -#endif -#ifdef Base_Instance_Support - if (hasGLExtension("GL_ARB_base_instance")) { + if (GLEW_ARB_base_instance) { hasBaseInstance = true; - Log::info("GLDriver", "ARB Instance enabled"); + Log::info("GLDriver", "ARB Base Instance enabled"); } -#endif -#ifdef Draw_Indirect - if (hasGLExtension("GL_ARB_draw_indirect")) { + if (GLEW_ARB_draw_indirect) { hasDrawIndirect = true; Log::info("GLDriver", "ARB Draw Indirect enabled"); } -#endif } @@ -548,8 +543,7 @@ void IrrDriver::initDevice() m_mrt.clear(); m_mrt.reallocate(2); - irr::video::COpenGLDriver* gl_driver = (irr::video::COpenGLDriver*)m_device->getVideoDriver(); - gl_driver->extGlGenQueries(1, &m_lensflare_query); + glGenQueries(1, &m_lensflare_query); m_query_issued = false; scene::IMesh * const sphere = m_scene_manager->getGeometryCreator()->createSphereMesh(1, 16, 16); diff --git a/src/graphics/render.cpp b/src/graphics/render.cpp index 0850e6f40..336302a8a 100644 --- a/src/graphics/render.cpp +++ b/src/graphics/render.cpp @@ -494,29 +494,25 @@ void IrrDriver::computeSunVisibility() hasgodrays = World::getWorld()->getTrack()->hasGodRays(); } - irr::video::COpenGLDriver* gl_driver = (irr::video::COpenGLDriver*)m_device->getVideoDriver(); - if (UserConfigParams::m_light_shaft && hasgodrays)//hasflare || hasgodrays) + if (UserConfigParams::m_light_shaft && hasgodrays) { GLuint res = 0; if (m_query_issued) - gl_driver->extGlGetQueryObjectuiv(m_lensflare_query, GL_QUERY_RESULT, &res); + glGetQueryObjectuiv(m_lensflare_query, GL_QUERY_RESULT, &res); m_post_processing->setSunPixels(res); // Prepare the query for the next frame. glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - gl_driver->extGlBeginQuery(GL_SAMPLES_PASSED_ARB, m_lensflare_query); + glBeginQuery(GL_SAMPLES_PASSED_ARB, m_lensflare_query); m_scene_manager->setCurrentRendertime(scene::ESNRP_SOLID); m_scene_manager->drawAll(scene::ESNRP_CAMERA); irr_driver->setPhase(GLOW_PASS); m_sun_interposer->render(); - gl_driver->extGlEndQuery(GL_SAMPLES_PASSED_ARB); + glEndQuery(GL_SAMPLES_PASSED_ARB); m_query_issued = true; m_lensflare->setStrength(res / 4000.0f); - if (hasflare) - m_lensflare->OnRegisterSceneNode(); - // Make sure the color mask is reset glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } diff --git a/src/physics/irr_debug_drawer.hpp b/src/physics/irr_debug_drawer.hpp index b384f12bd..6dc54d4ed 100644 --- a/src/physics/irr_debug_drawer.hpp +++ b/src/physics/irr_debug_drawer.hpp @@ -20,8 +20,8 @@ #define HEADER_IRR_DEBUG_DRAWER_HPP #include "btBulletDynamicsCommon.h" -#include "graphics/glwrap.hpp" +#include #include "utils/vec3.hpp" #include #include From d741204ee06733222ca56d65d6dcf6ac4fd9a3aa Mon Sep 17 00:00:00 2001 From: vlj Date: Fri, 5 Sep 2014 18:28:41 +0200 Subject: [PATCH 4/5] Compute shader support detected at runtime. --- src/graphics/irr_driver.cpp | 5 +++++ src/graphics/irr_driver.hpp | 6 ++++++ src/graphics/post_processing.cpp | 12 ++---------- src/graphics/shaders.cpp | 9 +++------ 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index 4a5c601a7..db8b4ad04 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -497,6 +497,7 @@ void IrrDriver::initDevice() hasBaseInstance = false; hasBuffserStorage = false; hasDrawIndirect = false; + hasComputeShaders = false; // Default false value for hasVSLayer if --no-graphics argument is used if (!ProfileWorld::isNoGraphics()) { @@ -516,6 +517,10 @@ void IrrDriver::initDevice() hasDrawIndirect = true; Log::info("GLDriver", "ARB Draw Indirect enabled"); } + if (GLEW_ARB_compute_shader) { + hasComputeShaders = true; + Log::info("GLDriver", "ARB Compute Shader enabled"); + } } diff --git a/src/graphics/irr_driver.hpp b/src/graphics/irr_driver.hpp index 8a233227f..1539227cf 100644 --- a/src/graphics/irr_driver.hpp +++ b/src/graphics/irr_driver.hpp @@ -203,6 +203,7 @@ private: bool hasBaseInstance; bool hasDrawIndirect; bool hasBuffserStorage; + bool hasComputeShaders; bool m_need_ubo_workaround; bool m_need_rh_workaround; bool m_need_srgb_workaround; @@ -324,6 +325,11 @@ public: return hasBuffserStorage; } + bool hasARBComputeShaders() const + { + return hasComputeShaders; + } + video::SColorf getAmbientLight() const; struct GlowData { diff --git a/src/graphics/post_processing.cpp b/src/graphics/post_processing.cpp index fc0e99044..0075fa354 100644 --- a/src/graphics/post_processing.cpp +++ b/src/graphics/post_processing.cpp @@ -337,15 +337,12 @@ void PostProcessing::renderGaussian17TapBlur(FrameBuffer &in_fbo, FrameBuffer &a assert(in_fbo.getWidth() == auxiliary.getWidth() && in_fbo.getHeight() == auxiliary.getHeight()); float inv_width = 1.0f / in_fbo.getWidth(), inv_height = 1.0f / in_fbo.getHeight(); { -#if WIN32 - if (irr_driver->getGLSLVersion() < 430) -#endif + if (irr_driver->hasARBComputeShaders()) { auxiliary.Bind(); FullScreenShader::Gaussian17TapHShader::getInstance()->SetTextureUnits(createVector(in_fbo.getRTT()[0], irr_driver->getFBO(FBO_LINEAR_DEPTH).getRTT()[0])); DrawFullScreenEffect(core::vector2df(inv_width, inv_height)); } -#if WIN32 else { @@ -356,19 +353,15 @@ void PostProcessing::renderGaussian17TapBlur(FrameBuffer &in_fbo, FrameBuffer &a FullScreenShader::ComputeGaussian17TapHShader::getInstance()->setUniforms(); glDispatchCompute(in_fbo.getWidth() / 8, in_fbo.getHeight() / 8, 1); } -#endif } { -#if WIN32 - if (irr_driver->getGLSLVersion() < 430) -#endif + if (irr_driver->hasARBComputeShaders()) { in_fbo.Bind(); FullScreenShader::Gaussian17TapVShader::getInstance()->SetTextureUnits(createVector(auxiliary.getRTT()[0], irr_driver->getFBO(FBO_LINEAR_DEPTH).getRTT()[0])); DrawFullScreenEffect(core::vector2df(inv_width, inv_height)); } -#if WIN32 else { glUseProgram(FullScreenShader::ComputeGaussian17TapVShader::getInstance()->Program); @@ -378,7 +371,6 @@ void PostProcessing::renderGaussian17TapBlur(FrameBuffer &in_fbo, FrameBuffer &a FullScreenShader::ComputeGaussian17TapVShader::getInstance()->setUniforms(); glDispatchCompute(in_fbo.getWidth() / 8, in_fbo.getHeight() / 8, 1); } -#endif } } diff --git a/src/graphics/shaders.cpp b/src/graphics/shaders.cpp index d95ccdf4f..2fe6a267e 100644 --- a/src/graphics/shaders.cpp +++ b/src/graphics/shaders.cpp @@ -1727,8 +1727,8 @@ namespace FullScreenShader ComputeGaussian17TapHShader::ComputeGaussian17TapHShader() { -#if WIN32 - if (irr_driver->getGLSLVersion() < 420) + + if (irr_driver->hasARBComputeShaders()) return; Program = LoadProgram( GL_COMPUTE_SHADER, file_manager->getAsset("shaders/bilateralH.comp").c_str()); @@ -1737,7 +1737,6 @@ namespace FullScreenShader TU_dest = 2; AssignUniforms(); AssignTextureUnit(Program, TexUnit(TU_source, "source"), TexUnit(TU_depth, "depth"), TexUnit(TU_dest, "dest")); -#endif } Gaussian6HBlurShader::Gaussian6HBlurShader() @@ -1772,8 +1771,7 @@ namespace FullScreenShader ComputeGaussian17TapVShader::ComputeGaussian17TapVShader() { -#if WIN32 - if (irr_driver->getGLSLVersion() < 420) + if (irr_driver->hasARBComputeShaders()) return; Program = LoadProgram( GL_COMPUTE_SHADER, file_manager->getAsset("shaders/bilateralV.comp").c_str()); @@ -1781,7 +1779,6 @@ namespace FullScreenShader TU_depth = 1; TU_dest = 2; AssignTextureUnit(Program, TexUnit(TU_source, "source"), TexUnit(TU_depth, "depth"), TexUnit(TU_dest, "dest")); -#endif } Gaussian6VBlurShader::Gaussian6VBlurShader() From 781288bf80873126356f6e2a13b9db2a108b5e23 Mon Sep 17 00:00:00 2001 From: vlj Date: Fri, 5 Sep 2014 18:33:05 +0200 Subject: [PATCH 5/5] Texture storage support detected at runtime. --- src/graphics/irr_driver.cpp | 5 +++++ src/graphics/irr_driver.hpp | 6 ++++++ src/graphics/rtts.cpp | 8 ++------ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index db8b4ad04..493dff0ed 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -498,6 +498,7 @@ void IrrDriver::initDevice() hasBuffserStorage = false; hasDrawIndirect = false; hasComputeShaders = false; + hasTextureStorage = false; // Default false value for hasVSLayer if --no-graphics argument is used if (!ProfileWorld::isNoGraphics()) { @@ -521,6 +522,10 @@ void IrrDriver::initDevice() hasComputeShaders = true; Log::info("GLDriver", "ARB Compute Shader enabled"); } + if (GLEW_ARB_texture_storage) { + hasTextureStorage = true; + Log::info("GLDriver", "ARB Texture Storage enabled"); + } } diff --git a/src/graphics/irr_driver.hpp b/src/graphics/irr_driver.hpp index 1539227cf..f324b1dcd 100644 --- a/src/graphics/irr_driver.hpp +++ b/src/graphics/irr_driver.hpp @@ -204,6 +204,7 @@ private: bool hasDrawIndirect; bool hasBuffserStorage; bool hasComputeShaders; + bool hasTextureStorage; bool m_need_ubo_workaround; bool m_need_rh_workaround; bool m_need_srgb_workaround; @@ -330,6 +331,11 @@ public: return hasComputeShaders; } + bool hasARBTextureStorage() const + { + return hasTextureStorage; + } + video::SColorf getAmbientLight() const; struct GlowData { diff --git a/src/graphics/rtts.cpp b/src/graphics/rtts.cpp index 3cd98bf5a..c37c097fb 100644 --- a/src/graphics/rtts.cpp +++ b/src/graphics/rtts.cpp @@ -29,11 +29,9 @@ static GLuint generateRTT3D(GLenum target, size_t w, size_t h, size_t d, GLint i GLuint result; glGenTextures(1, &result); glBindTexture(target, result); -#if WIN32 - if (irr_driver->getGLSLVersion() >= 420) + if (irr_driver->hasARBTextureStorage()) glTexStorage3D(target, 1, internalFormat, w, h, d); else -#endif glTexImage3D(target, 0, internalFormat, w, h, d, 0, format, type, 0); return result; } @@ -43,11 +41,9 @@ static GLuint generateRTT(const core::dimension2du &res, GLint internalFormat, G GLuint result; glGenTextures(1, &result); glBindTexture(GL_TEXTURE_2D, result); -#if WIN32 - if (irr_driver->getGLSLVersion() >= 420) + if (irr_driver->hasARBTextureStorage()) glTexStorage2D(GL_TEXTURE_2D, mipmaplevel, internalFormat, res.Width, res.Height); else -#endif glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, res.Width, res.Height, 0, format, type, 0); return result; }