[PATCH vkd3d 2/2] vkd3d: Optimise the GPU VA allocator.

Sveinar Søpler cybermax at dexter.no
Wed Nov 20 11:06:36 CST 2019

I am getting a compile warning when compiling 32-bit with this patch.


In file included from ./include/private/vkd3d_memory.h:26,
                  from libs/vkd3d/vkd3d_private.h:27,
                  from libs/vkd3d/device.c:19:
libs/vkd3d/device.c: In function ‘vkd3d_gpu_va_allocator_dereference_slab’:
libs/vkd3d/device.c:1963:13: warning: format ‘%zu’ expects argument of 
type ‘size_t’, but argument 7 has type ‘SIZE_T’ {aka ‘const long 
unsigned int’} [-Wformat=]
  1963 |         ERR("Address %#"PRIx64" is %#"PRIx64" bytes into slab 
%u of size %zu.\n",
       |             ^~~~~~~~~~~~
  1964 |                 address, base_offset, slab_idx, slab->size);
       |                                                 ~~~~~~~~~~
       |                                                     |
       |                                                     SIZE_T {aka 
const long unsigned int}
./include/private/vkd3d_debug.h:71:57: note: in definition of macro 
    71 |         vkd3d_dbg_printf(vkd3d_dbg_level, __FUNCTION__, 
__VA_ARGS__); } while (0)
       | ^~~~~~~~~~~
./include/private/vkd3d_debug.h:85:15: note: in expansion of macro 
    85 | #define ERR   VKD3D_DBG_LOG(ERR)
       |               ^~~~~~~~~~~~~
libs/vkd3d/device.c:1963:9: note: in expansion of macro ‘ERR’
  1963 |         ERR("Address %#"PRIx64" is %#"PRIx64" bytes into slab 
%u of size %zu.\n",
       |         ^~~
libs/vkd3d/device.c:1963:76: note: format string is defined here
  1963 |         ERR("Address %#"PRIx64" is %#"PRIx64" bytes into slab 
%u of size %zu.\n",
| ~~^
| |
| unsigned int
| %lu


%zu expects this to be unsigned int and not long for my 32-bit compiler. 
I dunno if this is different for MSVC or some other compiler for 32-bit? 
Should it just be changed for %lu to get rid of the warning, or is there 
some weirdness with Ubuntu gcc-9 behavior? (Or my setup for that matter).

Compile log from OBS in case there is something i have done wrong: 


On 24.10.2019 16:33, hverbeet at codeweavers.com (Henri Verbeet) wrote:
> From: Hans-Kristian Arntzen <post at arntzen-software.no>
> The GPU VA allocator was allocating memory in a way where dereferencing
> GPU VA required a lock + bsearch() to find the right VA range.
> Rather than going this route, we turn the common case into O(1) and
> lock-free by creating a slab allocator which allows us to lookup a
> pointer directly from a GPU VA with (VA - Base) / PageSize.
> The number of allocations in the fast path must be limited since we
> cannot trivially grow the allocator while remaining lock-free for
> dereferences.
> Signed-off-by: Hans-Kristian Arntzen <post at arntzen-software.no>
> Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
> ---
> This supersedes patch 171219.
>   libs/vkd3d/device.c        | 226 +++++++++++++++++++++++++++++++++++++--------
>   libs/vkd3d/vkd3d_private.h |  28 ++++--
>   2 files changed, 204 insertions(+), 50 deletions(-)

More information about the wine-devel mailing list