diff --git a/src/mesa/main/shared.c b/src/mesa/main/shared.c
index 16eb5dbe083..546b0d629d0 100644
--- a/src/mesa/main/shared.c
+++ b/src/mesa/main/shared.c
@@ -42,10 +42,12 @@
#include "syncobj.h"
#include "texobj.h"
#include "texturebindless.h"
+#include "pipe/p_screen.h"
#include "util/hash_table.h"
#include "util/set.h"
#include "util/u_memory.h"
+#include "util/u_process.h"
static void
free_shared_state(struct gl_context *ctx, struct gl_shared_state *shared);
@@ -71,7 +73,21 @@ _mesa_alloc_shared_state(struct gl_context *ctx,
return NULL;
simple_mtx_init(&shared->Mutex, mtx_plain);
- shared->ReuseGLNames = options->reuse_gl_names == 1;
+
+ const char *driver_name = ctx->screen->get_name(ctx->screen);
+ bool is_virgl_guest = !strcmp(driver_name, "virgl");
+ const char *process_name = util_get_process_name();
+ bool is_virgl_host = strstr(process_name, "qemu-system") == process_name ||
+ strstr(process_name, "crosvm") ||
+ strstr(process_name, "virgl_test_server");
+
+ /* Enable GL name reuse for all drivers by default except virgl, which
+ * is hopelessly broken.
+ *
+ * To disable it, set reuse_gl_names=0 in the environment.
+ */
+ if (!is_virgl_guest && !is_virgl_host)
+ shared->ReuseGLNames = options->reuse_gl_names != 0;
_mesa_InitHashTable(&shared->DisplayList, shared->ReuseGLNames);
_mesa_InitHashTable(&shared->TexObjects, shared->ReuseGLNames);
diff --git a/src/util/00-mesa-defaults.conf b/src/util/00-mesa-defaults.conf
index 4950d8dbee7..6bcb720848a 100644
--- a/src/util/00-mesa-defaults.conf
+++ b/src/util/00-mesa-defaults.conf
@@ -383,7 +383,6 @@ TODO: document the other workarounds.
-
@@ -883,14 +882,6 @@ TODO: document the other workarounds.
-
-
-
-
-