Mesa (main): glthread: add an option to make glCheckFramebufferStatus a no-op

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Oct 27 01:46:56 UTC 2021


Module: Mesa
Branch: main
Commit: c14d755f3d3ea0f1501da5da021d59f26379d1f1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c14d755f3d3ea0f1501da5da021d59f26379d1f1

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Mon Oct 18 08:16:23 2021 -0400

glthread: add an option to make glCheckFramebufferStatus a no-op

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13403>

---

 src/gallium/auxiliary/pipe-loader/driinfo_gallium.h | 1 +
 src/gallium/auxiliary/util/u_driconf.c              | 1 +
 src/gallium/include/frontend/api.h                  | 1 +
 src/mapi/glapi/gen/ARB_framebuffer_object.xml       | 3 ++-
 src/mesa/main/mtypes.h                              | 7 +++++++
 src/mesa/state_tracker/st_extensions.c              | 1 +
 src/util/00-mesa-defaults.conf                      | 1 +
 src/util/driconf.h                                  | 4 ++++
 8 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h b/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
index 3b630f77698..d93856dd35d 100644
--- a/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
+++ b/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
@@ -31,6 +31,7 @@ DRI_CONF_SECTION_DEBUG
    DRI_CONF_GLSL_CORRECT_DERIVATIVES_AFTER_DISCARD(false)
    DRI_CONF_GLSL_IGNORE_WRITE_TO_READONLY_VAR(false)
    DRI_CONF_ALLOW_DRAW_OUT_OF_ORDER(false)
+   DRI_CONF_GLTHREAD_NOP_CHECK_FRAMEBUFFER_STATUS(false)
    DRI_CONF_FORCE_COMPAT_PROFILE(false)
    DRI_CONF_FORCE_GL_NAMES_REUSE(false)
    DRI_CONF_TRANSCODE_ETC(false)
diff --git a/src/gallium/auxiliary/util/u_driconf.c b/src/gallium/auxiliary/util/u_driconf.c
index 8ace8474766..531a55c2753 100644
--- a/src/gallium/auxiliary/util/u_driconf.c
+++ b/src/gallium/auxiliary/util/u_driconf.c
@@ -58,6 +58,7 @@ u_driconf_fill_st_options(struct st_config_options *options,
    query_bool_option(force_glsl_abs_sqrt);
    query_bool_option(allow_glsl_cross_stage_interpolation_mismatch);
    query_bool_option(allow_draw_out_of_order);
+   query_bool_option(glthread_nop_check_framebuffer_status);
    query_bool_option(ignore_map_unsynchronized);
    query_bool_option(force_gl_names_reuse);
    query_bool_option(transcode_etc);
diff --git a/src/gallium/include/frontend/api.h b/src/gallium/include/frontend/api.h
index 5b9f9c63d6d..6514d87d81a 100644
--- a/src/gallium/include/frontend/api.h
+++ b/src/gallium/include/frontend/api.h
@@ -234,6 +234,7 @@ struct st_config_options
    bool force_glsl_abs_sqrt;
    bool allow_glsl_cross_stage_interpolation_mismatch;
    bool allow_draw_out_of_order;
+   bool glthread_nop_check_framebuffer_status;
    bool ignore_map_unsynchronized;
    bool force_integer_tex_nearest;
    bool force_gl_names_reuse;
diff --git a/src/mapi/glapi/gen/ARB_framebuffer_object.xml b/src/mapi/glapi/gen/ARB_framebuffer_object.xml
index 295175c8816..44f274691c1 100644
--- a/src/mapi/glapi/gen/ARB_framebuffer_object.xml
+++ b/src/mapi/glapi/gen/ARB_framebuffer_object.xml
@@ -220,7 +220,8 @@
 	<glx vendorpriv="1426" always_array="true"/>
     </function>
 
-    <function name="CheckFramebufferStatus" es2="2.0" no_error="true">
+    <function name="CheckFramebufferStatus" es2="2.0" no_error="true"
+              marshal_call_before="if (ctx->Const.GLThreadNopCheckFramebufferStatus) return GL_FRAMEBUFFER_COMPLETE;">
         <param name="target" type="GLenum"/>
 	<return type="GLenum"/>
 	<glx vendorpriv="1427"/>
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 4bb2d8844d5..f8f12c03152 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -4305,6 +4305,13 @@ struct gl_constants
     *  produce 0 instead of leaving the texture content undefined).
     */
    bool NoClippingOnCopyTex;
+
+   /**
+    * Force glthread to always return GL_FRAMEBUFFER_COMPLETE to prevent
+    * synchronization. Used for apps that call it every frame or multiple times
+    * a frame, but always getting framebuffer completeness.
+    */
+   bool GLThreadNopCheckFramebufferStatus;
 };
 
 
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index f27051115d1..5e731bec413 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -1840,6 +1840,7 @@ void st_init_extensions(struct pipe_screen *screen,
    }
 
    consts->AllowDrawOutOfOrder = options->allow_draw_out_of_order;
+   consts->GLThreadNopCheckFramebufferStatus = options->glthread_nop_check_framebuffer_status;
 
    bool prefer_nir = PIPE_SHADER_IR_NIR ==
          screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, PIPE_SHADER_CAP_PREFERRED_IR);
diff --git a/src/util/00-mesa-defaults.conf b/src/util/00-mesa-defaults.conf
index 9809352c9b3..8fe9a8941bd 100644
--- a/src/util/00-mesa-defaults.conf
+++ b/src/util/00-mesa-defaults.conf
@@ -766,6 +766,7 @@ TODO: document the other workarounds.
             <option name="radeonsi_zerovram" value="true" />
         </application>
         <application name="SPECviewperf13" executable="viewperf">
+            <option name="glthread_nop_check_framebuffer_status" value="true" />
             <option name="radeonsi_sync_compile" value="true" />
             <option name="radeonsi_clamp_div_by_zero" value="true" />
             <option name="radeonsi_tc_max_cpu_storage_size" value="1000" />
diff --git a/src/util/driconf.h b/src/util/driconf.h
index b1faacca096..a2ed0f82d5b 100644
--- a/src/util/driconf.h
+++ b/src/util/driconf.h
@@ -216,6 +216,10 @@
    DRI_CONF_OPT_B(allow_draw_out_of_order, def, \
                   "Allow out-of-order draw optimizations. Set when Z fighting doesn't have to be accurate.")
 
+#define DRI_CONF_GLTHREAD_NOP_CHECK_FRAMEBUFFER_STATUS(def) \
+   DRI_CONF_OPT_B(glthread_nop_check_framebuffer_status, def, \
+                  "glthread always returns GL_FRAMEBUFFER_COMPLETE to prevent synchronization.")
+
 #define DRI_CONF_FORCE_GL_VENDOR() \
    DRI_CONF_OPT_S_NODEF(force_gl_vendor, "Override GPU vendor string.")
 



More information about the mesa-commit mailing list