diff options
author | Louis-Francis Ratté-Boulianne <lfrb@collabora.com> | 2023-10-31 15:56:31 -0400 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2024-06-12 21:20:06 +0000 |
commit | 5db73986725027b3b42e05fb4cf863ed21b0b81f (patch) | |
tree | 28ea92c96e8f1eee46c0b174f53f1182438c51b4 /src/gallium | |
parent | c8bf321bf86875a2ca14424b9b59b93b15a0652b (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.c | 39 | ||||
-rw-r--r-- | src/gallium/auxiliary/driver_trace/tr_screen.c | 83 | ||||
-rw-r--r-- | src/gallium/include/pipe/p_defines.h | 6 | ||||
-rw-r--r-- | src/gallium/include/pipe/p_screen.h | 38 | ||||
-rw-r--r-- | src/gallium/include/pipe/p_state.h | 2 |
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 */ |