summaryrefslogtreecommitdiff
path: root/glsl.jam
blob: c9ba82aabab551093814d776a38e9de3cc1e33ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import type : register ;
import type : type ;
import generators : register-standard ;
import scanner : register ;

type.register GL_VERTEX_SHADER : vert ;
type.register GL_TESS_CONTROL_SHADER : tesc ;
type.register GL_TESS_EVALUATION_SHADER : tese ;
type.register GL_GEOMETRY_SHADER : geom ;
type.register GL_FRAGMENT_SHADER : frag ;
type.register GL_GENERIC_SHADER : glsl ;

generators.register-standard glsl.embed : GL_VERTEX_SHADER : CPP(%-vert) H(%-vert) GL_GENERIC_SHADER(%-vert) ;
generators.register-standard glsl.embed : GL_TESS_CONTROL_SHADER : CPP(%-tesc) H(%-tesc) GL_GENERIC_SHADER(%-tesc) ;
generators.register-standard glsl.embed : GL_TESS_EVALUATION_SHADER : CPP(%-tese) H(%-tese) GL_GENERIC_SHADER(%-tese) ;
generators.register-standard glsl.embed : GL_GEOMETRY_SHADER : CPP(%-geom) H(%-geom) GL_GENERIC_SHADER(%-geom) ;
generators.register-standard glsl.embed : GL_FRAGMENT_SHADER : CPP(%-frag) H(%-frag) GL_GENERIC_SHADER(%-frag) ;

class m4-scanner : common-scanner {
    rule pattern ( ) {
        return "s?include\\(`([^']*)'\\)" ;
    }
}

scanner.register m4-scanner : include ;

type.set-scanner GL_VERTEX_SHADER : m4-scanner ;
type.set-scanner GL_TESS_CONTROL_SHADER : m4-scanner ;
type.set-scanner GL_TESS_EVALUATION_SHADER : m4-scanner ;
type.set-scanner GL_GEOMETRY_SHADER : m4-scanner ;
type.set-scanner GL_FRAGMENT_SHADER : m4-scanner ;
type.set-scanner GL_GENERIC_SHADER : m4-scanner ;

actions glsl.embed
{
	set -e
	m4 -I$(2:D) -DSOURCE=$(2) -DOUTPUT=$(1[3]) -DNAME=$(2:B) -DTYPE=$(2:S) -DGLTYPE=$(OPTIONS) $(2) > $(1[3])$(2:S)
	glslangValidator -l $(1[3])$(2:S)
	mv $(1[3])$(2:S) $(1[3])
	clang-format -i $(1[3])
	m4 -I$(2:D) -DSOURCE=$(1[3]) -DOUTPUT=$(1[3]) -DNAME=$(2:B) -DTYPE=$(2:S) -DGLTYPE=$(OPTIONS) lib/embed-glsl.h.m4 > $(1[2])
	m4 -I$(2:D) -DSOURCE=$(1[3]) -DOUTPUT=$(1[3]) -DNAME=$(2:B) -DTYPE=$(2:S) -DGLTYPE=$(OPTIONS) lib/embed-glsl.cpp.m4 > $(1[1])
	clang-format -i $(1[1]) $(1[2])
}

rule glsl.embed ( targets * : sources * : properties * )
{
	NOUPDATE $(targets[2]) ;
	DEPENDS $(targets[2]) : lib/embed-glsl.h.m4 ;
	DEPENDS $(targets[1]) $(targets[3]) : lib/embed-glsl.cpp.m4 ;
	OPTIONS on $(targets) = [ type.type $(sources) ] ;
}