diff --git a/src/gallium/drivers/r600/ci/r600-turks-fails.txt b/src/gallium/drivers/r600/ci/r600-turks-fails.txt index 1b6f4691f50..49b4acfb283 100644 --- a/src/gallium/drivers/r600/ci/r600-turks-fails.txt +++ b/src/gallium/drivers/r600/ci/r600-turks-fails.txt @@ -439,13 +439,6 @@ dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffe dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.8,Fail dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.9,Fail -# One triangle missing -dEQP-GLES31.functional.draw_indirect.draw_elements_indirect.indices.index_byte,Fail - -# Line is entirely missing -dEQP-GLES31.functional.draw_indirect.random.35,Fail -dEQP-GLES31.functional.draw_indirect.random.45,Fail - dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.r32f_rgba8_snorm,Fail dEQP-GLES31.functional.image_load_store.2d.format_reinterpret.rgba8_rgba8_snorm,Fail dEQP-GLES31.functional.image_load_store.2d_array.format_reinterpret.r32f_rgba8_snorm,Fail diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index 5e2318c86f3..a801f151423 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -2211,30 +2211,16 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info struct pipe_resource *out_buffer = NULL; unsigned out_offset; void *ptr; - unsigned start, count; + const unsigned out_size = sizeof(uint16_t); + const unsigned start = 0; + const unsigned count = likely(!indirect) ? + draws[0].count : + indexbuf->width0 - index_offset; + const unsigned out_width = count * out_size; - if (likely(!indirect)) { - start = 0; - count = draws[0].count; - } - else { - /* Have to get start/count from indirect buffer, slow path ahead... */ - struct r600_resource *indirect_resource = (struct r600_resource *)indirect->buffer; - unsigned *data = r600_buffer_map_sync_with_rings(&rctx->b, indirect_resource, - PIPE_MAP_READ); - if (data) { - data += indirect->offset / sizeof(unsigned); - start = data[2] * index_size; - count = data[0]; - } - else { - start = 0; - count = 0; - } - } - - u_upload_alloc(ctx->stream_uploader, start, count * 2, + u_upload_alloc(ctx->stream_uploader, start, out_width, 256, &out_offset, &out_buffer, &ptr); + if (unlikely(!ptr)) return; @@ -2243,7 +2229,7 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info indexbuf = out_buffer; index_offset = out_offset; - index_size = 2; + index_size = out_size; has_user_indices = false; } @@ -2451,7 +2437,10 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info RADEON_PRIO_INDEX_BUFFER)); } else { - uint32_t max_size = (indexbuf->width0 - index_offset) / index_size; + const uint32_t max_size = + likely(indexbuf == info->index.resource) ? + (indexbuf->width0 - index_offset) / index_size : + info->index.resource->width0 - draws[0].start; radeon_emit(cs, PKT3(EG_PKT3_INDEX_BASE, 1, 0)); radeon_emit(cs, va);