nv50: make use of TGSI immediate type
[mesa.git] / src / gallium / drivers / nv50 / nv50_program.h
index 255c7c737ef823da68c39d238a6db51bb6e82df9..639f06217ed94ab55fbc3eb2734bb26068a328f9 100644 (file)
-#ifndef __NV50_PROGRAM_H__
-#define __NV50_PROGRAM_H__
+/*
+ * Copyright 2010 Ben Skeggs
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef __NV50_PROG_H__
+#define __NV50_PROG_H__
 
 #include "pipe/p_state.h"
 #include "tgsi/tgsi_scan.h"
+#include "nouveau/nouveau_class.h"
 
-struct nv50_program_exec {
-       struct nv50_program_exec *next;
-
-       unsigned inst[2];
-       struct {
-               int index;
-               unsigned mask;
-               unsigned shift;
-       } param;
-};
+struct nv50_varying {
+   uint8_t id; /* tgsi index */
+   uint8_t hw; /* hw index, nv50 wants flat FP inputs last */
 
-struct nv50_sreg4 {
-       uint8_t hw;
-       uint8_t id; /* tgsi index, nv50 needs them sorted: flat ones last */
+   uint8_t mask   : 4;
+   uint8_t linear : 1;
+   uint8_t pad    : 3;
 
-       uint8_t mask;
-       boolean linear;
+   ubyte sn; /* semantic name */
+   ubyte si; /* semantic index */
 };
 
 struct nv50_program {
-       struct pipe_shader_state pipe;
-       struct tgsi_shader_info info;
-       boolean translated;
+   struct pipe_shader_state pipe;
 
-       unsigned type;
-       struct nv50_program_exec *exec_head;
-       struct nv50_program_exec *exec_tail;
-       unsigned exec_size;
-       struct nouveau_resource *data[1];
-       unsigned data_start[1];
+   ubyte type;
+   boolean translated;
 
-       struct nouveau_bo *bo;
+   struct nouveau_bo *bo;
+   struct nouveau_stateobj *so;
 
-       float *immd;
-       unsigned immd_nr;
-       unsigned param_nr;
+   uint32_t *code;
+   unsigned code_size;
+   unsigned code_start; /* offset inside bo */
+   uint32_t *immd;
+   unsigned immd_size;
+   unsigned parm_size; /* size limit of uniform buffer */
 
-       struct {
-               unsigned high_temp;
-               unsigned high_result;
+   ubyte max_gpr; /* REG_ALLOC_TEMP */
+   ubyte max_out; /* REG_ALLOC_RESULT or FP_RESULT_COUNT */
 
-               uint32_t attr[2];
-               uint32_t regs[4];
+   ubyte in_nr;
+   ubyte out_nr;
+   struct nv50_varying in[16];
+   struct nv50_varying out[16];
 
-               /* for VPs, io_nr doesn't count 'private' results (PSIZ etc.) */
-               unsigned io_nr;
-               struct nv50_sreg4 io[PIPE_MAX_SHADER_OUTPUTS];
+   struct {
+      uint32_t attrs[3]; /* VP_ATTR_EN_0,1 and VP_GP_BUILTIN_ATTR_EN */
+      ubyte psiz;
+      ubyte bfc[2];
+      ubyte edgeflag;
+      ubyte clpd;
+      ubyte clpd_nr;
+   } vp;
 
-               /* FP colour inputs, VP/GP back colour outputs */
-               struct nv50_sreg4 two_side[2];
+   struct {
+      uint32_t flags[2]; /* 0x19a8, 196c */
+      uint32_t interp; /* 0x1988 */
+      uint32_t colors; /* 0x1904 */
+   } fp;
 
-               /* VP only */
-               uint8_t clpd, clpd_nr;
-               uint8_t psiz;
-       } cfg;
+   struct {
+      ubyte primid; /* primitive id output register */
+      uint8_t vert_count;
+      uint8_t prim_type; /* point, line strip or tri strip */
+   } gp;
+
+   void *fixups;
+   unsigned num_fixups;
 };
 
-#endif
+#define NV50_INTERP_LINEAR   (1 << 0)
+#define NV50_INTERP_FLAT     (1 << 1)
+#define NV50_INTERP_CENTROID (1 << 2)
+
+#define NV50_PROG_MAX_SUBROUTINES 8
+
+/* analyze TGSI and see which TEMP[] are used as subroutine inputs/outputs */
+struct nv50_subroutine {
+   int id;
+   uint32_t argv[4][1]; /* 4 bitmasks, for each of xyzw, only allow 32 TEMPs */
+   uint32_t retv[4][1];
+};
+
+struct nv50_translation_info {
+   struct nv50_program *p;
+   unsigned inst_nr;
+   ubyte input_file;
+   ubyte output_file;
+   ubyte input_map[PIPE_MAX_SHADER_INPUTS][4];
+   ubyte output_map[PIPE_MAX_SHADER_OUTPUTS][4];
+   ubyte interp_mode[PIPE_MAX_SHADER_INPUTS];
+   int input_access[PIPE_MAX_SHADER_INPUTS][4];
+   int output_access[PIPE_MAX_SHADER_OUTPUTS][4];
+   boolean indirect_inputs;
+   boolean indirect_outputs;
+   struct tgsi_shader_info scan;
+   uint32_t *immd32;
+   unsigned immd32_nr;
+   ubyte *immd32_ty;
+   ubyte edgeflag_out;
+   struct nv50_subroutine subr[NV50_PROG_MAX_SUBROUTINES];
+   int subr_nr;
+};
+
+int nv50_generate_code(struct nv50_translation_info *ti);
+boolean nv50_program_tx(struct nv50_program *p);
+
+#endif /* __NV50_PROG_H__ */