diff --git a/.pick_status.json b/.pick_status.json index 2c59972af05..d0abc17fd51 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -194,7 +194,7 @@ "description": "r600: fix the indirect draw 8-bits path", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "d80701df8af4a5d74c4f4eb09a4b3cef6970104b", "notes": null diff --git a/src/gallium/drivers/r600/ci/r600-turks-fails.txt b/src/gallium/drivers/r600/ci/r600-turks-fails.txt index d77278ae063..7c5dc32f4dd 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 ba45b73d156..e86bf3cd365 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; } @@ -2432,7 +2418,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);