int st_glsl_type_size(const struct glsl_type *type);
static nir_shader *
-load_glsl(const char *filename, gl_shader_stage stage)
+load_glsl(unsigned num_files, char* const* files, gl_shader_stage stage)
{
static const struct standalone_options options = {
.glsl_version = 140,
};
struct gl_shader_program *prog;
- prog = standalone_compile_shader(&options, 1, (char * const*)&filename);
+ prog = standalone_compile_shader(&options, num_files, files);
if (!prog)
- errx(1, "couldn't parse `%s'", filename);
+ errx(1, "couldn't parse `%s'", files[0]);
nir_shader *nir = glsl_to_nir(prog, stage, ir3_get_compiler_options());
static void print_usage(void)
{
- printf("Usage: ir3_compiler [OPTIONS]... <file.tgsi | file.vert | file.frag>\n");
+ printf("Usage: ir3_compiler [OPTIONS]... <file.tgsi | (file.vert | file.frag)*>\n");
printf(" --verbose - verbose compiler/debug messages\n");
printf(" --binning-pass - generate binning pass shader (VERT)\n");
printf(" --color-two-side - emulate two-sided color (FRAG)\n");
int main(int argc, char **argv)
{
int ret = 0, n = 1;
- const char *filename;
+ char *filenames[2];
+ int num_files = 0;
+ unsigned stage = 0;
struct ir3_shader_variant v;
struct ir3_shader s;
struct ir3_shader_key key = {};
}
debug_printf("\n");
- filename = argv[n];
+ while (n < argc) {
+ char *filename = argv[n];
+ char *ext = rindex(filename, '.');
+
+ if (strcmp(ext, ".tgsi") == 0) {
+ if (num_files != 0)
+ errx(1, "in TGSI mode, only a single file may be specified");
+ s.from_tgsi = true;
+ } else if (strcmp(ext, ".frag") == 0) {
+ if (s.from_tgsi)
+ errx(1, "cannot mix GLSL and TGSI");
+ if (num_files >= ARRAY_SIZE(filenames))
+ errx(1, "too many GLSL files");
+ stage = MESA_SHADER_FRAGMENT;
+ } else if (strcmp(ext, ".vert") == 0) {
+ if (s.from_tgsi)
+ errx(1, "cannot mix GLSL and TGSI");
+ if (num_files >= ARRAY_SIZE(filenames))
+ errx(1, "too many GLSL files");
+ stage = MESA_SHADER_VERTEX;
+ } else {
+ print_usage();
+ return -1;
+ }
- ret = read_file(filename, &ptr, &size);
- if (ret) {
- print_usage();
- return ret;
- }
+ filenames[num_files++] = filename;
- if (fd_mesa_debug & FD_DBG_OPTMSGS)
- debug_printf("%s\n", (char *)ptr);
+ n++;
+ }
nir_shader *nir;
- char *ext = rindex(filename, '.');
-
- if (strcmp(ext, ".tgsi") == 0) {
+ if (s.from_tgsi) {
struct tgsi_token toks[65536];
+ ret = read_file(filenames[0], &ptr, &size);
+ if (ret) {
+ print_usage();
+ return ret;
+ }
+
+ if (fd_mesa_debug & FD_DBG_OPTMSGS)
+ debug_printf("%s\n", (char *)ptr);
+
if (!tgsi_text_translate(ptr, toks, ARRAY_SIZE(toks)))
- errx(1, "could not parse `%s'", filename);
+ errx(1, "could not parse `%s'", filenames[0]);
if (fd_mesa_debug & FD_DBG_OPTMSGS)
tgsi_dump(toks, 0);
nir = ir3_tgsi_to_nir(toks);
- s.from_tgsi = true;
- } else if (strcmp(ext, ".frag") == 0) {
- nir = load_glsl(filename, MESA_SHADER_FRAGMENT);
- s.from_tgsi = false;
- } else if (strcmp(ext, ".vert") == 0) {
- nir = load_glsl(filename, MESA_SHADER_FRAGMENT);
- s.from_tgsi = false;
+ } else if (num_files > 0) {
+ nir = load_glsl(num_files, filenames, stage);
} else {
print_usage();
return -1;