prog_print.c revision f787baff80235e8f90a72d43d4372b1ac977f161
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 * 46501ee87180047dd04afc69103c31e1eae5374bf1Brianfile_string(enum 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. 216501ee87180047dd04afc69103c31e1eae5374bf1Brian * \param file 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 * 222501ee87180047dd04afc69103c31e1eae5374bf1Brianreg_string(enum 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 * 328059376c855cbeb160e98f438a35edb8bd88b8bb2Brian_mesa_swizzle_string(GLuint swizzle, GLuint negateBase, GLboolean extended) 32900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 33074a19b0abd382574ff583eab81a374acead9254dBrian Paul static const char swz[] = "xyzw01!?"; /* See SWIZZLE_x definitions */ 33100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian static char s[20]; 33200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint i = 0; 33300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 33400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (!extended && swizzle == SWIZZLE_NOOP && negateBase == 0) 33500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return ""; /* no swizzle/negation */ 33600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 33700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (!extended) 33800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '.'; 33900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3404b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul if (negateBase & NEGATE_X) 34100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 34200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 0)]; 34300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 34400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (extended) { 34500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = ','; 34600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 34700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3484b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul if (negateBase & NEGATE_Y) 34900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 35000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 1)]; 35100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 35200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (extended) { 35300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = ','; 35400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 35500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3564b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul if (negateBase & NEGATE_Z) 35700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 35800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 2)]; 35900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 36000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (extended) { 36100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = ','; 36200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 36300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3644b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul if (negateBase & 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", 435d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul reg_string((enum 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", 448501ee87180047dd04afc69103c31e1eae5374bf1Brian file_string((enum 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, 465d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul reg_string((enum register_file) srcReg->File, 466d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul srcReg->Index, mode, srcReg->RelAddr, prog), 467d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_swizzle_string(srcReg->Swizzle, 468f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul srcReg->NegateBase, GL_FALSE), 469f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul abs); 470501ee87180047dd04afc69103c31e1eae5374bf1Brian#if 0 471d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprintf(f, "%s[%d]%s", 472d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul file_string((enum register_file) srcReg->File, mode), 473d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul srcReg->Index, 474d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_swizzle_string(srcReg->Swizzle, 475d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul srcReg->NegateBase, 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{ 532d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_alu_instruction(stdout, 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", 565501ee87180047dd04afc69103c31e1eae5374bf1Brian file_string((enum register_file) inst->SrcReg[0].File, 566501ee87180047dd04afc69103c31e1eae5374bf1Brian mode), 56700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian inst->SrcReg[0].Index, 568059376c855cbeb160e98f438a35edb8bd88b8bb2Brian _mesa_swizzle_string(inst->SrcReg[0].Swizzle, 569059376c855cbeb160e98f438a35edb8bd88b8bb2Brian inst->SrcReg[0].NegateBase, 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", 582501ee87180047dd04afc69103c31e1eae5374bf1Brian file_string((enum register_file) inst->SrcReg[0].File, 583501ee87180047dd04afc69103c31e1eae5374bf1Brian mode), 58400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian inst->SrcReg[0].Index, 585059376c855cbeb160e98f438a35edb8bd88b8bb2Brian _mesa_swizzle_string(inst->SrcReg[0].Swizzle, 586059376c855cbeb160e98f438a35edb8bd88b8bb2Brian inst->SrcReg[0].NegateBase, 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{ 753d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul return _mesa_fprint_instruction_opt(stdout, 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 */ 761d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprint_instruction_opt(stdout, 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/** 807d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print program to stdout, default options. 80800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 80900cdc0a472c55330cbc58317f01b07f8f90be5a5Brianvoid 810d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_program(const struct gl_program *prog) 811d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 812d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprint_program_opt(stdout, 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/** 853d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print all of a program's parameters/fields to stdout. 854d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 85583ca3ff384ac09524ff6946134cded4174590d92Brianvoid 856d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_program_parameters(GLcontext *ctx, const struct gl_program *prog) 857d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 858d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprint_program_parameters(stdout, 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); 87683ca3ff384ac09524ff6946134cded4174590d92Brian for (i = 0; i < list->NumParameters; i++){ 87783ca3ff384ac09524ff6946134cded4174590d92Brian struct gl_program_parameter *param = list->Parameters + i; 87883ca3ff384ac09524ff6946134cded4174590d92Brian const GLfloat *v = list->ParameterValues[i]; 879d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprintf(f, "param[%d] sz=%d %s %s = {%.3g, %.3g, %.3g, %.3g}", 88083ca3ff384ac09524ff6946134cded4174590d92Brian i, param->Size, 881501ee87180047dd04afc69103c31e1eae5374bf1Brian file_string(list->Parameters[i].Type, mode), 88200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian param->Name, v[0], v[1], v[2], v[3]); 883f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_CENTROID) 884d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprintf(f, " Centroid"); 885f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_INVARIANT) 886d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprintf(f, " Invariant"); 887f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_FLAT) 888d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprintf(f, " Flat"); 889f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_LINEAR) 890d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprintf(f, " Linear"); 891d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprintf(f, "\n"); 892d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul } 893d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 894d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 895d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 896d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 897d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print a program parameter list to stdout. 898d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 899d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulvoid 900d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_parameter_list(const struct gl_program_parameter_list *list) 901d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 902d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprint_parameter_list(stdout, list); 903d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 904d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 905d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 906d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 907d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Write shader and associated info to a file. 908d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 909d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulvoid 910d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_write_shader_to_file(const struct gl_shader *shader) 911d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 912d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const char *type; 913d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul char filename[100]; 914d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul FILE *f; 915d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 916d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul if (shader->Type == GL_FRAGMENT_SHADER) 917d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul type = "frag"; 918d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul else 919d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul type = "vert"; 920d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 92198a053cfd4b5bcb6d704f1282892e99bb2052c5fJosé Fonseca _mesa_snprintf(filename, strlen(filename), "shader_%u.%s", shader->Name, type); 922d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul f = fopen(filename, "w"); 923d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul if (!f) { 924d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(stderr, "Unable to open %s for writing\n", filename); 925d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul return; 92600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 927d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 928d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "/* Shader %u source */\n", shader->Name); 929d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fputs(shader->Source, f); 930d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "\n"); 931d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 932d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "/* Compile status: %s */\n", 933d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul shader->CompileStatus ? "ok" : "fail"); 934d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul if (!shader->CompileStatus) { 935d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "/* Log Info: */\n"); 936d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fputs(shader->InfoLog, f); 937d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul } 938d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul else { 939d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "/* GPU code */\n"); 9406ce0c6e743b27cc284e8f164585cfe5892cd662aBrian Paul fprintf(f, "/*\n"); 941d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprint_program_opt(f, shader->Program, PROG_PRINT_DEBUG, GL_TRUE); 9426ce0c6e743b27cc284e8f164585cfe5892cd662aBrian Paul fprintf(f, "*/\n"); 943d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul } 944d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 945d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fclose(f); 94600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 947d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 948d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 949