Created
August 19, 2020 02:43
-
-
Save tamamu/985652f5966991934b7fcfa8da19486c to your computer and use it in GitHub Desktop.
Show Vulkan instance extension properties with handwritten Common Lisp binding by CFFI
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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