summaryrefslogtreecommitdiff
path: root/src/gallium
diff options
context:
space:
mode:
authorLouis-Francis Ratté-Boulianne <lfrb@collabora.com>2023-10-31 15:56:31 -0400
committerMarge Bot <emma+marge@anholt.net>2024-06-12 21:20:06 +0000
commit5db73986725027b3b42e05fb4cf863ed21b0b81f (patch)
tree28ea92c96e8f1eee46c0b174f53f1182438c51b4 /src/gallium
parentc8bf321bf86875a2ca14424b9b59b93b15a0652b (diff)
gallium: add interface for fixed-rate surface/texture compression
Add methods needed to implement EGL_EXT_surface_compression and GL_EXT_texture_storage_compression. Signed-off-by: Louis-Francis Ratté-Boulianne <lfrb@collabora.com> Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27109>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/auxiliary/driver_noop/noop_pipe.c39
-rw-r--r--src/gallium/auxiliary/driver_trace/tr_screen.c83
-rw-r--r--src/gallium/include/pipe/p_defines.h6
-rw-r--r--src/gallium/include/pipe/p_screen.h38
-rw-r--r--src/gallium/include/pipe/p_state.h2
5 files changed, 168 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/driver_noop/noop_pipe.c b/src/gallium/auxiliary/driver_noop/noop_pipe.c
index 1e657144c6e..30ee3a4d5b1 100644
--- a/src/gallium/auxiliary/driver_noop/noop_pipe.c
+++ b/src/gallium/auxiliary/driver_noop/noop_pipe.c
@@ -659,6 +659,42 @@ static unsigned int noop_get_dmabuf_modifier_planes(struct pipe_screen *screen,
return oscreen->get_dmabuf_modifier_planes(oscreen, modifier, format);
}
+static void noop_query_compression_rates(struct pipe_screen *screen,
+ enum pipe_format format, int max,
+ uint32_t *rates, int *count)
+{
+ struct noop_pipe_screen *noop_screen = (struct noop_pipe_screen*)screen;
+ struct pipe_screen *oscreen = noop_screen->oscreen;
+
+ *count = 0;
+ if (oscreen->query_compression_rates)
+ oscreen->query_compression_rates(oscreen, format, max, rates, count);
+}
+
+static void noop_query_compression_modifiers(struct pipe_screen *screen,
+ enum pipe_format fmt, uint32_t rate,
+ int max, uint64_t *mods, int *count)
+{
+ struct noop_pipe_screen *noop_screen = (struct noop_pipe_screen*)screen;
+ struct pipe_screen *oscreen = noop_screen->oscreen;
+
+ *count = 0;
+ if (oscreen->query_compression_modifiers)
+ oscreen->query_compression_modifiers(oscreen, fmt, rate, max, mods, count);
+}
+
+static bool noop_is_compression_modifier(struct pipe_screen *screen,
+ enum pipe_format format, uint64_t modifier,
+ uint32_t *rate)
+{
+ struct noop_pipe_screen *noop_screen = (struct noop_pipe_screen*)screen;
+ struct pipe_screen *oscreen = noop_screen->oscreen;
+
+ if (oscreen->is_compression_modifier)
+ return oscreen->is_compression_modifier(oscreen, format, modifier, rate);
+ return false;
+}
+
static void noop_get_driver_uuid(struct pipe_screen *screen, char *uuid)
{
struct noop_pipe_screen *noop_screen = (struct noop_pipe_screen*)screen;
@@ -811,6 +847,9 @@ struct pipe_screen *noop_screen_create(struct pipe_screen *oscreen)
screen->get_sparse_texture_virtual_page_size = noop_get_sparse_texture_virtual_page_size;
if (oscreen->set_fence_timeline_value)
screen->set_fence_timeline_value = noop_set_fence_timeline_value;
+ screen->query_compression_rates = noop_query_compression_rates;
+ screen->query_compression_modifiers = noop_query_compression_modifiers;
+ screen->is_compression_modifier = noop_is_compression_modifier;
slab_create_parent(&noop_screen->pool_transfers,
sizeof(struct pipe_transfer), 64);
diff --git a/src/gallium/auxiliary/driver_trace/tr_screen.c b/src/gallium/auxiliary/driver_trace/tr_screen.c
index e3e973373fc..9803524b14b 100644
--- a/src/gallium/auxiliary/driver_trace/tr_screen.c
+++ b/src/gallium/auxiliary/driver_trace/tr_screen.c
@@ -1423,6 +1423,86 @@ static void trace_screen_set_fence_timeline_value(struct pipe_screen *_screen,
screen->set_fence_timeline_value(screen, fence, value);
}
+static void trace_screen_query_compression_rates(struct pipe_screen *_screen,
+ enum pipe_format format,
+ int max, uint32_t *rates,
+ int *count)
+{
+ struct trace_screen *tr_scr = trace_screen(_screen);
+ struct pipe_screen *screen = tr_scr->screen;
+
+ trace_dump_call_begin("pipe_screen", "query_compression_rates");
+ trace_dump_arg(ptr, screen);
+ trace_dump_arg(format, format);
+ trace_dump_arg(int, max);
+
+ screen->query_compression_rates(screen, format, max, rates, count);
+
+ if (max)
+ trace_dump_arg_array(uint, rates, *count);
+ else
+ trace_dump_arg_array(uint, rates, max);
+ trace_dump_ret_begin();
+ trace_dump_uint(*count);
+ trace_dump_ret_end();
+
+ trace_dump_call_end();
+}
+
+static void trace_screen_query_compression_modifiers(struct pipe_screen *_screen,
+ enum pipe_format format,
+ uint32_t rate, int max,
+ uint64_t *modifiers,
+ int *count)
+{
+ struct trace_screen *tr_scr = trace_screen(_screen);
+ struct pipe_screen *screen = tr_scr->screen;
+
+ trace_dump_call_begin("pipe_screen", "query_compression_rates");
+ trace_dump_arg(ptr, screen);
+ trace_dump_arg(format, format);
+ trace_dump_arg(uint, rate);
+ trace_dump_arg(int, max);
+
+ screen->query_compression_modifiers(screen, format, rate, max, modifiers, count);
+
+ if (max)
+ trace_dump_arg_array(uint, modifiers, *count);
+ else
+ trace_dump_arg_array(uint, modifiers, max);
+ trace_dump_ret_begin();
+ trace_dump_uint(*count);
+ trace_dump_ret_end();
+
+ trace_dump_call_end();
+}
+
+static bool trace_screen_is_compression_modifier(struct pipe_screen *_screen,
+ enum pipe_format format,
+ uint64_t modifier,
+ uint32_t *rate)
+{
+ struct trace_screen *tr_scr = trace_screen(_screen);
+ struct pipe_screen *screen = tr_scr->screen;
+ bool result;
+
+ trace_dump_call_begin("pipe_screen", "query_compression_rates");
+ trace_dump_arg(ptr, screen);
+ trace_dump_arg(format, format);
+ trace_dump_arg(uint, modifier);
+
+ result = screen->is_compression_modifier(screen, format, modifier, rate);
+
+ trace_dump_ret_begin();
+ trace_dump_uint(*rate);
+ trace_dump_bool(result);
+ trace_dump_ret_end();
+
+ trace_dump_call_end();
+
+ return result;
+}
+
bool
trace_enabled(void)
{
@@ -1531,6 +1611,9 @@ trace_screen_create(struct pipe_screen *screen)
SCR_INIT(get_sparse_texture_virtual_page_size);
SCR_INIT(set_fence_timeline_value);
SCR_INIT(driver_thread_add_job);
+ SCR_INIT(query_compression_rates);
+ SCR_INIT(query_compression_modifiers);
+ SCR_INIT(is_compression_modifier);
tr_scr->screen = screen;
diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
index 4d572f0383f..b417c06e785 100644
--- a/src/gallium/include/pipe/p_defines.h
+++ b/src/gallium/include/pipe/p_defines.h
@@ -509,6 +509,12 @@ enum pipe_flush_flags
#define PIPE_RESOURCE_FLAG_FRONTEND_PRIV (1 << 24) /* gallium frontend private */
/**
+ * Fixed-rate compression
+ */
+#define PIPE_COMPRESSION_FIXED_RATE_NONE 0x0
+#define PIPE_COMPRESSION_FIXED_RATE_DEFAULT 0xF
+
+/**
* Hint about the expected lifecycle of a resource.
* Sorted according to GPU vs CPU access.
*/
diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h
index 2439f6c92d4..d45e64bee68 100644
--- a/src/gallium/include/pipe/p_screen.h
+++ b/src/gallium/include/pipe/p_screen.h
@@ -803,6 +803,44 @@ struct pipe_screen {
uint32_t in_data_size,
void *data,
bool *need_export_dmabuf);
+
+ /**
+ * Get supported compression fixed rates (bits per component) for a format.
+ * If \p max is 0, the total number of supported rates for the supplied
+ * format is returned in \p count, with no modification to \p rates.
+ * Otherwise, \p rates is filled with upto \p max supported compression
+ * rates, and \p count with the number of values copied.
+ */
+ void (*query_compression_rates)(struct pipe_screen *screen,
+ enum pipe_format format, int max,
+ uint32_t *rates, int *count);
+
+ /**
+ * Get modifiers associated with a given compression fixed rate.
+ * If \p rate is PIPE_COMPRESSION_FIXED_RATE_DEFAULT, supported compression
+ * modifiers are returned in order of priority.
+ * If \p max is 0, the total number of supported modifiers for the supplied
+ * compression rate is returned in \p count, with no modification to \p
+ * modifiers. Otherwise, \p modifiers is filled with upto \p max supported
+ * modifiers, and \p count with the number of values copied.
+ */
+ void (*query_compression_modifiers)(struct pipe_screen *screen,
+ enum pipe_format format, uint32_t rate,
+ int max, uint64_t *modifiers, int *count);
+
+ /**
+ * Determine whether the modifer is enabling fixed-rate compression for
+ * the given screen and format.
+ *
+ * If \p rate is not NULL, the value it points to will be set to the
+ * bitrate (bits per component) associated with the modifier.
+ *
+ * \return true if the format+modifier pair is enabling fixed-rate
+ * compression on \p screen, false otherwise.
+ */
+ bool (*is_compression_modifier)(struct pipe_screen *screen,
+ enum pipe_format format, uint64_t modifier,
+ uint32_t *rate);
};
diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
index 7e4a57d3c27..096b96c061d 100644
--- a/src/gallium/include/pipe/p_state.h
+++ b/src/gallium/include/pipe/p_state.h
@@ -579,6 +579,8 @@ struct pipe_resource
unsigned nr_sparse_levels:8; /**< Mipmap levels support partial resident */
+ unsigned compression_rate:4; /**< Fixed-rate compresion bitrate if any */
+
unsigned usage:8; /**< PIPE_USAGE_x (not a bitmask) */
unsigned bind; /**< bitmask of PIPE_BIND_x */
unsigned flags; /**< bitmask of PIPE_RESOURCE_FLAG_x */