gallium: add pipe_context::multi_draw

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7056>
This commit is contained in:
Marek Olšák 2020-10-07 18:49:33 -04:00 committed by Marge Bot
parent d9c12c6072
commit 73f2d3c291
2 changed files with 40 additions and 0 deletions

View File

@ -49,6 +49,7 @@ struct pipe_debug_callback;
struct pipe_depth_stencil_alpha_state;
struct pipe_device_reset_callback;
struct pipe_draw_info;
struct pipe_draw_start_count;
struct pipe_grid_info;
struct pipe_fence_handle;
struct pipe_framebuffer_state;
@ -108,6 +109,41 @@ struct pipe_context {
/*@{*/
void (*draw_vbo)( struct pipe_context *pipe,
const struct pipe_draw_info *info );
/**
* Direct multi draw specifying "start" and "count" for each draw.
*
* For indirect multi draws, use draw_vbo, which supports them through
* "info->indirect".
*
* Differences against draw_vbo:
* - "start" and "count" are taken from "draws", not "info"
* - "info->has_user_indices" is always false
* - "info->indirect" and "info->count_from_stream_output" are always NULL
*
* Differences against glMultiDraw:
* - "info->draw_id" is 0 and should be 0 for every draw
* (we could make this configurable)
* - "info->index_bias" is always constant due to hardware performance
* concerns (this is very important) and the lack of apps using
* glMultiDrawElementsBaseVertex.
*
* The main use case is to optimize applications that submit many
* back-to-back draws or when mesa/main or st/mesa eliminates redundant
* state changes, resulting in back-to-back draws in the driver. It requires
* DrawID = 0 for every draw. u_threaded_context is the module that converts
* back-to-back draws into a multi draw. It's done trivially by looking
* ahead within a gallium command buffer and collapsing draws.
*
* \param pipe context
* \param info draw info
* \param draws array of (start, count) pairs
* \param num_draws number of draws
*/
void (*multi_draw)(struct pipe_context *pipe,
const struct pipe_draw_info *info,
const struct pipe_draw_start_count *draws,
unsigned num_draws);
/*@}*/
/**

View File

@ -720,6 +720,10 @@ struct pipe_draw_indirect_info
struct pipe_resource *indirect_draw_count;
};
struct pipe_draw_start_count {
unsigned start;
unsigned count;
};
/**
* Information to describe a draw_vbo call.