Ver Fonte

glgsg: Guess max vertex attrib stride if not queryable

Or should we just assume the most restrictive possibility?
rdb há 2 anos atrás
pai
commit
805fa5a36a
1 ficheiros alterados com 16 adições e 4 exclusões
  1. 16 4
      panda/src/glstuff/glGraphicsStateGuardian_src.cxx

+ 16 - 4
panda/src/glstuff/glGraphicsStateGuardian_src.cxx

@@ -3523,27 +3523,39 @@ reset() {
 #endif
 
 #ifndef OPENGLES_1
+  _max_vertex_attrib_stride = -1;
 #ifdef OPENGLES
   if (is_at_least_gles_version(3, 1))
 #else
   if (is_at_least_gl_version(4, 4))
 #endif
   {
-    _max_vertex_attrib_stride = -1;
     glGetIntegerv(GL_MAX_VERTEX_ATTRIB_STRIDE, &_max_vertex_attrib_stride);
 
     if (_max_vertex_attrib_stride < 0) {
       GLCAT.warning()
         << "Failed to query GL_MAX_VERTEX_ATTRIB_STRIDE.\n";
-      _max_vertex_attrib_stride = INT_MAX;
     }
     else if (GLCAT.is_debug()) {
       GLCAT.debug()
         << "max vertex attrib stride = " << _max_vertex_attrib_stride << "\n";
     }
   }
-  else {
-    _max_vertex_attrib_stride = INT_MAX;
+  if (_max_vertex_attrib_stride < 0) {
+    // OpenGL doesn't specify a maximum before version 4.4 / ES 3.1, but
+    // drivers really do have one.  Make an educated guess.
+#ifdef OPENGLES
+    _max_vertex_attrib_stride = (_gl_vendor == "Qualcomm") ? INT_MAX : 2048;
+#elif defined(_WIN32)
+    _max_vertex_attrib_stride = (_gl_vendor == "Intel") ? 4095 : 2048;
+#else
+    _max_vertex_attrib_stride = 2048;
+#endif
+    if (GLCAT.is_debug()) {
+      GLCAT.debug()
+        << "max vertex attrib stride = " << _max_vertex_attrib_stride
+        << " (guessed)\n";
+    }
   }
 #endif  // !OPENGLES_1