87 lines
3.4 KiB
Common Lisp
87 lines
3.4 KiB
Common Lisp
#|
|
|
This file is a part of stoe project.
|
|
Copyright (c) 2017 Renaud Casenave-Péré (renaud@casenave-pere.fr)
|
|
|#
|
|
|
|
(uiop:define-package :stoe/engine/render
|
|
(:use :cl :vk :alexandria :cffi
|
|
:stoe/core/modules
|
|
:stoe/engine/window))
|
|
(in-package :stoe/engine/render)
|
|
|
|
(defclass render-thread (specialized-thread)
|
|
())
|
|
|
|
(defvar *render-thread* nil)
|
|
(defvar *frames-per-second* 0.0)
|
|
|
|
(defvar *engine-name* "Stoe")
|
|
(defvar *engine-version* 0)
|
|
|
|
(defvar *instance-extension-properties* nil)
|
|
(defvar *instance-layer-properties* nil)
|
|
(defvar *physical-devices* nil)
|
|
(defvar *physical-device-index* 0)
|
|
(defvar *queue-family-properties* nil)
|
|
(defvar *device-extension-properties* nil)
|
|
(defvar *device* nil)
|
|
|
|
(push :vk-xlib *features*)
|
|
|
|
(defun initialize (&optional argv)
|
|
"Initialize the render module.
|
|
Create a vulkan instance."
|
|
(declare (ignore argv))
|
|
(format t "Initialize Render module~%")
|
|
(window-initialize)
|
|
(setf *instance-layer-properties* (enumerate-instance-layer-properties))
|
|
(setf *instance-extension-properties* (enumerate-instance-extension-properties ""))
|
|
(unless (and (boundp '%vk::*instance*) %vk::*instance*)
|
|
(let ((layers '("VK_LAYER_LUNARG_standard_validation"))
|
|
(exts '("VK_EXT_debug_report"
|
|
#+vk-xlib
|
|
"VK_KHR_xlib_surface"
|
|
#+vk-xcb
|
|
"VK_KHR_xcb_surface"
|
|
#+vk-wayland
|
|
"VK_KHR_wayland_surface")))
|
|
(setf %vk::*instance-extensions* (make-hash-table))
|
|
(setf %vk::*instance-params* (list :layers layers :exts exts))
|
|
(let ((instance (vk-assert (create-instance :app "Stoe test" :app-version 0
|
|
:engine *engine-name* :engine-version *engine-version*
|
|
:layers layers
|
|
:exts exts))))
|
|
(setf %vk::*instance* instance))))
|
|
(unless *device*
|
|
(let ((phys-devices (vk-assert (enumerate-physical-devices %vk::*instance*))))
|
|
(setf *physical-devices* phys-devices)
|
|
(setf *queue-family-properties*
|
|
(mapcar (lambda (phys-device)
|
|
(get-physical-device-queue-family-properties phys-device))
|
|
phys-devices))
|
|
(let ((queue-family-index
|
|
(loop for queue-family in (nth *physical-device-index*
|
|
*queue-family-properties*)
|
|
for index = 0 then (1+ index)
|
|
when (member :graphics (getf queue-family :queue-flags))
|
|
return index)))
|
|
(setf *device-extension-properties* (enumerate-device-extension-properties
|
|
(nth *physical-device-index*
|
|
*physical-devices*) ""))
|
|
(let ((device (vk-assert (create-device (first phys-devices)
|
|
:queue-family-index queue-family-index
|
|
:exts '("VK_KHR_swapchain")))))
|
|
(setf *device* device))))))
|
|
|
|
(defun finalize ()
|
|
"Finalize the render module."
|
|
(format t "Finalize Render module~%")
|
|
(%vk::destroy-device *device* (null-pointer))
|
|
(setf *device* nil)
|
|
(%vk::destroy-instance %vk::*instance* (null-pointer))
|
|
(setf %vk::*instance* nil))
|
|
|
|
(defun update (delta-time)
|
|
(declare (ignore delta-time)))
|
|
|
|
(defmodule stoe/engine/render :render)
|