Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/gpu/opengl/gl_backend.cc46
-rw-r--r--source/blender/gpu/opengl/gl_batch.cc2
-rw-r--r--source/blender/gpu/opengl/gl_context.hh11
-rw-r--r--source/blender/gpu/opengl/gl_drawlist.cc5
-rw-r--r--source/blender/gpu/opengl/gl_shader.cc26
-rw-r--r--source/blender/gpu/opengl/gl_state.cc5
-rw-r--r--source/blender/gpu/opengl/gl_texture.cc23
-rw-r--r--source/blender/gpu/opengl/gl_vertex_array.cc2
8 files changed, 76 insertions, 44 deletions
diff --git a/source/blender/gpu/opengl/gl_backend.cc b/source/blender/gpu/opengl/gl_backend.cc
index 7285b9ad35c..edaa84cdcf8 100644
--- a/source/blender/gpu/opengl/gl_backend.cc
+++ b/source/blender/gpu/opengl/gl_backend.cc
@@ -209,11 +209,20 @@ static void detect_workarounds(void)
GCaps.mip_render_workaround = true;
GLContext::debug_layer_workaround = true;
GLContext::unused_fb_slot_workaround = true;
- GLContext::texture_copy_workaround = true;
/* Turn off extensions. */
GLContext::base_instance_support = false;
+ GLContext::clear_texture_support = false;
+ GLContext::copy_image_support = false;
GLContext::debug_layer_support = false;
+ GLContext::direct_state_access_support = false;
+ GLContext::fixed_restart_index_support = false;
+ GLContext::multi_bind_support = false;
+ GLContext::multi_draw_indirect_support = false;
+ GLContext::shader_draw_parameters_support = false;
GLContext::texture_cube_map_array_support = false;
+ GLContext::texture_filter_anisotropic_support = false;
+ GLContext::texture_gather_support = false;
+ GLContext::vertex_attrib_binding_support = false;
return;
}
@@ -268,7 +277,7 @@ static void detect_workarounds(void)
* covered since they only support GL 4.4 on windows.
* This fixes some issues with workbench anti-aliasing on Win + Intel GPU. (see T76273) */
if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_WIN, GPU_DRIVER_OFFICIAL) && !GLEW_VERSION_4_5) {
- GLContext::texture_copy_workaround = true;
+ GLContext::copy_image_support = false;
}
/* Special fix for theses specific GPUs.
* Without this workaround, blender crashes on startup. (see T72098) */
@@ -305,6 +314,11 @@ static void detect_workarounds(void)
strstr(version, "Mesa 19.1") || strstr(version, "Mesa 19.2"))) {
GLContext::unused_fb_slot_workaround = true;
}
+ /* There is a bug on older Nvidia GPU where GL_ARB_texture_gather
+ * is reported to be supported but yield a compile error (see T55802). */
+ if (GPU_type_matches(GPU_DEVICE_NVIDIA, GPU_OS_ANY, GPU_DRIVER_ANY) && !GLEW_VERSION_4_0) {
+ GLContext::texture_gather_support = false;
+ }
/* dFdx/dFdy calculation factors, those are dependent on driver. */
if (GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_ANY, GPU_DRIVER_ANY) &&
@@ -323,6 +337,11 @@ static void detect_workarounds(void)
GLContext::derivative_signs[1] = 1.0;
}
}
+
+ /* Disable multidraw if the base instance cannot be read. */
+ if (GLContext::shader_draw_parameters_support == false) {
+ GLContext::multi_draw_indirect_support = false;
+ }
/* Enable our own incomplete debug layer if no other is available. */
if (GLContext::debug_layer_support == false) {
GLContext::debug_layer_workaround = true;
@@ -336,11 +355,20 @@ GLint GLContext::max_ubo_size;
GLint GLContext::max_ubo_binds;
/** Extensions. */
bool GLContext::base_instance_support = false;
+bool GLContext::clear_texture_support = false;
+bool GLContext::copy_image_support = false;
bool GLContext::debug_layer_support = false;
+bool GLContext::direct_state_access_support = false;
+bool GLContext::fixed_restart_index_support = false;
+bool GLContext::multi_bind_support = false;
+bool GLContext::multi_draw_indirect_support = false;
+bool GLContext::shader_draw_parameters_support = false;
bool GLContext::texture_cube_map_array_support = false;
+bool GLContext::texture_filter_anisotropic_support = false;
+bool GLContext::texture_gather_support = false;
+bool GLContext::vertex_attrib_binding_support = false;
/** Workarounds. */
bool GLContext::debug_layer_workaround = false;
-bool GLContext::texture_copy_workaround = false;
bool GLContext::unused_fb_slot_workaround = false;
float GLContext::derivative_signs[2] = {1.0f, 1.0f};
@@ -361,8 +389,18 @@ void GLBackend::capabilities_init(void)
glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_BLOCKS, &GLContext::max_ubo_binds);
glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &GLContext::max_ubo_size);
GLContext::base_instance_support = GLEW_ARB_base_instance;
- GLContext::texture_cube_map_array_support = GLEW_ARB_texture_cube_map_array;
+ GLContext::clear_texture_support = GLEW_ARB_clear_texture;
+ GLContext::copy_image_support = GLEW_ARB_copy_image;
GLContext::debug_layer_support = GLEW_VERSION_4_3 || GLEW_KHR_debug || GLEW_ARB_debug_output;
+ GLContext::direct_state_access_support = GLEW_ARB_direct_state_access;
+ GLContext::fixed_restart_index_support = GLEW_ARB_ES3_compatibility;
+ GLContext::multi_bind_support = GLEW_ARB_multi_bind;
+ GLContext::multi_draw_indirect_support = GLEW_ARB_multi_draw_indirect;
+ GLContext::shader_draw_parameters_support = GLEW_ARB_shader_draw_parameters;
+ GLContext::texture_cube_map_array_support = GLEW_ARB_texture_cube_map_array;
+ GLContext::texture_filter_anisotropic_support = GLEW_EXT_texture_filter_anisotropic;
+ GLContext::texture_gather_support = GLEW_ARB_texture_gather;
+ GLContext::vertex_attrib_binding_support = GLEW_ARB_vertex_attrib_binding;
detect_workarounds();
diff --git a/source/blender/gpu/opengl/gl_batch.cc b/source/blender/gpu/opengl/gl_batch.cc
index 17bc1013a78..ca627775e1f 100644
--- a/source/blender/gpu/opengl/gl_batch.cc
+++ b/source/blender/gpu/opengl/gl_batch.cc
@@ -307,7 +307,7 @@ void GLBatch::bind(int i_first)
#if GPU_TRACK_INDEX_RANGE
/* Can be removed if GL 4.3 is required. */
- if (!GLEW_ARB_ES3_compatibility && (elem != NULL)) {
+ if (!GLContext::fixed_restart_index_support && (elem != NULL)) {
glPrimitiveRestartIndex(this->elem_()->restart_index());
}
#endif
diff --git a/source/blender/gpu/opengl/gl_context.hh b/source/blender/gpu/opengl/gl_context.hh
index 1cef6e61425..9822c842ce7 100644
--- a/source/blender/gpu/opengl/gl_context.hh
+++ b/source/blender/gpu/opengl/gl_context.hh
@@ -62,11 +62,20 @@ class GLContext : public Context {
static GLint max_ubo_binds;
/** Extensions. */
static bool base_instance_support;
+ static bool clear_texture_support;
+ static bool copy_image_support;
static bool debug_layer_support;
+ static bool direct_state_access_support;
+ static bool fixed_restart_index_support;
+ static bool multi_bind_support;
+ static bool multi_draw_indirect_support;
+ static bool shader_draw_parameters_support;
static bool texture_cube_map_array_support;
+ static bool texture_filter_anisotropic_support;
+ static bool texture_gather_support;
+ static bool vertex_attrib_binding_support;
/** Workarounds. */
static bool debug_layer_workaround;
- static bool texture_copy_workaround;
static bool unused_fb_slot_workaround;
static float derivative_signs[2];
diff --git a/source/blender/gpu/opengl/gl_drawlist.cc b/source/blender/gpu/opengl/gl_drawlist.cc
index 6e3b1107b9c..990e1a8014b 100644
--- a/source/blender/gpu/opengl/gl_drawlist.cc
+++ b/source/blender/gpu/opengl/gl_drawlist.cc
@@ -41,8 +41,6 @@
#include <limits.h>
-#define USE_MULTI_DRAW_INDIRECT 1
-
using namespace blender::gpu;
typedef struct GLDrawCommand {
@@ -75,8 +73,7 @@ GLDrawList::GLDrawList(int length)
data_size_ = 0;
data_ = NULL;
- if (USE_MULTI_DRAW_INDIRECT && GLEW_ARB_multi_draw_indirect &&
- GLContext::base_instance_support) {
+ if (GLContext::multi_draw_indirect_support) {
/* Alloc the biggest possible command list, which is indexed. */
buffer_size_ = sizeof(GLDrawCommandIndexed) * length;
}
diff --git a/source/blender/gpu/opengl/gl_shader.cc b/source/blender/gpu/opengl/gl_shader.cc
index 7b3a071bf63..c400f218f5a 100644
--- a/source/blender/gpu/opengl/gl_shader.cc
+++ b/source/blender/gpu/opengl/gl_shader.cc
@@ -85,25 +85,15 @@ char *GLShader::glsl_patch_get(void)
/* Enable extensions for features that are not part of our base GLSL version
* don't use an extension for something already available! */
- if (GLEW_ARB_texture_gather) {
- /* There is a bug on older Nvidia GPU where GL_ARB_texture_gather
- * is reported to be supported but yield a compile error (see T55802). */
- if (!GPU_type_matches(GPU_DEVICE_NVIDIA, GPU_OS_ANY, GPU_DRIVER_ANY) || GLEW_VERSION_4_0) {
- STR_CONCAT(patch, slen, "#extension GL_ARB_texture_gather: enable\n");
-
- /* Some drivers don't agree on GLEW_ARB_texture_gather and the actual support in the
- * shader so double check the preprocessor define (see T56544). */
- if (!GPU_type_matches(GPU_DEVICE_NVIDIA, GPU_OS_ANY, GPU_DRIVER_ANY) && !GLEW_VERSION_4_0) {
- STR_CONCAT(patch, slen, "#ifdef GL_ARB_texture_gather\n");
- STR_CONCAT(patch, slen, "# define GPU_ARB_texture_gather\n");
- STR_CONCAT(patch, slen, "#endif\n");
- }
- else {
- STR_CONCAT(patch, slen, "#define GPU_ARB_texture_gather\n");
- }
- }
+ if (GLContext::texture_gather_support) {
+ STR_CONCAT(patch, slen, "#extension GL_ARB_texture_gather: enable\n");
+ /* Some drivers don't agree on GLEW_ARB_texture_gather and the actual support in the
+ * shader so double check the preprocessor define (see T56544). */
+ STR_CONCAT(patch, slen, "#ifdef GL_ARB_texture_gather\n");
+ STR_CONCAT(patch, slen, "# define GPU_ARB_texture_gather\n");
+ STR_CONCAT(patch, slen, "#endif\n");
}
- if (GLEW_ARB_shader_draw_parameters) {
+ if (GLContext::shader_draw_parameters_support) {
STR_CONCAT(patch, slen, "#extension GL_ARB_shader_draw_parameters : enable\n");
STR_CONCAT(patch, slen, "#define GPU_ARB_shader_draw_parameters\n");
}
diff --git a/source/blender/gpu/opengl/gl_state.cc b/source/blender/gpu/opengl/gl_state.cc
index 970a4d45a88..03762edac93 100644
--- a/source/blender/gpu/opengl/gl_state.cc
+++ b/source/blender/gpu/opengl/gl_state.cc
@@ -56,7 +56,7 @@ GLStateManager::GLStateManager(void) : GPUStateManager()
glPrimitiveRestartIndex((GLuint)0xFFFFFFFF);
/* TODO: Should become default. But needs at least GL 4.3 */
- if (GLEW_ARB_ES3_compatibility) {
+ if (GLContext::fixed_restart_index_support) {
/* Takes precedence over #GL_PRIMITIVE_RESTART. */
glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
}
@@ -454,7 +454,6 @@ void GLStateManager::texture_bind(Texture *tex_, eGPUSamplerState sampler_type,
/* Bind the texture to slot 0 for editing purpose. Used by legacy pipeline. */
void GLStateManager::texture_bind_temp(GLTexture *tex)
{
- // BLI_assert(!GLEW_ARB_direct_state_access);
glActiveTexture(GL_TEXTURE0);
glBindTexture(tex->target_, tex->tex_id_);
/* Will reset the first texture that was originally bound to slot 0 back before drawing. */
@@ -506,7 +505,7 @@ void GLStateManager::texture_bind_apply(void)
int last = 64 - bitscan_reverse_uint64(dirty_bind);
int count = last - first;
- if (GLEW_ARB_multi_bind) {
+ if (GLContext::multi_bind_support) {
glBindTextures(first, count, textures_ + first);
glBindSamplers(first, count, samplers_ + first);
}
diff --git a/source/blender/gpu/opengl/gl_texture.cc b/source/blender/gpu/opengl/gl_texture.cc
index 4e279fc47c1..ef4b2d1d4d3 100644
--- a/source/blender/gpu/opengl/gl_texture.cc
+++ b/source/blender/gpu/opengl/gl_texture.cc
@@ -89,7 +89,7 @@ bool GLTexture::init_internal(void)
this->ensure_mipmaps(0);
/* Avoid issue with incomplete textures. */
- if (GLEW_ARB_direct_state_access) {
+ if (GLContext::direct_state_access_support) {
glTextureParameteri(tex_id_, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}
else {
@@ -111,7 +111,7 @@ bool GLTexture::init_internal(GPUVertBuf *vbo)
GLenum internal_format = to_gl_internal_format(format_);
- if (GLEW_ARB_direct_state_access) {
+ if (GLContext::direct_state_access_support) {
glTextureBuffer(tex_id_, internal_format, gl_vbo->vbo_id_);
}
else {
@@ -244,8 +244,8 @@ void GLTexture::update_sub(
GLenum gl_format = to_gl_data_format(format_);
GLenum gl_type = to_gl(type);
- /* Some drivers have issues with cubemap & glTextureSubImage3D even if it correct. */
- if (GLEW_ARB_direct_state_access && (type_ != GPU_TEXTURE_CUBE)) {
+ /* Some drivers have issues with cubemap & glTextureSubImage3D even if it is correct. */
+ if (GLContext::direct_state_access_support && (type_ != GPU_TEXTURE_CUBE)) {
this->update_sub_direct_state_access(mip, offset, extent, gl_format, gl_type, data);
return;
}
@@ -306,7 +306,7 @@ void GLTexture::generate_mipmap(void)
}
/* Downsample from mip 0 using implementation. */
- if (GLEW_ARB_direct_state_access) {
+ if (GLContext::direct_state_access_support) {
glGenerateTextureMipmap(tex_id_);
}
else {
@@ -319,7 +319,7 @@ void GLTexture::clear(eGPUDataFormat data_format, const void *data)
{
BLI_assert(validate_data_format(format_, data_format));
- if (GLEW_ARB_clear_texture && !(G.debug & G_DEBUG_GPU_FORCE_WORKAROUNDS)) {
+ if (GLContext::clear_texture_support) {
int mip = 0;
GLenum gl_format = to_gl_data_format(format_);
GLenum gl_type = to_gl(data_format);
@@ -348,8 +348,7 @@ void GLTexture::copy_to(Texture *dst_)
/* TODO support array / 3D textures. */
BLI_assert(dst->d_ == 0);
- if (GLEW_ARB_copy_image && !GLContext::texture_copy_workaround) {
- /* Opengl 4.3 */
+ if (GLContext::copy_image_support) {
int mip = 0;
/* NOTE: mip_size_get() won't override any dimension that is equal to 0. */
int extent[3] = {1, 1, 1};
@@ -385,7 +384,7 @@ void *GLTexture::read(int mip, eGPUDataFormat type)
GLenum gl_format = to_gl_data_format(format_);
GLenum gl_type = to_gl(type);
- if (GLEW_ARB_direct_state_access) {
+ if (GLContext::direct_state_access_support) {
glGetTextureImage(tex_id_, mip, gl_format, gl_type, texture_size, data);
}
else {
@@ -416,7 +415,7 @@ void GLTexture::swizzle_set(const char swizzle[4])
(GLint)swizzle_to_gl(swizzle[1]),
(GLint)swizzle_to_gl(swizzle[2]),
(GLint)swizzle_to_gl(swizzle[3])};
- if (GLEW_ARB_direct_state_access) {
+ if (GLContext::direct_state_access_support) {
glTextureParameteriv(tex_id_, GL_TEXTURE_SWIZZLE_RGBA, gl_swizzle);
}
else {
@@ -430,7 +429,7 @@ void GLTexture::mip_range_set(int min, int max)
BLI_assert(min <= max && min >= 0 && max <= mipmaps_);
mip_min_ = min;
mip_max_ = max;
- if (GLEW_ARB_direct_state_access) {
+ if (GLContext::direct_state_access_support) {
glTextureParameteri(tex_id_, GL_TEXTURE_BASE_LEVEL, min);
glTextureParameteri(tex_id_, GL_TEXTURE_MAX_LEVEL, max);
}
@@ -520,7 +519,7 @@ void GLTexture::samplers_init(void)
void GLTexture::samplers_update(void)
{
- if (!GLEW_EXT_texture_filter_anisotropic) {
+ if (!GLContext::texture_filter_anisotropic_support) {
return;
}
diff --git a/source/blender/gpu/opengl/gl_vertex_array.cc b/source/blender/gpu/opengl/gl_vertex_array.cc
index 732221cfab3..14a7b4deb7d 100644
--- a/source/blender/gpu/opengl/gl_vertex_array.cc
+++ b/source/blender/gpu/opengl/gl_vertex_array.cc
@@ -135,7 +135,7 @@ void GLVertArray::update_bindings(const GLuint vao,
}
}
- if (attr_mask != 0 && GLEW_ARB_vertex_attrib_binding) {
+ if (attr_mask != 0 && GLContext::vertex_attrib_binding_support) {
for (uint16_t mask = 1, a = 0; a < 16; a++, mask <<= 1) {
if (attr_mask & mask) {
GLContext *ctx = GLContext::get();