comparison svk/generate.nim @ 1483:55911f736a5a default tip

add: more shit
author sam <sam@basx.dev>
date Tue, 29 Apr 2025 00:17:33 +0700
parents bca8f65ed4ed
children
comparison
equal deleted inserted replaced
1482:bca8f65ed4ed 1483:55911f736a5a
233 # 233 #
234 # android 234 # android
235 ANativeWindow = object 235 ANativeWindow = object
236 AHardwareBuffer = object 236 AHardwareBuffer = object
237 237
238 # apple 238 # apple/metal
239 CAMetalLayer = object 239 CAMetalLayer = object
240 MTLDevice = object
241 MTLCommandQueue = object
242 MTLBuffer = object
243 MTLTexture = object
244 MTLSharedEvent = object
245 MTLSharedEvent_id = object 240 MTLSharedEvent_id = object
241 MTLDevice_id = object
242 MTLCommandQueue_id = object
243 MTLBuffer_id = object
244 MTLTexture_id = object
245 IOSurfaceRef = object
246 246
247 # wayland 247 # wayland
248 wl_display = object 248 wl_display = object
249 wl_surface = object 249 wl_surface = object
250 250
275 NvSciSyncFence = object 275 NvSciSyncFence = object
276 NvSciBufAttrList = object 276 NvSciBufAttrList = object
277 NvSciBufObj = object 277 NvSciBufObj = object
278 278
279 # some base vulkan base types 279 # some base vulkan base types
280 VkSampleMask = distinct uint32 280 VkSampleMask* = distinct uint32
281 VkBool32 = distinct uint32 281 VkBool32* = distinct uint32
282 VkFlags = distinct uint32 282 VkFlags* = distinct uint32
283 VkFlags64 = distinct uint64 283 VkFlags64* = distinct uint64
284 VkDeviceSize = distinct uint64 284 VkDeviceSize* = distinct uint64
285 VkDeviceAddress = distinct uint64 285 VkDeviceAddress* = distinct uint64
286 VkRemoteAddressNV = pointer 286 VkRemoteAddressNV* = pointer
287 """ 287 """
288 288
289 # generate consts =============================================================================== 289 # generate consts ===============================================================================
290 outFile.writeLine "const" 290 outFile.writeLine "const"
291 for c in consts: 291 for c in consts:
305 "VK_PIPELINE_CACHE_HEADER_VERSION_SAFETY_CRITICAL_ONE", 305 "VK_PIPELINE_CACHE_HEADER_VERSION_SAFETY_CRITICAL_ONE",
306 "VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_ONE_EXT", 306 "VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_ONE_EXT",
307 ] 307 ]
308 outFile.writeLine "type" 308 outFile.writeLine "type"
309 309
310 echo "#########################"
311 for edef in enums.values(): 310 for edef in enums.values():
312 echo edef.values
313 if edef.values.len > 0: 311 if edef.values.len > 0:
314 outFile.writeLine &" {edef.name}* {{.size: 4.}} = enum" 312 outFile.writeLine &" {edef.name}* {{.size: 4.}} = enum"
315 for ee in edef.values: 313 for ee in edef.values:
316 # due to the nim identifier-system, there might be collisions between typenames and enum-member names 314 # due to the nim identifier-system, there might be collisions between typenames and enum-member names
317 if ee.name in nameCollisions: 315 if ee.name in nameCollisions:
322 outFile.writeLine "" 320 outFile.writeLine ""
323 321
324 # generate types =============================================================================== 322 # generate types ===============================================================================
325 for t in types: 323 for t in types:
326 let category = t.attr("category") 324 let category = t.attr("category")
325 let tName = t.attr("name")
326 if tName.startsWith("VkVideo"): # we are not doing the video API, sorry
327 continue
328 if tName.startsWith("VkPhysicalDeviceVideo"): # we are not doing the video API, sorry
329 continue
327 if t.attr("api") == "vulkansc": 330 if t.attr("api") == "vulkansc":
328 continue 331 continue
329 elif t.attr("deprecated") == "true": 332 elif t.attr("deprecated") == "true":
330 continue 333 continue
331 elif category == "include": 334 elif category == "include":
334 continue 337 continue
335 elif t.attr("requires").startsWith("vk_video"): 338 elif t.attr("requires").startsWith("vk_video"):
336 continue 339 continue
337 elif t.attr("alias") != "": 340 elif t.attr("alias") != "":
338 let a = t.attr("alias") 341 let a = t.attr("alias")
339 let n = t.attr("name") 342 outFile.writeLine &" {tName}* = {a}"
340 outFile.writeLine &" {n} = {a}"
341 elif category == "bitmask": 343 elif category == "bitmask":
342 if t.len > 0 and t[0].text.startsWith("typedef"): 344 if t.len > 0 and t[0].text.startsWith("typedef"):
343 outFile.writeLine &" {t[2][0].text} = distinct {t[1][0].text}" 345 outFile.writeLine &" {t[2][0].text}* = distinct {t[1][0].text}"
344 elif category == "union": 346 elif category == "union":
345 let n = t.attr("name") 347 outFile.writeLine &" {tName}* {{.union.}} = object"
346 outFile.writeLine &" {n}* {{.union.}} = object"
347 for member in t.findAll("member"): 348 for member in t.findAll("member"):
348 outFile.writeLine &" {member.memberDecl()}" 349 outFile.writeLine &" {member.memberDecl()}"
349 elif category == "handle": 350 elif category == "handle":
350 outFile.writeLine &" {t[2][0].text} = distinct pointer" 351 outFile.writeLine &" {t[2][0].text}* = distinct pointer"
351 elif category == "struct": 352 elif category == "struct":
352 let n = t.attr("name") 353 outFile.writeLine &" {tName}* = object"
353 outFile.writeLine &" {n}* = object"
354 for member in t.findAll("member"): 354 for member in t.findAll("member"):
355 if member.attr("api") == "vulkansc": 355 if member.attr("api") == "vulkansc":
356 continue 356 continue
357 outFile.writeLine &" {member.memberDecl()}" 357 outFile.writeLine &" {member.memberDecl()}"
358 elif category == "funcpointer": 358 elif category == "funcpointer":
361 <type>void</type>* pUserData, 361 <type>void</type>* pUserData,
362 <type>size_t</type> size, 362 <type>size_t</type> size,
363 <type>size_t</type> alignment, 363 <type>size_t</type> alignment,
364 <type>VkSystemAllocationScope</type> allocationScope); 364 <type>VkSystemAllocationScope</type> allocationScope);
365 </type> 365 </type>
366 PFN_vkAllocationFunction* = proc(
367 pUserData: pointer,
368 size: csize_t,
369 alignment: csize_t,
370 allocationScope: VkSystemAllocationScope,
371 ): pointer {.cdecl.}
372 ]# 366 ]#
373 assert t[0].text.startsWith("typedef ") 367 assert t[0].text.startsWith("typedef ")
374 outFile.writeLine &" {t[1][0].text}* = proc()" 368 let retName = t[0].text[8 ..< ^13].strip()
369 let funcName = t.findAll("name")[0][0].text
370
371 outFile.write &" {funcname}* = proc("
372 for i in 3 ..< t.len:
373 # TODO: params
374
375 if retName == "void"
376 outFile.writeLine &") {{.cdecl.}}"
377 elif retName == "void*"
378 outFile.writeLine &"): pointer {{.cdecl.}}"
379 else:
380 outFile.writeLine &"): {doTypename(retName, false)} {{.cdecl.}}"
381
375 else: 382 else:
376 doAssert category in ["", "basetype", "enum"], "unknown type category: " & category 383 doAssert category in ["", "basetype", "enum"], "unknown type category: " & category
377 outFile.writeLine "" 384 outFile.writeLine ""
378 385
379 outFile.writeLine """ 386 for command in commands:
380 when defined(linux): 387 #[
381 include ../semicongine/rendering/vulkan/platform/xlib 388 <command successcodes="VK_SUCCESS" errorcodes="VK_ERROR_OUT_OF_HOST_MEMORY,VK_ERROR_OUT_OF_DEVICE_MEMORY,VK_ERROR_INITIALIZATION_FAILED,VK_ERROR_LAYER_NOT_PRESENT,VK_ERROR_EXTENSION_NOT_PRESENT,VK_ERROR_INCOMPATIBLE_DRIVER">
382 when defined(windows): 389 <proto>
383 include ../semicongine/rendering/vulkan/platform/win32 390 <type>VkResult</type>
384 """ 391 <name>vkCreateInstance</name>
392 </proto>
393 <param>const <type>VkInstanceCreateInfo</type>* <name>pCreateInfo</name></param>
394 <param optional="true">const <type>VkAllocationCallbacks</type>* <name>pAllocator</name></param>
395 <param><type>VkInstance</type>* <name>pInstance</name></param>
396 </command>
397 ]#
398 if command.attr("api") == "vulkansc":
399 continue
400 if command.attr("alias") != "":
401 let funcName = command.attr("name")
402 let funcAlias = command.attr("alias")
403 outFile.write &"var {funcName}* = {funcAlias}\n"
404 continue
405
406 let proto = command.findAll("proto")[0]
407 let retType = proto.findAll("type")[0][0].text.strip()
408 let funcName = proto.findAll("name")[0][0].text.strip()
409
410 if "Video" in funcName: # Video API not supported at this time
411 continue
412
413 outFile.write &"var {funcName}*: proc("
414 for param in command:
415 if param.tag != "param":
416 continue
417 if param.attr("api") == "vulkansc":
418 continue
419 assert param.len in [2, 3, 4]
420 let paramType = param.findAll("type")[0][0].text
421 let paramName = param.findAll("name")[0][0].text
422 assert "*" notin paramType, $param
423 if paramType == "void":
424 outFile.write &"{doIdentifier(paramName)}: {doTypename(paramType, true)}, "
425 else:
426 outFile.write &"{doIdentifier(paramName)}: {doTypename(paramType, false)}, "
427
428 outFile.write &")"
429 if retType != "void":
430 assert "*" notin retType
431 outFile.write &": {doTypename(retType, false)}"
432 outFile.write " {.stdcall.}\n"
385 433
386 outFile.close() 434 outFile.close()
387 435
388 assert execCmd("nim c " & outPath) == 0 436 assert execCmd("nim c " & outPath) == 0