*/
%code requires {
-
-#define MAX_BUFS 4
-
-struct ir3_kernel_info {
- uint32_t local_size[3];
- uint32_t num_bufs;
- uint32_t buf_sizes[MAX_BUFS]; /* size in dwords */
-
- /* driver-param uniforms: */
- unsigned numwg;
-};
+#include "ir3/ir3_assembler.h"
struct ir3 * ir3_parse(struct ir3_shader_variant *v,
struct ir3_kernel_info *k, FILE *f);
static void new_shader(void)
{
- variant->ir = ir3_create(variant->shader->compiler, variant->shader->type);
+ variant->ir = ir3_create(variant->shader->compiler, variant);
block = ir3_block_create(variant->ir);
list_addtail(&block->node, &variant->ir->block_list);
}
static void add_const(unsigned reg, unsigned c0, unsigned c1, unsigned c2, unsigned c3)
{
- struct ir3_const_state *const_state = &variant->shader->const_state;
+ struct ir3_const_state *const_state = ir3_const_state(variant);
assert((reg & 0x7) == 0);
int idx = reg >> (1 + 2); /* low bit is half vs full, next two bits are swiz */
if (const_state->immediate_idx == const_state->immediates_size * 4) {
+ const_state->immediates = rerzalloc(const_state,
+ const_state->immediates,
+ __typeof__(const_state->immediates[0]),
+ const_state->immediates_size,
+ const_state->immediates_size + 4);
const_state->immediates_size += 4;
- const_state->immediates = realloc (const_state->immediates,
- const_state->immediates_size * sizeof(const_state->immediates[0]));
}
const_state->immediates[idx].val[0] = c0;
const_state->immediates[idx].val[1] = c1;
extern int yylex(void);
extern FILE *ir3_yyin;
+void ir3_yyset_lineno(int _line_number);
int yyparse(void);
struct ir3 * ir3_parse(struct ir3_shader_variant *v,
struct ir3_kernel_info *k, FILE *f)
{
+ ir3_yyset_lineno(1);
ir3_yyin = f;
#ifdef YYDEBUG
yydebug = 1;
%token <tok> T_A_INVOCATIONID
%token <tok> T_A_WGID
%token <tok> T_A_NUMWG
+%token <tok> T_A_IN
+%token <tok> T_A_OUT
+%token <tok> T_A_TEX
/* todo, re-add @sampler/@uniform/@varying if needed someday */
/* src register flags */
| invocationid_header
| wgid_header
| numwg_header
+| in_header
+| out_header
+| tex_header
const_val: T_FLOAT { $$ = fui($1); }
| T_INT { $$ = $1; }
add_const($3, 0, 0, 0, 0);
}
+/* Stubs for now */
+in_header: T_A_IN '(' T_REGISTER ')' T_IDENTIFIER '(' T_IDENTIFIER '=' integer ')' { }
+
+out_header: T_A_OUT '(' T_REGISTER ')' T_IDENTIFIER '(' T_IDENTIFIER '=' integer ')' { }
+
+tex_header: T_A_TEX '(' T_REGISTER ')'
+ T_IDENTIFIER '=' integer ',' /* src */
+ T_IDENTIFIER '=' integer ',' /* samp */
+ T_IDENTIFIER '=' integer ',' /* tex */
+ T_IDENTIFIER '=' integer ',' /* wrmask */
+ T_IDENTIFIER '=' integer /* cmd */ { }
+
iflag: T_SY { iflags.flags |= IR3_INSTR_SY; }
| T_SS { iflags.flags |= IR3_INSTR_SS; }
| T_JP { iflags.flags |= IR3_INSTR_JP; }
cat0_immed: '#' integer { instr->cat0.immed = $2; }
cat0_instr: T_OP_NOP { new_instr(OPC_NOP); }
-| T_OP_BR { new_instr(OPC_BR); } cat0_src ',' cat0_immed
+| T_OP_BR { new_instr(OPC_B); } cat0_src ',' cat0_immed
| T_OP_JUMP { new_instr(OPC_JUMP); } cat0_immed
| T_OP_CALL { new_instr(OPC_CALL); } cat0_immed
| T_OP_RET { new_instr(OPC_RET); }