From 73532f298726eb0a64f8b6c149b6c1a5f4b1228a Mon Sep 17 00:00:00 2001 From: Fabian Bieler <der.f...@gmx.net> Date: Mon, 14 Feb 2011 22:37:12 +0100 Subject: [PATCH 1/2] gallium/utils: Translate all buffers in vbuf manager
If one vertex element needs to be translated, translate all. Otherwise, the elements with matching format and offset are missing form the uploaded buffer. --- src/gallium/auxiliary/util/u_vbuf_mgr.c | 44 ++++++++---------------------- 1 files changed, 12 insertions(+), 32 deletions(-) diff --git a/src/gallium/auxiliary/util/u_vbuf_mgr.c b/src/gallium/auxiliary/util/u_vbuf_mgr.c index 7add88e..2852056 100644 --- a/src/gallium/auxiliary/util/u_vbuf_mgr.c +++ b/src/gallium/auxiliary/util/u_vbuf_mgr.c @@ -158,7 +158,6 @@ static void u_vbuf_translate_begin(struct u_vbuf_mgr_priv *mgr, struct translate_element *te; unsigned tr_elem_index[PIPE_MAX_ATTRIBS] = {0}; struct translate *tr; - boolean vb_translated[PIPE_MAX_ATTRIBS] = {0}; uint8_t *vb_map[PIPE_MAX_ATTRIBS] = {0}, *out_map; struct pipe_transfer *vb_transfer[PIPE_MAX_ATTRIBS] = {0}; struct pipe_resource *out_buffer = NULL; @@ -175,15 +174,6 @@ static void u_vbuf_translate_begin(struct u_vbuf_mgr_priv *mgr, enum pipe_format output_format = mgr->ve->native_format[i]; unsigned output_format_size = mgr->ve->native_format_size[i]; - /* Check for support. */ - if (mgr->ve->ve[i].src_format == mgr->ve->native_format[i] && - (mgr->caps.fetch_dword_unaligned || - (vb->buffer_offset % 4 == 0 && - vb->stride % 4 == 0 && - mgr->ve->ve[i].src_offset % 4 == 0))) { - continue; - } - /* Workaround for translate: output floats instead of halfs. */ switch (output_format) { case PIPE_FORMAT_R16_FLOAT: @@ -216,7 +206,6 @@ static void u_vbuf_translate_begin(struct u_vbuf_mgr_priv *mgr, te->output_offset = key.output_stride; key.output_stride += output_format_size; - vb_translated[mgr->ve->ve[i].vertex_buffer_index] = TRUE; tr_elem_index[i] = key.nr_elements; key.nr_elements++; } @@ -226,16 +215,14 @@ static void u_vbuf_translate_begin(struct u_vbuf_mgr_priv *mgr, /* Map buffers we want to translate. */ for (i = 0; i < mgr->b.nr_vertex_buffers; i++) { - if (vb_translated[i]) { - struct pipe_vertex_buffer *vb = &mgr->b.vertex_buffer[i]; + struct pipe_vertex_buffer *vb = &mgr->b.vertex_buffer[i]; - vb_map[i] = pipe_buffer_map(mgr->pipe, vb->buffer, - PIPE_TRANSFER_READ, &vb_transfer[i]); + vb_map[i] = pipe_buffer_map(mgr->pipe, vb->buffer, + PIPE_TRANSFER_READ, &vb_transfer[i]); - tr->set_buffer(tr, i, - vb_map[i] + vb->buffer_offset + vb->stride * min_index, - vb->stride, ~0); - } + tr->set_buffer(tr, i, + vb_map[i] + vb->buffer_offset + vb->stride * min_index, + vb->stride, ~0); } /* Create and map the output buffer. */ @@ -254,9 +241,7 @@ static void u_vbuf_translate_begin(struct u_vbuf_mgr_priv *mgr, /* Unmap all buffers. */ for (i = 0; i < mgr->b.nr_vertex_buffers; i++) { - if (vb_translated[i]) { - pipe_buffer_unmap(mgr->pipe, vb_transfer[i]); - } + pipe_buffer_unmap(mgr->pipe, vb_transfer[i]); } /* Setup the new vertex buffer in the first free slot. */ @@ -281,16 +266,11 @@ static void u_vbuf_translate_begin(struct u_vbuf_mgr_priv *mgr, /* Setup new vertex elements. */ for (i = 0; i < mgr->ve->count; i++) { - if (vb_translated[mgr->ve->ve[i].vertex_buffer_index]) { - te = &key.element[tr_elem_index[i]]; - new_velems[i].instance_divisor = mgr->ve->ve[i].instance_divisor; - new_velems[i].src_format = te->output_format; - new_velems[i].src_offset = te->output_offset; - new_velems[i].vertex_buffer_index = mgr->translate_vb_slot; - } else { - memcpy(&new_velems[i], &mgr->ve->ve[i], - sizeof(struct pipe_vertex_element)); - } + te = &key.element[tr_elem_index[i]]; + new_velems[i].instance_divisor = mgr->ve->ve[i].instance_divisor; + new_velems[i].src_format = te->output_format; + new_velems[i].src_offset = te->output_offset; + new_velems[i].vertex_buffer_index = mgr->translate_vb_slot; } mgr->fallback_ve = -- 1.7.2.3
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev