quakeforge/tools/qfcc/include/glsl-lang.h
Bill Currie c58748d640 [qfcc] Implement many glsl qualifiers as attributes
Attributes seem appropriate as GLSL's qualifiers affect variables rather
than types (since there's no typedef).

Not much is done with the attributes yet other than some basic error
checking (duplicates of non-layout attributes) and debug output, but
most (if not all) declarations get to the declaration code with
attributes intact.
2024-09-09 20:01:06 +09:00

104 lines
3 KiB
C

/*
glsl-lang.h
Shared stuff for glsl
Copyright (C) 2024 Bill Currie <bill@taniwha.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to:
Free Software Foundation, Inc.
59 Temple Place - Suite 330
Boston, MA 02111-1307, USA
*/
#ifndef __glsl_lang_h
#define __glsl_lang_h
typedef struct specifier_s specifier_t;
typedef struct attribute_s attribute_t;
typedef struct expr_s expr_t;
typedef struct type_s type_t;
typedef struct symbol_s symbol_t;
typedef struct symtab_s symtab_t;
typedef struct language_s language_t;
void glsl_init_comp (void);
void glsl_init_vert (void);
void glsl_init_tesc (void);
void glsl_init_tese (void);
void glsl_init_geom (void);
void glsl_init_frag (void);
int glsl_parse_string (const char *str);
extern language_t lang_glsl_comp;
extern language_t lang_glsl_vert;
extern language_t lang_glsl_tesc;
extern language_t lang_glsl_tese;
extern language_t lang_glsl_geom;
extern language_t lang_glsl_frag;
typedef enum glsl_interface_e : unsigned {
glsl_in,
glsl_out,
glsl_uniform,
glsl_buffer,
glsl_shared,
glsl_num_interfaces
} glsl_interface_t;
#define glsl_iftype_from_sc(sc) ((glsl_interface_t)((sc) - sc_in))
#define glsl_sc_from_iftype(it) (((storage_class_t)(it)) + sc_in)
extern const char *glsl_interface_names[glsl_num_interfaces];
typedef struct glsl_block_s {
struct glsl_block_s *next;
const char *name;
attribute_t *attributes;
symtab_t *members;
symbol_t *instance_name;
} glsl_block_t;
typedef struct glsl_sublang_s {
const char *name;
const char **interface_default_names;
} glsl_sublang_t;
#define glsl_sublang (*(glsl_sublang_t *) current_language.sublanguage)
extern glsl_sublang_t glsl_comp_sublanguage;
extern glsl_sublang_t glsl_vert_sublanguage;
extern glsl_sublang_t glsl_tesc_sublanguage;
extern glsl_sublang_t glsl_tese_sublanguage;
extern glsl_sublang_t glsl_geom_sublanguage;
extern glsl_sublang_t glsl_frag_sublanguage;
void glsl_block_clear (void);
void glsl_declare_block (specifier_t spec, symbol_t *block_sym,
symbol_t *instance_name);
glsl_block_t *glsl_get_block (const char *name, glsl_interface_t interface);
symtab_t *glsl_optimize_attributes (attribute_t *attributes);
void glsl_parse_declaration (specifier_t spec,
symbol_t *sym, const type_t *array,
const expr_t *init, symtab_t *symtab);
void glsl_declare_field (specifier_t spec, symtab_t *symtab);
bool glsl_on_include (const char *name);
void glsl_include (int behavior, void *scanner);
void glsl_multiview (int behavior, void *scanner);
#endif//__glsl_lang_h