prog_print.c revision 43a064e06dd0d3f7ff7ae23f19248e312c0b03b1
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:
7800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "Unknown program file!";
7900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
8000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
8100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
8200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
8300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/**
84501ee87180047dd04afc69103c31e1eae5374bf1Brian * Return ARB_v/f_prog-style input attrib string.
85501ee87180047dd04afc69103c31e1eae5374bf1Brian */
86501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic const char *
87501ee87180047dd04afc69103c31e1eae5374bf1Brianarb_input_attrib_string(GLint index, GLenum progType)
88501ee87180047dd04afc69103c31e1eae5374bf1Brian{
89a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul   /*
90a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul    * These strings should match the VERT_ATTRIB_x and FRAG_ATTRIB_x tokens.
91a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul    */
92501ee87180047dd04afc69103c31e1eae5374bf1Brian   const char *vertAttribs[] = {
93501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.position",
94501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.weight",
95501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.normal",
96501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.color.primary",
97501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.color.secondary",
98501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.fogcoord",
99501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.(six)",
100501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.(seven)",
101501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.texcoord[0]",
102501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.texcoord[1]",
103501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.texcoord[2]",
104501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.texcoord[3]",
105501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.texcoord[4]",
106501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.texcoord[5]",
107501ee87180047dd04afc69103c31e1eae5374bf1Brian      "vertex.texcoord[6]",
108d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.texcoord[7]",
109d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[0]",
110d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[1]",
111d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[2]",
112d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[3]",
113d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[4]",
114d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[5]",
115d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[6]",
116d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[7]",
117d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[8]",
118d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[9]",
119d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[10]",
120d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[11]",
121d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[12]",
122d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[13]",
123d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[14]",
124d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler      "vertex.attrib[15]"
125501ee87180047dd04afc69103c31e1eae5374bf1Brian   };
126501ee87180047dd04afc69103c31e1eae5374bf1Brian   const char *fragAttribs[] = {
127501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.position",
128501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.color.primary",
129501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.color.secondary",
130501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.fogcoord",
131501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[0]",
132501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[1]",
133501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[2]",
134501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[3]",
135501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[4]",
136501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[5]",
137501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[6]",
138501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.texcoord[7]",
139501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[0]",
140501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[1]",
141501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[2]",
142501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[3]",
143501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[4]",
144501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[5]",
145501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[6]",
146501ee87180047dd04afc69103c31e1eae5374bf1Brian      "fragment.varying[7]"
147501ee87180047dd04afc69103c31e1eae5374bf1Brian   };
148501ee87180047dd04afc69103c31e1eae5374bf1Brian
149501ee87180047dd04afc69103c31e1eae5374bf1Brian   if (progType == GL_VERTEX_PROGRAM_ARB) {
150501ee87180047dd04afc69103c31e1eae5374bf1Brian      assert(index < sizeof(vertAttribs) / sizeof(vertAttribs[0]));
151501ee87180047dd04afc69103c31e1eae5374bf1Brian      return vertAttribs[index];
152501ee87180047dd04afc69103c31e1eae5374bf1Brian   }
153501ee87180047dd04afc69103c31e1eae5374bf1Brian   else {
154501ee87180047dd04afc69103c31e1eae5374bf1Brian      assert(index < sizeof(fragAttribs) / sizeof(fragAttribs[0]));
155501ee87180047dd04afc69103c31e1eae5374bf1Brian      return fragAttribs[index];
156501ee87180047dd04afc69103c31e1eae5374bf1Brian   }
157501ee87180047dd04afc69103c31e1eae5374bf1Brian}
158501ee87180047dd04afc69103c31e1eae5374bf1Brian
159501ee87180047dd04afc69103c31e1eae5374bf1Brian
160501ee87180047dd04afc69103c31e1eae5374bf1Brian/**
161501ee87180047dd04afc69103c31e1eae5374bf1Brian * Return ARB_v/f_prog-style output attrib string.
162501ee87180047dd04afc69103c31e1eae5374bf1Brian */
163501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic const char *
164501ee87180047dd04afc69103c31e1eae5374bf1Brianarb_output_attrib_string(GLint index, GLenum progType)
165501ee87180047dd04afc69103c31e1eae5374bf1Brian{
166a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul   /*
167a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul    * These strings should match the VERT_RESULT_x and FRAG_RESULT_x tokens.
168a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul    */
169501ee87180047dd04afc69103c31e1eae5374bf1Brian   const char *vertResults[] = {
170501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.position",
171501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.color.primary",
172501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.color.secondary",
173501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.fogcoord",
174501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[0]",
175501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[1]",
176501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[2]",
177501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[3]",
178501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[4]",
179501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[5]",
180501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[6]",
181501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.texcoord[7]",
182501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[0]",
183501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[1]",
184501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[2]",
185501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[3]",
186501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[4]",
187501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[5]",
188501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[6]",
189501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.varying[7]"
190501ee87180047dd04afc69103c31e1eae5374bf1Brian   };
191501ee87180047dd04afc69103c31e1eae5374bf1Brian   const char *fragResults[] = {
192501ee87180047dd04afc69103c31e1eae5374bf1Brian      "result.color",
193a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul      "result.color(half)",
194a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul      "result.depth",
195a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul      "result.color[0]",
196a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul      "result.color[1]",
197a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul      "result.color[2]",
198a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul      "result.color[3]"
199501ee87180047dd04afc69103c31e1eae5374bf1Brian   };
200501ee87180047dd04afc69103c31e1eae5374bf1Brian
201501ee87180047dd04afc69103c31e1eae5374bf1Brian   if (progType == GL_VERTEX_PROGRAM_ARB) {
202501ee87180047dd04afc69103c31e1eae5374bf1Brian      assert(index < sizeof(vertResults) / sizeof(vertResults[0]));
203501ee87180047dd04afc69103c31e1eae5374bf1Brian      return vertResults[index];
204501ee87180047dd04afc69103c31e1eae5374bf1Brian   }
205501ee87180047dd04afc69103c31e1eae5374bf1Brian   else {
206501ee87180047dd04afc69103c31e1eae5374bf1Brian      assert(index < sizeof(fragResults) / sizeof(fragResults[0]));
207501ee87180047dd04afc69103c31e1eae5374bf1Brian      return fragResults[index];
208501ee87180047dd04afc69103c31e1eae5374bf1Brian   }
209501ee87180047dd04afc69103c31e1eae5374bf1Brian}
210501ee87180047dd04afc69103c31e1eae5374bf1Brian
211501ee87180047dd04afc69103c31e1eae5374bf1Brian
212501ee87180047dd04afc69103c31e1eae5374bf1Brian/**
213501ee87180047dd04afc69103c31e1eae5374bf1Brian * Return string representation of the given register.
214501ee87180047dd04afc69103c31e1eae5374bf1Brian * Note that some types of registers (like PROGRAM_UNIFORM) aren't defined
215501ee87180047dd04afc69103c31e1eae5374bf1Brian * by the ARB/NV program languages so we've taken some liberties here.
2161eee1bac1f6d911e6124daafc9b9291666d91cefVinson Lee * \param f  the register file (PROGRAM_INPUT, PROGRAM_TEMPORARY, etc)
217501ee87180047dd04afc69103c31e1eae5374bf1Brian * \param index  number of the register in the register file
218501ee87180047dd04afc69103c31e1eae5374bf1Brian * \param mode  the output format/mode/style
219501ee87180047dd04afc69103c31e1eae5374bf1Brian * \param prog  pointer to containing program
220501ee87180047dd04afc69103c31e1eae5374bf1Brian */
221501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic const char *
222b4026d9be828bd0b6f60158456edf24994efb053Brian Paulreg_string(gl_register_file f, GLint index, gl_prog_print_mode mode,
22319659a50f9356023c59942794bd4e6e075f120bdZack Rusin           GLboolean relAddr, const struct gl_program *prog)
224501ee87180047dd04afc69103c31e1eae5374bf1Brian{
225501ee87180047dd04afc69103c31e1eae5374bf1Brian   static char str[100];
226f88a9015985f1e308496803630221f284a94f397Brian Paul   const char *addr = relAddr ? "ADDR+" : "";
227501ee87180047dd04afc69103c31e1eae5374bf1Brian
228501ee87180047dd04afc69103c31e1eae5374bf1Brian   str[0] = 0;
229501ee87180047dd04afc69103c31e1eae5374bf1Brian
230501ee87180047dd04afc69103c31e1eae5374bf1Brian   switch (mode) {
231501ee87180047dd04afc69103c31e1eae5374bf1Brian   case PROG_PRINT_DEBUG:
232f88a9015985f1e308496803630221f284a94f397Brian Paul      _mesa_sprintf(str, "%s[%s%d]", file_string(f, mode), addr, index);
233501ee87180047dd04afc69103c31e1eae5374bf1Brian      break;
234501ee87180047dd04afc69103c31e1eae5374bf1Brian
235501ee87180047dd04afc69103c31e1eae5374bf1Brian   case PROG_PRINT_ARB:
236501ee87180047dd04afc69103c31e1eae5374bf1Brian      switch (f) {
237501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_INPUT:
23898a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca         _mesa_sprintf(str, "%s", arb_input_attrib_string(index, prog->Target));
239501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
240501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_OUTPUT:
24198a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca         _mesa_sprintf(str, "%s", arb_output_attrib_string(index, prog->Target));
242501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
243501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_TEMPORARY:
24498a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca         _mesa_sprintf(str, "temp%d", index);
245501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
246501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_ENV_PARAM:
247f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "program.env[%s%d]", addr, index);
248501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
249501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_LOCAL_PARAM:
250f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "program.local[%s%d]", addr, index);
251501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
252501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_VARYING: /* extension */
253f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "varying[%s%d]", addr, index);
254501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
255501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_CONSTANT: /* extension */
256f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "constant[%s%d]", addr, index);
257501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
258501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_UNIFORM: /* extension */
259f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "uniform[%s%d]", addr, index);
260501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
261501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_STATE_VAR:
262501ee87180047dd04afc69103c31e1eae5374bf1Brian         {
263501ee87180047dd04afc69103c31e1eae5374bf1Brian            struct gl_program_parameter *param
264501ee87180047dd04afc69103c31e1eae5374bf1Brian               = prog->Parameters->Parameters + index;
2659a64440154319738445e203339156e54232908eeBrian Paul            char *state = _mesa_program_state_string(param->StateIndexes);
26698a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca            _mesa_sprintf(str, state);
2679a64440154319738445e203339156e54232908eeBrian Paul            _mesa_free(state);
268501ee87180047dd04afc69103c31e1eae5374bf1Brian         }
269501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
270501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_ADDRESS:
27198a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca         _mesa_sprintf(str, "A%d", index);
272501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
273501ee87180047dd04afc69103c31e1eae5374bf1Brian      default:
274501ee87180047dd04afc69103c31e1eae5374bf1Brian         _mesa_problem(NULL, "bad file in reg_string()");
275501ee87180047dd04afc69103c31e1eae5374bf1Brian      }
276501ee87180047dd04afc69103c31e1eae5374bf1Brian      break;
277501ee87180047dd04afc69103c31e1eae5374bf1Brian
278501ee87180047dd04afc69103c31e1eae5374bf1Brian   case PROG_PRINT_NV:
279501ee87180047dd04afc69103c31e1eae5374bf1Brian      switch (f) {
280501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_INPUT:
281501ee87180047dd04afc69103c31e1eae5374bf1Brian         if (prog->Target == GL_VERTEX_PROGRAM_ARB)
28298a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca            _mesa_sprintf(str, "v[%d]", index);
283501ee87180047dd04afc69103c31e1eae5374bf1Brian         else
28498a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca            _mesa_sprintf(str, "f[%d]", index);
285501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
286501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_OUTPUT:
28798a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca         _mesa_sprintf(str, "o[%d]", index);
288501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
289501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_TEMPORARY:
29098a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca         _mesa_sprintf(str, "R%d", index);
291501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
292501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_ENV_PARAM:
29398a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca         _mesa_sprintf(str, "c[%d]", index);
294501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
295501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_VARYING: /* extension */
296f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "varying[%s%d]", addr, index);
297501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
298501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_UNIFORM: /* extension */
299f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "uniform[%s%d]", addr, index);
300501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
301501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_CONSTANT: /* extension */
302f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "constant[%s%d]", addr, index);
303501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
304501ee87180047dd04afc69103c31e1eae5374bf1Brian      case PROGRAM_STATE_VAR: /* extension */
305f88a9015985f1e308496803630221f284a94f397Brian Paul         _mesa_sprintf(str, "state[%s%d]", addr, index);
306501ee87180047dd04afc69103c31e1eae5374bf1Brian         break;
307501ee87180047dd04afc69103c31e1eae5374bf1Brian      default:
308501ee87180047dd04afc69103c31e1eae5374bf1Brian         _mesa_problem(NULL, "bad file in reg_string()");
309501ee87180047dd04afc69103c31e1eae5374bf1Brian      }
310501ee87180047dd04afc69103c31e1eae5374bf1Brian      break;
311501ee87180047dd04afc69103c31e1eae5374bf1Brian
312501ee87180047dd04afc69103c31e1eae5374bf1Brian   default:
313501ee87180047dd04afc69103c31e1eae5374bf1Brian      _mesa_problem(NULL, "bad mode in reg_string()");
314501ee87180047dd04afc69103c31e1eae5374bf1Brian   }
315501ee87180047dd04afc69103c31e1eae5374bf1Brian
316501ee87180047dd04afc69103c31e1eae5374bf1Brian   return str;
317501ee87180047dd04afc69103c31e1eae5374bf1Brian}
318501ee87180047dd04afc69103c31e1eae5374bf1Brian
319501ee87180047dd04afc69103c31e1eae5374bf1Brian
320501ee87180047dd04afc69103c31e1eae5374bf1Brian/**
32100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Return a string representation of the given swizzle word.
32200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * If extended is true, use extended (comma-separated) format.
3233a2815370d26012b41d742540237985a333b6ae4Brian * \param swizzle  the swizzle field
3243a2815370d26012b41d742540237985a333b6ae4Brian * \param negateBase  4-bit negation vector
3253a2815370d26012b41d742540237985a333b6ae4Brian * \param extended  if true, also allow 0, 1 values
32600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */
327059376c855cbeb160e98f438a35edb8bd88b8bb2Brianconst char *
3287db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul_mesa_swizzle_string(GLuint swizzle, GLuint negateMask, GLboolean extended)
32900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
33074a19b0abd382574ff583eab81a374acead9254dBrian Paul   static const char swz[] = "xyzw01!?";  /* See SWIZZLE_x definitions */
33100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   static char s[20];
33200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   GLuint i = 0;
33300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
3347db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul   if (!extended && swizzle == SWIZZLE_NOOP && negateMask == 0)
33500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return ""; /* no swizzle/negation */
33600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
33700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (!extended)
33800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = '.';
33900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
3407db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul   if (negateMask & NEGATE_X)
34100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = '-';
34200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   s[i++] = swz[GET_SWZ(swizzle, 0)];
34300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
34400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (extended) {
34500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = ',';
34600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
34700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
3487db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul   if (negateMask & NEGATE_Y)
34900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = '-';
35000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   s[i++] = swz[GET_SWZ(swizzle, 1)];
35100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
35200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (extended) {
35300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = ',';
35400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
35500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
3567db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul   if (negateMask & NEGATE_Z)
35700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = '-';
35800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   s[i++] = swz[GET_SWZ(swizzle, 2)];
35900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
36000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (extended) {
36100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = ',';
36200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
36300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
3647db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul   if (negateMask & NEGATE_W)
36500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = '-';
36600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   s[i++] = swz[GET_SWZ(swizzle, 3)];
36700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
36800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   s[i] = 0;
36900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   return s;
37000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
37100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
37200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
373511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paulvoid
374511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul_mesa_print_swizzle(GLuint swizzle)
375511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul{
376511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul   if (swizzle == SWIZZLE_XYZW) {
377511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul      _mesa_printf(".xyzw\n");
378511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul   }
379511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul   else {
380f9c574d7192d2193ff3e12629a8db1a74b6dbf55Michal Krol      const char *s = _mesa_swizzle_string(swizzle, 0, 0);
381511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul      _mesa_printf("%s\n", s);
382511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul   }
383511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul}
384511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul
385511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul
386610c2461ce0683ca5412e4b2b7a496f67e9d3704Brian Paulconst char *
387610c2461ce0683ca5412e4b2b7a496f67e9d3704Brian Paul_mesa_writemask_string(GLuint writeMask)
38800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
38900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   static char s[10];
39000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   GLuint i = 0;
39100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
39200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (writeMask == WRITEMASK_XYZW)
39300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      return "";
39400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
39500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   s[i++] = '.';
39600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (writeMask & WRITEMASK_X)
39700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = 'x';
39800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (writeMask & WRITEMASK_Y)
39900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = 'y';
40000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (writeMask & WRITEMASK_Z)
40100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = 'z';
40200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (writeMask & WRITEMASK_W)
40300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      s[i++] = 'w';
40400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
40500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   s[i] = 0;
40600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   return s;
40700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
40800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
4093a2815370d26012b41d742540237985a333b6ae4Brian
410d750861dc26e3898afa2b49e3969d709dc227664Brianconst char *
411d750861dc26e3898afa2b49e3969d709dc227664Brian_mesa_condcode_string(GLuint condcode)
4123a2815370d26012b41d742540237985a333b6ae4Brian{
4133a2815370d26012b41d742540237985a333b6ae4Brian   switch (condcode) {
4143a2815370d26012b41d742540237985a333b6ae4Brian   case COND_GT:  return "GT";
4153a2815370d26012b41d742540237985a333b6ae4Brian   case COND_EQ:  return "EQ";
4163a2815370d26012b41d742540237985a333b6ae4Brian   case COND_LT:  return "LT";
4173a2815370d26012b41d742540237985a333b6ae4Brian   case COND_UN:  return "UN";
4183a2815370d26012b41d742540237985a333b6ae4Brian   case COND_GE:  return "GE";
4193a2815370d26012b41d742540237985a333b6ae4Brian   case COND_LE:  return "LE";
4203a2815370d26012b41d742540237985a333b6ae4Brian   case COND_NE:  return "NE";
4213a2815370d26012b41d742540237985a333b6ae4Brian   case COND_TR:  return "TR";
4223a2815370d26012b41d742540237985a333b6ae4Brian   case COND_FL:  return "FL";
4233a2815370d26012b41d742540237985a333b6ae4Brian   default: return "cond???";
4243a2815370d26012b41d742540237985a333b6ae4Brian   }
4253a2815370d26012b41d742540237985a333b6ae4Brian}
4263a2815370d26012b41d742540237985a333b6ae4Brian
4273a2815370d26012b41d742540237985a333b6ae4Brian
42800cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void
429d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_dst_reg(FILE * f,
430d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul               const struct prog_dst_register *dstReg,
431d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul               gl_prog_print_mode mode,
432d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul               const struct gl_program *prog)
43300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
434d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "%s%s",
435b4026d9be828bd0b6f60158456edf24994efb053Brian Paul                 reg_string((gl_register_file) dstReg->File,
436d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            dstReg->Index, mode, dstReg->RelAddr, prog),
437d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                 _mesa_writemask_string(dstReg->WriteMask));
438501ee87180047dd04afc69103c31e1eae5374bf1Brian
4391936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian   if (dstReg->CondMask != COND_TR) {
440d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " (%s.%s)",
441d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                    _mesa_condcode_string(dstReg->CondMask),
442d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                    _mesa_swizzle_string(dstReg->CondSwizzle,
443d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                                         GL_FALSE, GL_FALSE));
4441936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian   }
4451936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian
446501ee87180047dd04afc69103c31e1eae5374bf1Brian#if 0
447d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "%s[%d]%s",
448b4026d9be828bd0b6f60158456edf24994efb053Brian Paul                file_string((gl_register_file) dstReg->File, mode),
44900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian                dstReg->Index,
450610c2461ce0683ca5412e4b2b7a496f67e9d3704Brian Paul                _mesa_writemask_string(dstReg->WriteMask));
451501ee87180047dd04afc69103c31e1eae5374bf1Brian#endif
45200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
45300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
454d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
45500cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void
456d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_src_reg(FILE *f,
457d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul               const struct prog_src_register *srcReg,
458d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul               gl_prog_print_mode mode,
459d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul               const struct gl_program *prog)
46000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
461f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul   const char *abs = srcReg->Abs ? "|" : "";
462f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul
463f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul   _mesa_fprintf(f, "%s%s%s%s",
464f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul                 abs,
465b4026d9be828bd0b6f60158456edf24994efb053Brian Paul                 reg_string((gl_register_file) srcReg->File,
466d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            srcReg->Index, mode, srcReg->RelAddr, prog),
467d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                 _mesa_swizzle_string(srcReg->Swizzle,
4687db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul                                      srcReg->Negate, GL_FALSE),
469f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul                 abs);
470501ee87180047dd04afc69103c31e1eae5374bf1Brian#if 0
471d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "%s[%d]%s",
472b4026d9be828bd0b6f60158456edf24994efb053Brian Paul                 file_string((gl_register_file) srcReg->File, mode),
473d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                 srcReg->Index,
474d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                 _mesa_swizzle_string(srcReg->Swizzle,
4757db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul                                      srcReg->Negate, GL_FALSE));
476501ee87180047dd04afc69103c31e1eae5374bf1Brian#endif
47700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
47800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
479d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
48000cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void
481d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_comment(FILE *f, const struct prog_instruction *inst)
48200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
48300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (inst->Comment)
484d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ";  # %s\n", inst->Comment);
48500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   else
486d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ";\n");
48700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
48800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
48900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
490501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic void
491d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_alu_instruction(FILE *f,
492d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                       const struct prog_instruction *inst,
493d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                       const char *opcode_string, GLuint numRegs,
494d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                       gl_prog_print_mode mode,
495d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                       const struct gl_program *prog)
49600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
49700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   GLuint j;
49800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
499d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "%s", opcode_string);
500b50280e95f3c044f53c0705d3a5619ebb2db4513Brian   if (inst->CondUpdate)
501d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ".C");
50200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
50300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   /* frag prog only */
50400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (inst->SaturateMode == SATURATE_ZERO_ONE)
505d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "_SAT");
50600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
507d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, " ");
50800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (inst->DstReg.File != PROGRAM_UNDEFINED) {
509d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_dst_reg(f, &inst->DstReg, mode, prog);
51000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
51100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   else {
512d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " ???");
51300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
51400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
51500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   if (numRegs > 0)
516d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ", ");
51700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
51800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   for (j = 0; j < numRegs; j++) {
519d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_src_reg(f, inst->SrcReg + j, mode, prog);
52000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      if (j + 1 < numRegs)
521d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul	 _mesa_fprintf(f, ", ");
52200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
52300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
524d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   fprint_comment(f, inst);
5250020d1022f4b5befe4adf783bedc4cf83e09f01fBrian}
5260020d1022f4b5befe4adf783bedc4cf83e09f01fBrian
5270020d1022f4b5befe4adf783bedc4cf83e09f01fBrian
5280020d1022f4b5befe4adf783bedc4cf83e09f01fBrianvoid
5290020d1022f4b5befe4adf783bedc4cf83e09f01fBrian_mesa_print_alu_instruction(const struct prog_instruction *inst,
5300020d1022f4b5befe4adf783bedc4cf83e09f01fBrian                            const char *opcode_string, GLuint numRegs)
5310020d1022f4b5befe4adf783bedc4cf83e09f01fBrian{
53243a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin   fprint_alu_instruction(stderr, inst, opcode_string,
533d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                          numRegs, PROG_PRINT_DEBUG, NULL);
534501ee87180047dd04afc69103c31e1eae5374bf1Brian}
535501ee87180047dd04afc69103c31e1eae5374bf1Brian
536501ee87180047dd04afc69103c31e1eae5374bf1Brian
53700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/**
53800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Print a single vertex/fragment program instruction.
53900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */
540d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulstatic GLint
541d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_instruction_opt(FILE *f,
542d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            const struct prog_instruction *inst,
543d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            GLint indent,
544501ee87180047dd04afc69103c31e1eae5374bf1Brian                            gl_prog_print_mode mode,
545501ee87180047dd04afc69103c31e1eae5374bf1Brian                            const struct gl_program *prog)
54600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
5477b30053b264726156a018c822657270e745320ceBrian   GLint i;
5485db088d70fbd14620c2fc7840096a05993f8e2b9Brian
5495db088d70fbd14620c2fc7840096a05993f8e2b9Brian   if (inst->Opcode == OPCODE_ELSE ||
5505db088d70fbd14620c2fc7840096a05993f8e2b9Brian       inst->Opcode == OPCODE_ENDIF ||
5515db088d70fbd14620c2fc7840096a05993f8e2b9Brian       inst->Opcode == OPCODE_ENDLOOP ||
5525db088d70fbd14620c2fc7840096a05993f8e2b9Brian       inst->Opcode == OPCODE_ENDSUB) {
5535db088d70fbd14620c2fc7840096a05993f8e2b9Brian      indent -= 3;
5545db088d70fbd14620c2fc7840096a05993f8e2b9Brian   }
5555db088d70fbd14620c2fc7840096a05993f8e2b9Brian   for (i = 0; i < indent; i++) {
556d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " ");
5575db088d70fbd14620c2fc7840096a05993f8e2b9Brian   }
5585db088d70fbd14620c2fc7840096a05993f8e2b9Brian
55900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   switch (inst->Opcode) {
56000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_PRINT:
561d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "PRINT '%s'", inst->Data);
56200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) {
563d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, ", ");
564d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "%s[%d]%s",
565b4026d9be828bd0b6f60158456edf24994efb053Brian Paul                      file_string((gl_register_file) inst->SrcReg[0].File,
566501ee87180047dd04afc69103c31e1eae5374bf1Brian                                  mode),
56700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian                      inst->SrcReg[0].Index,
568059376c855cbeb160e98f438a35edb8bd88b8bb2Brian                      _mesa_swizzle_string(inst->SrcReg[0].Swizzle,
5697db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul                                           inst->SrcReg[0].Negate, GL_FALSE));
57000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      }
57100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      if (inst->Comment)
572d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "  # %s", inst->Comment);
573d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
57400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      break;
57500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_SWZ:
576d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "SWZ");
57700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      if (inst->SaturateMode == SATURATE_ZERO_ONE)
578d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "_SAT");
579d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " ");
580d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_dst_reg(f, &inst->DstReg, mode, prog);
581d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ", %s[%d], %s",
582b4026d9be828bd0b6f60158456edf24994efb053Brian Paul                   file_string((gl_register_file) inst->SrcReg[0].File,
583501ee87180047dd04afc69103c31e1eae5374bf1Brian                               mode),
58400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian                   inst->SrcReg[0].Index,
585059376c855cbeb160e98f438a35edb8bd88b8bb2Brian                   _mesa_swizzle_string(inst->SrcReg[0].Swizzle,
5867db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul                                        inst->SrcReg[0].Negate, GL_TRUE));
587d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
58800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      break;
58900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_TEX:
59000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_TXP:
5914b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul   case OPCODE_TXL:
59200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_TXB:
593d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "%s", _mesa_opcode_string(inst->Opcode));
59400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      if (inst->SaturateMode == SATURATE_ZERO_ONE)
595d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "_SAT");
596d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " ");
597d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_dst_reg(f, &inst->DstReg, mode, prog);
598d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ", ");
599d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_src_reg(f, &inst->SrcReg[0], mode, prog);
600d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ", texture[%d], ", inst->TexSrcUnit);
60100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      switch (inst->TexSrcTarget) {
602d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      case TEXTURE_1D_INDEX:   _mesa_fprintf(f, "1D");    break;
603d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      case TEXTURE_2D_INDEX:   _mesa_fprintf(f, "2D");    break;
604d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      case TEXTURE_3D_INDEX:   _mesa_fprintf(f, "3D");    break;
605d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      case TEXTURE_CUBE_INDEX: _mesa_fprintf(f, "CUBE");  break;
606d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      case TEXTURE_RECT_INDEX: _mesa_fprintf(f, "RECT");  break;
60700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      default:
60800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian         ;
60900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      }
61044e018c09e7aeba9fd9f4c380da224bd6622c470Brian Paul      if (inst->TexShadow)
61144e018c09e7aeba9fd9f4c380da224bd6622c470Brian Paul         _mesa_fprintf(f, " SHADOW");
612d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
61300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      break;
6144b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul
6154b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul   case OPCODE_KIL:
616d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "%s", _mesa_opcode_string(inst->Opcode));
617d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " ");
618d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_src_reg(f, &inst->SrcReg[0], mode, prog);
619d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
6204b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul      break;
6214b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul   case OPCODE_KIL_NV:
622d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "%s", _mesa_opcode_string(inst->Opcode));
623d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " ");
624d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "%s.%s",
6254b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul                   _mesa_condcode_string(inst->DstReg.CondMask),
6264b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul                   _mesa_swizzle_string(inst->DstReg.CondSwizzle,
6274b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul                                        GL_FALSE, GL_FALSE));
628d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
6294b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul      break;
6304b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul
63100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_ARL:
632d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "ARL ");
633d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_dst_reg(f, &inst->DstReg, mode, prog);
634d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, ", ");
635d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_src_reg(f, &inst->SrcReg[0], mode, prog);
636d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
63700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      break;
63800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_BRA:
639d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "BRA %d (%s%s)",
6403a2815370d26012b41d742540237985a333b6ae4Brian                   inst->BranchTarget,
641d750861dc26e3898afa2b49e3969d709dc227664Brian                   _mesa_condcode_string(inst->DstReg.CondMask),
642059376c855cbeb160e98f438a35edb8bd88b8bb2Brian                   _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE));
643d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
64400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      break;
6455ae49cf3ed53fda6a904d7e90feef78495ae6903Brian   case OPCODE_IF:
64663556fa9949f543a8134b6b5ff3d216acb71dd9fBrian      if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) {
64763556fa9949f543a8134b6b5ff3d216acb71dd9fBrian         /* Use ordinary register */
648d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "IF ");
649d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         fprint_src_reg(f, &inst->SrcReg[0], mode, prog);
650d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "; ");
65163556fa9949f543a8134b6b5ff3d216acb71dd9fBrian      }
65263556fa9949f543a8134b6b5ff3d216acb71dd9fBrian      else {
65363556fa9949f543a8134b6b5ff3d216acb71dd9fBrian         /* Use cond codes */
654d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "IF (%s%s);",
655d750861dc26e3898afa2b49e3969d709dc227664Brian                      _mesa_condcode_string(inst->DstReg.CondMask),
65663556fa9949f543a8134b6b5ff3d216acb71dd9fBrian                      _mesa_swizzle_string(inst->DstReg.CondSwizzle,
65763556fa9949f543a8134b6b5ff3d216acb71dd9fBrian                                           0, GL_FALSE));
65863556fa9949f543a8134b6b5ff3d216acb71dd9fBrian      }
659d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, " # (if false, goto %d)", inst->BranchTarget);
660d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
6615db088d70fbd14620c2fc7840096a05993f8e2b9Brian      return indent + 3;
6625ae49cf3ed53fda6a904d7e90feef78495ae6903Brian   case OPCODE_ELSE:
663d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "ELSE; # (goto %d)\n", inst->BranchTarget);
6645db088d70fbd14620c2fc7840096a05993f8e2b9Brian      return indent + 3;
6655ae49cf3ed53fda6a904d7e90feef78495ae6903Brian   case OPCODE_ENDIF:
666d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "ENDIF;\n");
6675db088d70fbd14620c2fc7840096a05993f8e2b9Brian      break;
6685db088d70fbd14620c2fc7840096a05993f8e2b9Brian   case OPCODE_BGNLOOP:
669d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "BGNLOOP; # (end at %d)\n", inst->BranchTarget);
6705db088d70fbd14620c2fc7840096a05993f8e2b9Brian      return indent + 3;
6715db088d70fbd14620c2fc7840096a05993f8e2b9Brian   case OPCODE_ENDLOOP:
672d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "ENDLOOP; # (goto %d)\n", inst->BranchTarget);
6735db088d70fbd14620c2fc7840096a05993f8e2b9Brian      break;
6745db088d70fbd14620c2fc7840096a05993f8e2b9Brian   case OPCODE_BRK:
675f22ed0986a743e033d827c78371612c7115ff913Brian   case OPCODE_CONT:
676d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "%s (%s%s); # (goto %d)",
67781767eead9e1b1b5d5dfd274c0875fa1332a5983Brian                   _mesa_opcode_string(inst->Opcode),
678d750861dc26e3898afa2b49e3969d709dc227664Brian                   _mesa_condcode_string(inst->DstReg.CondMask),
679059376c855cbeb160e98f438a35edb8bd88b8bb2Brian                   _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE),
6802755c798f3cb89fcd4ece16cd740af1cd86a6b99Brian                   inst->BranchTarget);
681d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
6825db088d70fbd14620c2fc7840096a05993f8e2b9Brian      break;
68363556fa9949f543a8134b6b5ff3d216acb71dd9fBrian
6845db088d70fbd14620c2fc7840096a05993f8e2b9Brian   case OPCODE_BGNSUB:
685f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      if (mode == PROG_PRINT_NV) {
686d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "%s:\n", inst->Comment); /* comment is label */
687f407cada8aa0bfea1b8dfae766392162c702aaa4Brian         return indent;
688f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      }
689f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      else {
690d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "BGNSUB");
691d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         fprint_comment(f, inst);
692f407cada8aa0bfea1b8dfae766392162c702aaa4Brian         return indent + 3;
693f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      }
6945db088d70fbd14620c2fc7840096a05993f8e2b9Brian   case OPCODE_ENDSUB:
695f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      if (mode == PROG_PRINT_DEBUG) {
696d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "ENDSUB");
697d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         fprint_comment(f, inst);
698f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      }
699f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      break;
700f407cada8aa0bfea1b8dfae766392162c702aaa4Brian   case OPCODE_CAL:
701f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      if (mode == PROG_PRINT_NV) {
702d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "CAL %s;  # (goto %d)\n", inst->Comment, inst->BranchTarget);
703f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      }
704f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      else {
705d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "CAL %u", inst->BranchTarget);
706d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         fprint_comment(f, inst);
707f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      }
708f407cada8aa0bfea1b8dfae766392162c702aaa4Brian      break;
709f407cada8aa0bfea1b8dfae766392162c702aaa4Brian   case OPCODE_RET:
710d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "RET (%s%s)",
711d750861dc26e3898afa2b49e3969d709dc227664Brian                   _mesa_condcode_string(inst->DstReg.CondMask),
712d750861dc26e3898afa2b49e3969d709dc227664Brian                   _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE));
713d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprint_comment(f, inst);
7145ae49cf3ed53fda6a904d7e90feef78495ae6903Brian      break;
715f407cada8aa0bfea1b8dfae766392162c702aaa4Brian
71600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   case OPCODE_END:
717d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "END\n");
71800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      break;
7193a2815370d26012b41d742540237985a333b6ae4Brian   case OPCODE_NOP:
720059376c855cbeb160e98f438a35edb8bd88b8bb2Brian      if (mode == PROG_PRINT_DEBUG) {
721d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "NOP");
722d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         fprint_comment(f, inst);
723059376c855cbeb160e98f438a35edb8bd88b8bb2Brian      }
724059376c855cbeb160e98f438a35edb8bd88b8bb2Brian      else if (inst->Comment) {
725059376c855cbeb160e98f438a35edb8bd88b8bb2Brian         /* ARB/NV extensions don't have NOP instruction */
726d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "# %s\n", inst->Comment);
727059376c855cbeb160e98f438a35edb8bd88b8bb2Brian      }
7283a2815370d26012b41d742540237985a333b6ae4Brian      break;
72900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   /* XXX may need other special-case instructions */
73000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   default:
731f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul      if (inst->Opcode < MAX_OPCODE) {
732f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul         /* typical alu instruction */
733f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul         fprint_alu_instruction(f, inst,
734f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul                                _mesa_opcode_string(inst->Opcode),
735f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul                                _mesa_num_inst_src_regs(inst->Opcode),
736f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul                                mode, prog);
737f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul      }
738f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul      else {
739f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul         _mesa_fprintf(f, "Other opcode %d\n", inst->Opcode);
740f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul      }
74100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      break;
74200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
7435db088d70fbd14620c2fc7840096a05993f8e2b9Brian   return indent;
74400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
74500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
74600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
747d0038930312f96468a9159a1221c3f4c56bddaa4Brian PaulGLint
748d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_instruction_opt(const struct prog_instruction *inst,
749d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            GLint indent,
750d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            gl_prog_print_mode mode,
751d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            const struct gl_program *prog)
752d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{
75343a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin   return _mesa_fprint_instruction_opt(stderr, inst, indent, mode, prog);
754d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul}
755d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
756d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
75700cdc0a472c55330cbc58317f01b07f8f90be5a5Brianvoid
758d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_instruction(const struct prog_instruction *inst)
75900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
760d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   /* note: 4th param should be ignored for PROG_PRINT_DEBUG */
76143a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin   _mesa_fprint_instruction_opt(stderr, inst, 0, PROG_PRINT_DEBUG, NULL);
762501ee87180047dd04afc69103c31e1eae5374bf1Brian}
763501ee87180047dd04afc69103c31e1eae5374bf1Brian
764501ee87180047dd04afc69103c31e1eae5374bf1Brian
765d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
766501ee87180047dd04afc69103c31e1eae5374bf1Brian/**
767501ee87180047dd04afc69103c31e1eae5374bf1Brian * Print program, with options.
768501ee87180047dd04afc69103c31e1eae5374bf1Brian */
769d2eff33ab7fda9527458ea35d9eb109ec2988490Brian Paulvoid
770d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_program_opt(FILE *f,
771d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                         const struct gl_program *prog,
772d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                         gl_prog_print_mode mode,
773d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                         GLboolean lineNumbers)
774501ee87180047dd04afc69103c31e1eae5374bf1Brian{
7755db088d70fbd14620c2fc7840096a05993f8e2b9Brian   GLuint i, indent = 0;
776501ee87180047dd04afc69103c31e1eae5374bf1Brian
777501ee87180047dd04afc69103c31e1eae5374bf1Brian   switch (prog->Target) {
778501ee87180047dd04afc69103c31e1eae5374bf1Brian   case GL_VERTEX_PROGRAM_ARB:
779501ee87180047dd04afc69103c31e1eae5374bf1Brian      if (mode == PROG_PRINT_ARB)
780d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "!!ARBvp1.0\n");
781501ee87180047dd04afc69103c31e1eae5374bf1Brian      else if (mode == PROG_PRINT_NV)
782d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "!!VP1.0\n");
783501ee87180047dd04afc69103c31e1eae5374bf1Brian      else
784d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "# Vertex Program/Shader\n");
785501ee87180047dd04afc69103c31e1eae5374bf1Brian      break;
786501ee87180047dd04afc69103c31e1eae5374bf1Brian   case GL_FRAGMENT_PROGRAM_ARB:
787501ee87180047dd04afc69103c31e1eae5374bf1Brian   case GL_FRAGMENT_PROGRAM_NV:
788501ee87180047dd04afc69103c31e1eae5374bf1Brian      if (mode == PROG_PRINT_ARB)
789d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "!!ARBfp1.0\n");
790501ee87180047dd04afc69103c31e1eae5374bf1Brian      else if (mode == PROG_PRINT_NV)
791d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "!!FP1.0\n");
792501ee87180047dd04afc69103c31e1eae5374bf1Brian      else
793d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "# Fragment Program/Shader\n");
794501ee87180047dd04afc69103c31e1eae5374bf1Brian      break;
795501ee87180047dd04afc69103c31e1eae5374bf1Brian   }
796501ee87180047dd04afc69103c31e1eae5374bf1Brian
79700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   for (i = 0; i < prog->NumInstructions; i++) {
798501ee87180047dd04afc69103c31e1eae5374bf1Brian      if (lineNumbers)
799d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, "%3d: ", i);
800d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      indent = _mesa_fprint_instruction_opt(f, prog->Instructions + i,
801501ee87180047dd04afc69103c31e1eae5374bf1Brian                                           indent, mode, prog);
80200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
80300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
80400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
80500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
80600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/**
80743a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin * Print program to stderr, default options.
80800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */
80900cdc0a472c55330cbc58317f01b07f8f90be5a5Brianvoid
810d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_program(const struct gl_program *prog)
811d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{
81243a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin   _mesa_fprint_program_opt(stderr, prog, PROG_PRINT_DEBUG, GL_TRUE);
813d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul}
814d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
815d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
816d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/**
817d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print all of a program's parameters/fields to given file.
818d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */
819d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulstatic void
820d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_program_parameters(FILE *f,
821d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                                GLcontext *ctx,
822d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                                const struct gl_program *prog)
82300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{
8244b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul   GLuint i;
8254b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul
826d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "InputsRead: 0x%x\n", prog->InputsRead);
827d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "OutputsWritten: 0x%x\n", prog->OutputsWritten);
828d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "NumInstructions=%d\n", prog->NumInstructions);
829d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "NumTemporaries=%d\n", prog->NumTemporaries);
830d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "NumParameters=%d\n", prog->NumParameters);
831d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "NumAttributes=%d\n", prog->NumAttributes);
832d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "NumAddressRegs=%d\n", prog->NumAddressRegs);
833d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "Samplers=[ ");
8344b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul   for (i = 0; i < MAX_SAMPLERS; i++) {
835d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "%d ", prog->SamplerUnits[i]);
8364b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul   }
837d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "]\n");
8384b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul
83900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   _mesa_load_state_parameters(ctx, prog->Parameters);
8404b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul
84100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#if 0
842d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "Local Params:\n");
84300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   for (i = 0; i < MAX_PROGRAM_LOCAL_PARAMS; i++){
84400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian      const GLfloat *p = prog->LocalParams[i];
845d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "%2d: %f, %f, %f, %f\n", i, p[0], p[1], p[2], p[3]);
84600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
84700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#endif
84883ca3ff384ac09524ff6946134cded4174590d92Brian   _mesa_print_parameter_list(prog->Parameters);
84983ca3ff384ac09524ff6946134cded4174590d92Brian}
85083ca3ff384ac09524ff6946134cded4174590d92Brian
85100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian
852d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/**
85343a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin * Print all of a program's parameters/fields to stderr.
854d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */
85583ca3ff384ac09524ff6946134cded4174590d92Brianvoid
856d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_program_parameters(GLcontext *ctx, const struct gl_program *prog)
857d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{
85843a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin   _mesa_fprint_program_parameters(stderr, ctx, prog);
859d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul}
860d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
861d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
862d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/**
863d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print a program parameter list to given file.
864d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */
865d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulstatic void
866d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_parameter_list(FILE *f,
867d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul                            const struct gl_program_parameter_list *list)
86883ca3ff384ac09524ff6946134cded4174590d92Brian{
869501ee87180047dd04afc69103c31e1eae5374bf1Brian   const gl_prog_print_mode mode = PROG_PRINT_DEBUG;
87083ca3ff384ac09524ff6946134cded4174590d92Brian   GLuint i;
871501ee87180047dd04afc69103c31e1eae5374bf1Brian
8724b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul   if (!list)
8734b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul      return;
8744b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul
875d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   _mesa_fprintf(f, "param list %p\n", (void *) list);
876ac1fc3f46511a449c812651dda686d4aaac39753Brian Paul   _mesa_fprintf(f, "dirty state flags: 0x%x\n", list->StateFlags);
87783ca3ff384ac09524ff6946134cded4174590d92Brian   for (i = 0; i < list->NumParameters; i++){
87883ca3ff384ac09524ff6946134cded4174590d92Brian      struct gl_program_parameter *param = list->Parameters + i;
87983ca3ff384ac09524ff6946134cded4174590d92Brian      const GLfloat *v = list->ParameterValues[i];
880d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "param[%d] sz=%d %s %s = {%.3g, %.3g, %.3g, %.3g}",
88183ca3ff384ac09524ff6946134cded4174590d92Brian                   i, param->Size,
882501ee87180047dd04afc69103c31e1eae5374bf1Brian                   file_string(list->Parameters[i].Type, mode),
88300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian                   param->Name, v[0], v[1], v[2], v[3]);
884f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul      if (param->Flags & PROG_PARAM_BIT_CENTROID)
885d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, " Centroid");
886f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul      if (param->Flags & PROG_PARAM_BIT_INVARIANT)
887d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, " Invariant");
888f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul      if (param->Flags & PROG_PARAM_BIT_FLAT)
889d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, " Flat");
890f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul      if (param->Flags & PROG_PARAM_BIT_LINEAR)
891d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul         _mesa_fprintf(f, " Linear");
892d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprintf(f, "\n");
893d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   }
894d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul}
895d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
896d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
897d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/**
89843a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin * Print a program parameter list to stderr.
899d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */
900d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulvoid
901d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_parameter_list(const struct gl_program_parameter_list *list)
902d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{
90343a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin   _mesa_fprint_parameter_list(stderr, list);
904d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul}
905d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
906d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
907d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/**
908d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Write shader and associated info to a file.
909d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */
910d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulvoid
911d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_write_shader_to_file(const struct gl_shader *shader)
912d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{
913d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   const char *type;
914d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   char filename[100];
915d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   FILE *f;
916d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
917d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   if (shader->Type == GL_FRAGMENT_SHADER)
918d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      type = "frag";
919d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   else
920d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      type = "vert";
921d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
9223c1ce2d64919e0fb9b28f0697addb87708f4f6edBrian Paul   _mesa_snprintf(filename, sizeof(filename), "shader_%u.%s", shader->Name, type);
923d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   f = fopen(filename, "w");
924d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   if (!f) {
925d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprintf(stderr, "Unable to open %s for writing\n", filename);
926d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      return;
92700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian   }
928d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
929d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   fprintf(f, "/* Shader %u source */\n", shader->Name);
930d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   fputs(shader->Source, f);
931d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   fprintf(f, "\n");
932d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
933d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   fprintf(f, "/* Compile status: %s */\n",
934d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul           shader->CompileStatus ? "ok" : "fail");
935d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   if (!shader->CompileStatus) {
936d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprintf(f, "/* Log Info: */\n");
937d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fputs(shader->InfoLog, f);
938d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   }
939d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   else {
940d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      fprintf(f, "/* GPU code */\n");
9416ce0c6e743b27cc284e8f164585cfe5892cd662aBrian Paul      fprintf(f, "/*\n");
942d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul      _mesa_fprint_program_opt(f, shader->Program, PROG_PRINT_DEBUG, GL_TRUE);
9436ce0c6e743b27cc284e8f164585cfe5892cd662aBrian Paul      fprintf(f, "*/\n");
944d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   }
945d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
946d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul   fclose(f);
94700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}
948d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
949d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul
950