ilo: fix for half-float vertex arrays
authorChia-I Wu <olvaffe@gmail.com>
Fri, 14 Jun 2013 16:56:17 +0000 (00:56 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Fri, 14 Jun 2013 17:00:03 +0000 (01:00 +0800)
Commit 6fe0453c339b6e894e0ee8d2200e7638a43ed21e broke half-float vertex
arrays.  This reverts a part of that commit, and explains why.

src/gallium/drivers/ilo/ilo_gpe_gen6.c

index 536dbf8872d18f2ecdd0f6a6c6a7801163f5c7ad..89566b72a0450be2c10dbb45cf0da5c87dfa1b05 100644 (file)
@@ -767,7 +767,20 @@ gen6_emit_3DSTATE_VERTEX_BUFFERS(const struct ilo_dev_info *dev,
       if (vb->buffer && vb->stride <= 2048) {
          const struct ilo_buffer *buf = ilo_buffer(vb->buffer);
          const uint32_t start_offset = vb->buffer_offset;
-         const uint32_t end_offset = buf->bo_size - 1;
+         /*
+          * As noted in ilo_translate_format(), we treat some 3-component
+          * formats as 4-component formats to work around hardware
+          * limitations.  Imagine the case where the vertex buffer holds a
+          * single PIPE_FORMAT_R16G16B16_FLOAT vertex, and buf->bo_size is 6.
+          * The hardware would not be able to fetch it because the vertex
+          * buffer is expected to hold a PIPE_FORMAT_R16G16B16A16_FLOAT vertex
+          * and that takes at least 8 bytes.
+          *
+          * For the workaround to work, we query the physical size, which is
+          * page aligned, to calculate end_offset so that the last vertex has
+          * a better chance to be fetched.
+          */
+         const uint32_t end_offset = intel_bo_get_size(buf->bo) - 1;
 
          dw |= vb->stride << BRW_VB0_PITCH_SHIFT;