Module: Mesa Branch: main Commit: 7edb26966e9dbc184c1f6ea7d5d014537e6d1701 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7edb26966e9dbc184c1f6ea7d5d014537e6d1701
Author: Juan A. Suarez Romero <[email protected]> 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 <[email protected]> Reviewed-by: Iago Toral Quiroga <[email protected]> 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 */
