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