From c949aa46e216213a684920d79d2f623401cf57b7 Mon Sep 17 00:00:00 2001 From: Laura Hermanns Date: Sat, 21 Sep 2024 20:38:13 -0400 Subject: [PATCH] [GL] Enabled GL_EXT_framebuffer_object extension in GL 2.x backend. - Added GL_EXT_framebuffer_object as substitute for GL_ARB_framebuffer_object in GL. - Removed HasNativeVAO(): VAOs are always required in GL 3+, but they are excluded for GL 2.x compatibility profile. --- .../OpenGL/Command/GLCommandExecutor.cpp | 4 +- .../Command/GLImmediateCommandBuffer.cpp | 4 +- .../OpenGL/Ext/GLExtensionRegistry.cpp | 24 +- .../Renderer/OpenGL/Ext/GLExtensionRegistry.h | 6 +- sources/Renderer/OpenGL/GLTypes.cpp | 2 +- sources/Renderer/OpenGL/OpenGL.h | 29 +-- .../OpenGL/Platform/MacOS/MacOSGLExt.h | 207 ++++++------------ .../GLCompat/GLCompatExtensionLoader.cpp | 15 +- .../GLCompat/GLCompatExtensionMapping.h | 118 ++++++++++ .../Profile/GLCompat/GLCompatExtensions.h | 1 + .../GLCompat/GLCompatExtensionsDecl.inl | 5 - .../OpenGL/RenderState/GLStateManager.cpp | 137 ++++++------ .../Renderer/OpenGL/Texture/GLFramebuffer.cpp | 6 +- tests/Testbed/TestbedContext.cpp | 5 + 14 files changed, 292 insertions(+), 271 deletions(-) create mode 100644 sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensionMapping.h diff --git a/sources/Renderer/OpenGL/Command/GLCommandExecutor.cpp b/sources/Renderer/OpenGL/Command/GLCommandExecutor.cpp index 1996a80591..766b45966e 100644 --- a/sources/Renderer/OpenGL/Command/GLCommandExecutor.cpp +++ b/sources/Renderer/OpenGL/Command/GLCommandExecutor.cpp @@ -326,7 +326,7 @@ static std::size_t ExecuteGLCommand(const GLOpcode opcode, const void* pc, GLSta case GLOpcodeDrawArraysInstanced: { auto cmd = reinterpret_cast(pc); - #if !LLGL_GL_ENABLE_OPENGL2X + #if LLGL_GLEXT_DRAW_INSTANCED glDrawArraysInstanced(cmd->mode, cmd->first, cmd->count, cmd->instancecount); #endif return sizeof(*cmd); @@ -370,7 +370,7 @@ static std::size_t ExecuteGLCommand(const GLOpcode opcode, const void* pc, GLSta case GLOpcodeDrawElementsInstanced: { auto cmd = reinterpret_cast(pc); - #if !LLGL_GL_ENABLE_OPENGL2X + #if LLGL_GLEXT_DRAW_INSTANCED glDrawElementsInstanced(cmd->mode, cmd->count, cmd->type, cmd->indices, cmd->instancecount); #endif return sizeof(*cmd); diff --git a/sources/Renderer/OpenGL/Command/GLImmediateCommandBuffer.cpp b/sources/Renderer/OpenGL/Command/GLImmediateCommandBuffer.cpp index 2d75ee4403..b2c3be6551 100644 --- a/sources/Renderer/OpenGL/Command/GLImmediateCommandBuffer.cpp +++ b/sources/Renderer/OpenGL/Command/GLImmediateCommandBuffer.cpp @@ -634,7 +634,7 @@ void GLImmediateCommandBuffer::DrawIndexed(std::uint32_t numIndices, std::uint32 void GLImmediateCommandBuffer::DrawInstanced(std::uint32_t numVertices, std::uint32_t firstVertex, std::uint32_t numInstances) { - #if !LLGL_GL_ENABLE_OPENGL2X + #if LLGL_GLEXT_DRAW_INSTANCED LLGL_FLUSH_MEMORY_BARRIERS(); glDrawArraysInstanced( GetDrawMode(), @@ -661,7 +661,7 @@ void GLImmediateCommandBuffer::DrawInstanced(std::uint32_t numVertices, std::uin void GLImmediateCommandBuffer::DrawIndexedInstanced(std::uint32_t numIndices, std::uint32_t numInstances, std::uint32_t firstIndex) { - #if !LLGL_GL_ENABLE_OPENGL2X + #if LLGL_GLEXT_DRAW_INSTANCED LLGL_FLUSH_MEMORY_BARRIERS(); glDrawElementsInstanced( GetDrawMode(), diff --git a/sources/Renderer/OpenGL/Ext/GLExtensionRegistry.cpp b/sources/Renderer/OpenGL/Ext/GLExtensionRegistry.cpp index 154df33f7d..5de26b870f 100644 --- a/sources/Renderer/OpenGL/Ext/GLExtensionRegistry.cpp +++ b/sources/Renderer/OpenGL/Ext/GLExtensionRegistry.cpp @@ -15,11 +15,28 @@ namespace LLGL static std::array(GLExt::Count)> g_registeredExtensions { { false } }; -void RegisterExtension(GLExt extension) +static void RegisterExtensionInternal(GLExt extension) { g_registeredExtensions[static_cast(extension)] = true; } +void RegisterExtension(GLExt extension) +{ + #if LLGL_GL_ENABLE_OPENGL2X + switch (extension) + { + case GLExt::EXT_framebuffer_object: + RegisterExtensionInternal(GLExt::ARB_framebuffer_object); // Substitute EXT_framebuffer_object with ARB_framebuffer_object + break; + default: + RegisterExtensionInternal(extension); + break; + } + #else // LLGL_GL_ENABLE_OPENGL2X + RegisterExtensionInternal(extension); + #endif // /LLGL_GL_ENABLE_OPENGL2X +} + bool HasExtension(const GLExt extension) { return g_registeredExtensions[static_cast(extension)]; @@ -30,11 +47,6 @@ bool HasNativeSamplers() return HasExtension(GLExt::ARB_sampler_objects); } -bool HasNativeVAO() -{ - return HasExtension(GLExt::ARB_vertex_array_object); -} - } // /namespace LLGL diff --git a/sources/Renderer/OpenGL/Ext/GLExtensionRegistry.h b/sources/Renderer/OpenGL/Ext/GLExtensionRegistry.h index 6580aefe6f..3a0d36a613 100644 --- a/sources/Renderer/OpenGL/Ext/GLExtensionRegistry.h +++ b/sources/Renderer/OpenGL/Ext/GLExtensionRegistry.h @@ -116,6 +116,9 @@ enum class GLExt /* Intel sepcific extensions (INTEL) */ INTEL_conservative_rasterization, // no procedures + /* Substitute extensions for GL 2.x only - do *not* used in HasExtension() calls! */ + EXT_framebuffer_object, + /* Enumeration entry counter */ Count, }; @@ -130,9 +133,6 @@ bool HasExtension(const GLExt extension); // Returns ture if GL_ARB_sampler_objects is supported. Shortcut for 'HasExtension(GLExt::ARB_sampler_objects)'. bool HasNativeSamplers(); -// Returns true if GL_ARB_vertex_array_object is supported. Shortcut for 'HasExtension(GLExt::ARB_vertex_array_object)'. -bool HasNativeVAO(); - } // /namespace LLGL diff --git a/sources/Renderer/OpenGL/GLTypes.cpp b/sources/Renderer/OpenGL/GLTypes.cpp index 49b37c1433..b5f4222a61 100644 --- a/sources/Renderer/OpenGL/GLTypes.cpp +++ b/sources/Renderer/OpenGL/GLTypes.cpp @@ -946,7 +946,7 @@ GLenum ToTextureCubeMap(std::uint32_t arrayLayer) GLenum ToColorAttachment(std::uint32_t attachmentIndex) { - #if !LLGL_GL_ENABLE_OPENGL2X + #if LLGL_GLEXT_FRAMEBUFFER_OBJECT if (attachmentIndex < LLGL_MAX_NUM_COLOR_ATTACHMENTS) { static const GLenum g_drawBuffers[] = diff --git a/sources/Renderer/OpenGL/OpenGL.h b/sources/Renderer/OpenGL/OpenGL.h index 497a7bd619..f5d7740b11 100644 --- a/sources/Renderer/OpenGL/OpenGL.h +++ b/sources/Renderer/OpenGL/OpenGL.h @@ -26,6 +26,10 @@ #else // LLGL_WEBGL +#if GL_ARB_framebuffer_object || GL_EXT_framebuffer_object || GL_ES_VERSION_2_0 || GL_ES_VERSION_3_0 +# define LLGL_GLEXT_FRAMEBUFFER_OBJECT 1 +#endif + #if !LLGL_GL_ENABLE_OPENGL2X #if GL_ARB_vertex_array_object || GL_ES_VERSION_3_0 @@ -36,6 +40,10 @@ # define LLGL_GLEXT_SAMPLER_OBJECTS 1 #endif +#if GL_ARB_draw_instanced || GL_ES_VERSION_3_0 +# define LLGL_GLEXT_DRAW_INSTANCED 1 +#endif + #if GL_ARB_separate_shader_objects || GL_ES_VERSION_3_1 # define LLGL_GLEXT_SEPARATE_SHADER_OBJECTS 1 #elif GL_EXT_separate_shader_objects @@ -195,27 +203,6 @@ # define LLGL_USE_NULL_FRAGMENT_SHADER 1 #endif -#if LLGL_GL_ENABLE_OPENGL2X -# define glGenFramebuffers glGenFramebuffersEXT -# define glDeleteFramebuffers glDeleteFramebuffersEXT -# define glBindFramebuffer glBindFramebufferEXT -# define glBindRenderbuffer glBindRenderbufferEXT -# define glBlitFramebuffer glBlitFramebufferEXT -# define glFramebufferTexture1D glFramebufferTexture1DEXT -# define glFramebufferTexture2D glFramebufferTexture2DEXT -# define glFramebufferTexture3D glFramebufferTexture3DEXT -# define glFramebufferRenderbuffer glFramebufferRenderbufferEXT -# define glCheckFramebufferStatus glCheckFramebufferStatusEXT -# define glGenRenderbuffers glGenRenderbuffersEXT -# define glDeleteRenderbuffers glDeleteRenderbuffersEXT -# define glRenderbufferStorage glRenderbufferStorageEXT -# define glRenderbufferStorageMultisample glRenderbufferStorageMultisampleEXT -# define glGetRenderbufferParameteriv glGetRenderbufferParameterivEXT -# define glGetFramebufferAttachmentParameteriv glGetFramebufferAttachmentParameterivEXT -# define glGenerateMipmap glGenerateMipmapEXT -#endif - - #endif diff --git a/sources/Renderer/OpenGL/Platform/MacOS/MacOSGLExt.h b/sources/Renderer/OpenGL/Platform/MacOS/MacOSGLExt.h index 32255642d9..2301bfe567 100644 --- a/sources/Renderer/OpenGL/Platform/MacOS/MacOSGLExt.h +++ b/sources/Renderer/OpenGL/Platform/MacOS/MacOSGLExt.h @@ -10,339 +10,258 @@ #include "../../OpenGL.h" +#include "../../Ext/GLExtensions.h" #ifndef GL_MIRROR_CLAMP_TO_EDGE -#define GL_MIRROR_CLAMP_TO_EDGE ( 0x8743 ) +#define GL_MIRROR_CLAMP_TO_EDGE ( 0x8743 ) #endif #ifndef GL_DEBUG_OUTPUT -#define GL_DEBUG_OUTPUT ( 0x92E0 ) +#define GL_DEBUG_OUTPUT ( 0x92E0 ) #endif #ifndef GL_DEBUG_OUTPUT_SYNCHRONOUS -#define GL_DEBUG_OUTPUT_SYNCHRONOUS ( 0x8242 ) +#define GL_DEBUG_OUTPUT_SYNCHRONOUS ( 0x8242 ) #endif #ifndef GL_PRIMITIVE_RESTART_FIXED_INDEX -#define GL_PRIMITIVE_RESTART_FIXED_INDEX ( 0x8D69 ) +#define GL_PRIMITIVE_RESTART_FIXED_INDEX ( 0x8D69 ) #endif #ifndef GL_ATOMIC_COUNTER_BUFFER -#define GL_ATOMIC_COUNTER_BUFFER ( 0x92C0 ) +#define GL_ATOMIC_COUNTER_BUFFER ( 0x92C0 ) #endif #ifndef GL_DISPATCH_INDIRECT_BUFFER -#define GL_DISPATCH_INDIRECT_BUFFER ( 0x90EE ) +#define GL_DISPATCH_INDIRECT_BUFFER ( 0x90EE ) #endif #ifndef GL_QUERY_BUFFER -#define GL_QUERY_BUFFER ( 0x9192 ) +#define GL_QUERY_BUFFER ( 0x9192 ) #endif #ifndef GL_SHADER_STORAGE_BUFFER -#define GL_SHADER_STORAGE_BUFFER ( 0x90D2 ) +#define GL_SHADER_STORAGE_BUFFER ( 0x90D2 ) #endif #ifndef GL_COMPUTE_SHADER -#define GL_COMPUTE_SHADER ( 0x91B9 ) +#define GL_COMPUTE_SHADER ( 0x91B9 ) #endif #ifndef GL_ANY_SAMPLES_PASSED_CONSERVATIVE -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE ( 0x8D6A ) +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE ( 0x8D6A ) #endif #ifndef GL_MAX_COMPUTE_WORK_GROUP_COUNT -#define GL_MAX_COMPUTE_WORK_GROUP_COUNT ( 0x91BE ) +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT ( 0x91BE ) #endif #ifndef GL_MAX_COMPUTE_WORK_GROUP_SIZE -#define GL_MAX_COMPUTE_WORK_GROUP_SIZE ( 0x91BF ) +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE ( 0x91BF ) #endif #ifndef GL_COMPARE_R_TO_TEXTURE -#define GL_COMPARE_R_TO_TEXTURE ( 0x884E ) +#define GL_COMPARE_R_TO_TEXTURE ( 0x884E ) #endif #ifndef GL_CLAMP -#define GL_CLAMP ( 0x2900 ) +#define GL_CLAMP ( 0x2900 ) #endif #ifndef GL_TEXTURE_MAX_ANISOTROPY -#define GL_TEXTURE_MAX_ANISOTROPY ( 0x84FE ) +#define GL_TEXTURE_MAX_ANISOTROPY ( 0x84FE ) #endif #ifndef GL_CLIP_ORIGIN -#define GL_CLIP_ORIGIN ( 0x935C ) +#define GL_CLIP_ORIGIN ( 0x935C ) #endif #ifndef GL_CLIP_DEPTH_MODE -#define GL_CLIP_DEPTH_MODE ( 0x935D ) +#define GL_CLIP_DEPTH_MODE ( 0x935D ) #endif #ifndef GL_LOWER_LEFT -#define GL_LOWER_LEFT ( 0x8CA1 ) +#define GL_LOWER_LEFT ( 0x8CA1 ) #endif #ifndef GL_UPPER_LEFT -#define GL_UPPER_LEFT ( 0x8CA2 ) +#define GL_UPPER_LEFT ( 0x8CA2 ) #endif #ifndef GL_NEGATIVE_ONE_TO_ONE -#define GL_NEGATIVE_ONE_TO_ONE ( 0x935E ) +#define GL_NEGATIVE_ONE_TO_ONE ( 0x935E ) #endif #ifndef GL_ZERO_TO_ONE -#define GL_ZERO_TO_ONE ( 0x935F ) +#define GL_ZERO_TO_ONE ( 0x935F ) #endif // These macros are for MacOS X 10.6 support // { -#ifdef GL_FRAMEBUFFER_EXT - -#ifndef GL_FRAMEBUFFER -#define GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT -#endif - -#ifndef GL_READ_FRAMEBUFFER -#define GL_READ_FRAMEBUFFER GL_READ_FRAMEBUFFER_EXT -#endif - -#ifndef GL_DRAW_FRAMEBUFFER -#define GL_DRAW_FRAMEBUFFER GL_DRAW_FRAMEBUFFER_EXT -#endif - -#ifndef GL_FRAMEBUFFER_COMPLETE -#define GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_EXT -#endif - -#ifndef GL_RENDERBUFFER_WIDTH -#define GL_RENDERBUFFER_WIDTH GL_RENDERBUFFER_WIDTH_EXT -#endif - -#ifndef GL_RENDERBUFFER_HEIGHT -#define GL_RENDERBUFFER_HEIGHT GL_RENDERBUFFER_HEIGHT_EXT -#endif - -#ifndef GL_RENDERBUFFER_INTERNAL_FORMAT -#define GL_RENDERBUFFER_INTERNAL_FORMAT GL_RENDERBUFFER_INTERNAL_FORMAT_EXT -#endif - -#ifndef GL_DEPTH_ATTACHMENT -#define GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_EXT -#endif - -#ifndef GL_STENCIL_ATTACHMENT -#define GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_EXT -#endif - -#ifndef GL_COLOR_ATTACHMENT0 -#define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT -#endif - -#ifndef GL_COLOR_ATTACHMENT1 -#define GL_COLOR_ATTACHMENT1 GL_COLOR_ATTACHMENT1_EXT -#endif - -#ifndef GL_COLOR_ATTACHMENT2 -#define GL_COLOR_ATTACHMENT2 GL_COLOR_ATTACHMENT2_EXT -#endif - -#ifndef GL_COLOR_ATTACHMENT3 -#define GL_COLOR_ATTACHMENT3 GL_COLOR_ATTACHMENT3_EXT -#endif - -#ifndef GL_COLOR_ATTACHMENT4 -#define GL_COLOR_ATTACHMENT4 GL_COLOR_ATTACHMENT4_EXT -#endif - -#ifndef GL_COLOR_ATTACHMENT5 -#define GL_COLOR_ATTACHMENT5 GL_COLOR_ATTACHMENT5_EXT -#endif - -#ifndef GL_COLOR_ATTACHMENT6 -#define GL_COLOR_ATTACHMENT6 GL_COLOR_ATTACHMENT6_EXT -#endif - -#ifndef GL_COLOR_ATTACHMENT7 -#define GL_COLOR_ATTACHMENT7 GL_COLOR_ATTACHMENT7_EXT -#endif - -#ifndef GL_COLOR_ATTACHMENT8 -#define GL_COLOR_ATTACHMENT8 GL_COLOR_ATTACHMENT8_EXT -#endif - -#ifndef GL_RENDERBUFFER -#define GL_RENDERBUFFER GL_RENDERBUFFER_EXT -#endif - -#else // GL_FRAMEBUFFER_EXT - #ifndef GL_FRAMEBUFFER -#define GL_FRAMEBUFFER 0x8D40 +#define GL_FRAMEBUFFER ( 0x8D40 ) #endif #ifndef GL_READ_FRAMEBUFFER -#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_READ_FRAMEBUFFER ( 0x8CA8 ) #endif #ifndef GL_DRAW_FRAMEBUFFER -#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_DRAW_FRAMEBUFFER ( 0x8CA9 ) #endif #ifndef GL_FRAMEBUFFER_COMPLETE -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_COMPLETE ( 0x8CD5 ) #endif #ifndef GL_RENDERBUFFER_WIDTH -#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_WIDTH ( 0x8D42 ) #endif #ifndef GL_RENDERBUFFER_HEIGHT -#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_HEIGHT ( 0x8D43 ) #endif #ifndef GL_RENDERBUFFER_INTERNAL_FORMAT -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_RENDERBUFFER_INTERNAL_FORMAT ( 0x8D44 ) #endif #ifndef GL_DEPTH_ATTACHMENT -#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_DEPTH_ATTACHMENT ( 0x8D00 ) #endif #ifndef GL_STENCIL_ATTACHMENT -#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_STENCIL_ATTACHMENT ( 0x8D20 ) #endif #ifndef GL_COLOR_ATTACHMENT0 -#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT0 ( 0x8CE0 ) #endif #ifndef GL_COLOR_ATTACHMENT1 -#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT1 ( 0x8CE1 ) #endif #ifndef GL_COLOR_ATTACHMENT2 -#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT2 ( 0x8CE2 ) #endif #ifndef GL_COLOR_ATTACHMENT3 -#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT3 ( 0x8CE3 ) #endif #ifndef GL_COLOR_ATTACHMENT4 -#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT4 ( 0x8CE4 ) #endif #ifndef GL_COLOR_ATTACHMENT5 -#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT5 ( 0x8CE5 ) #endif #ifndef GL_COLOR_ATTACHMENT6 -#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT6 ( 0x8CE6 ) #endif #ifndef GL_COLOR_ATTACHMENT7 -#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT7 ( 0x8CE7 ) #endif #ifndef GL_COLOR_ATTACHMENT8 -#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT8 ( 0x8CE8 ) #endif #ifndef GL_RENDERBUFFER -#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER ( 0x8D41 ) #endif -#endif // /GL_FRAMEBUFFER_EXT - #ifndef GL_FRAMEBUFFER_UNDEFINED -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_FRAMEBUFFER_UNDEFINED ( 0x8219 ) #endif #ifndef GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT ( 0x8CD6 ) #endif #ifndef GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT ( 0x8CD7 ) #endif #ifndef GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER ( 0x8CDB ) #endif #ifndef GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER ( 0x8CDC ) #endif #ifndef GL_FRAMEBUFFER_UNSUPPORTED -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_FRAMEBUFFER_UNSUPPORTED ( 0x8CDD ) #endif #ifndef GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE ( 0x8D56 ) #endif #ifndef GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS ( 0x8DA8 ) #endif #ifndef GL_INVALID_FRAMEBUFFER_OPERATION -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_INVALID_FRAMEBUFFER_OPERATION ( 0x0506 ) #endif #ifndef GL_DEPTH_STENCIL_ATTACHMENT -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_DEPTH_STENCIL_ATTACHMENT ( 0x821A ) #endif #ifndef GL_TEXTURE_1D_ARRAY -#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_TEXTURE_1D_ARRAY ( 0x8C18 ) #endif #ifndef GL_PROXY_TEXTURE_1D_ARRAY -#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_PROXY_TEXTURE_1D_ARRAY ( 0x8C19 ) #endif #ifndef GL_TEXTURE_2D_ARRAY -#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_TEXTURE_2D_ARRAY ( 0x8C1A ) #endif #ifndef GL_PROXY_TEXTURE_2D_ARRAY -#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_PROXY_TEXTURE_2D_ARRAY ( 0x8C1B ) #endif #ifndef GL_TEXTURE_CUBE_MAP_ARRAY -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_CUBE_MAP_ARRAY ( 0x9009 ) #endif #ifndef GL_TEXTURE_2D_MULTISAMPLE -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_TEXTURE_2D_MULTISAMPLE ( 0x9100 ) #endif #ifndef GL_PROXY_TEXTURE_2D_MULTISAMPLE -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE ( 0x9101 ) #endif #ifndef GL_TEXTURE_2D_MULTISAMPLE_ARRAY -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY ( 0x9102 ) #endif #ifndef GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY ( 0x9103 ) #endif #ifndef GL_MAP_READ_BIT -#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_READ_BIT ( 0x0001 ) #endif #ifndef GL_MAP_WRITE_BIT -#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_WRITE_BIT ( 0x0002 ) #endif #ifndef GL_INVALID_INDEX -#define GL_INVALID_INDEX 0xFFFFFFFFu +#define GL_INVALID_INDEX ( 0xFFFFFFFFu ) #endif // } MacOS X 10.6 support diff --git a/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensionLoader.cpp b/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensionLoader.cpp index 2037aa42e2..38014bb3f3 100644 --- a/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensionLoader.cpp +++ b/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensionLoader.cpp @@ -156,8 +156,7 @@ static bool DECL_LOADGLEXT_PROC(ARB_vertex_shader) return true; } -// For GL 2.x, this is substituted with GL_EXT_framebuffer_object -static bool DECL_LOADGLEXT_PROC(ARB_framebuffer_object) +static bool DECL_LOADGLEXT_PROC(EXT_framebuffer_object) { LOAD_GLPROC( glGenRenderbuffersEXT ); LOAD_GLPROC( glDeleteRenderbuffersEXT ); @@ -438,13 +437,6 @@ static bool DECL_LOADGLEXT_PROC(ARB_polygon_offset_clamp) return true; } -static bool DECL_LOADGLEXT_PROC(ARB_framebuffer_no_attachments) -{ - LOAD_GLPROC( glFramebufferParameteri ); - LOAD_GLPROC( glGetFramebufferParameteriv ); - return true; -} - static bool DECL_LOADGLEXT_PROC(ARB_clear_buffer_object) { LOAD_GLPROC( glClearBufferData ); @@ -549,7 +541,7 @@ bool LoadSupportedOpenGLExtensions(bool /*isCoreProfile*/, bool abortOnFailure) /* Enable hardware buffer extensions */ ENABLE_GLEXT( ARB_vertex_buffer_object ); ENABLE_GLEXT( ARB_vertex_shader ); - ENABLE_GLEXT( ARB_framebuffer_object ); + ENABLE_GLEXT( EXT_framebuffer_object ); ENABLE_GLEXT( ARB_map_buffer_range ); /* Enable shader extensions */ @@ -640,7 +632,7 @@ bool LoadSupportedOpenGLExtensions(bool /*isCoreProfile*/, bool abortOnFailure) /* Load hardware buffer extensions */ LOAD_GLEXT( ARB_vertex_buffer_object ); // Always required for GL 2.x LOAD_GLEXT( ARB_vertex_shader ); // Always required for GL 2.x - LOAD_GLEXT( ARB_framebuffer_object ); // Always required for GL 2.x + LOAD_GLEXT( EXT_framebuffer_object ); // Always required for GL 2.x LOAD_GLEXT( ARB_map_buffer_range ); /* Load shader extensions */ @@ -677,7 +669,6 @@ bool LoadSupportedOpenGLExtensions(bool /*isCoreProfile*/, bool abortOnFailure) LOAD_GLEXT( ARB_copy_buffer ); LOAD_GLEXT( ARB_copy_image ); LOAD_GLEXT( ARB_polygon_offset_clamp ); - LOAD_GLEXT( ARB_framebuffer_no_attachments ); LOAD_GLEXT( ARB_clear_buffer_object ); /* Enable extensions and ignore procedures */ diff --git a/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensionMapping.h b/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensionMapping.h new file mode 100644 index 0000000000..7c9850cf01 --- /dev/null +++ b/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensionMapping.h @@ -0,0 +1,118 @@ +/* + * GLCompatExtensionMapping.h + * + * Copyright (c) 2015 Lukas Hermanns. All rights reserved. + * Licensed under the terms of the BSD 3-Clause license (see LICENSE.txt). + */ + +#ifndef LLGL_GL_COMPAT_EXTENSION_MAPPING_H +#define LLGL_GL_COMPAT_EXTENSION_MAPPING_H + + +#include "../../OpenGL.h" + + +#if GL_EXT_framebuffer_object + +#define glGenFramebuffers glGenFramebuffersEXT +#define glDeleteFramebuffers glDeleteFramebuffersEXT +#define glBindFramebuffer glBindFramebufferEXT +#define glBindRenderbuffer glBindRenderbufferEXT +#define glBlitFramebuffer glBlitFramebufferEXT +#define glFramebufferTexture1D glFramebufferTexture1DEXT +#define glFramebufferTexture2D glFramebufferTexture2DEXT +#define glFramebufferTexture3D glFramebufferTexture3DEXT +#define glFramebufferRenderbuffer glFramebufferRenderbufferEXT +#define glCheckFramebufferStatus glCheckFramebufferStatusEXT +#define glGenRenderbuffers glGenRenderbuffersEXT +#define glDeleteRenderbuffers glDeleteRenderbuffersEXT +#define glRenderbufferStorage glRenderbufferStorageEXT +#define glRenderbufferStorageMultisample glRenderbufferStorageMultisampleEXT +#define glGetRenderbufferParameteriv glGetRenderbufferParameterivEXT +#define glGetFramebufferAttachmentParameteriv glGetFramebufferAttachmentParameterivEXT +#define glGenerateMipmap glGenerateMipmapEXT + +#ifndef GL_FRAMEBUFFER +#define GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT +#endif + +#ifndef GL_READ_FRAMEBUFFER +#define GL_READ_FRAMEBUFFER GL_READ_FRAMEBUFFER_EXT +#endif + +#ifndef GL_DRAW_FRAMEBUFFER +#define GL_DRAW_FRAMEBUFFER GL_DRAW_FRAMEBUFFER_EXT +#endif + +#ifndef GL_FRAMEBUFFER_COMPLETE +#define GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_EXT +#endif + +#ifndef GL_RENDERBUFFER_WIDTH +#define GL_RENDERBUFFER_WIDTH GL_RENDERBUFFER_WIDTH_EXT +#endif + +#ifndef GL_RENDERBUFFER_HEIGHT +#define GL_RENDERBUFFER_HEIGHT GL_RENDERBUFFER_HEIGHT_EXT +#endif + +#ifndef GL_RENDERBUFFER_INTERNAL_FORMAT +#define GL_RENDERBUFFER_INTERNAL_FORMAT GL_RENDERBUFFER_INTERNAL_FORMAT_EXT +#endif + +#ifndef GL_DEPTH_ATTACHMENT +#define GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_EXT +#endif + +#ifndef GL_STENCIL_ATTACHMENT +#define GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_EXT +#endif + +#ifndef GL_COLOR_ATTACHMENT0 +#define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT +#endif + +#ifndef GL_COLOR_ATTACHMENT1 +#define GL_COLOR_ATTACHMENT1 GL_COLOR_ATTACHMENT1_EXT +#endif + +#ifndef GL_COLOR_ATTACHMENT2 +#define GL_COLOR_ATTACHMENT2 GL_COLOR_ATTACHMENT2_EXT +#endif + +#ifndef GL_COLOR_ATTACHMENT3 +#define GL_COLOR_ATTACHMENT3 GL_COLOR_ATTACHMENT3_EXT +#endif + +#ifndef GL_COLOR_ATTACHMENT4 +#define GL_COLOR_ATTACHMENT4 GL_COLOR_ATTACHMENT4_EXT +#endif + +#ifndef GL_COLOR_ATTACHMENT5 +#define GL_COLOR_ATTACHMENT5 GL_COLOR_ATTACHMENT5_EXT +#endif + +#ifndef GL_COLOR_ATTACHMENT6 +#define GL_COLOR_ATTACHMENT6 GL_COLOR_ATTACHMENT6_EXT +#endif + +#ifndef GL_COLOR_ATTACHMENT7 +#define GL_COLOR_ATTACHMENT7 GL_COLOR_ATTACHMENT7_EXT +#endif + +#ifndef GL_COLOR_ATTACHMENT8 +#define GL_COLOR_ATTACHMENT8 GL_COLOR_ATTACHMENT8_EXT +#endif + +#ifndef GL_RENDERBUFFER +#define GL_RENDERBUFFER GL_RENDERBUFFER_EXT +#endif + +#endif // /GL_EXT_framebuffer_object + + +#endif + + + +// ================================================================================ diff --git a/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensions.h b/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensions.h index 22693831ec..305e5f6bb8 100644 --- a/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensions.h +++ b/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensions.h @@ -11,6 +11,7 @@ #include #include "../../OpenGL.h" +#include "GLCompatExtensionMapping.h" namespace LLGL diff --git a/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensionsDecl.inl b/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensionsDecl.inl index a582c30123..c2fa7b0fa3 100644 --- a/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensionsDecl.inl +++ b/sources/Renderer/OpenGL/Profile/GLCompat/GLCompatExtensionsDecl.inl @@ -283,11 +283,6 @@ DECL_GLPROC(PFNGLCOPYIMAGESUBDATAPROC, glCopyImageS DECL_GLPROC(PFNGLPOLYGONOFFSETCLAMPPROC, glPolygonOffsetClamp, void, (GLfloat, GLfloat, GLfloat)); -/* GL_ARB_framebuffer_no_attachments */ - -DECL_GLPROC(PFNGLFRAMEBUFFERPARAMETERIPROC, glFramebufferParameteri, void, (GLenum, GLenum, GLint)); -DECL_GLPROC(PFNGLGETFRAMEBUFFERPARAMETERIVPROC, glGetFramebufferParameteriv, void, (GLenum, GLenum, GLint*)); - /* GL_ARB_clear_buffer_object */ DECL_GLPROC(PFNGLCLEARBUFFERDATAPROC, glClearBufferData, void, (GLenum, GLenum, GLenum, GLenum, const void*)); diff --git a/sources/Renderer/OpenGL/RenderState/GLStateManager.cpp b/sources/Renderer/OpenGL/RenderState/GLStateManager.cpp index d30616c65a..8dabfb7d73 100644 --- a/sources/Renderer/OpenGL/RenderState/GLStateManager.cpp +++ b/sources/Renderer/OpenGL/RenderState/GLStateManager.cpp @@ -169,7 +169,7 @@ static const GLenum g_bufferTargetsEnum[] = #endif }; -#if !LLGL_GL_ENABLE_OPENGL2X +#if LLGL_GLEXT_FRAMEBUFFER_OBJECT // Maps GLFramebufferTarget to in glBindFramebuffer static const GLenum g_framebufferTargetsEnum[] = @@ -179,7 +179,7 @@ static const GLenum g_framebufferTargetsEnum[] = GL_READ_FRAMEBUFFER, }; -#endif // /!LLGL_GL_ENABLE_OPENGL2X +#endif // /LLGL_GLEXT_FRAMEBUFFER_OBJECT // Maps GLTextureTarget to in glBindTexture static const GLenum g_textureTargetsEnum[] = @@ -988,7 +988,7 @@ static GLuint GetPrimitiveRestartIndex(bool indexType16Bits) void GLStateManager::BindVertexArray(GLuint vertexArray) { - #if !LLGL_GL_ENABLE_OPENGL2X + #if LLGL_GLEXT_VERTEX_ARRAY_OBJECT /* Only bind VAO if it has changed */ if (contextState_.boundVertexArray != vertexArray) @@ -997,52 +997,46 @@ void GLStateManager::BindVertexArray(GLuint vertexArray) glBindVertexArray(vertexArray); contextState_.boundVertexArray = vertexArray; - #ifdef LLGL_GL_ENABLE_OPENGL2X - /* Only perform deferred binding of element array buffer if VAOs are supported */ - if (HasNativeVAO()) - #endif // /LLGL_GL_ENABLE_OPENGL2X + /* + Always reset index buffer binding + -> see https://www.opengl.org/wiki/Vertex_Specification#Index_buffers + */ + contextState_.boundBuffers[static_cast(GLBufferTarget::ElementArrayBuffer)] = 0; + + if (vertexArray != 0) { - /* - Always reset index buffer binding - -> see https://www.opengl.org/wiki/Vertex_Specification#Index_buffers - */ - contextState_.boundBuffers[static_cast(GLBufferTarget::ElementArrayBuffer)] = 0; + #if LLGL_PRIMITIVE_RESTART + + if (contextState_.boundElementArrayBuffer != 0) + { + /* Bind deferred index buffer and enable primitive restart index */ + BindBuffer(GLBufferTarget::ElementArrayBuffer, contextState_.boundElementArrayBuffer); + Enable(GLState::PrimitiveRestart); + SetPrimitiveRestartIndex(GetPrimitiveRestartIndex(indexType16Bits_)); + } + else + { + /* Disable primitive restart index if no index buffer is bound */ + Disable(GLState::PrimitiveRestart); + } + + #else // LLGL_PRIMITIVE_RESTART - if (vertexArray != 0) + if (contextState_.boundElementArrayBuffer != 0) { - #if LLGL_PRIMITIVE_RESTART - - if (contextState_.boundElementArrayBuffer != 0) - { - /* Bind deferred index buffer and enable primitive restart index */ - BindBuffer(GLBufferTarget::ElementArrayBuffer, contextState_.boundElementArrayBuffer); - Enable(GLState::PrimitiveRestart); - SetPrimitiveRestartIndex(GetPrimitiveRestartIndex(indexType16Bits_)); - } - else - { - /* Disable primitive restart index if no index buffer is bound */ - Disable(GLState::PrimitiveRestart); - } - - #else // LLGL_PRIMITIVE_RESTART - - if (contextState_.boundElementArrayBuffer != 0) - { - /* Bind deferred index buffer */ - BindBuffer(GLBufferTarget::ElementArrayBuffer, contextState_.boundElementArrayBuffer); - } - - #endif // /LLGL_PRIMITIVE_RESTART + /* Bind deferred index buffer */ + BindBuffer(GLBufferTarget::ElementArrayBuffer, contextState_.boundElementArrayBuffer); } + + #endif // /LLGL_PRIMITIVE_RESTART } } - #else + #else // LLGL_GLEXT_VERTEX_ARRAY_OBJECT LLGL_TRAP_FEATURE_NOT_SUPPORTED("Vertex-Array-Objects"); - #endif + #endif // /LLGL_GLEXT_VERTEX_ARRAY_OBJECT } void GLStateManager::BindGLBuffer(const GLBuffer& buffer) @@ -1057,45 +1051,44 @@ void GLStateManager::NotifyVertexArrayRelease(GLuint vertexArray) void GLStateManager::BindElementArrayBufferToVAO(GLuint buffer, bool indexType16Bits) { - #ifdef LLGL_GL_ENABLE_OPENGL2X - if (!HasNativeVAO()) + #if LLGL_GLEXT_VERTEX_ARRAY_OBJECT + + /* Always store buffer ID to bind the index buffer the next time "BindVertexArray" is called */ + contextState_.boundElementArrayBuffer = buffer; + indexType16Bits_ = indexType16Bits; + + /* If a valid VAO is currently being bound, bind the specified buffer directly */ + #if LLGL_PRIMITIVE_RESTART + + if (contextState_.boundVertexArray != 0) { - /* Bind element array buffer directly (for GL 2.x compatibility) */ + /* Bind index buffer and enable primitive restart index */ BindBuffer(GLBufferTarget::ElementArrayBuffer, buffer); + Enable(GLState::PrimitiveRestart); + SetPrimitiveRestartIndex(GetPrimitiveRestartIndex(indexType16Bits_)); } else - #endif // /LLGL_GL_ENABLE_OPENGL2X { - /* Always store buffer ID to bind the index buffer the next time "BindVertexArray" is called */ - contextState_.boundElementArrayBuffer = buffer; - indexType16Bits_ = indexType16Bits; + /* Disable primitive restart index */ + Disable(GLState::PrimitiveRestart); + } - /* If a valid VAO is currently being bound, bind the specified buffer directly */ - #if LLGL_PRIMITIVE_RESTART + #else // LLGL_PRIMITIVE_RESTART - if (contextState_.boundVertexArray != 0) - { - /* Bind index buffer and enable primitive restart index */ - BindBuffer(GLBufferTarget::ElementArrayBuffer, buffer); - Enable(GLState::PrimitiveRestart); - SetPrimitiveRestartIndex(GetPrimitiveRestartIndex(indexType16Bits_)); - } - else - { - /* Disable primitive restart index */ - Disable(GLState::PrimitiveRestart); - } + if (contextState_.boundVertexArray != 0) + { + /* Bind index buffer */ + BindBuffer(GLBufferTarget::ElementArrayBuffer, buffer); + } - #else + #endif // /LLGL_PRIMITIVE_RESTART - if (contextState_.boundVertexArray != 0) - { - /* Bind index buffer */ - BindBuffer(GLBufferTarget::ElementArrayBuffer, buffer); - } + #else // !LLGL_GLEXT_VERTEX_ARRAY_OBJECT - #endif - } + /* Bind element array buffer directly (for GL 2.x compatibility) */ + BindBuffer(GLBufferTarget::ElementArrayBuffer, buffer); + + #endif // /LLGL_GLEXT_VERTEX_ARRAY_OBJECT } void GLStateManager::PushBoundBuffer(GLBufferTarget target) @@ -1180,7 +1173,7 @@ void GLStateManager::BindGLRenderTarget(GLRenderTarget* renderTarget) void GLStateManager::BindFramebuffer(GLFramebufferTarget target, GLuint framebuffer) { - #if !LLGL_GL_ENABLE_OPENGL2X + #if LLGL_GLEXT_FRAMEBUFFER_OBJECT /* Only bind framebuffer if the framebuffer has changed */ auto targetIdx = static_cast(target); if (contextState_.boundFramebuffers[targetIdx] != framebuffer) @@ -1230,7 +1223,7 @@ GLRenderTarget* GLStateManager::GetBoundRenderTarget() const /* ----- Renderbuffer ----- */ -#if !LLGL_GL_ENABLE_OPENGL2X +#if LLGL_GLEXT_FRAMEBUFFER_OBJECT void GLStateManager::BindRenderbuffer(GLuint renderbuffer) { @@ -1265,7 +1258,7 @@ void GLStateManager::DeleteRenderbuffer(GLuint renderbuffer) } } -#else // !LLGL_GL_ENABLE_OPENGL2X +#else // LLGL_GLEXT_FRAMEBUFFER_OBJECT void GLStateManager::BindRenderbuffer(GLuint renderbuffer) { @@ -1287,7 +1280,7 @@ void GLStateManager::DeleteRenderbuffer(GLuint renderbuffer) LLGL_TRAP_FEATURE_NOT_SUPPORTED("renderbuffers"); } -#endif // /!LLGL_GL_ENABLE_OPENGL2X +#endif // /LLGL_GLEXT_FRAMEBUFFER_OBJECT /* ----- Texture ----- */ diff --git a/sources/Renderer/OpenGL/Texture/GLFramebuffer.cpp b/sources/Renderer/OpenGL/Texture/GLFramebuffer.cpp index 3e908e7785..6f5f3ab4d2 100644 --- a/sources/Renderer/OpenGL/Texture/GLFramebuffer.cpp +++ b/sources/Renderer/OpenGL/Texture/GLFramebuffer.cpp @@ -116,14 +116,14 @@ void GLFramebuffer::AttachTexture( GLenum target) { GLuint texID = texture.GetID(); - #if !LLGL_GL_ENABLE_OPENGL2X + #if LLGL_GLEXT_FRAMEBUFFER_OBJECT if (texture.IsRenderbuffer()) { /* Attach renderbuffer to FBO */ glFramebufferRenderbuffer(target, attachment, GL_RENDERBUFFER, texID); } else - #endif // /!LLGL_GL_ENABLE_OPENGL2X + #endif // /LLGL_GLEXT_FRAMEBUFFER_OBJECT { /* Attach texture to FBO */ switch (texture.GetType()) @@ -163,7 +163,7 @@ void GLFramebuffer::AttachTexture( void GLFramebuffer::AttachRenderbuffer(GLenum attachment, GLuint renderbufferID) { - #if !LLGL_GL_ENABLE_OPENGL2X + #if LLGL_GLEXT_FRAMEBUFFER_OBJECT glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, renderbufferID); #else LLGL_TRAP_FEATURE_NOT_SUPPORTED("renderbuffer"); diff --git a/tests/Testbed/TestbedContext.cpp b/tests/Testbed/TestbedContext.cpp index 448a605bbd..d9c3ec8bb9 100644 --- a/tests/Testbed/TestbedContext.cpp +++ b/tests/Testbed/TestbedContext.cpp @@ -876,6 +876,11 @@ bool TestbedContext::LoadShaders() } else if (IsShadingLanguageSupported(ShadingLanguage::GLSL)) { + if (std::find(caps.shadingLanguages.begin(), caps.shadingLanguages.end(), LLGL::ShadingLanguage::GLSL_330) == caps.shadingLanguages.end()) + { + Log::Errorf("OpenGL backend does not support GLSL 330\n"); + return false; + } shaders[VSSolid] = LoadShaderFromFile(shaderPath + "TriangleMesh.330core.vert", ShaderType::Vertex); shaders[PSSolid] = LoadShaderFromFile(shaderPath + "TriangleMesh.330core.frag", ShaderType::Fragment); shaders[VSTextured] = LoadShaderFromFile(shaderPath + "TriangleMesh.330core.vert", ShaderType::Vertex, nullptr, nullptr, definesEnableTexturing);