Commit: 97f75ca87f72e8cbb744728bfd49b2c3f2f1ebdb
Author: Clément Foucault
Date:   Tue Aug 25 18:18:43 2020 +0200
Branches: master
https://developer.blender.org/rB97f75ca87f72e8cbb744728bfd49b2c3f2f1ebdb

GPUState: Move state limits getter to the area they belong

This fix a GL_INVALID_VALUE error on startup due to 0.0f max line width.

Also moves the max anisotropy filter to the sampler creation.

This reduces code fragmentation.

===================================================================

M       source/blender/gpu/GPU_extensions.h
M       source/blender/gpu/intern/gpu_extensions.cc
M       source/blender/gpu/intern/gpu_texture.cc
M       source/blender/gpu/opengl/gl_state.cc
M       source/blender/gpu/opengl/gl_state.hh

===================================================================

diff --git a/source/blender/gpu/GPU_extensions.h 
b/source/blender/gpu/GPU_extensions.h
index 2ce6e458378..18ac2265cc4 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -40,7 +40,6 @@ int GPU_max_color_texture_samples(void);
 int GPU_max_cube_map_size(void);
 int GPU_max_ubo_binds(void);
 int GPU_max_ubo_size(void);
-float GPU_max_line_width(void);
 void GPU_get_dfdy_factors(float fac[2]);
 bool GPU_arb_base_instance_is_supported(void);
 bool GPU_arb_texture_cube_map_array_is_supported(void);
diff --git a/source/blender/gpu/intern/gpu_extensions.cc 
b/source/blender/gpu/intern/gpu_extensions.cc
index 8074e4b64f0..1d607d79b01 100644
--- a/source/blender/gpu/intern/gpu_extensions.cc
+++ b/source/blender/gpu/intern/gpu_extensions.cc
@@ -71,12 +71,10 @@ static struct GPUGlobal {
   GLint maxubosize;
   GLint maxubobinds;
   int samples_color_texture_max;
-  float line_width_range[2];
   /* workaround for different calculation of dfdy factors on GPUs. Some 
GPUs/drivers
    * calculate dfdy in shader differently when drawing to an off-screen 
buffer. First
    * number is factor on screen and second is off-screen */
   float dfdyfactors[2];
-  float max_anisotropy;
   /* Some Intel drivers have limited support for `GLEW_ARB_base_instance` so in
    * these cases it is best to indicate that it is not supported. See T67951 */
   bool glew_arb_base_instance_is_supported;
@@ -164,11 +162,6 @@ int GPU_max_textures_vert(void)
   return GG.maxtexturesvert;
 }
 
-float GPU_max_texture_anisotropy(void)
-{
-  return GG.max_anisotropy;
-}
-
 int GPU_max_color_texture_samples(void)
 {
   return GG.samples_color_texture_max;
@@ -189,11 +182,6 @@ int GPU_max_ubo_size(void)
   return GG.maxubosize;
 }
 
-float GPU_max_line_width(void)
-{
-  return GG.line_width_range[1];
-}
-
 void GPU_get_dfdy_factors(float fac[2])
 {
   copy_v2_v2(fac, GG.dfdyfactors);
@@ -264,18 +252,9 @@ void gpu_extensions_init(void)
   glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &GG.maxtexlayers);
   glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &GG.maxcubemapsize);
 
-  if (GLEW_EXT_texture_filter_anisotropic) {
-    glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &GG.max_anisotropy);
-  }
-  else {
-    GG.max_anisotropy = 1.0f;
-  }
-
   glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_BLOCKS, &GG.maxubobinds);
   glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &GG.maxubosize);
 
-  glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, GG.line_width_range);
-
   glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &GG.samples_color_texture_max);
 
   const char *vendor = (const char *)glGetString(GL_VENDOR);
diff --git a/source/blender/gpu/intern/gpu_texture.cc 
b/source/blender/gpu/intern/gpu_texture.cc
index 91990dac83f..3d84ca14423 100644
--- a/source/blender/gpu/intern/gpu_texture.cc
+++ b/source/blender/gpu/intern/gpu_texture.cc
@@ -2179,6 +2179,11 @@ void GPU_texture_get_mipmap_size(GPUTexture *tex, int 
lvl, int *size)
 
 void GPU_samplers_init(void)
 {
+  float max_anisotropy = 1.0f;
+  if (GLEW_EXT_texture_filter_anisotropic) {
+    glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_anisotropy);
+  }
+
   glGenSamplers(GPU_SAMPLER_MAX, GG.samplers);
   for (int i = 0; i < GPU_SAMPLER_MAX; i++) {
     eGPUSamplerState state = static_cast<eGPUSamplerState>(i);
@@ -2193,7 +2198,7 @@ void GPU_samplers_init(void)
     GLenum compare_mode = (state & GPU_SAMPLER_COMPARE) ? 
GL_COMPARE_REF_TO_TEXTURE : GL_NONE;
     /* TODO(fclem) Anisotropic level should be a render engine parameter. */
     float aniso_filter = ((state & GPU_SAMPLER_MIPMAP) && (state & 
GPU_SAMPLER_ANISO)) ?
-                             U.anisotropic_filter :
+                             max_ff(max_anisotropy, U.anisotropic_filter) :
                              1.0f;
 
     glSamplerParameteri(GG.samplers[i], GL_TEXTURE_WRAP_S, wrap_s);
diff --git a/source/blender/gpu/opengl/gl_state.cc 
b/source/blender/gpu/opengl/gl_state.cc
index 4e21ab43b45..7dc3e44c516 100644
--- a/source/blender/gpu/opengl/gl_state.cc
+++ b/source/blender/gpu/opengl/gl_state.cc
@@ -26,6 +26,7 @@
 
 #include "glew-mx.h"
 
+#include "gl_context.hh"
 #include "gl_state.hh"
 
 using namespace blender::gpu;
@@ -53,6 +54,9 @@ GLStateManager::GLStateManager(void) : GPUStateManager()
     glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
   }
 
+  /* Limits. */
+  glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, line_width_range_);
+
   /* Force update using default state. */
   current_ = ~state;
   current_mutable_ = ~mutable_state;
@@ -150,7 +154,7 @@ void GLStateManager::set_mutable_state(const 
GPUStateMutable &state)
 
   if (changed.line_width != 0) {
     /* TODO remove, should use wide line shader. */
-    glLineWidth(clamp_f(state.line_width, 1.0f, GPU_max_line_width()));
+    glLineWidth(clamp_f(state.line_width, line_width_range_[0], 
line_width_range_[1]));
   }
 
   if (changed.depth_range[0] != 0 || changed.depth_range[1] != 0) {
diff --git a/source/blender/gpu/opengl/gl_state.hh 
b/source/blender/gpu/opengl/gl_state.hh
index bcbf6c06c61..8e806cb3e7a 100644
--- a/source/blender/gpu/opengl/gl_state.hh
+++ b/source/blender/gpu/opengl/gl_state.hh
@@ -40,6 +40,8 @@ class GLStateManager : public GPUStateManager {
   /** Current state of the GL implementation. Avoids resetting the whole state 
for every change. */
   GPUState current_;
   GPUStateMutable current_mutable_;
+  /** Limits. */
+  float line_width_range_[2];
 
  public:
   GLStateManager();

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to