Add a starting block for a glsl dsl compiler
This commit is contained in:
parent
906d165556
commit
2c0f5f1904
3 changed files with 67 additions and 1 deletions
25
src/render/shader/compiler.lisp
Normal file
25
src/render/shader/compiler.lisp
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
#|
|
||||||
|
This file is a part of stoe project.
|
||||||
|
Copyright (c) 2014 Renaud Casenave-Péré (renaud@casenave-pere.fr)
|
||||||
|
|#
|
||||||
|
|
||||||
|
(in-package :cl-user)
|
||||||
|
(defpackage stoe.shader.compiler
|
||||||
|
(:use :cl :utils)
|
||||||
|
(:nicknames :compiler)
|
||||||
|
(:import-from :stoe.shader.glsl
|
||||||
|
:glsl-compile)
|
||||||
|
(:export :defshader))
|
||||||
|
(in-package :stoe.shader.compiler)
|
||||||
|
|
||||||
|
(defun %defshader (lambda-list body)
|
||||||
|
(let ((shader (glsl-compile (cons 'newshader (cons lambda-list body)))))
|
||||||
|
shader))
|
||||||
|
|
||||||
|
(defmacro defshader (name lambda-list &body body)
|
||||||
|
"Define a shader defining function.
|
||||||
|
The newly created shader will be put in a special package: `%stoe.shaders'."
|
||||||
|
(let ((symbol (intern (symbol-name name) :%stoe.shaders)))
|
||||||
|
`(progn
|
||||||
|
(set ',symbol (%defshader ',lambda-list ',body))
|
||||||
|
',symbol)))
|
||||||
38
src/render/shader/glsl.lisp
Normal file
38
src/render/shader/glsl.lisp
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
#|
|
||||||
|
This file is a part of stoe project.
|
||||||
|
Copyright (c) 2014 Renaud Casenave-Péré (renaud@casenave-pere.fr)
|
||||||
|
|#
|
||||||
|
|
||||||
|
(in-package :cl-user)
|
||||||
|
(defpackage stoe.shader.glsl
|
||||||
|
(:use :cl :utils)
|
||||||
|
(:nicknames :glsl)
|
||||||
|
(:import-from :stoe.shader.walker
|
||||||
|
:defhandler
|
||||||
|
:walk
|
||||||
|
:walk-list
|
||||||
|
:walk-1)
|
||||||
|
(:export :compile))
|
||||||
|
(in-package :stoe.shader.glsl)
|
||||||
|
|
||||||
|
(defvar *form-handlers* (make-hash-table)
|
||||||
|
"Hash table for the form handlers for a glsl dsl.")
|
||||||
|
|
||||||
|
(defvar *current-indent* 0
|
||||||
|
"Keep the number of space needed for the next directive.")
|
||||||
|
|
||||||
|
(defhandler newshader (newshader lambda-list &rest body)
|
||||||
|
(walk-list body))
|
||||||
|
|
||||||
|
(defun default-handler (first &rest rest)
|
||||||
|
"Handle a simple function call."
|
||||||
|
(format nil "~@[~vt~]~(~a~) (~{~a~^, ~});~%"
|
||||||
|
(when (> *current-indent* 0)
|
||||||
|
*current-indent*)
|
||||||
|
(if (symbolp first)
|
||||||
|
first
|
||||||
|
(walk-1 first)) (walk-list rest)))
|
||||||
|
|
||||||
|
(defun glsl-compile (form)
|
||||||
|
(let ((*current-indent* 0))
|
||||||
|
(walk form *form-handlers* #'default-handler)))
|
||||||
5
stoe.asd
5
stoe.asd
|
|
@ -59,7 +59,10 @@
|
||||||
((:file "gl-utils")
|
((:file "gl-utils")
|
||||||
(:module "shader"
|
(:module "shader"
|
||||||
:components
|
:components
|
||||||
((:file "glsl-compiler")
|
((:file "walker")
|
||||||
|
(:file "glsl")
|
||||||
|
(:file "compiler")
|
||||||
|
(:file "glsl-compiler")
|
||||||
(:file "shader")))
|
(:file "shader")))
|
||||||
(:file "mesh")
|
(:file "mesh")
|
||||||
(:file "render")
|
(:file "render")
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue