Mesa (master): lavapipe: resolve border-color when creating sampler

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Apr 19 14:11:56 UTC 2021


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

Author: Erik Faye-Lund <erik.faye-lund at collabora.com>
Date:   Mon Apr 19 13:25:36 2021 +0200

lavapipe: resolve border-color when creating sampler

This is going to make it easier to implement the custom border-color
extension.

While we're moving the code, tweak the memset code a bit, so we don't do
any float-ism in the int-case. It doesn't change anything functionally,
just makes it slightly clearer what's going on here.

Reviewed-by: Joshua Ashton <joshua at froggi.es>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10320>

---

 src/gallium/frontends/lavapipe/lvp_device.c  | 28 ++++++++++++++++++++++++++++
 src/gallium/frontends/lavapipe/lvp_execute.c | 26 ++------------------------
 src/gallium/frontends/lavapipe/lvp_private.h |  1 +
 3 files changed, 31 insertions(+), 24 deletions(-)

diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c
index 7f58d1d1d34..abdc68e35cc 100644
--- a/src/gallium/frontends/lavapipe/lvp_device.c
+++ b/src/gallium/frontends/lavapipe/lvp_device.c
@@ -1929,6 +1929,34 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateSampler(
                        VK_OBJECT_TYPE_SAMPLER);
    sampler->create_info = *pCreateInfo;
 
+   switch (pCreateInfo->borderColor) {
+   case VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK:
+   case VK_BORDER_COLOR_INT_TRANSPARENT_BLACK:
+   default:
+      memset(&sampler->border_color, 0, sizeof(union pipe_color_union));
+      break;
+   case VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK:
+      sampler->border_color.f[0] = sampler->border_color.f[1] =
+      sampler->border_color.f[2] = 0.0f;
+      sampler->border_color.f[3] = 1.0f;
+      break;
+   case VK_BORDER_COLOR_INT_OPAQUE_BLACK:
+      sampler->border_color.i[0] = sampler->border_color.i[1] =
+      sampler->border_color.i[2] = 0;
+      sampler->border_color.i[3] = 1;
+      break;
+   case VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE:
+      sampler->border_color.f[0] = sampler->border_color.f[1] =
+      sampler->border_color.f[2] = 1.0f;
+      sampler->border_color.f[3] = 1.0f;
+      break;
+   case VK_BORDER_COLOR_INT_OPAQUE_WHITE:
+      sampler->border_color.i[0] = sampler->border_color.i[1] =
+      sampler->border_color.i[2] = 1;
+      sampler->border_color.i[3] = 1;
+      break;
+   }
+
    sampler->reduction_mode = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE;
    if (reduction_mode_create_info)
       sampler->reduction_mode = reduction_mode_create_info->reductionMode;
diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c
index 0a39a9d596f..e19acb7141c 100644
--- a/src/gallium/frontends/lavapipe/lvp_execute.c
+++ b/src/gallium/frontends/lavapipe/lvp_execute.c
@@ -781,30 +781,8 @@ static void fill_sampler(struct pipe_sampler_state *ss,
    ss->compare_func = samp->create_info.compareOp;
    ss->seamless_cube_map = true;
    ss->reduction_mode = samp->reduction_mode;
-
-   switch (samp->create_info.borderColor) {
-   case VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK:
-   case VK_BORDER_COLOR_INT_TRANSPARENT_BLACK:
-   default:
-      memset(ss->border_color.f, 0, 4 * sizeof(float));
-      break;
-   case VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK:
-      ss->border_color.f[0] = ss->border_color.f[1] = ss->border_color.f[2] = 0.0f;
-      ss->border_color.f[3] = 1.0f;
-      break;
-   case VK_BORDER_COLOR_INT_OPAQUE_BLACK:
-      ss->border_color.i[0] = ss->border_color.i[1] = ss->border_color.i[2] = 0;
-      ss->border_color.i[3] = 1;
-      break;
-   case VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE:
-      ss->border_color.f[0] = ss->border_color.f[1] = ss->border_color.f[2] = 1.0f;
-      ss->border_color.f[3] = 1.0f;
-      break;
-   case VK_BORDER_COLOR_INT_OPAQUE_WHITE:
-      ss->border_color.i[0] = ss->border_color.i[1] = ss->border_color.i[2] = 1;
-      ss->border_color.i[3] = 1;
-      break;
-   }
+   memcpy(&ss->border_color, &samp->border_color,
+          sizeof(union pipe_color_union));
 }
 
 static void fill_sampler_stage(struct rendering_state *state,
diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h
index d1e0b27ce31..86b2bf0264f 100644
--- a/src/gallium/frontends/lavapipe/lvp_private.h
+++ b/src/gallium/frontends/lavapipe/lvp_private.h
@@ -309,6 +309,7 @@ struct lvp_render_pass {
 struct lvp_sampler {
    struct vk_object_base base;
    VkSamplerCreateInfo create_info;
+   union pipe_color_union border_color;
    VkSamplerReductionMode reduction_mode;
    uint32_t state[4];
 };



More information about the mesa-commit mailing list