prog_print.c revision 2237d136cd8f964048a4ccdc87e0ffb48af0f73d
100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/*
200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Mesa 3-D graphics library
3f4361540f8dd3016571523863b33481cba7a0c07Brian Paul * Version:  7.3
400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian *
5f4361540f8dd3016571523863b33481cba7a0c07Brian Paul * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian *
800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Permission is hereby granted, free of charge, to any person obtaining a
900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * copy of this software and associated documentation files (the "Software"),
1000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * to deal in the Software without restriction, including without limitation
1100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * and/or sell copies of the Software, and to permit persons to whom the
1300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Software is furnished to do so, subject to the following conditions:
1400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian *
1500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * The above copyright notice and this permission notice shall be included
1600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * in all copies or substantial portions of the Software.
1700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian *
1800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
2100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
2300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */
2500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
2600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/**
2700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \file prog_print.c
2800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Print vertex/fragment programs - for debugging.
2900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \author Brian Paul
3000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */
3100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
32bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/glheader.h"
33bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/context.h"
34bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/imports.h"
3500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_instruction.h"
3600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_parameter.h"
3700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_print.h"
3800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_statevars.h"
3900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
4000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
41501ee87180047dd04afc69103c31e1eae5374bf1Brian
4200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/**
4300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Return string name for given program/register file.
4400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */
4500cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic const char *
46b4026d9be828bd0b6f60158456edf24994efb053Brian Paulfile_string(gl_register_file f, gl_prog_print_mode mode)
4700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
4800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   switch (f) {
4900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case PROGRAM_TEMPORARY:
5000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "TEMP";
5100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case PROGRAM_LOCAL_PARAM:
5200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "LOCAL";
5300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case PROGRAM_ENV_PARAM:
5400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "ENV";
5500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case PROGRAM_STATE_VAR:
5600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "STATE";
5700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case PROGRAM_INPUT:
5800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "INPUT";
5900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case PROGRAM_OUTPUT:
6000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "OUTPUT";
6100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case PROGRAM_NAMED_PARAM:
6200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "NAMED";
6300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case PROGRAM_CONSTANT:
6400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "CONST";
6500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case PROGRAM_UNIFORM:
6600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "UNIFORM";
6700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case PROGRAM_VARYING:
6800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "VARYING";
6900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case PROGRAM_WRITE_ONLY:
7000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "WRITE_ONLY";
7100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case PROGRAM_ADDRESS:
7200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "ADDR";
73b2ab693d68f2ba1358b9c3f8bab53b9ebfb586feBrian   case PROGRAM_SAMPLER:
74b2ab693d68f2ba1358b9c3f8bab53b9ebfb586feBrian      return "SAMPLER";
75bc7d2c4f51c56787b261e6ab6f9a77d39c3493e1Brian Paul   case PROGRAM_UNDEFINED:
76bc7d2c4f51c56787b261e6ab6f9a77d39c3493e1Brian Paul      return "UNDEFINED";
7700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   default:
787c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul      {
797c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul         static char s[20];
807c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul         _mesa_snprintf(s, sizeof(s), "FILE%u", f);
817c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul         return s;
827c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul      }
8300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
8400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
8500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
8600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
8700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/**
88501ee87180047dd04afc69103c31e1eae5374bf1Brian * Return ARB_v/f_prog-style input attrib string.
89501ee87180047dd04afc69103c31e1eae5374bf1Brian */
90501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic const char *
91501ee87180047dd04afc69103c31e1eae5374bf1Brianarb_input_attrib_string(GLint index, GLenum progType)
92501ee87180047dd04afc69103c31e1eae5374bf1Brian{
93a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul   /*
94a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul    * These strings should match the VERT_ATTRIB_x and FRAG_ATTRIB_x tokens.
95a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul    */
96501ee87180047dd04afc69103c31e1eae5374bf1Brian   const char *vertAttribs[] = {
97501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.position",
98501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.weight",
99501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.normal",
100501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.color.primary",
101501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.color.secondary",
102501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.fogcoord",
103501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.(six)",
104501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.(seven)",
105501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.texcoord[0]",
106501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.texcoord[1]",
107501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.texcoord[2]",
108501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.texcoord[3]",
109501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.texcoord[4]",
110501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.texcoord[5]",
111501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.texcoord[6]",
112d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.texcoord[7]",
113d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[0]",
114d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[1]",
115d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[2]",
116d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[3]",
117d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[4]",
118d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[5]",
119d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[6]",
120d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[7]",
121d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[8]",
122d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[9]",
123d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[10]",
124d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[11]",
125d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[12]",
126d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[13]",
127d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[14]",
128d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[15]"
129501ee87180047dd04afc69103c31e1eae5374bf1Brian   };
130501ee87180047dd04afc69103c31e1eae5374bf1Brian   const char *fragAttribs[] = {
131501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.position",
132501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.color.primary",
133501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.color.secondary",
134501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.fogcoord",
135501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[0]",
136501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[1]",
137501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[2]",
138501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[3]",
139501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[4]",
140501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[5]",
141501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[6]",
142501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[7]",
143501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[0]",
144501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[1]",
145501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[2]",
146501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[3]",
147501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[4]",
148501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[5]",
149501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[6]",
150501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[7]"
151501ee87180047dd04afc69103c31e1eae5374bf1Brian   };
152501ee87180047dd04afc69103c31e1eae5374bf1Brian
153501ee87180047dd04afc69103c31e1eae5374bf1Brian   if (progType == GL_VERTEX_PROGRAM_ARB) {
154501ee87180047dd04afc69103c31e1eae5374bf1Brian      assert(index < sizeof(vertAttribs) / sizeof(vertAttribs[0]));
155501ee87180047dd04afc69103c31e1eae5374bf1Brian      return vertAttribs[index];
156501ee87180047dd04afc69103c31e1eae5374bf1Brian   }
157501ee87180047dd04afc69103c31e1eae5374bf1Brian   else {
158501ee87180047dd04afc69103c31e1eae5374bf1Brian      assert(index < sizeof(fragAttribs) / sizeof(fragAttribs[0]));
159501ee87180047dd04afc69103c31e1eae5374bf1Brian      return fragAttribs[index];
160501ee87180047dd04afc69103c31e1eae5374bf1Brian   }
161501ee87180047dd04afc69103c31e1eae5374bf1Brian}
162501ee87180047dd04afc69103c31e1eae5374bf1Brian
163501ee87180047dd04afc69103c31e1eae5374bf1Brian
164501ee87180047dd04afc69103c31e1eae5374bf1Brian/**
165501ee87180047dd04afc69103c31e1eae5374bf1Brian * Return ARB_v/f_prog-style output attrib string.
166501ee87180047dd04afc69103c31e1eae5374bf1Brian */
167501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic const char *
168501ee87180047dd04afc69103c31e1eae5374bf1Brianarb_output_attrib_string(GLint index, GLenum progType)
169501ee87180047dd04afc69103c31e1eae5374bf1Brian{
170a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul   /*
171a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul    * These strings should match the VERT_RESULT_x and FRAG_RESULT_x tokens.
172a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul    */
173501ee87180047dd04afc69103c31e1eae5374bf1Brian   const char *vertResults[] = {
174501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.position",
175501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.color.primary",
176501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.color.secondary",
177501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.fogcoord",
178501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[0]",
179501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[1]",
180501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[2]",
181501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[3]",
182501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[4]",
183501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[5]",
184501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[6]",
185501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[7]",
186501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[0]",
187501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[1]",
188501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[2]",
189501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[3]",
190501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[4]",
191501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[5]",
192501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[6]",
193501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[7]"
194501ee87180047dd04afc69103c31e1eae5374bf1Brian   };
195501ee87180047dd04afc69103c31e1eae5374bf1Brian   const char *fragResults[] = {
196501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.color",
197a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul      "result.color(half)",
198a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul      "result.depth",
199a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul      "result.color[0]",
200a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul      "result.color[1]",
201a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul      "result.color[2]",
202a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul      "result.color[3]"
203501ee87180047dd04afc69103c31e1eae5374bf1Brian   };
204501ee87180047dd04afc69103c31e1eae5374bf1Brian
205501ee87180047dd04afc69103c31e1eae5374bf1Brian   if (progType == GL_VERTEX_PROGRAM_ARB) {
206501ee87180047dd04afc69103c31e1eae5374bf1Brian      assert(index < sizeof(vertResults) / sizeof(vertResults[0]));
207501ee87180047dd04afc69103c31e1eae5374bf1Brian      return vertResults[index];
208501ee87180047dd04afc69103c31e1eae5374bf1Brian   }
209501ee87180047dd04afc69103c31e1eae5374bf1Brian   else {
210501ee87180047dd04afc69103c31e1eae5374bf1Brian      assert(index < sizeof(fragResults) / sizeof(fragResults[0]));
211501ee87180047dd04afc69103c31e1eae5374bf1Brian      return fragResults[index];
212501ee87180047dd04afc69103c31e1eae5374bf1Brian   }
213501ee87180047dd04afc69103c31e1eae5374bf1Brian}
214501ee87180047dd04afc69103c31e1eae5374bf1Brian
215501ee87180047dd04afc69103c31e1eae5374bf1Brian
216501ee87180047dd04afc69103c31e1eae5374bf1Brian/**
217501ee87180047dd04afc69103c31e1eae5374bf1Brian * Return string representation of the given register.
218501ee87180047dd04afc69103c31e1eae5374bf1Brian * Note that some types of registers (like PROGRAM_UNIFORM) aren't defined
219501ee87180047dd04afc69103c31e1eae5374bf1Brian * by the ARB/NV program languages so we've taken some liberties here.
2201eee1bac1f6d911e6124daafc9b9291666d91cefVinson Lee * \param f  the register file (PROGRAM_INPUT, PROGRAM_TEMPORARY, etc)
221501ee87180047dd04afc69103c31e1eae5374bf1Brian * \param index  number of the register in the register file
222501ee87180047dd04afc69103c31e1eae5374bf1Brian * \param mode  the output format/mode/style
223501ee87180047dd04afc69103c31e1eae5374bf1Brian * \param prog  pointer to containing program
224501ee87180047dd04afc69103c31e1eae5374bf1Brian */
225501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic const char *
226b4026d9be828bd0b6f60158456edf24994efb053Brian Paulreg_string(gl_register_file f, GLint index, gl_prog_print_mode mode,
22719659a50f9356023c59942794bd4e6e075f120bdZack Rusin           GLboolean relAddr, const struct gl_program *prog)
228501ee87180047dd04afc69103c31e1eae5374bf1Brian{
229501ee87180047dd04afc69103c31e1eae5374bf1Brian   static char str[100];
230f88a9015985f1e308496803630221f284a94f397Brian Paul   const char *addr = relAddr ? "ADDR+" : "";
231501ee87180047dd04afc69103c31e1eae5374bf1Brian
232501ee87180047dd04afc69103c31e1eae5374bf1Brian   str[0] = 0;
233501ee87180047dd04afc69103c31e1eae5374bf1Brian
234501ee87180047dd04afc69103c31e1eae5374bf1Brian   switch (mode) {
235501ee87180047dd04afc69103c31e1eae5374bf1Brian   case PROG_PRINT_DEBUG:
236f88a9015985f1e308496803630221f284a94f397Brian Paul      _mesa_sprintf(str, "%s[%s%d]", file_string(f, mode), addr, index);
237501ee87180047dd04afc69103c31e1eae5374bf1Brian      break;
238501ee87180047dd04afc69103c31e1eae5374bf1Brian
239501ee87180047dd04afc69103c31e1eae5374bf1Brian   case PROG_PRINT_ARB:
240501ee87180047dd04afc69103c31e1eae5374bf1Brian      switch (f) {
241501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_INPUT:
24298a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca         _mesa_sprintf(str, "%s", arb_input_attrib_string(index, prog->Target));
243501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
244501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_OUTPUT:
24598a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca         _mesa_sprintf(str, "%s", arb_output_attrib_string(index, prog->Target));
246501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
247501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_TEMPORARY:
24898a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca         _mesa_sprintf(str, "temp%d", index);
249501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
250501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_ENV_PARAM:
251f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "program.env[%s%d]", addr, index);
252501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
253501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_LOCAL_PARAM:
254f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "program.local[%s%d]", addr, index);
255501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
256501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_VARYING: /* extension */
257f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "varying[%s%d]", addr, index);
258501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
259501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_CONSTANT: /* extension */
260f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "constant[%s%d]", addr, index);
261501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
262501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_UNIFORM: /* extension */
263f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "uniform[%s%d]", addr, index);
264501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
265501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_STATE_VAR:
266501ee87180047dd04afc69103c31e1eae5374bf1Brian         {
267501ee87180047dd04afc69103c31e1eae5374bf1Brian            struct gl_program_parameter *param
268501ee87180047dd04afc69103c31e1eae5374bf1Brian               = prog->Parameters->Parameters + index;
2699a64440154319738445e203339156e54232908eeBrian Paul            char *state = _mesa_program_state_string(param->StateIndexes);
27098a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca            _mesa_sprintf(str, state);
2719a64440154319738445e203339156e54232908eeBrian Paul            _mesa_free(state);
272501ee87180047dd04afc69103c31e1eae5374bf1Brian         }
273501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
274501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_ADDRESS:
27598a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca         _mesa_sprintf(str, "A%d", index);
276501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
277501ee87180047dd04afc69103c31e1eae5374bf1Brian      default:
278501ee87180047dd04afc69103c31e1eae5374bf1Brian         _mesa_problem(NULL, "bad file in reg_string()");
279501ee87180047dd04afc69103c31e1eae5374bf1Brian      }
280501ee87180047dd04afc69103c31e1eae5374bf1Brian      break;
281501ee87180047dd04afc69103c31e1eae5374bf1Brian
282501ee87180047dd04afc69103c31e1eae5374bf1Brian   case PROG_PRINT_NV:
283501ee87180047dd04afc69103c31e1eae5374bf1Brian      switch (f) {
284501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_INPUT:
285501ee87180047dd04afc69103c31e1eae5374bf1Brian         if (prog->Target == GL_VERTEX_PROGRAM_ARB)
28698a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca            _mesa_sprintf(str, "v[%d]", index);
287501ee87180047dd04afc69103c31e1eae5374bf1Brian         else
28898a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca            _mesa_sprintf(str, "f[%d]", index);
289501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
290501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_OUTPUT:
29198a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca         _mesa_sprintf(str, "o[%d]", index);
292501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
293501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_TEMPORARY:
29498a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca         _mesa_sprintf(str, "R%d", index);
295501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
296501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_ENV_PARAM:
29798a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca         _mesa_sprintf(str, "c[%d]", index);
298501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
299501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_VARYING: /* extension */
300f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "varying[%s%d]", addr, index);
301501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
302501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_UNIFORM: /* extension */
303f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "uniform[%s%d]", addr, index);
304501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
305501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_CONSTANT: /* extension */
306f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "constant[%s%d]", addr, index);
307501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
308501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_STATE_VAR: /* extension */
309f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "state[%s%d]", addr, index);
310501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
311501ee87180047dd04afc69103c31e1eae5374bf1Brian      default:
312501ee87180047dd04afc69103c31e1eae5374bf1Brian         _mesa_problem(NULL, "bad file in reg_string()");
313501ee87180047dd04afc69103c31e1eae5374bf1Brian      }
314501ee87180047dd04afc69103c31e1eae5374bf1Brian      break;
315501ee87180047dd04afc69103c31e1eae5374bf1Brian
316501ee87180047dd04afc69103c31e1eae5374bf1Brian   default:
317501ee87180047dd04afc69103c31e1eae5374bf1Brian      _mesa_problem(NULL, "bad mode in reg_string()");
318501ee87180047dd04afc69103c31e1eae5374bf1Brian   }
319501ee87180047dd04afc69103c31e1eae5374bf1Brian
320501ee87180047dd04afc69103c31e1eae5374bf1Brian   return str;
321501ee87180047dd04afc69103c31e1eae5374bf1Brian}
322501ee87180047dd04afc69103c31e1eae5374bf1Brian
323501ee87180047dd04afc69103c31e1eae5374bf1Brian
324501ee87180047dd04afc69103c31e1eae5374bf1Brian/**
32500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Return a string representation of the given swizzle word.
32600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * If extended is true, use extended (comma-separated) format.
3273a2815370d26012b41d742540237985a333b6ae4Brian * \param swizzle  the swizzle field
3283a2815370d26012b41d742540237985a333b6ae4Brian * \param negateBase  4-bit negation vector
3293a2815370d26012b41d742540237985a333b6ae4Brian * \param extended  if true, also allow 0, 1 values
33000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */
331059376c855cbeb160e98f438a35edb8bd88b8bb2Brianconst char *
3327db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul_mesa_swizzle_string(GLuint swizzle, GLuint negateMask, GLboolean extended)
33300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
33474a19b0abd382574ff583eab81a374acead9254dBrian Paul   static const char swz[] = "xyzw01!?";  /* See SWIZZLE_x definitions */
33500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   static char s[20];
33600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   GLuint i = 0;
33700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
3387db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul   if (!extended && swizzle == SWIZZLE_NOOP && negateMask == 0)
33900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return ""; /* no swizzle/negation */
34000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
34100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (!extended)
34200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = '.';
34300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
3447db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul   if (negateMask & NEGATE_X)
34500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = '-';
34600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   s[i++] = swz[GET_SWZ(swizzle, 0)];
34700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
34800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (extended) {
34900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = ',';
35000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
35100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
3527db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul   if (negateMask & NEGATE_Y)
35300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = '-';
35400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   s[i++] = swz[GET_SWZ(swizzle, 1)];
35500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
35600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (extended) {
35700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = ',';
35800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
35900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
3607db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul   if (negateMask & NEGATE_Z)
36100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = '-';
36200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   s[i++] = swz[GET_SWZ(swizzle, 2)];
36300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
36400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (extended) {
36500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = ',';
36600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
36700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
3687db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul   if (negateMask & NEGATE_W)
36900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = '-';
37000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   s[i++] = swz[GET_SWZ(swizzle, 3)];
37100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
37200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   s[i] = 0;
37300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   return s;
37400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
37500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
37600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
377511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paulvoid
378511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul_mesa_print_swizzle(GLuint swizzle)
379511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul{
380511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul   if (swizzle == SWIZZLE_XYZW) {
381511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul      _mesa_printf(".xyzw\n");
382511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul   }
383511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul   else {
384f9c574d7192d2193ff3e12629a8db1a74b6dbf55Michal Krol      const char *s = _mesa_swizzle_string(swizzle, 0, 0);
385511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul      _mesa_printf("%s\n", s);
386511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul   }
387511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul}
388511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul
389511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul
390610c2461ce0683ca5412e4b2b7a496f67e9d3704Brian Paulconst char *
391610c2461ce0683ca5412e4b2b7a496f67e9d3704Brian Paul_mesa_writemask_string(GLuint writeMask)
39200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
39300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   static char s[10];
39400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   GLuint i = 0;
39500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
39600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (writeMask == WRITEMASK_XYZW)
39700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "";
39800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
39900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   s[i++] = '.';
40000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (writeMask & WRITEMASK_X)
40100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = 'x';
40200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (writeMask & WRITEMASK_Y)
40300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = 'y';
40400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (writeMask & WRITEMASK_Z)
40500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = 'z';
40600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (writeMask & WRITEMASK_W)
40700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = 'w';
40800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
40900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   s[i] = 0;
41000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   return s;
41100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
41200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
4133a2815370d26012b41d742540237985a333b6ae4Brian
414d750861dc26e3898afa2b49e3969d709dc227664Brianconst char *
415d750861dc26e3898afa2b49e3969d709dc227664Brian_mesa_condcode_string(GLuint condcode)
4163a2815370d26012b41d742540237985a333b6ae4Brian{
4173a2815370d26012b41d742540237985a333b6ae4Brian   switch (condcode) {
4183a2815370d26012b41d742540237985a333b6ae4Brian   case COND_GT:  return "GT";
4193a2815370d26012b41d742540237985a333b6ae4Brian   case COND_EQ:  return "EQ";
4203a2815370d26012b41d742540237985a333b6ae4Brian   case COND_LT:  return "LT";
4213a2815370d26012b41d742540237985a333b6ae4Brian   case COND_UN:  return "UN";
4223a2815370d26012b41d742540237985a333b6ae4Brian   case COND_GE:  return "GE";
4233a2815370d26012b41d742540237985a333b6ae4Brian   case COND_LE:  return "LE";
4243a2815370d26012b41d742540237985a333b6ae4Brian   case COND_NE:  return "NE";
4253a2815370d26012b41d742540237985a333b6ae4Brian   case COND_TR:  return "TR";
4263a2815370d26012b41d742540237985a333b6ae4Brian   case COND_FL:  return "FL";
4273a2815370d26012b41d742540237985a333b6ae4Brian   default: return "cond???";
4283a2815370d26012b41d742540237985a333b6ae4Brian   }
4293a2815370d26012b41d742540237985a333b6ae4Brian}
4303a2815370d26012b41d742540237985a333b6ae4Brian
4313a2815370d26012b41d742540237985a333b6ae4Brian
43200cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void
433d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_dst_reg(FILE * f,
434d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul               const struct prog_dst_register *dstReg,
435d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul               gl_prog_print_mode mode,
436d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul               const struct gl_program *prog)
43700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
438d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "%s%s",
439b4026d9be828bd0b6f60158456edf24994efb053Brian Paul                 reg_string((gl_register_file) dstReg->File,
440d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            dstReg->Index, mode, dstReg->RelAddr, prog),
441d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                 _mesa_writemask_string(dstReg->WriteMask));
442501ee87180047dd04afc69103c31e1eae5374bf1Brian
4431936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian   if (dstReg->CondMask != COND_TR) {
444d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " (%s.%s)",
445d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                    _mesa_condcode_string(dstReg->CondMask),
446d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                    _mesa_swizzle_string(dstReg->CondSwizzle,
447d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                                         GL_FALSE, GL_FALSE));
4481936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian   }
4491936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian
450501ee87180047dd04afc69103c31e1eae5374bf1Brian#if 0
451d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "%s[%d]%s",
452b4026d9be828bd0b6f60158456edf24994efb053Brian Paul                file_string((gl_register_file) dstReg->File, mode),
45300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian                dstReg->Index,
454610c2461ce0683ca5412e4b2b7a496f67e9d3704Brian Paul                _mesa_writemask_string(dstReg->WriteMask));
455501ee87180047dd04afc69103c31e1eae5374bf1Brian#endif
45600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
45700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
458d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
45900cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void
460d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_src_reg(FILE *f,
461d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul               const struct prog_src_register *srcReg,
462d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul               gl_prog_print_mode mode,
463d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul               const struct gl_program *prog)
46400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
465f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul   const char *abs = srcReg->Abs ? "|" : "";
466f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul
467f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul   _mesa_fprintf(f, "%s%s%s%s",
468f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul                 abs,
469b4026d9be828bd0b6f60158456edf24994efb053Brian Paul                 reg_string((gl_register_file) srcReg->File,
470d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            srcReg->Index, mode, srcReg->RelAddr, prog),
471d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                 _mesa_swizzle_string(srcReg->Swizzle,
4727db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul                                      srcReg->Negate, GL_FALSE),
473f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul                 abs);
474501ee87180047dd04afc69103c31e1eae5374bf1Brian#if 0
475d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "%s[%d]%s",
476b4026d9be828bd0b6f60158456edf24994efb053Brian Paul                 file_string((gl_register_file) srcReg->File, mode),
477d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                 srcReg->Index,
478d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                 _mesa_swizzle_string(srcReg->Swizzle,
4797db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul                                      srcReg->Negate, GL_FALSE));
480501ee87180047dd04afc69103c31e1eae5374bf1Brian#endif
48100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
48200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
483d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
48400cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void
485d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_comment(FILE *f, const struct prog_instruction *inst)
48600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
48700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (inst->Comment)
488d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ";  # %s\n", inst->Comment);
48900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   else
490d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ";\n");
49100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
49200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
49300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
494501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic void
495d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_alu_instruction(FILE *f,
496d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                       const struct prog_instruction *inst,
497d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                       const char *opcode_string, GLuint numRegs,
498d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                       gl_prog_print_mode mode,
499d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                       const struct gl_program *prog)
50000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
50100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   GLuint j;
50200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
503d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "%s", opcode_string);
504b50280e95f3c044f53c0705d3a5619ebb2db4513Brian   if (inst->CondUpdate)
505d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ".C");
50600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
50700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   /* frag prog only */
50800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (inst->SaturateMode == SATURATE_ZERO_ONE)
509d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "_SAT");
51000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
511d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, " ");
51200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (inst->DstReg.File != PROGRAM_UNDEFINED) {
513d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_dst_reg(f, &inst->DstReg, mode, prog);
51400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
51500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   else {
516d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " ???");
51700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
51800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
51900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (numRegs > 0)
520d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ", ");
52100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
52200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   for (j = 0; j < numRegs; j++) {
523d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_src_reg(f, inst->SrcReg + j, mode, prog);
52400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      if (j + 1 < numRegs)
525d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul	 _mesa_fprintf(f, ", ");
52600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
52700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
528d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   fprint_comment(f, inst);
5290020d1022f4b5befe4adf783bedc4cf83e09f01fBrian}
5300020d1022f4b5befe4adf783bedc4cf83e09f01fBrian
5310020d1022f4b5befe4adf783bedc4cf83e09f01fBrian
5320020d1022f4b5befe4adf783bedc4cf83e09f01fBrianvoid
5330020d1022f4b5befe4adf783bedc4cf83e09f01fBrian_mesa_print_alu_instruction(const struct prog_instruction *inst,
5340020d1022f4b5befe4adf783bedc4cf83e09f01fBrian                            const char *opcode_string, GLuint numRegs)
5350020d1022f4b5befe4adf783bedc4cf83e09f01fBrian{
536d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   fprint_alu_instruction(stdout, inst, opcode_string,
537d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                          numRegs, PROG_PRINT_DEBUG, NULL);
538501ee87180047dd04afc69103c31e1eae5374bf1Brian}
539501ee87180047dd04afc69103c31e1eae5374bf1Brian
540501ee87180047dd04afc69103c31e1eae5374bf1Brian
54100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/**
54200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Print a single vertex/fragment program instruction.
54300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */
5442237d136cd8f964048a4ccdc87e0ffb48af0f73dNicolai HähnleGLint
545d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_instruction_opt(FILE *f,
546d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            const struct prog_instruction *inst,
547d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            GLint indent,
548501ee87180047dd04afc69103c31e1eae5374bf1Brian                            gl_prog_print_mode mode,
549501ee87180047dd04afc69103c31e1eae5374bf1Brian                            const struct gl_program *prog)
55000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
5517b30053b264726156a018c822657270e745320ceBrian   GLint i;
5525db088d70fbd14620c2fc7840096a05993f8e2b9Brian
5535db088d70fbd14620c2fc7840096a05993f8e2b9Brian   if (inst->Opcode == OPCODE_ELSE ||
5545db088d70fbd14620c2fc7840096a05993f8e2b9Brian       inst->Opcode == OPCODE_ENDIF ||
5555db088d70fbd14620c2fc7840096a05993f8e2b9Brian       inst->Opcode == OPCODE_ENDLOOP ||
5565db088d70fbd14620c2fc7840096a05993f8e2b9Brian       inst->Opcode == OPCODE_ENDSUB) {
5575db088d70fbd14620c2fc7840096a05993f8e2b9Brian      indent -= 3;
5585db088d70fbd14620c2fc7840096a05993f8e2b9Brian   }
5595db088d70fbd14620c2fc7840096a05993f8e2b9Brian   for (i = 0; i < indent; i++) {
560d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " ");
5615db088d70fbd14620c2fc7840096a05993f8e2b9Brian   }
5625db088d70fbd14620c2fc7840096a05993f8e2b9Brian
56300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   switch (inst->Opcode) {
56400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_PRINT:
565d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "PRINT '%s'", inst->Data);
56600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) {
567d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, ", ");
568d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "%s[%d]%s",
569b4026d9be828bd0b6f60158456edf24994efb053Brian Paul                      file_string((gl_register_file) inst->SrcReg[0].File,
570501ee87180047dd04afc69103c31e1eae5374bf1Brian                                  mode),
57100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian                      inst->SrcReg[0].Index,
572059376c855cbeb160e98f438a35edb8bd88b8bb2Brian                      _mesa_swizzle_string(inst->SrcReg[0].Swizzle,
5737db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul                                           inst->SrcReg[0].Negate, GL_FALSE));
57400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      }
57500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      if (inst->Comment)
576d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "  # %s", inst->Comment);
577d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
57800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      break;
57900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_SWZ:
580d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "SWZ");
58100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      if (inst->SaturateMode == SATURATE_ZERO_ONE)
582d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "_SAT");
583d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " ");
584d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_dst_reg(f, &inst->DstReg, mode, prog);
585d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ", %s[%d], %s",
586b4026d9be828bd0b6f60158456edf24994efb053Brian Paul                   file_string((gl_register_file) inst->SrcReg[0].File,
587501ee87180047dd04afc69103c31e1eae5374bf1Brian                               mode),
58800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian                   inst->SrcReg[0].Index,
589059376c855cbeb160e98f438a35edb8bd88b8bb2Brian                   _mesa_swizzle_string(inst->SrcReg[0].Swizzle,
5907db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul                                        inst->SrcReg[0].Negate, GL_TRUE));
591d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
59200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      break;
59300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_TEX:
59400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_TXP:
5954b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul   case OPCODE_TXL:
59600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_TXB:
597d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "%s", _mesa_opcode_string(inst->Opcode));
59800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      if (inst->SaturateMode == SATURATE_ZERO_ONE)
599d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "_SAT");
600d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " ");
601d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_dst_reg(f, &inst->DstReg, mode, prog);
602d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ", ");
603d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_src_reg(f, &inst->SrcReg[0], mode, prog);
604d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ", texture[%d], ", inst->TexSrcUnit);
60500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      switch (inst->TexSrcTarget) {
606d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      case TEXTURE_1D_INDEX:   _mesa_fprintf(f, "1D");    break;
607d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      case TEXTURE_2D_INDEX:   _mesa_fprintf(f, "2D");    break;
608d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      case TEXTURE_3D_INDEX:   _mesa_fprintf(f, "3D");    break;
609d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      case TEXTURE_CUBE_INDEX: _mesa_fprintf(f, "CUBE");  break;
610d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      case TEXTURE_RECT_INDEX: _mesa_fprintf(f, "RECT");  break;
61100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      default:
61200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian         ;
61300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      }
61444e018c09e7aeba9fd9f4c380da224bd6622c470Brian Paul      if (inst->TexShadow)
61544e018c09e7aeba9fd9f4c380da224bd6622c470Brian Paul         _mesa_fprintf(f, " SHADOW");
616d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
61700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      break;
6184b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul
6194b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul   case OPCODE_KIL:
620d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "%s", _mesa_opcode_string(inst->Opcode));
621d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " ");
622d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_src_reg(f, &inst->SrcReg[0], mode, prog);
623d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
6244b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul      break;
6254b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul   case OPCODE_KIL_NV:
626d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "%s", _mesa_opcode_string(inst->Opcode));
627d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " ");
628d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "%s.%s",
6294b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul                   _mesa_condcode_string(inst->DstReg.CondMask),
6304b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul                   _mesa_swizzle_string(inst->DstReg.CondSwizzle,
6314b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul                                        GL_FALSE, GL_FALSE));
632d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
6334b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul      break;
6344b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul
63500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_ARL:
636d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "ARL ");
637d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_dst_reg(f, &inst->DstReg, mode, prog);
638d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ", ");
639d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_src_reg(f, &inst->SrcReg[0], mode, prog);
640d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
64100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      break;
64200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_BRA:
643d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "BRA %d (%s%s)",
6443a2815370d26012b41d742540237985a333b6ae4Brian                   inst->BranchTarget,
645d750861dc26e3898afa2b49e3969d709dc227664Brian                   _mesa_condcode_string(inst->DstReg.CondMask),
646059376c855cbeb160e98f438a35edb8bd88b8bb2Brian                   _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE));
647d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
64800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      break;
6495ae49cf3ed53fda6a904d7e90feef78495ae6903Brian   case OPCODE_IF:
65063556fa9949f543a8134b6b5ff3d216acb71dd9fBrian      if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) {
65163556fa9949f543a8134b6b5ff3d216acb71dd9fBrian         /* Use ordinary register */
652d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "IF ");
653d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         fprint_src_reg(f, &inst->SrcReg[0], mode, prog);
654d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "; ");
65563556fa9949f543a8134b6b5ff3d216acb71dd9fBrian      }
65663556fa9949f543a8134b6b5ff3d216acb71dd9fBrian      else {
65763556fa9949f543a8134b6b5ff3d216acb71dd9fBrian         /* Use cond codes */
658d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "IF (%s%s);",
659d750861dc26e3898afa2b49e3969d709dc227664Brian                      _mesa_condcode_string(inst->DstReg.CondMask),
66063556fa9949f543a8134b6b5ff3d216acb71dd9fBrian                      _mesa_swizzle_string(inst->DstReg.CondSwizzle,
66163556fa9949f543a8134b6b5ff3d216acb71dd9fBrian                                           0, GL_FALSE));
66263556fa9949f543a8134b6b5ff3d216acb71dd9fBrian      }
663d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " # (if false, goto %d)", inst->BranchTarget);
664d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
6655db088d70fbd14620c2fc7840096a05993f8e2b9Brian      return indent + 3;
6665ae49cf3ed53fda6a904d7e90feef78495ae6903Brian   case OPCODE_ELSE:
667d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "ELSE; # (goto %d)\n", inst->BranchTarget);
6685db088d70fbd14620c2fc7840096a05993f8e2b9Brian      return indent + 3;
6695ae49cf3ed53fda6a904d7e90feef78495ae6903Brian   case OPCODE_ENDIF:
670d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "ENDIF;\n");
6715db088d70fbd14620c2fc7840096a05993f8e2b9Brian      break;
6725db088d70fbd14620c2fc7840096a05993f8e2b9Brian   case OPCODE_BGNLOOP:
673d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "BGNLOOP; # (end at %d)\n", inst->BranchTarget);
6745db088d70fbd14620c2fc7840096a05993f8e2b9Brian      return indent + 3;
6755db088d70fbd14620c2fc7840096a05993f8e2b9Brian   case OPCODE_ENDLOOP:
676d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "ENDLOOP; # (goto %d)\n", inst->BranchTarget);
6775db088d70fbd14620c2fc7840096a05993f8e2b9Brian      break;
6785db088d70fbd14620c2fc7840096a05993f8e2b9Brian   case OPCODE_BRK:
679f22ed0986a743e033d827c78371612c7115ff913Brian   case OPCODE_CONT:
680d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "%s (%s%s); # (goto %d)",
68181767eead9e1b1b5d5dfd274c0875fa1332a5983Brian                   _mesa_opcode_string(inst->Opcode),
682d750861dc26e3898afa2b49e3969d709dc227664Brian                   _mesa_condcode_string(inst->DstReg.CondMask),
683059376c855cbeb160e98f438a35edb8bd88b8bb2Brian                   _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE),
6842755c798f3cb89fcd4ece16cd740af1cd86a6b99Brian                   inst->BranchTarget);
685d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
6865db088d70fbd14620c2fc7840096a05993f8e2b9Brian      break;
68763556fa9949f543a8134b6b5ff3d216acb71dd9fBrian
6885db088d70fbd14620c2fc7840096a05993f8e2b9Brian   case OPCODE_BGNSUB:
689f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      if (mode == PROG_PRINT_NV) {
690d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "%s:\n", inst->Comment); /* comment is label */
691f407cada8aa0bfea1b8dfae766392162c702aaa4Brian         return indent;
692f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      }
693f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      else {
694d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "BGNSUB");
695d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         fprint_comment(f, inst);
696f407cada8aa0bfea1b8dfae766392162c702aaa4Brian         return indent + 3;
697f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      }
6985db088d70fbd14620c2fc7840096a05993f8e2b9Brian   case OPCODE_ENDSUB:
699f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      if (mode == PROG_PRINT_DEBUG) {
700d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "ENDSUB");
701d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         fprint_comment(f, inst);
702f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      }
703f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      break;
704f407cada8aa0bfea1b8dfae766392162c702aaa4Brian   case OPCODE_CAL:
705f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      if (mode == PROG_PRINT_NV) {
706d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "CAL %s;  # (goto %d)\n", inst->Comment, inst->BranchTarget);
707f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      }
708f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      else {
709d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "CAL %u", inst->BranchTarget);
710d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         fprint_comment(f, inst);
711f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      }
712f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      break;
713f407cada8aa0bfea1b8dfae766392162c702aaa4Brian   case OPCODE_RET:
714d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "RET (%s%s)",
715d750861dc26e3898afa2b49e3969d709dc227664Brian                   _mesa_condcode_string(inst->DstReg.CondMask),
716d750861dc26e3898afa2b49e3969d709dc227664Brian                   _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE));
717d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
7185ae49cf3ed53fda6a904d7e90feef78495ae6903Brian      break;
719f407cada8aa0bfea1b8dfae766392162c702aaa4Brian
72000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_END:
721d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "END\n");
72200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      break;
7233a2815370d26012b41d742540237985a333b6ae4Brian   case OPCODE_NOP:
724059376c855cbeb160e98f438a35edb8bd88b8bb2Brian      if (mode == PROG_PRINT_DEBUG) {
725d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "NOP");
726d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         fprint_comment(f, inst);
727059376c855cbeb160e98f438a35edb8bd88b8bb2Brian      }
728059376c855cbeb160e98f438a35edb8bd88b8bb2Brian      else if (inst->Comment) {
729059376c855cbeb160e98f438a35edb8bd88b8bb2Brian         /* ARB/NV extensions don't have NOP instruction */
730d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "# %s\n", inst->Comment);
731059376c855cbeb160e98f438a35edb8bd88b8bb2Brian      }
7323a2815370d26012b41d742540237985a333b6ae4Brian      break;
73300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   /* XXX may need other special-case instructions */
73400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   default:
735f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul      if (inst->Opcode < MAX_OPCODE) {
736f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul         /* typical alu instruction */
737f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul         fprint_alu_instruction(f, inst,
738f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul                                _mesa_opcode_string(inst->Opcode),
739f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul                                _mesa_num_inst_src_regs(inst->Opcode),
740f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul                                mode, prog);
741f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul      }
742f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul      else {
7437c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul         fprint_alu_instruction(f, inst,
7447c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul                                _mesa_opcode_string(inst->Opcode),
7457c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul                                3/*_mesa_num_inst_src_regs(inst->Opcode)*/,
7467c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul                                mode, prog);
747f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul      }
74800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      break;
74900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
7505db088d70fbd14620c2fc7840096a05993f8e2b9Brian   return indent;
75100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
75200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
75300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
754d0038930312f96468a9159a1221c3f4c56bddaa4Brian PaulGLint
755d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_instruction_opt(const struct prog_instruction *inst,
756d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            GLint indent,
757d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            gl_prog_print_mode mode,
758d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            const struct gl_program *prog)
759d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{
760d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   return _mesa_fprint_instruction_opt(stdout, inst, indent, mode, prog);
761d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul}
762d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
763d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
76400cdc0a472c55330cbc58317f01b07f8f90be5a5Brianvoid
765d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_instruction(const struct prog_instruction *inst)
76600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
767d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   /* note: 4th param should be ignored for PROG_PRINT_DEBUG */
768d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprint_instruction_opt(stdout, inst, 0, PROG_PRINT_DEBUG, NULL);
769501ee87180047dd04afc69103c31e1eae5374bf1Brian}
770501ee87180047dd04afc69103c31e1eae5374bf1Brian
771501ee87180047dd04afc69103c31e1eae5374bf1Brian
772d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
773501ee87180047dd04afc69103c31e1eae5374bf1Brian/**
774501ee87180047dd04afc69103c31e1eae5374bf1Brian * Print program, with options.
775501ee87180047dd04afc69103c31e1eae5374bf1Brian */
776d2eff33ab7fda9527458ea35d9eb109ec2988490Brian Paulvoid
777d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_program_opt(FILE *f,
778d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                         const struct gl_program *prog,
779d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                         gl_prog_print_mode mode,
780d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                         GLboolean lineNumbers)
781501ee87180047dd04afc69103c31e1eae5374bf1Brian{
7825db088d70fbd14620c2fc7840096a05993f8e2b9Brian   GLuint i, indent = 0;
783501ee87180047dd04afc69103c31e1eae5374bf1Brian
784501ee87180047dd04afc69103c31e1eae5374bf1Brian   switch (prog->Target) {
785501ee87180047dd04afc69103c31e1eae5374bf1Brian   case GL_VERTEX_PROGRAM_ARB:
786501ee87180047dd04afc69103c31e1eae5374bf1Brian      if (mode == PROG_PRINT_ARB)
787d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "!!ARBvp1.0\n");
788501ee87180047dd04afc69103c31e1eae5374bf1Brian      else if (mode == PROG_PRINT_NV)
789d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "!!VP1.0\n");
790501ee87180047dd04afc69103c31e1eae5374bf1Brian      else
791d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "# Vertex Program/Shader\n");
792501ee87180047dd04afc69103c31e1eae5374bf1Brian      break;
793501ee87180047dd04afc69103c31e1eae5374bf1Brian   case GL_FRAGMENT_PROGRAM_ARB:
794501ee87180047dd04afc69103c31e1eae5374bf1Brian   case GL_FRAGMENT_PROGRAM_NV:
795501ee87180047dd04afc69103c31e1eae5374bf1Brian      if (mode == PROG_PRINT_ARB)
796d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "!!ARBfp1.0\n");
797501ee87180047dd04afc69103c31e1eae5374bf1Brian      else if (mode == PROG_PRINT_NV)
798d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "!!FP1.0\n");
799501ee87180047dd04afc69103c31e1eae5374bf1Brian      else
800d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "# Fragment Program/Shader\n");
801501ee87180047dd04afc69103c31e1eae5374bf1Brian      break;
802501ee87180047dd04afc69103c31e1eae5374bf1Brian   }
803501ee87180047dd04afc69103c31e1eae5374bf1Brian
80400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   for (i = 0; i < prog->NumInstructions; i++) {
805501ee87180047dd04afc69103c31e1eae5374bf1Brian      if (lineNumbers)
806d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "%3d: ", i);
807d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      indent = _mesa_fprint_instruction_opt(f, prog->Instructions + i,
808501ee87180047dd04afc69103c31e1eae5374bf1Brian                                           indent, mode, prog);
80900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
81000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
81100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
81200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
81300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/**
814d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print program to stdout, default options.
81500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */
81600cdc0a472c55330cbc58317f01b07f8f90be5a5Brianvoid
817d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_program(const struct gl_program *prog)
818d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{
819d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprint_program_opt(stdout, prog, PROG_PRINT_DEBUG, GL_TRUE);
820d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul}
821d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
822d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
823d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/**
824d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print all of a program's parameters/fields to given file.
825d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */
826d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulstatic void
827d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_program_parameters(FILE *f,
828d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                                GLcontext *ctx,
829d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                                const struct gl_program *prog)
83000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
8314b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul   GLuint i;
8324b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul
833d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "InputsRead: 0x%x\n", prog->InputsRead);
834d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "OutputsWritten: 0x%x\n", prog->OutputsWritten);
835d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "NumInstructions=%d\n", prog->NumInstructions);
836d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "NumTemporaries=%d\n", prog->NumTemporaries);
837d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "NumParameters=%d\n", prog->NumParameters);
838d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "NumAttributes=%d\n", prog->NumAttributes);
839d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "NumAddressRegs=%d\n", prog->NumAddressRegs);
840d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "Samplers=[ ");
8414b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul   for (i = 0; i < MAX_SAMPLERS; i++) {
842d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "%d ", prog->SamplerUnits[i]);
8434b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul   }
844d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "]\n");
8454b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul
84600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   _mesa_load_state_parameters(ctx, prog->Parameters);
8474b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul
84800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#if 0
849d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "Local Params:\n");
85000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   for (i = 0; i < MAX_PROGRAM_LOCAL_PARAMS; i++){
85100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      const GLfloat *p = prog->LocalParams[i];
852d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "%2d: %f, %f, %f, %f\n", i, p[0], p[1], p[2], p[3]);
85300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
85400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#endif
85583ca3ff384ac09524ff6946134cded4174590d92Brian   _mesa_print_parameter_list(prog->Parameters);
85683ca3ff384ac09524ff6946134cded4174590d92Brian}
85783ca3ff384ac09524ff6946134cded4174590d92Brian
85800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
859d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/**
860d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print all of a program's parameters/fields to stdout.
861d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */
86283ca3ff384ac09524ff6946134cded4174590d92Brianvoid
863d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_program_parameters(GLcontext *ctx, const struct gl_program *prog)
864d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{
865d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprint_program_parameters(stdout, ctx, prog);
866d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul}
867d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
868d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
869d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/**
870d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print a program parameter list to given file.
871d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */
872d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulstatic void
873d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_parameter_list(FILE *f,
874d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            const struct gl_program_parameter_list *list)
87583ca3ff384ac09524ff6946134cded4174590d92Brian{
876501ee87180047dd04afc69103c31e1eae5374bf1Brian   const gl_prog_print_mode mode = PROG_PRINT_DEBUG;
87783ca3ff384ac09524ff6946134cded4174590d92Brian   GLuint i;
878501ee87180047dd04afc69103c31e1eae5374bf1Brian
8794b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul   if (!list)
8804b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul      return;
8814b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul
882d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "param list %p\n", (void *) list);
883ac1fc3f46511a449c812651dda686d4aaac39753Brian Paul   _mesa_fprintf(f, "dirty state flags: 0x%x\n", list->StateFlags);
88483ca3ff384ac09524ff6946134cded4174590d92Brian   for (i = 0; i < list->NumParameters; i++){
88583ca3ff384ac09524ff6946134cded4174590d92Brian      struct gl_program_parameter *param = list->Parameters + i;
88683ca3ff384ac09524ff6946134cded4174590d92Brian      const GLfloat *v = list->ParameterValues[i];
887d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "param[%d] sz=%d %s %s = {%.3g, %.3g, %.3g, %.3g}",
88883ca3ff384ac09524ff6946134cded4174590d92Brian                   i, param->Size,
889501ee87180047dd04afc69103c31e1eae5374bf1Brian                   file_string(list->Parameters[i].Type, mode),
89000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian                   param->Name, v[0], v[1], v[2], v[3]);
891f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul      if (param->Flags & PROG_PARAM_BIT_CENTROID)
892d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, " Centroid");
893f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul      if (param->Flags & PROG_PARAM_BIT_INVARIANT)
894d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, " Invariant");
895f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul      if (param->Flags & PROG_PARAM_BIT_FLAT)
896d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, " Flat");
897f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul      if (param->Flags & PROG_PARAM_BIT_LINEAR)
898d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, " Linear");
899d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "\n");
900d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   }
901d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul}
902d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
903d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
904d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/**
905d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print a program parameter list to stdout.
906d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */
907d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulvoid
908d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_parameter_list(const struct gl_program_parameter_list *list)
909d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{
910d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprint_parameter_list(stdout, list);
911d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul}
912d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
913d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
914d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/**
915d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Write shader and associated info to a file.
916d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */
917d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulvoid
918d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_write_shader_to_file(const struct gl_shader *shader)
919d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{
920d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   const char *type;
921d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   char filename[100];
922d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   FILE *f;
923d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
924d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   if (shader->Type == GL_FRAGMENT_SHADER)
925d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      type = "frag";
926d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   else
927d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      type = "vert";
928d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
9293c1ce2d64919e0fb9b28f0697addb87708f4f6edBrian Paul   _mesa_snprintf(filename, sizeof(filename), "shader_%u.%s", shader->Name, type);
930d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   f = fopen(filename, "w");
931d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   if (!f) {
932d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprintf(stderr, "Unable to open %s for writing\n", filename);
933d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      return;
93400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
935d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
936d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   fprintf(f, "/* Shader %u source */\n", shader->Name);
937d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   fputs(shader->Source, f);
938d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   fprintf(f, "\n");
939d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
940d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   fprintf(f, "/* Compile status: %s */\n",
941d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul           shader->CompileStatus ? "ok" : "fail");
942d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   if (!shader->CompileStatus) {
943d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprintf(f, "/* Log Info: */\n");
944d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fputs(shader->InfoLog, f);
945d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   }
946d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   else {
947d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprintf(f, "/* GPU code */\n");
9486ce0c6e743b27cc284e8f164585cfe5892cd662aBrian Paul      fprintf(f, "/*\n");
949d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprint_program_opt(f, shader->Program, PROG_PRINT_DEBUG, GL_TRUE);
9506ce0c6e743b27cc284e8f164585cfe5892cd662aBrian Paul      fprintf(f, "*/\n");
951f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul      fprintf(f, "/* Parameters / constants */\n");
952f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul      fprintf(f, "/*\n");
953f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul      _mesa_fprint_parameter_list(f, shader->Program->Parameters);
954f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul      fprintf(f, "*/\n");
955d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   }
956d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
957d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   fclose(f);
95800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
959d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
960d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
961