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