[Mesa-dev] [PATCH] util/primconvert: Avoid point arithmetic; apply offset on all cases.
Ilia Mirkin
imirkin at alum.mit.edu
Fri Dec 5 06:35:01 PST 2014
On Fri, Dec 5, 2014 at 9:29 AM, Jose Fonseca <jfonseca at vmware.com> wrote:
> On 05/12/14 14:18, Ilia Mirkin wrote:
>>
>> On Fri, Dec 5, 2014 at 9:16 AM, Jose Fonseca <jfonseca at vmware.com> wrote:
>>>
>>> From: José Fonseca <jfonseca at vmware.com>
>>>
>>> Matches what u_vbuf_get_minmax_index() does.
>>
>>
>> Hm, nouveau nv50 (and probably nvc0) does:
>>
>> if (ib->buffer) {
>> nv50->idxbuf.offset = ib->offset;
>> BCTX_REFN(nv50->bufctx_3d, INDEX, nv04_resource(ib->buffer),
>> RD);
>> } else {
>> nv50->idxbuf.user_buffer = ib->user_buffer;
>> }
>>
>> Is the offset really supposed to be applied to the user buffer?
>
>
> Nouveau is the odd ball here, as softpipe/llvmpipe apply it:
>
> src/gallium/drivers/llvmpipe/lp_draw_arrays.c
> src/gallium/drivers/softpipe/sp_draw_arrays.c
>
>> I
>> figured the point of the offset was that you couldn't provide an
>> offset into a pipe_resource otherwise, while with a user ptr, you can
>> just add it in yourself...
>
> True. Still it's better to apply these things uniformly, because the user
> vs buffer pointer is a distinction which rapidly disappears inside a pipe
> driver. (E.g, the driver can promote the user pointer to a buffer
> internally, and then the information of whether offset should or not be
> taken in account gets lost)
Definitely agree that it's better to apply things uniformly. Just
wasn't sure if "uniformly" meant "fix u_vbuf" or "fix nouveau" :)
FWIW, st/mesa does, in setup_index_buffer:
if (_mesa_is_bufferobj(bufobj)) {
/* indices are in a real VBO */
ibuffer->buffer = st_buffer_object(bufobj)->buffer;
ibuffer->offset = pointer_to_offset(ib->ptr);
}
else {
/* indices are in user space memory */
ibuffer->user_buffer = ib->ptr;
}
But the ibuffer is zero-initialized beforehand. So this discussion is
largely academic. I'm happy to decree that ib->offset shall be applied
to the user_buffer as well and go around fixing nouveau and anyone
else coming in its path.
So... this change Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
Cheers,
-ilia
>
> Jose
>
>
>>> ---
>>> src/gallium/auxiliary/indices/u_primconvert.c | 3 ++-
>>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/src/gallium/auxiliary/indices/u_primconvert.c
>>> b/src/gallium/auxiliary/indices/u_primconvert.c
>>> index 4632781..eba1f9e 100644
>>> --- a/src/gallium/auxiliary/indices/u_primconvert.c
>>> +++ b/src/gallium/auxiliary/indices/u_primconvert.c
>>> @@ -137,8 +137,9 @@ util_primconvert_draw_vbo(struct primconvert_context
>>> *pc,
>>> src = ib->user_buffer;
>>> if (!src) {
>>> src = pipe_buffer_map(pc->pipe, ib->buffer,
>>> - PIPE_TRANSFER_READ, &src_transfer) +
>>> ib->offset;
>>> + PIPE_TRANSFER_READ, &src_transfer);
>>> }
>>> + src = (const uint8_t *)src + ib->offset;
>>> }
>>> else {
>>> u_index_generator(pc->primtypes_mask,
>>> --
>>> 2.1.0
>>>
>
More information about the mesa-dev
mailing list