Skip to content

llvmpipe: Don't use u_ringbuffer for lp_scene_queue

Caio Oliveira requested to merge cmarcelo/mesa:r/gallium-queue-fixes into master

Inline the ring buffer and signal logic into lp_scene_queue instead of using a u_ringbuffer. The code ends up simpler since there's no need to handle serializing data from / to packets.

This fixes a crash when compiling Mesa with LTO, that happened because of util_ringbuffer_dequeue() was writing data after the "header packet", as shown below

struct scene_packet {
   struct util_packet header;
   struct lp_scene *scene;
};

/* Snippet of old lp_scene_deque(). */
packet.scene = NULL;
ret = util_ringbuffer_dequeue(queue->ring,
                              &packet.header,
                              sizeof packet / 4,
return packet.scene;

but due to the way aliasing analysis work the compiler didn't considered the "&packet->header" to alias with "packet->scene". With the aggressive inlining done by LTO, this would end up always returning NULL instead of the content read by util_ringbuffer_dequeue().

Issue found by Thiago Macieira.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110884

Merge request reports