nvc0_program.h revision a287a758c6567405a7ea10df21e586d1e2ff08ec
1
2#ifndef __NVC0_PROGRAM_H__
3#define __NVC0_PROGRAM_H__
4
5#include "pipe/p_state.h"
6#include "tgsi/tgsi_scan.h"
7
8#define NVC0_CAP_MAX_PROGRAM_TEMPS 64
9
10#define NVC0_SHADER_HEADER_SIZE (20 * 4)
11
12struct nvc0_program {
13   struct pipe_shader_state pipe;
14
15   ubyte type;
16   boolean translated;
17   ubyte max_gpr;
18
19   uint32_t *code;
20   unsigned code_base;
21   unsigned code_size;
22   unsigned parm_size;
23
24   uint32_t hdr[20]; /* TODO: move this into code to save space */
25
26   uint32_t flags[2];
27
28   struct {
29      uint8_t edgeflag;
30      uint8_t num_ucps;
31      uint8_t out_pos[PIPE_MAX_SHADER_OUTPUTS];
32   } vp;
33   struct {
34      uint8_t early_z;
35      uint8_t in_pos[PIPE_MAX_SHADER_INPUTS];
36   } fp;
37
38   void *relocs;
39   unsigned num_relocs;
40
41   struct nouveau_resource *res;
42};
43
44/* first 2 bits are written into the program header, for each input */
45#define NVC0_INTERP_FLAT          (1 << 0)
46#define NVC0_INTERP_PERSPECTIVE   (2 << 0)
47#define NVC0_INTERP_LINEAR        (3 << 0)
48#define NVC0_INTERP_CENTROID      (1 << 2)
49
50/* analyze TGSI and see which TEMP[] are used as subroutine inputs/outputs */
51struct nvc0_subroutine {
52   unsigned id;
53   unsigned first_insn;
54   uint32_t argv[NVC0_CAP_MAX_PROGRAM_TEMPS][4];
55   uint32_t retv[NVC0_CAP_MAX_PROGRAM_TEMPS][4];
56};
57
58struct nvc0_translation_info {
59   struct nvc0_program *prog;
60   struct tgsi_full_instruction *insns;
61   unsigned num_insns;
62   ubyte input_file;
63   ubyte output_file;
64   ubyte fp_depth_output;
65   uint16_t input_loc[PIPE_MAX_SHADER_INPUTS][4];
66   uint16_t output_loc[PIPE_MAX_SHADER_OUTPUTS][4];
67   uint16_t sysval_loc[TGSI_SEMANTIC_COUNT];
68   boolean sysval_in[TGSI_SEMANTIC_COUNT];
69   int input_access[PIPE_MAX_SHADER_INPUTS][4];
70   int output_access[PIPE_MAX_SHADER_OUTPUTS][4];
71   ubyte interp_mode[PIPE_MAX_SHADER_INPUTS];
72   boolean indirect_inputs;
73   boolean indirect_outputs;
74   boolean require_stores;
75   boolean global_stores;
76   uint32_t *immd32;
77   ubyte *immd32_ty;
78   unsigned immd32_nr;
79   ubyte edgeflag_out;
80   struct nvc0_subroutine *subr;
81   unsigned num_subrs;
82   boolean append_ucp;
83   struct tgsi_shader_info scan;
84};
85
86int nvc0_generate_code(struct nvc0_translation_info *);
87
88void nvc0_relocate_program(struct nvc0_program *,
89                           uint32_t code_base, uint32_t data_base);
90
91#endif
92