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:
David Herrmann 2012-08-08 12:13:29 +02:00
parent 2da673ec8f
commit 9fe063e274
3 changed files with 71 additions and 48 deletions

2
.gitignore vendored
View File

@ -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

View File

@ -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

View File

@ -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;
}