anv/allocator: Allow state pools to allocate large states
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 24 Apr 2017 08:51:51 +0000 (01:51 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 5 May 2017 02:07:54 +0000 (19:07 -0700)
commitf82d3d38b62048246c4df999a1789b5cb60184c6
treea2ebc05fe825f8149e87edcbca1ef10f9f927d7f
parent8c079b566e59df2f6d0e0deb951078aba862991d
anv/allocator: Allow state pools to allocate large states

Previously, the maximum size of a state that could be allocated from a
state pool was a block.  However, this has caused us various issues
particularly with shaders which are potentially very large.  We've also
hit issues with render passes with a large number of attachments when we
go to allocate the block of surface state.  This effectively removes the
restriction on the maximum size of a single state.  (There's still a
limit of 1MB imposed by a fixed-length bucket array.)

For states larger than the block size, we just grab a large block off of
the block pool rather than sub-allocating.  When we go to allocate some
chunk of state and the current bucket does not have state, we try to
pull a chunk from some larger bucket and split it up.  This should
improve memory usage if a client occasionally allocates a large block of
state.

This commit is inspired by some similar work done by Juan A. Suarez
Romero <jasuarez@igalia.com>.

Reviewed-by: Juan A. Suarez Romero <jasuarez@igalia.com>
src/intel/vulkan/anv_allocator.c