-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathpack_shaders.cpp
87 lines (66 loc) · 2.13 KB
/
pack_shaders.cpp
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <stdio.h>
#include <vector>
const char* s_files[] =
{
"common/rand_init.spv",
"common/vert_srgb.spv",
"common/frag_srgb.spv",
"common/miss.spv",
"common/miss_tex_sky.spv",
"geometry/closesthit_colored_indexed_triangle_lists.spv",
"geometry/intersection_unit_spheres.spv",
"geometry/closesthit_colored_unit_spheres.spv",
"geometry/closesthit_unit_spheres_checker_tex.spv",
"geometry/closesthit_textured_triangle_lists.spv",
"geometry/closesthit_textured_unit_spheres.spv",
"geometry/closesthit_sphere_lights.spv",
"geometry/closesthit_wavefront_indexed_triangle_lists.spv",
"path_tracer/raygen.spv",
"path_tracer/final.spv"
};
int main()
{
int num_files = (int)sizeof(s_files) / (int)sizeof(const char*);
FILE *fp = fopen("shaders_packed.hpp", "w");
fputs("/* This file is generated by pack_shaders.cpp */ \n", fp);
std::vector<int> sizes(num_files);
for (int i = 0; i < num_files; i++)
{
fprintf(fp, "static char s_filename_%d[]=\"%s\";\n", i, s_files[i]);
char fn[1024];
sprintf(fn, "shaders/%s", s_files[i]);
FILE *fheader = fopen(fn, "rb");
fseek(fheader, 0, SEEK_END);
size_t size = (size_t)ftell(fheader);
fseek(fheader, 0, SEEK_SET);
std::vector<char> buf((size + 3)&(~3));
fread(buf.data(), 1, size, fheader);
fclose(fheader);
sizes[i] = (int)size;
size_t num_dwords = buf.size() >> 2;
unsigned *dwords = (unsigned*)buf.data();
fprintf(fp, "static unsigned s_file_content_%d[]={\n", i);
for (size_t j = 0; j < num_dwords; j++)
{
fprintf(fp, "0x%x,", dwords[j]);
if (j % 10 == 9)
fputs("\n", fp);
}
fputs("};\n\n", fp);
}
fprintf(fp, "static int s_num_shaders = %d;\n", num_files);
fputs("static int s_size_shaders[] = {\n", fp);
for (int i = 0; i < num_files; i++)
fprintf(fp, "%d,\n", sizes[i]);
fputs("};\n\n", fp);
fputs("static const char* s_name_shaders[] = {\n", fp);
for (int i = 0; i < num_files; i++)
fprintf(fp, "s_filename_%d,\n", i);
fputs("};\n\n", fp);
fputs("static const char* s_content_shaders[] = {\n", fp);
for (int i = 0; i < num_files; i++)
fprintf(fp, "(char*)s_file_content_%d,\n", i);
fputs("};\n\n", fp);
fclose(fp);
return 0;
}