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

Reply via email to