-
Notifications
You must be signed in to change notification settings - Fork 50
Open
Description
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:83ktype.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
Labels
No labels