Skip to content

Instantly share code, notes, and snippets.

@tamamu
Created August 19, 2020 02:43
Show Gist options
  • Save tamamu/985652f5966991934b7fcfa8da19486c to your computer and use it in GitHub Desktop.
Save tamamu/985652f5966991934b7fcfa8da19486c to your computer and use it in GitHub Desktop.
Show Vulkan instance extension properties with handwritten Common Lisp binding by CFFI
(ql:quickload :cffi)
(defpackage vkffi
(:use :cl :cffi))
(in-package vkffi)
(define-foreign-library vulkan
(:windows "vulkan-1.dll"))
(use-foreign-library vulkan)
(defcenum vk-result
(:VK_SUCCESS 0)
(:VK_NOT_READY 1)
(:VK_TIMEOUT 2)
(:VK_EVENT_SET 3)
(:VK_EVENT_RESET 4)
(:VK_INCOMPLETE 5)
(:VK_ERROR_OUT_OF_HOST_MEMORY -1)
(:VK_ERROR_OUT_OF_DEVICE_MEMORY -2)
(:VK_ERROR_INITIALIZATION_FAILED -3)
(:VK_ERROR_DEVICE_LOST -4)
(:VK_ERROR_MEMORY_MAP_FAILED -5)
(:VK_ERROR_LAYER_NOT_PRESENT -6)
(:VK_ERROR_EXTENSION_NOT_PRESENT -7)
(:VK_ERROR_FEATURE_NOT_PRESENT -8)
(:VK_ERROR_INCOMPATIBLE_DRIVER -9)
(:VK_ERROR_TOO_MANY_OBJECTS -10)
(:VK_ERROR_FORMAT_NOT_SUPPORTED -11)
(:VK_ERROR_FRAGMENTED_POOL -12)
(:VK_ERROR_UNKNOWN -13)
;Provided by VK_VERSION_1_1
(:VK_ERROR_OUT_OF_POOL_MEMORY -1000069000)
; Provided by VK_VERSION_1_1
(:VK_ERROR_INVALID_EXTERNAL_HANDLE -1000072003)
; Provided by VK_VERSION_1_2
(:VK_ERROR_FRAGMENTATION -1000161000)
; Provided by VK_VERSION_1_2
(:VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS -1000257000)
; Provided by VK_KHR_surface
(:VK_ERROR_SURFACE_LOST_KHR -1000000000)
; Provided by VK_KHR_surface
(:VK_ERROR_NATIVE_WINDOW_IN_USE_KHR -1000000001)
; Provided by VK_KHR_swapchain
(:VK_SUBOPTIMAL_KHR 1000001003)
; Provided by VK_KHR_swapchain
(:VK_ERROR_OUT_OF_DATE_KHR -1000001004)
; Provided by VK_KHR_display_swapchain
(:VK_ERROR_INCOMPATIBLE_DISPLAY_KHR -1000003001)
; Provided by VK_EXT_debug_report
(:VK_ERROR_VALIDATION_FAILED_EXT -1000011001)
; Provided by VK_NV_glsl_shader
(:VK_ERROR_INVALID_SHADER_NV -1000012000)
; Provided by VK_KHR_ray_tracing
(:VK_ERROR_INCOMPATIBLE_VERSION_KHR -1000150000)
; Provided by VK_EXT_image_drm_format_modifier
(:VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT -1000158000)
; Provided by VK_EXT_global_priority
(:VK_ERROR_NOT_PERMITTED_EXT -1000174001)
; Provided by VK_EXT_full_screen_exclusive
(:VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT -1000255000)
; Provided by VK_KHR_deferred_host_operations
(:VK_THREAD_IDLE_KHR 1000268000)
; Provided by VK_KHR_deferred_host_operations
(:VK_THREAD_DONE_KHR 1000268001)
; Provided by VK_KHR_deferred_host_operations
(:VK_OPERATION_DEFERRED_KHR 1000268002)
; Provided by VK_KHR_deferred_host_operations
(:VK_OPERATION_NOT_DEFERRED_KHR 1000268003)
; Provided by VK_EXT_pipeline_creation_cache_control
(:VK_PIPELINE_COMPILE_REQUIRED_EXT 1000297000)
; Provided by VK_KHR_maintenance1
(:VK_ERROR_OUT_OF_POOL_MEMORY_KHR -1000069000)
; Provided by VK_KHR_external_memory
(:VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR -1000072003)
; Provided by VK_EXT_descriptor_indexing
(:VK_ERROR_FRAGMENTATION_EXT -1000161000)
; Provided by VK_EXT_buffer_device_address
(:VK_ERROR_INVALID_DEVICE_ADDRESS_EXT -1000257000)
; Provided by VK_KHR_buffer_device_address
(:VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR -1000257000)
(:VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT 1000297000))
;(defconstant VK_MAX_EXTENSION_NAME_SIZE 256)
(defcstruct vk-extension-properties
(extension-name :char :count 256)
(spec-version :uint32))
(defcfun ("vkEnumerateInstanceExtensionProperties" vk-enumerate-instance-extension-properties) vk-result
(pLayerName (:pointer :char))
(pPropertyCount (:pointer :uint32))
(pProperties (:pointer (:struct vk-extension-properties))))
(with-foreign-object (%extension-count :uint32)
(format t "vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr) ... ~a~%"
(vk-enumerate-instance-extension-properties (null-pointer) %extension-count (null-pointer)))
(let ((extension-count (mem-ref %extension-count :uint32)))
(format t "~a extensions supported~%" extension-count)
(with-foreign-object (%extension-properties '(:struct vk-extension-properties) extension-count)
(format t "vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, &extensionProperties) ... ~a~%"
(vk-enumerate-instance-extension-properties (null-pointer) %extension-count %extension-properties))
(let ((extension-properties
(loop for i below extension-count
collect (mem-aref %extension-properties '(:struct vk-extension-properties) i))))
(loop for ep in extension-properties
do (format t "~a - spec:~a~%"
(convert-from-foreign (getf ep 'extension-name) :string)
(getf ep 'spec-version)))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment