u_vbuf: take advantage of all new vertex fetch caps
authorMarek Olšák <maraeo@gmail.com>
Wed, 18 Apr 2012 23:41:46 +0000 (01:41 +0200)
committerMarek Olšák <maraeo@gmail.com>
Mon, 23 Apr 2012 23:39:22 +0000 (01:39 +0200)
src/gallium/auxiliary/util/u_vbuf.c
src/gallium/auxiliary/util/u_vbuf.h
src/mesa/state_tracker/st_context.c

index 3c6dc9a3ab10e1155fa46d00b6bb096a132d18bb..a592a1214e272fd9235a8f74f0f6993115871485 100644 (file)
@@ -144,11 +144,15 @@ void u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps)
       screen->is_format_supported(screen, PIPE_FORMAT_R32_SSCALED, PIPE_BUFFER,
                                   0, PIPE_BIND_VERTEX_BUFFER);
 
-   caps->fetch_dword_unaligned =
+   caps->buffer_offset_unaligned =
       !screen->get_param(screen,
-                        PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY) &&
+                        PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY);
+
+   caps->buffer_stride_unaligned =
       !screen->get_param(screen,
-                        PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY) &&
+                        PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY);
+
+   caps->velem_src_offset_unaligned =
       !screen->get_param(screen,
                         PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY);
 
@@ -653,14 +657,15 @@ u_vbuf_create_vertex_elements(struct u_vbuf *mgr, unsigned count,
 
       ve->incompatible_layout_elem[i] =
             ve->ve[i].src_format != format ||
-            (!mgr->caps.fetch_dword_unaligned && ve->ve[i].src_offset % 4 != 0);
+            (!mgr->caps.velem_src_offset_unaligned &&
+             ve->ve[i].src_offset % 4 != 0);
       ve->incompatible_layout =
             ve->incompatible_layout ||
             ve->incompatible_layout_elem[i];
    }
 
    /* Align the formats to the size of DWORD if needed. */
-   if (!mgr->caps.fetch_dword_unaligned) {
+   if (!mgr->caps.velem_src_offset_unaligned) {
       for (i = 0; i < count; i++) {
          ve->native_format_size[i] = align(ve->native_format_size[i], 4);
       }
@@ -704,8 +709,8 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr, unsigned count,
          continue;
       }
 
-      if (!mgr->caps.fetch_dword_unaligned &&
-          (vb->stride % 4 != 0 || vb->buffer_offset % 4 != 0)) {
+      if ((!mgr->caps.buffer_offset_unaligned && vb->buffer_offset % 4 != 0) ||
+          (!mgr->caps.buffer_stride_unaligned && vb->stride % 4 != 0)) {
          mgr->incompatible_vb[i] = TRUE;
          mgr->incompatible_vb_layout = TRUE;
          pipe_resource_reference(&real_vb->buffer, NULL);
index 161349970a154b8a5c7556db380beca977ca0a28..59eb59a119040398002c2880b38db8b2f2d3a6cf 100644 (file)
@@ -49,9 +49,11 @@ struct u_vbuf_caps {
    unsigned format_norm32:1;     /* PIPE_FORMAT_*32*NORM */
    unsigned format_scaled32:1;   /* PIPE_FORMAT_*32*SCALED */
 
-   /* Whether vertex fetches don't have to be dword-aligned. */
+   /* Whether vertex fetches don't have to be 4-byte-aligned. */
    /* TRUE if hardware supports it. */
-   unsigned fetch_dword_unaligned:1;
+   unsigned buffer_offset_unaligned:1;
+   unsigned buffer_stride_unaligned:1;
+   unsigned velem_src_offset_unaligned:1;
 
    /* Whether the driver supports user vertex buffers. */
    unsigned user_vertex_buffers:1;
index b27f2f677b62dbce53c7b3273d2ef2f8989d68e8..84aae8144167e7bd71f3168947ef365245425860 100644 (file)
@@ -119,7 +119,9 @@ static void st_init_vbuf(struct st_context *st)
    u_vbuf_get_caps(st->pipe->screen, &caps);
 
    /* Create u_vbuf if there is anything unsupported. */
-   if (!caps.fetch_dword_unaligned ||
+   if (!caps.buffer_offset_unaligned ||
+       !caps.buffer_stride_unaligned ||
+       !caps.velem_src_offset_unaligned ||
        !caps.format_fixed32 ||
        !caps.format_float16 ||
        !caps.format_float64 ||