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:

committed by
Marge Bot

parent
c8bf321bf8
commit
5db7398672
@@ -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);
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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.
|
||||
|
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
@@ -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 */
|
||||
|
Reference in New Issue
Block a user