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>
This commit is contained in:
Louis-Francis Ratté-Boulianne
2023-10-31 15:56:31 -04:00
committed by Marge Bot
parent c8bf321bf8
commit 5db7398672
5 changed files with 168 additions and 0 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -508,6 +508,12 @@ enum pipe_flush_flags
#define PIPE_RESOURCE_FLAG_DRV_PRIV (1 << 9) /* driver/winsys private */
#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.

View File

@@ -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);
};

View File

@@ -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 */