gallium: Add u_default_get_sample_position
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Sun, 9 Apr 2023 18:53:18 +0000 (14:53 -0400)
committerMarge Bot <emma+marge@anholt.net>
Thu, 13 Apr 2023 15:40:54 +0000 (15:40 +0000)
ctx->get_sample_position doesn't change what it returns based on the programmed
positions, it's just supposed to return the defaults. For most (all?) hardware,
those are the Vulkan standard sample positions. In bf9a1e0a4be ("zink: add a
pipe_context::get_sample_position hook"), Mike wondered why there wasn't a
common implementation. So here's one to fix that :~)

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Emma Anholt <emma@anholt.net>
Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22383>

src/gallium/auxiliary/meson.build
src/gallium/auxiliary/util/u_sample_positions.c [new file with mode: 0644]
src/gallium/auxiliary/util/u_sample_positions.h [new file with mode: 0644]

index 3d7ec917e491c40d565b38d63789fdc9eaee63d6..2080ffae5f270ec290e9a377e95cce5b378ad7dc 100644 (file)
@@ -251,6 +251,8 @@ files_libgallium = files(
   'util/u_rect.h',
   'util/u_resource.c',
   'util/u_resource.h',
+  'util/u_sample_positions.c',
+  'util/u_sample_positions.h',
   'util/u_sampler.c',
   'util/u_sampler.h',
   'util/u_screen.c',
diff --git a/src/gallium/auxiliary/util/u_sample_positions.c b/src/gallium/auxiliary/util/u_sample_positions.c
new file mode 100644 (file)
index 0000000..a96e8c0
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2023 Alyssa Rosenzweig
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "u_sample_positions.h"
+
+/*
+ * This file implement a default version of get_sample_position that returns the
+ * standard sample positions, as standardized in both Vulkan and Direct3D and
+ * hence almost everyone's hardware.
+ */
+
+static const float u_default_sample_positions_1x[][2] = {
+   {0.5, 0.5}
+};
+
+static const float u_default_sample_positions_2x[][2] = {
+   {0.75, 0.75},
+   {0.25, 0.25}
+};
+
+static const float u_default_sample_positions_4x[][4] = {
+   {0.375, 0.125},
+   {0.875, 0.375},
+   {0.125, 0.625},
+   {0.625, 0.875},
+};
+
+static const float u_default_sample_positions_8x[][4] = {
+   {0.5625, 0.3125},
+   {0.4375, 0.6875},
+   {0.8125, 0.5625},
+   {0.3125, 0.1875},
+   {0.1875, 0.8125},
+   {0.0625, 0.4375},
+   {0.6875, 0.9375},
+   {0.9375, 0.0625},
+
+};
+
+static const float u_default_sample_positions_16x[][4] = {
+   {0.5625, 0.5625},
+   {0.4375, 0.3125},
+   {0.3125, 0.625},
+   {0.75,   0.4375},
+   {0.1875, 0.375},
+   {0.625,  0.8125},
+   {0.8125, 0.6875},
+   {0.6875, 0.1875},
+   {0.375,  0.875},
+   {0.5,    0.0625},
+   {0.25,   0.125},
+   {0.125,  0.75},
+   {0.0,    0.5},
+   {0.9375, 0.25},
+   {0.875,  0.9375},
+   {0.0625, 0.0},
+};
+
+static const float *
+u_default_sample_position(unsigned sample_count, unsigned sample_index)
+{
+   switch (sample_count) {
+   case  0:
+   case  1: return u_default_sample_positions_1x[sample_index];
+   case  2: return u_default_sample_positions_2x[sample_index];
+   case  4: return u_default_sample_positions_4x[sample_index];
+   case  8: return u_default_sample_positions_8x[sample_index];
+   case 16: return u_default_sample_positions_16x[sample_index];
+   default: unreachable("Invalid sample count");
+   }
+}
+
+void
+u_default_get_sample_position(struct pipe_context *ctx,
+                              unsigned sample_count,
+                              unsigned sample_index,
+                              float *out_value)
+{
+   const float *positions =
+      u_default_sample_position(sample_count, sample_index);
+
+   out_value[0] = positions[0];
+   out_value[1] = positions[1];
+}
diff --git a/src/gallium/auxiliary/util/u_sample_positions.h b/src/gallium/auxiliary/util/u_sample_positions.h
new file mode 100644 (file)
index 0000000..aea3c20
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2023 Alyssa Rosenzweig
+ * SPDX-License-Identifier: MIT
+ */
+
+#ifndef U_SAMPLE_POSITIONS_H
+#define U_SAMPLE_POSITIONS_H
+
+#include "pipe/p_context.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void
+u_default_get_sample_position(struct pipe_context *ctx,
+                              unsigned sample_count,
+                              unsigned sample_index,
+                              float *out_value);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif