st/va: change frame_idx from array to hash table
authorJulien Isorce <julien.isorce@gmail.com>
Tue, 25 Jul 2017 14:31:28 +0000 (15:31 +0100)
committerJulien Isorce <jisorce@oblong.com>
Mon, 14 Aug 2017 12:40:19 +0000 (13:40 +0100)
commit91d93aa62162f98d6377e5c796b63faa263f2c18
tree9df67ea3d8fcbbe7eff793363585a79591a9974f
parent3d8da1f678e196af619d74845f7d5f564ce40ea3
st/va: change frame_idx from array to hash table

The picture_id was assumed to be a frame number so in 0-31.
But the vaapi client gstreamer-vaapi uses the surfaces handles
as identifier which are unsigned int.

This bug can happen when using a lot of vaapi surfaces within
the same process. Indeed Mesa/st/va increments a counter for the
surface ID: mesa/util/u_handle_table.c::handle_table_add which
starts from 0 and incremented by 1 at each call.
So creating more than 32 surfaces was a problem.

The following bug contains a test that reproduces the problem
by running a couple of vaapih264enc in the same process. The
above also explains why there was no pb when running them in
separated processes.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102006
Signed-off-by: Julien Isorce <jisorce@oblong.com>
Tested-by: Tomas Rataj <rataj28@gmail.com>
Acked-by: Christian König <christian.koenig@amd.com>
Reviewed-and-tested-by: Boyuan Zhang <Boyuan.Zhang@amd.com>
src/gallium/include/pipe/p_video_state.h
src/gallium/state_trackers/va/context.c
src/gallium/state_trackers/va/picture.c
src/gallium/state_trackers/va/va_private.h