diff --git a/renderdoc/driver/gl/gl_common.cpp b/renderdoc/driver/gl/gl_common.cpp index 29692154b..9d70da225 100644 --- a/renderdoc/driver/gl/gl_common.cpp +++ b/renderdoc/driver/gl/gl_common.cpp @@ -47,7 +47,7 @@ bool CheckReplayContext(PFNGLGETSTRINGPROC getStr, PFNGLGETINTEGERVPROC getInt, // as they should have minimal or no hardware requirement. They were present on mesa 10.6 // for all drivers which dates to mid 2015. #undef EXT_TO_CHECK -#define EXT_TO_CHECK(ext) ext, +#define EXT_TO_CHECK(ver, ext) ext, enum { EXTENSION_CHECKS() ext_count, @@ -78,8 +78,8 @@ bool CheckReplayContext(PFNGLGETSTRINGPROC getStr, PFNGLGETINTEGERVPROC getInt, ext += 3; #undef EXT_TO_CHECK -#define EXT_TO_CHECK(extname) \ - if(!strcmp(ext, STRINGIZE(extname))) \ +#define EXT_TO_CHECK(ver, extname) \ + if(GLCoreVersion >= ver || !strcmp(ext, STRINGIZE(extname))) \ exts[extname] = true; EXTENSION_CHECKS() @@ -402,8 +402,8 @@ void CheckExtensions(const GLHookSet &gl) ext += 3; #undef EXT_TO_CHECK -#define EXT_TO_CHECK(extname) \ - if(!strcmp(ext, STRINGIZE(extname))) \ +#define EXT_TO_CHECK(ver, extname) \ + if(GLCoreVersion >= ver || !strcmp(ext, STRINGIZE(extname))) \ HasExt[extname] = true; EXTENSION_CHECKS() @@ -469,7 +469,7 @@ void DoVendorChecks(const GLHookSet &gl, GLWindowingData context) // AMD throws an error if we try to copy the mips that are smaller than 4x4, if(gl.glGetError && gl.glGenTextures && gl.glBindTexture && gl.glCopyImageSubData && gl.glTexStorage2D && gl.glTexSubImage2D && gl.glTexParameteri && gl.glDeleteTextures && - (GLCoreVersion >= 43 || HasExt[ARB_copy_image]) && HasExt[ARB_texture_storage]) + HasExt[ARB_copy_image] && HasExt[ARB_texture_storage]) { GLuint texs[2]; gl.glGenTextures(2, texs); @@ -576,8 +576,7 @@ void DoVendorChecks(const GLHookSet &gl, GLWindowingData context) } if(gl.glGetError && gl.glGenProgramPipelines && gl.glDeleteProgramPipelines && - gl.glGetProgramPipelineiv && (HasExt[ARB_compute_shader] || GLCoreVersion >= 43) && - (HasExt[ARB_program_interface_query] || GLCoreVersion >= 43)) + gl.glGetProgramPipelineiv && HasExt[ARB_compute_shader] && HasExt[ARB_program_interface_query]) { GLuint pipe = 0; gl.glGenProgramPipelines(1, &pipe); diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index ecedeaacc..7eada2187 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -187,54 +187,57 @@ void GetBindpointMapping(const GLHookSet &gl, GLuint curProg, int shadIdx, Shade extern int GLCoreVersion; extern bool GLIsCore; +// list of extensions and the version when they became core +// 99 means the extension never became core, so you can easily +// just do a check of CoreVersion >= NN and they will always fail. #define EXTENSION_CHECKS() \ - EXT_TO_CHECK(ARB_enhanced_layouts) \ - EXT_TO_CHECK(ARB_clip_control) \ - EXT_TO_CHECK(EXT_polygon_offset_clamp) \ - EXT_TO_CHECK(KHR_blend_equation_advanced_coherent) \ - EXT_TO_CHECK(EXT_raster_multisample) \ - EXT_TO_CHECK(ARB_indirect_parameters) \ - EXT_TO_CHECK(EXT_depth_bounds_test) \ - EXT_TO_CHECK(ARB_compute_shader) \ - EXT_TO_CHECK(ARB_program_interface_query) \ - EXT_TO_CHECK(ARB_copy_image) \ - EXT_TO_CHECK(ARB_shader_atomic_counters) \ - EXT_TO_CHECK(ARB_shader_storage_buffer_object) \ - EXT_TO_CHECK(EXT_direct_state_access) \ - EXT_TO_CHECK(ARB_clear_buffer_object) \ - EXT_TO_CHECK(ARB_internalformat_query2) \ - EXT_TO_CHECK(ARB_texture_swizzle) \ - EXT_TO_CHECK(EXT_texture_swizzle) \ - EXT_TO_CHECK(ARB_shading_language_420pack) \ - EXT_TO_CHECK(ARB_separate_shader_objects) \ - EXT_TO_CHECK(ARB_explicit_attrib_location) \ - EXT_TO_CHECK(ARB_vertex_attrib_binding) \ - EXT_TO_CHECK(ARB_sampler_objects) \ - EXT_TO_CHECK(KHR_debug) \ - EXT_TO_CHECK(ARB_sample_shading) \ - EXT_TO_CHECK(ARB_texture_cube_map_array) \ - EXT_TO_CHECK(ARB_shader_image_load_store) \ - EXT_TO_CHECK(ARB_tessellation_shader) \ - EXT_TO_CHECK(ARB_shader_subroutine) \ - EXT_TO_CHECK(ARB_draw_indirect) \ - EXT_TO_CHECK(ARB_query_buffer_object) \ - EXT_TO_CHECK(ARB_draw_buffers_blend) \ - EXT_TO_CHECK(ARB_viewport_array) \ - EXT_TO_CHECK(ARB_ES3_compatibility) \ - EXT_TO_CHECK(ARB_transform_feedback2) \ - EXT_TO_CHECK(ARB_texture_storage) \ - EXT_TO_CHECK(ARB_texture_storage_multisample) \ - EXT_TO_CHECK(ARB_gpu_shader5) \ - EXT_TO_CHECK(ARB_texture_view) \ - EXT_TO_CHECK(ARB_seamless_cubemap_per_texture) \ - EXT_TO_CHECK(ARB_stencil_texturing) \ - EXT_TO_CHECK(ARB_base_instance) + EXT_TO_CHECK(33, ARB_explicit_attrib_location) \ + EXT_TO_CHECK(33, ARB_sampler_objects) \ + EXT_TO_CHECK(33, ARB_texture_swizzle) \ + EXT_TO_CHECK(40, ARB_draw_buffers_blend) \ + EXT_TO_CHECK(40, ARB_draw_indirect) \ + EXT_TO_CHECK(40, ARB_gpu_shader5) \ + EXT_TO_CHECK(40, ARB_sample_shading) \ + EXT_TO_CHECK(40, ARB_shader_subroutine) \ + EXT_TO_CHECK(40, ARB_tessellation_shader) \ + EXT_TO_CHECK(40, ARB_texture_cube_map_array) \ + EXT_TO_CHECK(40, ARB_transform_feedback2) \ + EXT_TO_CHECK(41, ARB_separate_shader_objects) \ + EXT_TO_CHECK(41, ARB_viewport_array) \ + EXT_TO_CHECK(42, ARB_base_instance) \ + EXT_TO_CHECK(42, ARB_shader_atomic_counters) \ + EXT_TO_CHECK(42, ARB_shader_image_load_store) \ + EXT_TO_CHECK(42, ARB_shading_language_420pack) \ + EXT_TO_CHECK(42, ARB_texture_storage) \ + EXT_TO_CHECK(43, ARB_clear_buffer_object) \ + EXT_TO_CHECK(43, ARB_compute_shader) \ + EXT_TO_CHECK(43, ARB_copy_image) \ + EXT_TO_CHECK(43, ARB_ES3_compatibility) \ + EXT_TO_CHECK(43, ARB_internalformat_query2) \ + EXT_TO_CHECK(43, ARB_program_interface_query) \ + EXT_TO_CHECK(43, ARB_shader_storage_buffer_object) \ + EXT_TO_CHECK(43, ARB_stencil_texturing) \ + EXT_TO_CHECK(43, ARB_texture_storage_multisample) \ + EXT_TO_CHECK(43, ARB_texture_view) \ + EXT_TO_CHECK(43, ARB_vertex_attrib_binding) \ + EXT_TO_CHECK(43, KHR_debug) \ + EXT_TO_CHECK(44, ARB_enhanced_layouts) \ + EXT_TO_CHECK(44, ARB_query_buffer_object) \ + EXT_TO_CHECK(45, ARB_clip_control) \ + EXT_TO_CHECK(99, ARB_indirect_parameters) \ + EXT_TO_CHECK(99, ARB_seamless_cubemap_per_texture) \ + EXT_TO_CHECK(99, EXT_depth_bounds_test) \ + EXT_TO_CHECK(99, EXT_direct_state_access) \ + EXT_TO_CHECK(99, EXT_polygon_offset_clamp) \ + EXT_TO_CHECK(99, EXT_raster_multisample) \ + EXT_TO_CHECK(99, EXT_texture_swizzle) \ + EXT_TO_CHECK(99, KHR_blend_equation_advanced_coherent) // extensions we know we want to check for are precached, indexd by this enum enum ExtensionCheckEnum { #undef EXT_TO_CHECK -#define EXT_TO_CHECK(ext) ext, +#define EXT_TO_CHECK(ver, ext) ext, EXTENSION_CHECKS() GLExtension_Count, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 6d281e333..8b1b0c08d 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -1504,7 +1504,7 @@ struct RenderTextState enableBits[7] = gl.glIsEnabled(eGL_ALPHA_TEST) != 0; } - if(modern && (GLCoreVersion >= 45 || HasExt[ARB_clip_control])) + if(modern && HasExt[ARB_clip_control]) { gl.glGetIntegerv(eGL_CLIP_ORIGIN, (GLint *)&ClipOrigin); gl.glGetIntegerv(eGL_CLIP_DEPTH_MODE, (GLint *)&ClipDepth); @@ -1661,7 +1661,7 @@ struct RenderTextState gl.glDisable(eGL_ALPHA_TEST); } - if(modern && gl.glClipControl && (GLCoreVersion >= 45 || HasExt[ARB_clip_control])) + if(modern && gl.glClipControl && HasExt[ARB_clip_control]) gl.glClipControl(ClipOrigin, ClipDepth); if(modern && HasExt[ARB_draw_buffers_blend]) @@ -1852,7 +1852,7 @@ void WrappedOpenGL::RenderOverlayStr(float x, float y, const char *text) } gl.glPolygonMode(eGL_FRONT_AND_BACK, eGL_FILL); - if(gl.glClipControl && (GLCoreVersion >= 45 || HasExt[ARB_clip_control])) + if(gl.glClipControl && HasExt[ARB_clip_control]) gl.glClipControl(eGL_LOWER_LEFT, eGL_NEGATIVE_ONE_TO_ONE); // bind UBOs diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index e9f41a652..0497e2bda 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -399,7 +399,7 @@ void GLRenderState::MarkDirty(WrappedOpenGL *gl) GLint maxCount = 0; GLuint name = 0; - if(GLCoreVersion >= 40 || HasExt[ARB_transform_feedback2]) + if(HasExt[ARB_transform_feedback2]) { m_Real->glGetIntegerv(eGL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxCount); @@ -413,7 +413,7 @@ void GLRenderState::MarkDirty(WrappedOpenGL *gl) } } - if(GLCoreVersion >= 42 || HasExt[ARB_shader_image_load_store]) + if(HasExt[ARB_shader_image_load_store]) { m_Real->glGetIntegerv(eGL_MAX_IMAGE_UNITS, &maxCount); @@ -427,7 +427,7 @@ void GLRenderState::MarkDirty(WrappedOpenGL *gl) } } - if(GLCoreVersion >= 42 || HasExt[ARB_shader_atomic_counters]) + if(HasExt[ARB_shader_atomic_counters]) { m_Real->glGetIntegerv(eGL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, &maxCount); @@ -441,7 +441,7 @@ void GLRenderState::MarkDirty(WrappedOpenGL *gl) } } - if(GLCoreVersion >= 43 || HasExt[ARB_shader_storage_buffer_object]) + if(HasExt[ARB_shader_storage_buffer_object]) { m_Real->glGetIntegerv(eGL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, &maxCount); @@ -661,7 +661,7 @@ void GLRenderState::FetchState(void *ctx, WrappedOpenGL *gl) m_Real->glGetIntegerv(eGL_VERTEX_ARRAY_BINDING, (GLint *)&VAO); - if(GLCoreVersion >= 40 || HasExt[ARB_transform_feedback2]) + if(HasExt[ARB_transform_feedback2]) m_Real->glGetIntegerv(eGL_TRANSFORM_FEEDBACK_BINDING, (GLint *)&FeedbackObj); // the spec says that you can only query for the format that was previously set, or you get @@ -680,7 +680,7 @@ void GLRenderState::FetchState(void *ctx, WrappedOpenGL *gl) m_Real->glGetFloatv(eGL_POINT_SIZE, &PointSize); m_Real->glGetIntegerv(eGL_PRIMITIVE_RESTART_INDEX, (GLint *)&PrimitiveRestartIndex); - if(GLCoreVersion >= 45 || HasExt[ARB_clip_control]) + if(HasExt[ARB_clip_control]) { m_Real->glGetIntegerv(eGL_CLIP_ORIGIN, (GLint *)&ClipOrigin); m_Real->glGetIntegerv(eGL_CLIP_DEPTH_MODE, (GLint *)&ClipDepth); @@ -1138,7 +1138,7 @@ void GLRenderState::ApplyState(void *ctx, WrappedOpenGL *gl) m_Real->glActiveTexture(ActiveTexture); m_Real->glBindVertexArray(VAO); - if(GLCoreVersion >= 40 || HasExt[ARB_transform_feedback2]) + if(HasExt[ARB_transform_feedback2]) m_Real->glBindTransformFeedback(eGL_TRANSFORM_FEEDBACK, FeedbackObj); // See FetchState(). The spec says that you have to SET the right format for the shader too, diff --git a/renderdoc/driver/gl/gl_shader_refl.cpp b/renderdoc/driver/gl/gl_shader_refl.cpp index ac897c69c..8f3f43f1c 100644 --- a/renderdoc/driver/gl/gl_shader_refl.cpp +++ b/renderdoc/driver/gl/gl_shader_refl.cpp @@ -1688,7 +1688,7 @@ void MakeShaderReflection(const GLHookSet &gl, GLenum shadType, GLuint sepProg, GLsizei numSigProps = (GLsizei)ARRAY_COUNT(props); // GL_LOCATION_COMPONENT not supported on core <4.4 (or without GL_ARB_enhanced_layouts) - if(!HasExt[ARB_enhanced_layouts] && GLCoreVersion < 44) + if(!HasExt[ARB_enhanced_layouts]) numSigProps--; gl.glGetProgramResourceiv(sepProg, sigEnum, i, numSigProps, props, numSigProps, NULL, values);