Mesa (master): vc4: Add support for ETC1 textures if the kernel is new enough.

Eric Anholt anholt at kemper.freedesktop.org
Thu Nov 17 03:51:29 UTC 2016


Module: Mesa
Branch: master
Commit: 45c022f2b06967196516f0616a9e4959ddcd14da
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=45c022f2b06967196516f0616a9e4959ddcd14da

Author: Eric Anholt <eric at anholt.net>
Date:   Wed Nov 16 16:57:45 2016 -0800

vc4: Add support for ETC1 textures if the kernel is new enough.

The kernel changes for exposing the param have now been merged, so we can
expose it here.

---

 src/gallium/drivers/vc4/vc4_context.h   |  4 ++++
 src/gallium/drivers/vc4/vc4_screen.c    | 13 ++++++++-----
 src/gallium/drivers/vc4/vc4_screen.h    |  5 +++++
 src/gallium/drivers/vc4/vc4_simulator.c |  1 +
 4 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/vc4/vc4_context.h b/src/gallium/drivers/vc4/vc4_context.h
index db9e82d..e59b1d2 100644
--- a/src/gallium/drivers/vc4/vc4_context.h
+++ b/src/gallium/drivers/vc4/vc4_context.h
@@ -39,6 +39,10 @@
 #include "vc4_cl.h"
 #include "vc4_qir.h"
 
+#ifndef DRM_VC4_PARAM_SUPPORTS_ETC1
+#define DRM_VC4_PARAM_SUPPORTS_ETC1		4
+#endif
+
 #ifdef USE_VC4_SIMULATOR
 #define using_vc4_simulator true
 #else
diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c
index 82b5077..9f852f0 100644
--- a/src/gallium/drivers/vc4/vc4_screen.c
+++ b/src/gallium/drivers/vc4/vc4_screen.c
@@ -418,6 +418,7 @@ vc4_screen_is_format_supported(struct pipe_screen *pscreen,
                                unsigned sample_count,
                                unsigned usage)
 {
+        struct vc4_screen *screen = vc4_screen(pscreen);
         unsigned retval = 0;
 
         if (sample_count > 1 && sample_count != VC4_MAX_SAMPLES)
@@ -488,7 +489,7 @@ vc4_screen_is_format_supported(struct pipe_screen *pscreen,
 
         if ((usage & PIPE_BIND_SAMPLER_VIEW) &&
             vc4_tex_format_supported(format) &&
-            format != PIPE_FORMAT_ETC1_RGB8) {
+            (format != PIPE_FORMAT_ETC1_RGB8 || screen->has_etc1)) {
                 retval |= PIPE_BIND_SAMPLER_VIEW;
         }
 
@@ -529,10 +530,10 @@ static int handle_compare(void *key1, void *key2)
 }
 
 static bool
-vc4_supports_branches(struct vc4_screen *screen)
+vc4_has_feature(struct vc4_screen *screen, uint32_t feature)
 {
         struct drm_vc4_get_param p = {
-                .param = DRM_VC4_PARAM_SUPPORTS_BRANCHES,
+                .param = feature,
         };
         int ret = vc4_ioctl(screen->fd, DRM_IOCTL_VC4_GET_PARAM, &p);
 
@@ -609,8 +610,10 @@ vc4_screen_create(int fd)
         pipe_mutex_init(screen->bo_handles_mutex);
         screen->bo_handles = util_hash_table_create(handle_hash, handle_compare);
 
-        if (vc4_supports_branches(screen))
-                screen->has_control_flow = true;
+        screen->has_control_flow =
+                vc4_has_feature(screen, DRM_VC4_PARAM_SUPPORTS_BRANCHES);
+        screen->has_etc1 =
+                vc4_has_feature(screen, DRM_VC4_PARAM_SUPPORTS_ETC1);
 
         if (!vc4_get_chip_info(screen))
                 goto fail;
diff --git a/src/gallium/drivers/vc4/vc4_screen.h b/src/gallium/drivers/vc4/vc4_screen.h
index 83bb5aa..572d62d 100644
--- a/src/gallium/drivers/vc4/vc4_screen.h
+++ b/src/gallium/drivers/vc4/vc4_screen.h
@@ -30,6 +30,10 @@
 #include "util/list.h"
 #include "util/slab.h"
 
+#ifndef DRM_VC4_PARAM_SUPPORTS_ETC1
+#define DRM_VC4_PARAM_SUPPORTS_ETC1		4
+#endif
+
 struct vc4_bo;
 
 #define VC4_DEBUG_CL        0x0001
@@ -85,6 +89,7 @@ struct vc4_screen {
         uint32_t bo_size;
         uint32_t bo_count;
         bool has_control_flow;
+        bool has_etc1;
 
         struct vc4_simulator_file *sim_file;
 };
diff --git a/src/gallium/drivers/vc4/vc4_simulator.c b/src/gallium/drivers/vc4/vc4_simulator.c
index 82ffaab..8158983 100644
--- a/src/gallium/drivers/vc4/vc4_simulator.c
+++ b/src/gallium/drivers/vc4/vc4_simulator.c
@@ -612,6 +612,7 @@ vc4_simulator_get_param_ioctl(int fd, struct drm_vc4_get_param *args)
 {
         switch (args->param) {
         case DRM_VC4_PARAM_SUPPORTS_BRANCHES:
+        case DRM_VC4_PARAM_SUPPORTS_ETC1:
                 args->value = true;
                 return 0;
 




More information about the mesa-commit mailing list