summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2019-12-23 14:56:01 +1000
committerDave Airlie <airlied@redhat.com>2020-01-09 10:35:36 +1000
commitd10a3d528f1b6492bf8b00b427d52a5009f1955d (patch)
treed2a77d36b34fab4f9c796a336a5c1a48cc371a9f
parent3a4f8c8158df304af08681edbbfdfd40e43a6829 (diff)
gallium/util: add multi_draw_indirect to util_draw_indirect.
ARB_indirect_parameters needs drivers to deal with mutli_draw_indirect themselves. Reviewed-by: Roland Scheidegger <sroland@vmware.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3234>
-rw-r--r--src/gallium/auxiliary/util/u_draw.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/gallium/auxiliary/util/u_draw.c b/src/gallium/auxiliary/util/u_draw.c
index b7daa21c692..4627d2bdbc4 100644
--- a/src/gallium/auxiliary/util/u_draw.c
+++ b/src/gallium/auxiliary/util/u_draw.c
@@ -147,7 +147,7 @@ util_draw_indirect(struct pipe_context *pipe,
pipe_buffer_map_range(pipe,
info_in->indirect->buffer,
info_in->indirect->offset,
- num_params * sizeof(uint32_t),
+ (num_params * info_in->indirect->draw_count) * sizeof(uint32_t),
PIPE_TRANSFER_READ,
&transfer);
if (!transfer) {
@@ -155,14 +155,18 @@ util_draw_indirect(struct pipe_context *pipe,
return;
}
- info.count = params[0];
- info.instance_count = params[1];
- info.start = params[2];
- info.index_bias = info_in->index_size ? params[3] : 0;
- info.start_instance = info_in->index_size ? params[4] : params[3];
- info.indirect = NULL;
+ for (unsigned i = 0; i < info_in->indirect->draw_count; i++) {
+ info.count = params[0];
+ info.instance_count = params[1];
+ info.start = params[2];
+ info.index_bias = info_in->index_size ? params[3] : 0;
+ info.start_instance = info_in->index_size ? params[4] : params[3];
+ info.drawid = i;
+ info.indirect = NULL;
- pipe_buffer_unmap(pipe, transfer);
+ pipe->draw_vbo(pipe, &info);
- pipe->draw_vbo(pipe, &info);
+ params += info_in->indirect->stride / 4;
+ }
+ pipe_buffer_unmap(pipe, transfer);
}