gallium: add pipe_draw_info::index_bounds_valid

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7441>
This commit is contained in:
Marek Olšák 2020-11-01 07:14:22 -05:00 committed by Marge Bot
parent 920bbfb3a0
commit 72ff53098c
10 changed files with 20 additions and 6 deletions

View File

@ -108,6 +108,7 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
unsigned ib_offset;
util_draw_init_info(&new_info);
new_info.index_bounds_valid = info->index_bounds_valid;
new_info.min_index = info->min_index;
new_info.max_index = info->max_index;
new_info.index_bias = info->index_bias;

View File

@ -104,6 +104,7 @@ util_draw_arrays_instanced(struct pipe_context *pipe,
info.count = count;
info.start_instance = start_instance;
info.instance_count = instance_count;
info.index_bounds_valid = true;
info.min_index = start;
info.max_index = start + count - 1;

View File

@ -1373,6 +1373,7 @@ void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info,
* These values determine the user buffer bounds to upload.
*/
new_info.index_bias = index_bias0;
new_info.index_bounds_valid = true;
new_info.min_index = ~0u;
new_info.max_index = 0;
new_info.start_instance = ~0u;
@ -1469,7 +1470,7 @@ void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info,
if (u_vbuf_need_minmax_index(mgr)) {
unsigned max_index;
if (new_info.max_index != ~0u) {
if (new_info.index_bounds_valid) {
min_index = new_info.min_index;
max_index = new_info.max_index;
} else {

View File

@ -1061,7 +1061,7 @@ lima_draw_vbo_indexed(struct pipe_context *pctx,
/* Mali Utgard GPU always need min/max index info for index draw,
* compute it if upper layer does not do for us */
if (info->max_index != ~0u) {
if (info->index_bounds_valid) {
ctx->min_index = info->min_index;
ctx->max_index = info->max_index;
needs_indices = false;

View File

@ -69,7 +69,7 @@ panfrost_get_index_buffer_bounded(struct panfrost_context *ctx,
bool needs_indices = true;
mali_ptr out = 0;
if (info->max_index != ~0u) {
if (info->index_bounds_valid) {
*min_index = info->min_index;
*max_index = info->max_index;
needs_indices = false;

View File

@ -1840,6 +1840,7 @@ static void handle_update_buffer(struct lvp_cmd_buffer_entry *cmd,
static void handle_draw_indexed(struct lvp_cmd_buffer_entry *cmd,
struct rendering_state *state)
{
state->info.index_bounds_valid = false;
state->info.min_index = 0;
state->info.max_index = ~0;
state->info.index_size = state->index_size;
@ -1864,6 +1865,7 @@ static void handle_draw_indirect(struct lvp_cmd_buffer_entry *cmd,
struct rendering_state *state, bool indexed)
{
if (indexed) {
state->info.index_bounds_valid = false;
state->info.index_size = state->index_size;
state->info.index.resource = state->index_buffer;
state->info.max_index = ~0;

View File

@ -2358,6 +2358,7 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive,
info.index_size = context->index_size;
info.start = context->index_offset / context->index_size + StartIndex;
info.index_bias = BaseVertexIndex;
info.index_bounds_valid = true;
/* These don't include index bias: */
info.min_index = MinVertexIndex;
info.max_index = MinVertexIndex + NumVertices - 1;
@ -2409,6 +2410,7 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf,
info.index_size = index_size;
info.start = index_offset / info.index_size;
info.index_bias = 0;
info.index_bounds_valid = true;
info.min_index = MinVertexIndex;
info.max_index = MinVertexIndex + NumVertices - 1;
info.has_user_indices = ibuf == NULL;

View File

@ -761,8 +761,10 @@ struct pipe_draw_info
ubyte vertices_per_patch; /**< the number of vertices per patch */
ubyte index_size; /**< if 0, the draw is not indexed. */
bool primitive_restart:1;
bool has_user_indices:1; /**< if true, use index.user_buffer */
char _pad:6; /**< padding for memcmp */
bool has_user_indices:1; /**< if true, use index.user_buffer */
bool index_bounds_valid:1; /**< whether min_index and max_index are valid;
they're always invalid if index_size == 0 */
char _pad:5; /**< padding for memcmp */
unsigned start_instance; /**< first instance id */
unsigned instance_count; /**< number of instances */

View File

@ -188,9 +188,11 @@ st_draw_vbo(struct gl_context *ctx,
if (!index_bounds_valid && st->draw_needs_minmax_index) {
vbo_get_minmax_indices(ctx, prims, ib, &min_index, &max_index,
nr_prims);
index_bounds_valid = true;
}
info.index_size = 1 << ib->index_size_shift;
info.index_bounds_valid = index_bounds_valid;
info.min_index = min_index;
info.max_index = max_index;

View File

@ -130,8 +130,10 @@ st_feedback_draw_vbo(struct gl_context *ctx,
st_validate_state(st, ST_PIPELINE_RENDER);
if (ib && !index_bounds_valid)
if (ib && !index_bounds_valid) {
vbo_get_minmax_indices(ctx, prims, ib, &min_index, &max_index, nr_prims);
index_bounds_valid = true;
}
/* must get these after state validation! */
struct st_common_variant_key key;
@ -201,6 +203,7 @@ st_feedback_draw_vbo(struct gl_context *ctx,
}
info.index_size = index_size;
info.index_bounds_valid = index_bounds_valid;
info.min_index = min_index;
info.max_index = max_index;
info.has_user_indices = true;