[Mesa-dev] [PATCH V2 14/15] vbo: map indirect buffer and extract params if doing sw primitive restart

Brian Paul brianp at vmware.com
Thu Nov 7 11:07:20 PST 2013


On 11/07/2013 11:29 AM, Eric Anholt wrote:
> Brian Paul <brianp at vmware.com> writes:
>
>> On 11/07/2013 10:23 AM, Eric Anholt wrote:
>>> Chris Forbes <chrisf at ijw.co.nz> writes:
>>>
>>>> V2: Check for mapping failure (thanks Brian)
>>>>
>>>> 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 48d04e1..ee84f10 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,
>>>> +            (struct gl_buffer_object *)indirect)) {
>>>
>>> Are you just casting away the const here?  indirect should definitely
>>> not be const, because you're modifying it in calls like this.
>>
>> Yeah, he's casting away const, but the buffer's being mapped for
>> read-only.  An indirect drawing call should never modify the indirect
>> buffer's contents.
>
> But it sure does modify the indirect buffer object's struct, since it's
> getting used to do the call.  In the i965 case, the struct's "what bits
> have been referenced by the GPU since our last stall?" get modified both
> in the normal draw path and in the fallback path.
>
> Even state_tracker modifies the struct:
>
>     obj->Pointer = pipe_buffer_map_range(pipe,
>                                          st_obj->buffer,
>                                          offset, length,
>                                          flags,
>                                          &st_obj->transfer);
>

OK, we're just talking at different levels.  From the GL API point of 
view, the indirect buffer is not modified by the drawing call.  If/when 
I suggested/questioned making it const, that what I had in mind.

 From the implementation point of view, const qualifying it does seem to 
be too much trouble.  I realize that mapping a buffer, even for 
read-only, can involve modifying the gl_buffer_object.

Please remove the const qualifier then.  Sorry for the confusion.

-Brian



More information about the mesa-dev mailing list