[Mesa-dev] [PATCH] u_vbuf_mgr: restore buffer offsets
Chia-I Wu
olvaffe at gmail.com
Thu Jul 21 00:48:49 PDT 2011
On Wed, Jul 20, 2011 at 11:32 PM, Marek Olšák <maraeo at gmail.com> wrote:
> Well spotted, thanks. Some comments below.
>
> On Wed, Jul 20, 2011 at 3:25 PM, Chia-I Wu <olvaffe at gmail.com> wrote:
>> From: Chia-I Wu <olv at lunarg.com>
>>
>> u_vbuf_upload_buffers modifies the buffer offsets. If they are not
>> restored, and any of the vertex formats is not supported natively, the
>> next u_vbuf_mgr_draw_begin call will translate the vertex buffers with
>> incorrect buffer offsets.
>> ---
>> src/gallium/auxiliary/util/u_vbuf_mgr.c | 14 ++++++++++++++
>> 1 files changed, 14 insertions(+), 0 deletions(-)
>>
>> diff --git a/src/gallium/auxiliary/util/u_vbuf_mgr.c b/src/gallium/auxiliary/util/u_vbuf_mgr.c
>> index 374fc33..47e7027 100644
>> --- a/src/gallium/auxiliary/util/u_vbuf_mgr.c
>> +++ b/src/gallium/auxiliary/util/u_vbuf_mgr.c
>> @@ -79,6 +79,8 @@ struct u_vbuf_mgr_priv {
>> void *saved_ve, *fallback_ve;
>> boolean ve_binding_lock;
>>
>> + unsigned saved_buffer_offset[PIPE_MAX_ATTRIBS];
>> +
>> boolean any_user_vbs;
>> boolean incompatible_vb_layout;
>> };
>> @@ -488,6 +490,7 @@ void u_vbuf_mgr_set_vertex_buffers(struct u_vbuf_mgr *mgrb,
>>
>> pipe_resource_reference(&mgr->b.vertex_buffer[i].buffer, vb->buffer);
>> pipe_resource_reference(&mgr->b.real_vertex_buffer[i], NULL);
>> + mgr->saved_buffer_offset[i] = vb->buffer_offset;
>>
>> if (!vb->buffer) {
>> continue;
>> @@ -647,6 +650,17 @@ u_vbuf_mgr_draw_begin(struct u_vbuf_mgr *mgrb,
>> void u_vbuf_mgr_draw_end(struct u_vbuf_mgr *mgrb)
>> {
>> struct u_vbuf_mgr_priv *mgr = (struct u_vbuf_mgr_priv*)mgrb;
>> + unsigned i;
>> +
>> + /* buffer offsets were modified in u_vbuf_upload_buffers */
>> + if (mgr->any_user_vbs) {
>
> That conditional should probably be:
>
> if (mgr->any_user_vbs || mgr->fallback_ve)
>
> Because the translate fallback changes the buffer offsets too.
Translate fallback adds a new buffer at mgr->translate_vb_slot. It
does not seem to change the offsets of the original buffers?
>> + for (i = 0; i < mgr->ve->count; i++) {
>> + unsigned index = mgr->ve->ve[i].vertex_buffer_index;
>> + struct pipe_vertex_buffer *vb = &mgr->b.vertex_buffer[index];
>> +
>> + vb->buffer_offset = mgr->saved_buffer_offset[index];
>> + }
>
> Why not loop over vertex buffers instead of vertex elements?
I followed the way u_vbuf_upload_buffers loops the buffers. I will
update this chunk to loop over vertex buffers.
> Marek
>
>> + }
>>
>> if (mgr->fallback_ve) {
>> u_vbuf_translate_end(mgr);
>> --
>> 1.7.5.3
>>
>>
>
--
olv at LunarG.com
More information about the mesa-dev
mailing list