Fix T45909: Garbage output in Viewport with OpenSubdiv device set to GLSL Compute
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 26 Aug 2015 10:10:24 +0000 (12:10 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 26 Aug 2015 10:10:24 +0000 (12:10 +0200)
This isn't a Blender issue and the same bug happens with official OpenSubdiv
examples. For until it's either worked around from OpenSubdiv side or fixed
in the driver we'll force disable GLSL Compute for AMD hardware.

intern/opensubdiv/opensubdiv_utils_capi.cc

index 5a2d017ed26a9eb59713be1f99571086aba10b7b..a3aff5327db88c94952c8969d76318577042eaf7 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "opensubdiv_capi.h"
 
+#include <cstring>
 #include <GL/glew.h>
 
 #ifdef _MSC_VER
@@ -71,7 +72,24 @@ int openSubdiv_getAvailableEvaluators(void)
 #endif  /* OPENSUBDIV_HAS_GLSL_TRANSFORM_FEEDBACK */
 
 #ifdef OPENSUBDIV_HAS_GLSL_COMPUTE
-       flags |= OPENSUBDIV_EVALUATOR_GLSL_COMPUTE;
+       static bool vendor_checked = false;
+       static bool disable_glsl_compute = false;
+       /* Force disable GLSL Compute on AMD hardware because it has really
+        * hard time evaluating required shaders.
+        */
+       if (!vendor_checked) {
+               const char *vendor = (const char *)glGetString(GL_VENDOR);
+               const char *renderer = (const char *)glGetString(GL_RENDERER);
+               if (strstr(vendor, "ATI") ||
+                       strstr(renderer, "Mesa DRI R") ||
+                       (strstr(renderer, "Gallium ") && strstr(renderer, " on ATI ")))
+               {
+                       disable_glsl_compute = true;
+               }
+       }
+       if (!disable_glsl_compute) {
+               flags |= OPENSUBDIV_EVALUATOR_GLSL_COMPUTE;
+       }
 #endif  /* OPENSUBDIV_HAS_GLSL_COMPUTE */
 
        return flags;