[Mesa-dev] [PATCH V3 12/13] vbo: map indirect buffer and extract params if doing sw primitive restart
Chris Forbes
chrisf at ijw.co.nz
Tue Nov 12 12:45:42 PST 2013
There's a test for the SW primitive restart interaction in piglit.
On Wed, Nov 13, 2013 at 9:45 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> 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