[Vulkan] Builtin shaders and shaders offline compilation script
[platform/core/uifw/dali-core.git] / dali / graphics / vulkan / scripts / glsl2vk-compile.sh
1 #!/bin/bash
2
3 if [ ! -e 'dali-core' ] ; then
4
5     echo "Error: This script must be executed from the top-level directory where dali-core can be found!"
6     exit 0
7
8 fi
9
10 d=dali-core/dali/graphics/vulkan/shaders
11 outdir=dali-core/dali/graphics/vulkan/generated
12
13 cd $d
14 all_shaders=$(ls -1 *.{vert,frag})
15 cd $OLDPWD
16
17 for name in $all_shaders ; do
18   echo "Compiling $name..."
19   varname=$(echo "SHADER_$name" | tr [a-z] [A-Z] | sed -e 's/-/_/g;s/\./_/g;')  
20   glslangValidator -V1.0 $d/$name --vn $varname -o /tmp/spv.h
21
22   newname=$(echo ${name} | sed -e 's/\./-/;')".h"
23   echo Writing $newname
24
25   cat /tmp/spv.h | sed -e 's/const uint32_t /std::vector<uint32_t> /g;s/\[\]//g;' | tail -n +3 > $outdir/$newname
26   echo >> $outdir/$newname
27 done
28
29 echo "Generating cpp file..."
30 echo "#include <cstdint>" > $outdir/builtin-shader-gen.cpp
31 echo "#include <vector>" >> $outdir/builtin-shader-gen.cpp
32 echo "#include <string>" >> $outdir/builtin-shader-gen.cpp
33 echo -e "#include <map>\n" >> $outdir/builtin-shader-gen.cpp
34
35 varnames=
36 for name in $all_shaders ; do
37     varname=$(echo "SHADER_$name" | tr [a-z] [A-Z] | sed -e 's/-/_/g;s/\./_/g;')
38     newname=$(echo ${name} | sed -e 's/\./-/;')".h"
39     varnames="${varnames} $varname"
40     echo "#include \"$newname\"" >> $outdir/builtin-shader-gen.cpp
41 done
42
43 echo "static std::map<std::string, std::vector<uint32_t>> gGraphicsBuiltinShader = {" >> $outdir/builtin-shader-gen.cpp
44 for var in ${varnames} ; do
45     echo "  { \"$var\", $var }," >> $outdir/builtin-shader-gen.cpp
46 done
47 echo -e "};\n" >> $outdir/builtin-shader-gen.cpp
48
49 # generate graphics shader getter function
50 cat >> $outdir/builtin-shader-gen.cpp << EOF
51 extern "C" {
52
53 #define IMPORT_API __attribute__ ((visibility ("default")))
54
55 IMPORT_API std::vector<uint32_t> GraphicsGetBuiltinShader( const std::string& tag );
56
57 std::vector<uint32_t> GraphicsGetBuiltinShader( const std::string& tag )
58 {
59     auto iter = gGraphicsBuiltinShader.find( tag );
60     if( iter != gGraphicsBuiltinShader.end() )
61     {
62         return iter->second;
63     }
64     return {};
65 }
66
67 }
68 EOF
69
70 echo "Generating extern header file ( for external use )..."
71 echo "#ifndef GRAPHICS_BUILTIN_SHADER_EXTERN_GEN_H" > $outdir/builtin-shader-extern-gen.h
72 echo "#define GRAPHICS_BUILTIN_SHADER_EXTERN_GEN_H" >> $outdir/builtin-shader-extern-gen.h
73 echo "#include <cstdint>" >> $outdir/builtin-shader-extern-gen.h
74 echo "#include <vector>" >> $outdir/builtin-shader-extern-gen.h
75 echo "#include <string>" >> $outdir/builtin-shader-extern-gen.h
76 echo "" >> $outdir/builtin-shader-extern-gen.h
77
78 for name in $all_shaders ; do
79     varname=$(echo "SHADER_$name" | tr [a-z] [A-Z] | sed -e 's/-/_/g;s/\./_/g;')
80     newname=$(echo ${name} | sed -e 's/\./-/;')".h"
81     echo "extern std::vector<uint32_t> $varname;" >> $outdir/builtin-shader-extern-gen.h
82 done
83 cat >> $outdir/builtin-shader-extern-gen.h << EOF
84 extern "C" std::vector<uint32_t> GraphicsGetBuiltinShader( const std::string& tag );
85 #define GraphicsGetBuiltinShaderId( x ) GraphicsGetBuiltinShader( #x )
86 EOF
87 echo "#endif // GRAPHICS_BUILTIN_SHADER_EXTERN_GEN_H" >> $outdir/builtin-shader-extern-gen.h