r300: fix r300_draw_elements() behavior
What does this MR do and why?
r300: fix r300_draw_elements() behavior
Indeed, the pointer processed by r300_upload_index_buffer() was not the right one.
This is the reason why "deqp-gles2 --deqp-case=dEQP-GLES2.functional.draw.draw_elements.indices.user_ptr.index_byte"
was failing (the logs are below). This change corrects this issue and makes the related deqp tests work properly.
This change considers that r300_upload_index_buffer() sets indexBuffer to NULL. The indexBuffer resource
should be properly freed once the buffer is processed. This is required to avoid another refcnt imbalance
(another kind of memory leak).
==9962==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200000721f at pc 0x7fd57b54a9a0 bp 0x7fffd2c39290 sp 0x7fffd2c38a40
READ of size 30 at 0x60200000721f thread T0
#0 0x7fd57b54a99f in __interceptor_memcpy (/usr/lib64/libasan.so.6.0.0+0x3c99f)
#1 0x7fd570d10528 in u_upload_data ../src/gallium/auxiliary/util/u_upload_mgr.c:333
#2 0x7fd57114142b in r300_upload_index_buffer ../src/gallium/drivers/r300/r300_screen_buffer.c:44
#3 0x7fd57113943c in r300_draw_elements ../src/gallium/drivers/r300/r300_render.c:632
#4 0x7fd57113bbc4 in r300_draw_vbo ../src/gallium/drivers/r300/r300_render.c:840
#5 0x7fd570d212e2 in u_vbuf_draw_vbo ../src/gallium/auxiliary/util/u_vbuf.c:1487
#6 0x7fd56fceb873 in _mesa_validated_drawrangeelements ../src/mesa/main/draw.c:1709
#7 0x7fd56fcf28c5 in _mesa_DrawElementsBaseVertex ../src/mesa/main/draw.c:1852
Fixes: 330d0607ed6 ("gallium: remove pipe_index_buffer and set_index_buffer")
Signed-off-by: Patrick Lerda <patrick9876@free.fr>
Here are the deqp2 tests fixed in a gcc sanitizer environment by this change:
deqp-gles2/functional/draw/draw_elements/indices/user_ptr/index_byte: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/1_attribute/1_dynamic_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/1_attribute/1_dynamic_2_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/1_attribute/1_dynamic_buffer_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/1_attribute/1_dynamic_buffer_2_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/1_attribute/1_static_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/1_attribute/1_static_2_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/1_attribute/1_static_buffer_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/1_attribute/1_static_buffer_2_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/4_static_4_dynamic_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/4_static_4_dynamic_2_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/4_static_4_dynamic_buffers_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/4_static_4_dynamic_buffers_2_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/4_static_buffers_4_dynamic_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/4_static_buffers_4_dynamic_2_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/4_static_buffers_4_dynamic_buffers_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/4_static_buffers_4_dynamic_buffers_2_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/8_dynamic_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/8_dynamic_2_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/8_dynamic_buffers_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/8_dynamic_buffers_2_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/8_static_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/8_static_2_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/8_static_buffers_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/100_draws/8_attributes/8_static_buffers_2_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/10_draws/1_attribute/1_dynamic_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/10_draws/1_attribute/1_dynamic_buffer_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/10_draws/1_attribute/1_static_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/10_draws/1_attribute/1_static_buffer_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/10_draws/8_attributes/4_static_4_dynamic_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/10_draws/8_attributes/4_static_4_dynamic_buffers_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/10_draws/8_attributes/4_static_buffers_4_dynamic_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/10_draws/8_attributes/4_static_buffers_4_dynamic_2_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/10_draws/8_attributes/4_static_buffers_4_dynamic_buffers_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/10_draws/8_attributes/4_static_buffers_4_dynamic_buffers_2_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/10_draws/8_attributes/8_dynamic_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/10_draws/8_attributes/8_dynamic_buffers_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/10_draws/8_attributes/8_static_10_triangles: fail pass
deqp-gles2/performance/api/draw_call_batching/draw_elements/10_draws/8_attributes/8_static_buffers_10_triangles: fail pass