genshader: make shader generation more flexible
The genshader program now takes all input shaders as arguments so we can easily add new shaders. We also name the constants after the shader file to be as flexible as possible. This also moves the generated shaders into the static-kmscon library. The linker will strip unused symbols, anyway, so we aren't loosing anything here. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
parent
2da673ec8f
commit
9fe063e274
2
.gitignore
vendored
2
.gitignore
vendored
@ -23,7 +23,7 @@ stamp-*
|
||||
.dirstamp
|
||||
.libs
|
||||
genshader
|
||||
src/output_shaders.c
|
||||
src/static_shaders.c
|
||||
src/genshader.c
|
||||
docs/reference/*.txt
|
||||
docs/reference/*.bak
|
||||
|
22
Makefile.am
22
Makefile.am
@ -82,24 +82,22 @@ endif
|
||||
# pretty simple and just creates a string with the shader source as content.
|
||||
#
|
||||
|
||||
EXTRA_DIST += \
|
||||
SHADERS = \
|
||||
src/output_shader_def.vert \
|
||||
src/output_shader_def.frag \
|
||||
src/output_shader_tex.vert \
|
||||
src/output_shader_tex.frag
|
||||
|
||||
EXTRA_DIST += \
|
||||
$(SHADERS)
|
||||
CLEANFILES += \
|
||||
src/output_shaders.c
|
||||
src/static_shaders.c
|
||||
|
||||
nodist_genshader_SOURCES = \
|
||||
src/genshader.c
|
||||
|
||||
src/output_shaders.c: \
|
||||
src/output_shader_def.vert \
|
||||
src/output_shader_def.frag \
|
||||
src/output_shader_tex.vert \
|
||||
src/output_shader_tex.frag \
|
||||
genshader$(EXEEXT)
|
||||
./genshader$(EXEEXT)
|
||||
src/static_shaders.c: $(SHADERS) genshader$(EXEEXT)
|
||||
./genshader$(EXEEXT) src/static_shaders.c $(SHADERS)
|
||||
|
||||
#
|
||||
# libkmscon-core
|
||||
@ -108,9 +106,6 @@ src/output_shaders.c: \
|
||||
# Only "main.c" is not included here as it contains the main() function.
|
||||
#
|
||||
|
||||
nodist_libkmscon_core_la_SOURCES = \
|
||||
src/output_shaders.c
|
||||
|
||||
libkmscon_core_la_SOURCES = \
|
||||
src/conf.c src/conf.h \
|
||||
src/ui.c src/ui.h \
|
||||
@ -263,6 +258,9 @@ libkmscon_static_la_SOURCES = \
|
||||
external/htable.h \
|
||||
external/htable.c
|
||||
|
||||
nodist_libkmscon_static_la_SOURCES = \
|
||||
src/static_shaders.c
|
||||
|
||||
#
|
||||
# Binaries
|
||||
# These are the sources for the main binaries and test programs. They mostly
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* kmscon - Generate Shader Files
|
||||
*
|
||||
* Copyright (c) 2011 David Herrmann <dh.herrmann@googlemail.com>
|
||||
* Copyright (c) 2011-2012 David Herrmann <dh.herrmann@googlemail.com>
|
||||
* Copyright (c) 2011 University of Tuebingen
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
@ -26,12 +26,13 @@
|
||||
|
||||
/*
|
||||
* Shader Generator
|
||||
* This takes as arguments two shaders and creates a C-source file which
|
||||
* This takes as arguments shaders and creates a C-source file which
|
||||
* contains these shaders as constants.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static char *read_file(const char *path, size_t *size)
|
||||
{
|
||||
@ -81,6 +82,17 @@ static char *read_file(const char *path, size_t *size)
|
||||
return buf;
|
||||
}
|
||||
|
||||
static const char *get_basename(const char *path)
|
||||
{
|
||||
const char *res;
|
||||
|
||||
res = strrchr(path, '/');
|
||||
if (!res || !*++res)
|
||||
return path;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void write_seq(FILE *out, const char *src, size_t len)
|
||||
{
|
||||
size_t i;
|
||||
@ -96,54 +108,67 @@ static void write_seq(FILE *out, const char *src, size_t len)
|
||||
}
|
||||
}
|
||||
|
||||
static void write_file(const char *path, const char *vs, size_t l1,
|
||||
const char *fs, size_t l2, const char *tvs, size_t l3,
|
||||
const char *tfs, size_t l4)
|
||||
static void write_name(FILE *out, const char *name)
|
||||
{
|
||||
FILE *out;
|
||||
static const char c1[] = "/* This file is generated by genshader.c */\n"
|
||||
"const char *kmscon_vert_def = \"";
|
||||
static const char c2[] = "\";\nconst char *kmscon_frag_def = \"";
|
||||
static const char c3[] = "\";\nconst char *kmscon_vert_tex = \"";
|
||||
static const char c4[] = "\";\nconst char *kmscon_frag_tex = \"";
|
||||
static const char c5[] = "\";";
|
||||
size_t i, len;
|
||||
|
||||
out = fopen(path, "wb");
|
||||
if (!out) {
|
||||
fprintf(stderr, "genshader: cannot open %s: %m\n", path);
|
||||
abort();
|
||||
len = strlen(name);
|
||||
for (i = 0; i < len; ++i) {
|
||||
if ((name[i] >= 'A' && name[i] <= 'Z') ||
|
||||
(name[i] >= 'a' && name[i] <= 'z') ||
|
||||
(name[i] >= '0' && name[i] <= '9'))
|
||||
fwrite(&name[i], 1, 1, out);
|
||||
else
|
||||
fwrite("_", 1, 1, out);
|
||||
}
|
||||
}
|
||||
|
||||
static void write_single_file(FILE *out, const char *path)
|
||||
{
|
||||
static const char c1[] = "const char *gl_";
|
||||
static const char c2[] = " = \"";
|
||||
static const char c3[] = "\";\n";
|
||||
const char *name;
|
||||
char *content;
|
||||
size_t len;
|
||||
|
||||
name = get_basename(path);
|
||||
content = read_file(path, &len);
|
||||
|
||||
fwrite(c1, sizeof(c1) - 1, 1, out);
|
||||
write_seq(out, vs, l1);
|
||||
write_name(out, name);
|
||||
fwrite(c2, sizeof(c2) - 1, 1, out);
|
||||
write_seq(out, fs, l2);
|
||||
write_seq(out, content, len);
|
||||
fwrite(c3, sizeof(c3) - 1, 1, out);
|
||||
write_seq(out, tvs, l3);
|
||||
fwrite(c4, sizeof(c4) - 1, 1, out);
|
||||
write_seq(out, tfs, l4);
|
||||
fwrite(c5, sizeof(c5) - 1, 1, out);
|
||||
|
||||
fclose(out);
|
||||
free(content);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
char *def_vert, *def_frag, *tex_vert, *tex_frag;
|
||||
size_t vs, fs, tvs, tfs;
|
||||
FILE *out;
|
||||
size_t i;
|
||||
static const char c0[] = "/* This file was generated "
|
||||
"by genshader.c */\n";
|
||||
|
||||
def_vert = read_file("@abs_srcdir@/output_shader_def.vert", &vs);
|
||||
def_frag = read_file("@abs_srcdir@/output_shader_def.frag", &fs);
|
||||
tex_vert = read_file("@abs_srcdir@/output_shader_tex.vert", &tvs);
|
||||
tex_frag = read_file("@abs_srcdir@/output_shader_tex.frag", &tfs);
|
||||
if (argc < 2) {
|
||||
fprintf(stderr, "genshader: use ./genshader <outputfile> [<shader-files> ...]\n");
|
||||
abort();
|
||||
}
|
||||
|
||||
write_file("@abs_builddir@/output_shaders.c", def_vert, vs,
|
||||
def_frag, fs, tex_vert, tvs, tex_frag, tfs);
|
||||
out = fopen(argv[1], "wb");
|
||||
if (!out) {
|
||||
fprintf(stderr, "genshader: cannot open %s: %m\n", argv[1]);
|
||||
abort();
|
||||
}
|
||||
|
||||
free(tex_vert);
|
||||
free(tex_frag);
|
||||
free(def_vert);
|
||||
free(def_frag);
|
||||
fwrite(c0, sizeof(c0) - 1, 1, out);
|
||||
for (i = 2; i < argc; ++i) {
|
||||
fprintf(stderr, "genshader: parsing shader %s\n", argv[i]);
|
||||
write_single_file(out, argv[i]);
|
||||
}
|
||||
|
||||
fclose(out);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user