v3d: Use driconf to expose non-MSAA texture limits for Xorg.
authorEric Anholt <eric@anholt.net>
Wed, 1 May 2019 22:02:27 +0000 (15:02 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 13 May 2019 19:03:11 +0000 (12:03 -0700)
The V3D 4.2 HW has a limit to MSAA texture sizes of 4096.  With non-MSAA,
we can go up to 7680 (actually probably 8138, but that hasn't been
validated by the HW team).  Exposing 7680 in X11 will allow dual 4k displays.

15 files changed:
src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
src/gallium/auxiliary/target-helpers/drm_helper.h
src/gallium/auxiliary/target-helpers/drm_helper_public.h
src/gallium/drivers/v3d/driinfo_v3d.h [new file with mode: 0644]
src/gallium/drivers/v3d/meson.build
src/gallium/drivers/v3d/v3d_screen.c
src/gallium/drivers/v3d/v3d_screen.h
src/gallium/winsys/kmsro/drm/kmsro_drm_public.h
src/gallium/winsys/kmsro/drm/kmsro_drm_winsys.c
src/gallium/winsys/v3d/drm/v3d_drm_public.h
src/gallium/winsys/v3d/drm/v3d_drm_winsys.c
src/gallium/winsys/vc4/drm/vc4_drm_public.h
src/gallium/winsys/vc4/drm/vc4_drm_winsys.c
src/util/00-mesa-defaults.conf
src/util/xmlpool/t_options.h

index 3006f78311a0b93b812769dc9e4e7b842eacd008..9d75a9868e2f9eb1b3ea82946a1b48efe246f480 100644 (file)
@@ -111,10 +111,12 @@ static const struct drm_driver_descriptor driver_descriptors[] = {
     {
         .driver_name = "v3d",
         .create_screen = pipe_v3d_create_screen,
+        .driconf_xml = &v3d_driconf_xml,
     },
     {
         .driver_name = "vc4",
         .create_screen = pipe_vc4_create_screen,
+        .driconf_xml = &v3d_driconf_xml,
     },
     {
         .driver_name = "panfrost",
@@ -137,6 +139,7 @@ static const struct drm_driver_descriptor driver_descriptors[] = {
 static const struct drm_driver_descriptor default_driver_descriptor = {
         .driver_name = "kmsro",
         .create_screen = pipe_kmsro_create_screen,
+        .driconf_xml = &v3d_driconf_xml,
 };
 
 #endif
index 830c0abcb7f6d17b96fde35cbc9fc1ae5c2a8b01..ac891d1d30794b18d1a6f10793c0b5c6746e88b2 100644 (file)
@@ -96,7 +96,7 @@ pipe_kmsro_create_screen(int fd, const struct pipe_screen_config *config)
 {
    struct pipe_screen *screen;
 
-   screen = kmsro_drm_screen_create(fd);
+   screen = kmsro_drm_screen_create(fd, config);
    return screen ? debug_screen_wrap(screen) : NULL;
 }
 
@@ -281,10 +281,9 @@ pipe_vc4_create_screen(int fd, const struct pipe_screen_config *config)
 {
    struct pipe_screen *screen;
 
-   screen = vc4_drm_screen_create(fd);
+   screen = vc4_drm_screen_create(fd, config);
    return screen ? debug_screen_wrap(screen) : NULL;
 }
-
 #else
 
 struct pipe_screen *
@@ -304,10 +303,14 @@ pipe_v3d_create_screen(int fd, const struct pipe_screen_config *config)
 {
    struct pipe_screen *screen;
 
-   screen = v3d_drm_screen_create(fd);
+   screen = v3d_drm_screen_create(fd, config);
    return screen ? debug_screen_wrap(screen) : NULL;
 }
 
+const char *v3d_driconf_xml =
+      #include "v3d/v3d_driinfo.h"
+      ;
+
 #else
 
 struct pipe_screen *
@@ -317,6 +320,8 @@ pipe_v3d_create_screen(int fd, const struct pipe_screen_config *config)
    return NULL;
 }
 
+const char *v3d_driconf_xml = NULL;
+
 #endif
 
 #ifdef GALLIUM_PANFROST
index fedb5c0fc17caa6d278d0d08319db06a5ee1549c..a3cb9279fd5cf6d502282aa4af625343a6e1b036 100644 (file)
@@ -6,6 +6,7 @@ struct pipe_screen_config;
 
 const char *iris_driconf_xml;
 const char *radeonsi_driconf_xml;
+const char *v3d_driconf_xml;
 
 struct pipe_screen *
 pipe_i915_create_screen(int fd, const struct pipe_screen_config *config);
diff --git a/src/gallium/drivers/v3d/driinfo_v3d.h b/src/gallium/drivers/v3d/driinfo_v3d.h
new file mode 100644 (file)
index 0000000..5ea4585
--- /dev/null
@@ -0,0 +1,5 @@
+// v3d-specific driconf options
+
+DRI_CONF_SECTION_MISCELLANEOUS
+   DRI_CONF_V3D_NONMSAA_TEXTURE_SIZE_LIMIT("false")
+DRI_CONF_SECTION_END
index 7f9fdf10ac248a9e22b8df0a18dab6aaf425f244..297ff5ce63928ea626adfd0acd319f12c393abf5 100644 (file)
@@ -50,6 +50,16 @@ files_per_version = files(
   'v3dx_state.c',
 )
 
+v3d_driinfo_h = custom_target(
+  'v3d_driinfo.h',
+  input : files(
+    '../../../util/merge_driinfo.py',
+    '../../auxiliary/pipe-loader/driinfo_gallium.h', 'driinfo_v3d.h'
+  ),
+  output : 'v3d_driinfo.h',
+  command : [prog_python, '@INPUT@'],
+  capture : true,
+)
 v3d_args = ['-DV3D_BUILD_NEON']
 
 dep_v3dv3 = dependency('v3dv3', required: false)
@@ -93,7 +103,11 @@ libv3d_neon = static_library(
 
 libv3d = static_library(
   'v3d',
-  [files_libv3d, v3d_xml_pack],
+  [
+    files_libv3d,
+    v3d_xml_pack,
+    v3d_driinfo_h
+  ],
   include_directories : [
     inc_src, inc_include, inc_gallium, inc_gallium_aux, inc_broadcom,
     inc_gallium_drivers,
@@ -107,5 +121,6 @@ libv3d = static_library(
 driver_v3d = declare_dependency(
   compile_args : '-DGALLIUM_V3D',
   link_with : [libv3d, libv3dwinsys, libbroadcom_cle, libbroadcom_v3d],
+  sources : v3d_driinfo_h,
   dependencies : idep_nir,
 )
index e902be0547439760d0ac3ea50d794eb3c6c4e802..f6edf15bdf8a7ba55d5d06794ec06dd7c7106ee7 100644 (file)
@@ -36,6 +36,7 @@
 #include "util/u_screen.h"
 #include "util/u_transfer_helper.h"
 #include "util/ralloc.h"
+#include "util/xmlconfig.h"
 
 #include <xf86drm.h>
 #include "v3d_screen.h"
@@ -208,6 +209,8 @@ v3d_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
         case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
                 if (screen->devinfo.ver < 40)
                         return 2048;
+                else if (screen->nonmsaa_texture_size_limit)
+                        return 7680;
                 else
                         return 4096;
         case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
@@ -665,7 +668,8 @@ v3d_screen_query_dmabuf_modifiers(struct pipe_screen *pscreen,
 }
 
 struct pipe_screen *
-v3d_screen_create(int fd, struct renderonly *ro)
+v3d_screen_create(int fd, const struct pipe_screen_config *config,
+                  struct renderonly *ro)
 {
         struct v3d_screen *screen = rzalloc(NULL, struct v3d_screen);
         struct pipe_screen *pscreen;
@@ -700,6 +704,14 @@ v3d_screen_create(int fd, struct renderonly *ro)
         if (!v3d_get_device_info(screen))
                 goto fail;
 
+        /* We have to driCheckOption for the simulator mode to not assertion
+         * fail on not having our XML config.
+         */
+        const char *nonmsaa_name = "v3d_nonmsaa_texture_size_limit";
+        screen->nonmsaa_texture_size_limit =
+                driCheckOption(config->options, nonmsaa_name, DRI_BOOL) &&
+                driQueryOptionb(config->options, nonmsaa_name);
+
         slab_create_parent(&screen->transfer_pool, sizeof(struct v3d_transfer), 16);
 
         screen->has_csd = false; /* until the UABI is enabled. */
index 6e90755e77ca12fc3b328de377aece0c1497dea0..2f276ac9b0d82a3fa99eb8008c9c9a90996d39d5 100644 (file)
@@ -78,6 +78,7 @@ struct v3d_screen {
         uint32_t bo_count;
 
         bool has_csd;
+        bool nonmsaa_texture_size_limit;
 
         struct v3d_simulator_file *sim_file;
 };
@@ -88,7 +89,9 @@ v3d_screen(struct pipe_screen *screen)
         return (struct v3d_screen *)screen;
 }
 
-struct pipe_screen *v3d_screen_create(int fd, struct renderonly *ro);
+struct pipe_screen *v3d_screen_create(int fd,
+                                      const struct pipe_screen_config *config,
+                                      struct renderonly *ro);
 
 void
 v3d_fence_init(struct v3d_screen *screen);
index 4da4e4b72baeae31aba17f3a1344b40b1ab9a51a..9d81ea3ee393398947b78c4a40ab723ac9922159 100644 (file)
@@ -28,7 +28,9 @@
 #define __KMSRO_DRM_PUBLIC_H__
 
 struct pipe_screen;
+struct pipe_screen_config;
 
-struct pipe_screen *kmsro_drm_screen_create(int fd);
+struct pipe_screen *kmsro_drm_screen_create(int fd,
+                                            const struct pipe_screen_config *config);
 
 #endif /* __KMSRO_DRM_PUBLIC_H__ */
index 3a452f91315916e6f6476f5c4c99e4ff46b44298..bf599a1497c938c221c4b84d0ec75730d27e3109 100644 (file)
@@ -37,7 +37,8 @@
 #include "pipe/p_screen.h"
 #include "renderonly/renderonly.h"
 
-struct pipe_screen *kmsro_drm_screen_create(int fd)
+struct pipe_screen *kmsro_drm_screen_create(int fd,
+                                            const struct pipe_screen_config *config)
 {
    struct pipe_screen *screen = NULL;
    struct renderonly ro = {
@@ -53,7 +54,7 @@ struct pipe_screen *kmsro_drm_screen_create(int fd)
        * flag on allocation will have ensured.
        */
       ro.create_for_resource = renderonly_create_gpu_import_for_resource,
-      screen = vc4_drm_screen_create_renderonly(&ro);
+      screen = vc4_drm_screen_create_renderonly(&ro, config);
       if (!screen)
          close(ro.gpu_fd);
 
@@ -114,7 +115,7 @@ struct pipe_screen *kmsro_drm_screen_create(int fd)
    ro.gpu_fd = drmOpenWithType("v3d", NULL, DRM_NODE_RENDER);
    if (ro.gpu_fd >= 0) {
       ro.create_for_resource = renderonly_create_kms_dumb_buffer_for_resource,
-      screen = v3d_drm_screen_create_renderonly(&ro);
+      screen = v3d_drm_screen_create_renderonly(&ro, config);
       if (!screen)
          close(ro.gpu_fd);
 
index 1813825436b109bef189aed03190babbee57994e..4b8dd0b7804203649272c325bfebbb7e9941b8db 100644 (file)
 #define __VC5_DRM_PUBLIC_H__
 
 struct pipe_screen;
+struct pipe_screen_config;
 struct renderonly;
 
-struct pipe_screen *v3d_drm_screen_create(int drmFD);
-struct pipe_screen *v3d_drm_screen_create_renderonly(struct renderonly *ro);
+struct pipe_screen *v3d_drm_screen_create(int drmFD,
+                                          const struct pipe_screen_config *config);
+struct pipe_screen *v3d_drm_screen_create_renderonly(struct renderonly *ro,
+                                                     const struct pipe_screen_config *config);
 
 #endif /* __VC5_DRM_PUBLIC_H__ */
index cda830f3e84390fe3a5bfcd19726fc94f50bf7f4..1502cc728c45e28f904ef7e945b12641c476420c 100644 (file)
 #include "v3d/v3d_screen.h"
 
 struct pipe_screen *
-v3d_drm_screen_create(int fd)
+v3d_drm_screen_create(int fd, const struct pipe_screen_config *config)
 {
-       return v3d_screen_create(fcntl(fd, F_DUPFD_CLOEXEC, 3), NULL);
+   return v3d_screen_create(fcntl(fd, F_DUPFD_CLOEXEC, 3), config, NULL);
 }
 
 struct pipe_screen *
-v3d_drm_screen_create_renderonly(struct renderonly *ro)
+v3d_drm_screen_create_renderonly(struct renderonly *ro,
+                                 const struct pipe_screen_config *config)
 {
-       return v3d_screen_create(ro->gpu_fd, ro);
+   return v3d_screen_create(ro->gpu_fd, config, ro);
 }
index 102c1487ba5d3260cccf877a63da818f2648bc97..a727242d7ba1bcc900d236782baa6a915888c811 100644 (file)
@@ -27,7 +27,9 @@
 struct pipe_screen;
 struct renderonly;
 
-struct pipe_screen *vc4_drm_screen_create(int drmFD);
-struct pipe_screen *vc4_drm_screen_create_renderonly(struct renderonly *ro);
+struct pipe_screen *vc4_drm_screen_create(int drmFD,
+                                          const struct pipe_screen_config *config);
+struct pipe_screen *vc4_drm_screen_create_renderonly(struct renderonly *ro,
+                                                     const struct pipe_screen_config *config);
 
 #endif /* __VC4_DRM_PUBLIC_H__ */
index 4215857d06b512594887a8dc2312562f0b90c03f..2d05ac8cc92203d45e9947acd3fdc6f05282fddb 100644 (file)
@@ -32,7 +32,7 @@
 #include "drm-uapi/vc4_drm.h"
 
 struct pipe_screen *
-vc4_drm_screen_create(int fd)
+vc4_drm_screen_create(int fd, const struct pipe_screen_config *config)
 {
    bool v3d_present = true;
 
@@ -49,14 +49,15 @@ vc4_drm_screen_create(int fd)
       return vc4_screen_create(fcntl(fd, F_DUPFD_CLOEXEC, 3), NULL);
 
 #ifdef GALLIUM_KMSRO
-   return kmsro_drm_screen_create(fd);
+   return kmsro_drm_screen_create(fd, config);
 #endif
 
    return NULL;
 }
 
 struct pipe_screen *
-vc4_drm_screen_create_renderonly(struct renderonly *ro)
+vc4_drm_screen_create_renderonly(struct renderonly *ro,
+                                 const struct pipe_screen_config *config)
 {
    return vc4_screen_create(ro->gpu_fd, ro);
 }
index 6389b796d33dccc411fe1480602176dcd9de036d..d27e8541951ae6f56d4c10015068a95f0aaee137 100644 (file)
@@ -446,6 +446,9 @@ TODO: document the other workarounds.
         <application name="mpv" executable="mpv">
             <option name="adaptive_sync" value="false" />
         </application>
+        <application name="Xorg" executable="Xorg">
+            <option name="v3d_nonmsaa_texture_size_limit" value="true" />
+        </application>
 
         <!-- Gallium Nine workarounds: -->
         <application name="Rayman Legends" executable="Rayman Legends.exe">
@@ -481,4 +484,4 @@ TODO: document the other workarounds.
             <option name="radeonsi_enable_nir" value="true"/>
         </application>
     </device>
-</driconf>
+  </driconf>
index c7ebd3a4600c4032ba6716e49e5a0edb33dae587..4396ba79f79ee79219343ff2de1f860bc48d3ae4 100644 (file)
@@ -358,3 +358,8 @@ DRI_CONF_OPT_BEGIN_B(radeonsi_zerovram, def) \
         DRI_CONF_DESC(en,"Zero all vram allocations") \
 DRI_CONF_OPT_END
 
+#define DRI_CONF_V3D_NONMSAA_TEXTURE_SIZE_LIMIT(def) \
+DRI_CONF_OPT_BEGIN_B(v3d_nonmsaa_texture_size_limit, def) \
+        DRI_CONF_DESC(en,"Report the non-MSAA-only texture size limit") \
+DRI_CONF_OPT_END
+