From bfa8d21759c5f2b5b0885c696842167bd4c64fee Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Sat, 15 Jun 2013 00:56:17 +0800 Subject: [PATCH] ilo: fix for half-float vertex arrays 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 | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/ilo/ilo_gpe_gen6.c b/src/gallium/drivers/ilo/ilo_gpe_gen6.c index 536dbf8872d..89566b72a04 100644 --- a/src/gallium/drivers/ilo/ilo_gpe_gen6.c +++ b/src/gallium/drivers/ilo/ilo_gpe_gen6.c @@ -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; -- 2.30.2