stoe/engine/render.lisp
2018-05-02 22:14:03 +02:00

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)