Răsfoiți Sursa

glgsg: don't rely on glProgramUniform1i to be available

rdb 5 ani în urmă
părinte
comite
dda908d3ff

+ 1 - 11
panda/src/glstuff/glGraphicsStateGuardian_src.cxx

@@ -1832,18 +1832,8 @@ reset() {
     _glSpecializeShader = (PFNGLSPECIALIZESHADERARBPROC)
       get_extension_func("glSpecializeShaderARB");
 
-    if (is_at_least_gl_version(4, 1) || has_extension("GL_ARB_separate_shader_objects")) {
-      _glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)
-        get_extension_func("glProgramUniform1i");
-
-    } else if (has_extension("GL_EXT_separate_shader_objects") ||
-               has_extension("GL_EXT_direct_state_access")) {
-      _glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)
-        get_extension_func("glProgramUniform1iEXT");
-    }
-
     if (gl_support_spirv && _glShaderBinary != nullptr &&
-        _glSpecializeShader != nullptr && _glProgramUniform1i != nullptr) {
+       _glSpecializeShader != nullptr) {
       _supports_spir_v = true;
     }
   }

+ 0 - 3
panda/src/glstuff/glGraphicsStateGuardian_src.h

@@ -998,9 +998,6 @@ public:
   PFNGLSHADERBINARYPROC _glShaderBinary;
   PFNGLSHADERSOURCEPROC_P _glShaderSource;
   PFNGLUSEPROGRAMPROC  _glUseProgram;
-#ifndef OPENGLES
-  PFNGLPROGRAMUNIFORM1IPROC _glProgramUniform1i;
-#endif
   PFNGLUNIFORM4FPROC _glUniform4f;
   PFNGLUNIFORM1IPROC _glUniform1i;
   PFNGLUNIFORM1FVPROC _glUniform1fv;

+ 24 - 22
panda/src/glstuff/glShaderContext_src.cxx

@@ -280,6 +280,9 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext
     return;
   }
 
+  // Bind the program, so that we can call glUniform1i for the textures.
+  _glgsg->_glUseProgram(_glsl_program);
+
   // Is this a SPIR-V shader?  If so, we've already done the reflection.
   if (!_needs_reflection) {
     if (_needs_query_uniform_locations) {
@@ -302,9 +305,7 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext
         continue;
       }
 
-#ifndef OPENGLES
-      _glgsg->_glProgramUniform1i(_glsl_program, location, (int)i);
-#endif
+      _glgsg->_glUniform1i(location, (int)i);
       ++i;
     }
 
@@ -329,9 +330,7 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext
       ImageInput input = {spec._name, nullptr, spec._writable};
       _glsl_img_inputs.push_back(std::move(input));
 
-#ifndef OPENGLES
-      _glgsg->_glProgramUniform1i(_glsl_program, location, (int)i);
-#endif
+      _glgsg->_glUniform1i(location, (int)i);
       ++i;
     }
 
@@ -383,11 +382,28 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext
     if (_slider_table_size > 0 && _slider_table_index == -1) {
       _slider_table_index = _glgsg->_glGetUniformLocation(_glsl_program, "p3d_SliderTable");
     }
+  } else {
+    reflect_program();
+  }
 
-    _mat_part_cache = new LMatrix4[_shader->cp_get_mat_cache_size()];
-    return;
+  _glgsg->report_my_gl_errors();
+
+  // Restore the active shader.
+  if (_glgsg->_current_shader_context == nullptr) {
+    _glgsg->_glUseProgram(0);
+  } else {
+    _glgsg->_current_shader_context->bind();
   }
 
+  _mat_part_cache = new LMatrix4[_shader->cp_get_mat_cache_size()];
+}
+
+/**
+ * Analyzes the uniforms, attributes, etc. of a shader that was not already
+ * reflected.
+ */
+void CLP(ShaderContext)::
+reflect_program() {
   // Process the vertex attributes first.
   GLint param_count = 0;
   GLint name_buflen = 0;
@@ -465,9 +481,6 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext
   }
 #endif
 
-  // Bind the program, so that we can call glUniform1i for the textures.
-  _glgsg->_glUseProgram(_glsl_program);
-
   // Analyze the uniforms.
   param_count = 0;
   _glgsg->_glGetProgramiv(_glsl_program, GL_ACTIVE_UNIFORMS, &param_count);
@@ -478,17 +491,6 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext
   for (int i = 0; i < param_count; ++i) {
     reflect_uniform(i, name_buffer, name_buflen);
   }
-
-  _glgsg->report_my_gl_errors();
-
-  // Restore the active shader.
-  if (_glgsg->_current_shader_context == nullptr) {
-    _glgsg->_glUseProgram(0);
-  } else {
-    _glgsg->_current_shader_context->bind();
-  }
-
-  _mat_part_cache = new LMatrix4[_shader->cp_get_mat_cache_size()];
 }
 
 /**

+ 1 - 0
panda/src/glstuff/glShaderContext_src.h

@@ -34,6 +34,7 @@ public:
   ~CLP(ShaderContext)();
   ALLOC_DELETED_CHAIN(CLP(ShaderContext));
 
+  void reflect_program();
   void query_uniform_locations(const ShaderModule *module);
   void r_query_uniform_locations(uint32_t from_location, const ShaderType *type, const char *name);
   void reflect_attribute(int i, char *name_buf, GLsizei name_buflen);