Skip to content

Error when instanciating VkSpecializationInfo #101

@mulcyber

Description

@mulcyber

VkSpecializationInfo cannot be instanciated because pData is defined void[] that cannot be created by ffi.

As far as I can tell, there is no way around this since the issue is directly due to the definition of pData in vulkan.cdef.h:3175

typedef struct VkSpecializationInfo {
    uint32_t mapEntryCount;
    const VkSpecializationMapEntry* pMapEntries;
    size_t dataSize;
    const void* pData;
} VkSpecializationInfo;

Minimum example:

import numpy as np
import vulkan as vk

print("vulkan.py version:", vk.__version__)

np_data = np.int32(5)
data = np_data.tobytes()
len_data = len(data)
entries = [
    vk.VkSpecializationMapEntry(constantID=0, offset=0, size=len_data)
]

print("entries:", entries)
print("len(entries):", len(entries))
print("data:", data)
print("len(data):", len(data))
spec_info = vk.VkSpecializationInfo(
    pMapEntries=entries,
    pData=data,
)
vulkan.py version: 1.3.275.1
entries: [<cdata 'struct VkSpecializationMapEntry' owning 16 bytes>]
len(entries): 1
data: b'\x05\x00\x00\x00'
len(data): 4

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/tmp/ipykernel_3143/127872496.py in ?()
     13 print("entries:", entries)
     14 print("len(entries):", len(entries))
     15 print("data:", data)
     16 print("len(data):", len(data))
---> 17 spec_info = vk.VkSpecializationInfo(
     18     pMapEntries=entries,
     19     pData=data,
     20 )

~/projects/shaders_vulkan/venv/lib/python3.13/site-packages/vulkan/_vulkan.py in ?(mapEntryCount, pMapEntries, dataSize, pData)
   6605         mapEntryCount = len(pMapEntries)
   6606     if dataSize is None and pData is not None:
   6607         dataSize = len(pData)
   6608 
-> 6609     return _new('VkSpecializationInfo', mapEntryCount=mapEntryCount,pMapEntries=pMapEntries,dataSize=dataSize,pData=pData)

~/projects/shaders_vulkan/venv/lib/python3.13/site-packages/vulkan/_vulkan.py in ?(ctype, **kwargs)
   6275             mod = sys.modules[__name__]
   6276             setattr(mod, '_internal_' + pfn_name, v)
   6277             pfns[k] = getattr(mod, '_external_' + pfn_name)
   6278         elif ktype.kind == 'pointer':
-> 6279             ptrs[k] = _cast_ptr(v, ktype)
   6280 
   6281     # init object
   6282     init = dict(kwargs,  **{k: v for k, (v, _) in ptrs.items()})

~/projects/shaders_vulkan/venv/lib/python3.13/site-packages/vulkan/_vulkan.py in ?(x, _type)
     92         try:
     93             x = x.encode('ascii')
     94         except UnicodeEncodeError:
     95             x = x.encode('utf-8')
---> 96     return _cast_ptr2(x, _type)

~/projects/shaders_vulkan/venv/lib/python3.13/site-packages/vulkan/_vulkan.py in ?(x, _type)
     79             ptrs = [_cast_ptr(i, _type.item) for i in x]
     80             ret = ffi.new(_type.item.cname+'[]', [i for i, _ in ptrs])
     81             _weakkey_dict[ret] = tuple(i for _, i in ptrs if i != ffi.NULL)
     82         else:
---> 83             ret = ffi.new(_type.item.cname+'[]', x)
     84 
     85         return ret, ret
     86 

ValueError: array item of unknown size: 'void'

This is due to ffi trying to instanciate a void[] array for pData.

_type = vk.ffi.typeof('VkSpecializationInfo')  # _vulkan.py:6258
ktype = dict(_type.fields)['pData'].type  # _vulkan.py:6269
print("ktype.kind:", ktype.kind)  # elif statement _vulkan.py:6278
print("ktype.item.kind:", ktype.item.kind)  # if statement _vulkan.py:78 is false, skipping to else branch _vulkan.py:82
ret = vk.ffi.new(ktype.item.cname+'[]', data)  # _vulkan.py:83
ktype.kind: pointer
ktype.item.kind: void

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[57], line 5
      3 print("ktype.kind:", ktype.kind)  # elif statement _vulkan.py:6278
      4 print("ktype.item.kind:", ktype.item.kind)  # if statement _vulkan.py:78 is false, skipping to else branch _vulkan.py:82
----> 5 ret = vk.ffi.new(ktype.item.cname+'[]', data)  # _vulkan.py:83

ValueError: array item of unknown size: 'void'

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions