Mesa (main): v3d: add builtin support for white/black clamp-to-border

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri May 13 15:55:29 UTC 2022


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

Author: Juan A. Suarez Romero <jasuarez at igalia.com>
Date:   Thu May 12 16:07:54 2022 +0200

v3d: add builtin support for white/black clamp-to-border

Besides transparent border color, the hardware has special support for
white and black borders when clamping to border is enabled, which should
be more efficient.

v2:
 - Rename enumerations (Iago)
 - Add comment to border_color_variant field (Iago)
 - Refactor the sampler variant code selection (Iago)

v3:
 - Add comment for case of not clamping to border (Iago).
 - Generate only required sampler states (Iago).

v4:
 - Use one array element for standard border color set (Iago).

v5:
 - Fix variant setting for transparent black borders (Iago).

Signed-off-by: Juan A. Suarez Romero <jasuarez at igalia.com>
Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16422>

---

 src/gallium/drivers/v3d/v3d_context.h |  4 +++-
 src/gallium/drivers/v3d/v3dx_state.c  | 42 ++++++++++++++++++++++++++++-------
 2 files changed, 37 insertions(+), 9 deletions(-)

diff --git a/src/gallium/drivers/v3d/v3d_context.h b/src/gallium/drivers/v3d/v3d_context.h
index 5ba8727add3..01784f3bdb0 100644
--- a/src/gallium/drivers/v3d/v3d_context.h
+++ b/src/gallium/drivers/v3d/v3d_context.h
@@ -103,7 +103,9 @@ void v3d_job_add_bo(struct v3d_job *job, struct v3d_bo *bo);
 #define MAX_JOB_SCISSORS 16
 
 enum v3d_sampler_state_variant {
-        V3D_SAMPLER_STATE_BORDER_0,
+        V3D_SAMPLER_STATE_BORDER_0000,
+        V3D_SAMPLER_STATE_BORDER_0001,
+        V3D_SAMPLER_STATE_BORDER_1111,
         V3D_SAMPLER_STATE_F16,
         V3D_SAMPLER_STATE_F16_UNORM,
         V3D_SAMPLER_STATE_F16_SNORM,
diff --git a/src/gallium/drivers/v3d/v3dx_state.c b/src/gallium/drivers/v3d/v3dx_state.c
index 94459dd2fa3..a3f9f7b0470 100644
--- a/src/gallium/drivers/v3d/v3dx_state.c
+++ b/src/gallium/drivers/v3d/v3dx_state.c
@@ -579,8 +579,12 @@ v3d_upload_sampler_state_variant(void *map,
                                 sampler.maximum_anisotropy = 1;
                 }
 
-                if (variant == V3D_SAMPLER_STATE_BORDER_0) {
+                if (variant == V3D_SAMPLER_STATE_BORDER_0000) {
                         sampler.border_color_mode = V3D_BORDER_COLOR_0000;
+                } else if (variant == V3D_SAMPLER_STATE_BORDER_0001) {
+                        sampler.border_color_mode = V3D_BORDER_COLOR_0001;
+                } else if (variant == V3D_SAMPLER_STATE_BORDER_1111) {
+                        sampler.border_color_mode = V3D_BORDER_COLOR_1111;
                 } else {
                         sampler.border_color_mode = V3D_BORDER_COLOR_FOLLOWS;
 
@@ -723,16 +727,37 @@ v3d_create_sampler_state(struct pipe_context *pctx,
         enum V3DX(Wrap_Mode) wrap_t = translate_wrap(cso->wrap_t);
         enum V3DX(Wrap_Mode) wrap_r = translate_wrap(cso->wrap_r);
 
+#if V3D_VERSION >= 40
         bool uses_border_color = (wrap_s == V3D_WRAP_MODE_BORDER ||
                                   wrap_t == V3D_WRAP_MODE_BORDER ||
                                   wrap_r == V3D_WRAP_MODE_BORDER);
-        so->border_color_variants = (uses_border_color &&
-                                     (cso->border_color.ui[0] != 0 ||
-                                      cso->border_color.ui[1] != 0 ||
-                                      cso->border_color.ui[2] != 0 ||
-                                      cso->border_color.ui[3] != 0));
 
-#if V3D_VERSION >= 40
+        so->border_color_variants = false;
+
+        /* This is the variant with the default hardware settings */
+        enum v3d_sampler_state_variant border_variant = V3D_SAMPLER_STATE_BORDER_0000;
+
+        if (uses_border_color) {
+                if (cso->border_color.ui[0] == 0 &&
+                    cso->border_color.ui[1] == 0 &&
+                    cso->border_color.ui[2] == 0 &&
+                    cso->border_color.ui[3] == 0) {
+                        border_variant = V3D_SAMPLER_STATE_BORDER_0000;
+                } else if (cso->border_color.ui[0] == 0 &&
+                           cso->border_color.ui[1] == 0 &&
+                           cso->border_color.ui[2] == 0 &&
+                           cso->border_color.ui[3] == 0x3F800000) {
+                        border_variant = V3D_SAMPLER_STATE_BORDER_0001;
+                } else if (cso->border_color.ui[0] == 0x3F800000 &&
+                           cso->border_color.ui[1] == 0x3F800000 &&
+                           cso->border_color.ui[2] == 0x3F800000 &&
+                           cso->border_color.ui[3] == 0x3F800000) {
+                        border_variant = V3D_SAMPLER_STATE_BORDER_1111;
+                } else {
+                        so->border_color_variants = true;
+                }
+        }
+
         void *map;
         int sampler_align = so->border_color_variants ? 32 : 8;
         int sampler_size = align(cl_packet_length(SAMPLER_STATE), sampler_align);
@@ -748,7 +773,8 @@ v3d_create_sampler_state(struct pipe_context *pctx,
                 so->sampler_state_offset[i] =
                         so->sampler_state_offset[0] + i * sampler_size;
                 v3d_upload_sampler_state_variant(map + i * sampler_size,
-                                                 cso, i);
+                                                 cso,
+                                                 so->border_color_variants ? i : border_variant);
         }
 
 #else /* V3D_VERSION < 40 */



More information about the mesa-commit mailing list