[Mesa-dev] [PATCH V3 12/13] vbo: map indirect buffer and extract params if doing sw primitive restart
Kenneth Graunke
kenneth at whitecape.org
Tue Nov 12 12:45:06 PST 2013
On 11/09/2013 01:02 AM, Chris Forbes wrote:
> V2: Check for mapping failure (thanks Brian)
> V3: - Change error on mapping failure to OUT_OF_MEMORY (Brian)
> - Unconst; remove casting away of const.
>
> Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
> ---
> src/mesa/vbo/vbo_primitive_restart.c | 33 +++++++++++++++++++++++++++++++++
> 1 file changed, 33 insertions(+)
>
> diff --git a/src/mesa/vbo/vbo_primitive_restart.c b/src/mesa/vbo/vbo_primitive_restart.c
> index 75e760f..e0bd233 100644
> --- a/src/mesa/vbo/vbo_primitive_restart.c
> +++ b/src/mesa/vbo/vbo_primitive_restart.c
> @@ -180,6 +180,39 @@ vbo_sw_primitive_restart(struct gl_context *ctx,
> GLboolean map_ib = ib->obj->Name && !ib->obj->Pointer;
> void *ptr;
>
> + /* If there is an indirect buffer, map it and extract the draw params */
> + if (indirect && prims[0].is_indirect) {
> + struct _mesa_prim new_prim = *prims;
> + struct _mesa_index_buffer new_ib = *ib;
> + const uint32_t *indirect_params;
> + if (!ctx->Driver.MapBufferRange(ctx, 0, indirect->Size, GL_MAP_READ_BIT,
> + indirect)) {
> +
> + /* something went wrong with mapping, give up */
> + _mesa_error(ctx, GL_OUT_OF_MEMORY,
> + "failed to map indirect buffer for sw primitive restart");
> + return;
I had to think about this a bit:
If the current batch writes data into the indirect BO, and the
application immediately tries to DrawIndirect from it without flushing...
We should actually be okay, since intel_bufferobj_map_range will flush
the batch for us:
if (!(access & GL_MAP_UNSYNCHRONIZED_BIT)) {
if (drm_intel_bo_references(brw->batch.bo, intel_obj->buffer)) {
if (access & GL_MAP_INVALIDATE_BUFFER_BIT) {
...
} else {
perf_debug("Stalling on the GPU for mapping a busy buffer "
"object\n");
intel_batchbuffer_flush(brw);
}
} else {
...
}
}
Nice.
Have you at least done touch testing of SW primitive restart + draw
indirect? SW primitive restart is pretty broken in a lot of ways
anyway, so as long as you tried /something/ and it worked I won't object.
Patches 12 and 13 (with the relnotes fix) are also:
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
> + }
> +
> + assert(nr_prims == 1);
> + indirect_params = (const uint32_t *) ADD_POINTERS(indirect->Pointer,
> + new_prim.indirect_offset);
> +
> + new_prim.is_indirect = 0;
> + new_prim.count = indirect_params[0];
> + new_prim.num_instances = indirect_params[1];
> + new_prim.start = indirect_params[2];
> + new_prim.basevertex = indirect_params[3];
> + new_prim.base_instance = indirect_params[4];
> +
> + new_ib.count = new_prim.count;
> +
> + prims = &new_prim;
> + ib = &new_ib;
> +
> + ctx->Driver.UnmapBuffer(ctx, indirect);
> + }
> +
> /* Find the sub-primitives. These are regions in the index buffer which
> * are split based on the primitive restart index value.
> */
>
More information about the mesa-dev
mailing list