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 32df2d81ea59993a77bd1f1ef96c5cf19ac692d5f7Brian Paul#include <inttypes.h> /* for PRIx64 macro */ 33df2d81ea59993a77bd1f1ef96c5cf19ac692d5f7Brian Paul 34bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/glheader.h" 35bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/context.h" 36bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/imports.h" 3700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_instruction.h" 3800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_parameter.h" 3900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_print.h" 4000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_statevars.h" 4100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 43501ee87180047dd04afc69103c31e1eae5374bf1Brian 4400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 4500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Return string name for given program/register file. 4600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 47b8dacaf174517d3efa32711e0f85f8b861d0846bBrian Paulconst char * 48b8dacaf174517d3efa32711e0f85f8b861d0846bBrian Paul_mesa_register_file_name(gl_register_file f) 4900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 5000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (f) { 5100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_TEMPORARY: 5200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "TEMP"; 5300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_LOCAL_PARAM: 5400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "LOCAL"; 5500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_ENV_PARAM: 5600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "ENV"; 5700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_STATE_VAR: 5800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "STATE"; 5900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_INPUT: 6000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "INPUT"; 6100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_OUTPUT: 6200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "OUTPUT"; 6300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_NAMED_PARAM: 6400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "NAMED"; 6500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_CONSTANT: 6600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "CONST"; 6700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_UNIFORM: 6800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "UNIFORM"; 6900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_VARYING: 7000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "VARYING"; 7100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_WRITE_ONLY: 7200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "WRITE_ONLY"; 7300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_ADDRESS: 7400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "ADDR"; 75b2ab693d68f2ba1358b9c3f8bab53b9ebfb586feBrian case PROGRAM_SAMPLER: 76b2ab693d68f2ba1358b9c3f8bab53b9ebfb586feBrian return "SAMPLER"; 77379332f629153220614e651225b0521cd64c98b9Brian Paul case PROGRAM_SYSTEM_VALUE: 78379332f629153220614e651225b0521cd64c98b9Brian Paul return "SYSVAL"; 79bc7d2c4f51c56787b261e6ab6f9a77d39c3493e1Brian Paul case PROGRAM_UNDEFINED: 80bc7d2c4f51c56787b261e6ab6f9a77d39c3493e1Brian Paul return "UNDEFINED"; 8100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 827c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul { 837c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul static char s[20]; 8478a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul _mesa_snprintf(s, sizeof(s), "FILE%u", f); 857c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul return s; 867c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul } 8700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 8800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 8900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 9000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 9100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 92501ee87180047dd04afc69103c31e1eae5374bf1Brian * Return ARB_v/f_prog-style input attrib string. 93501ee87180047dd04afc69103c31e1eae5374bf1Brian */ 94501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic const char * 95501ee87180047dd04afc69103c31e1eae5374bf1Brianarb_input_attrib_string(GLint index, GLenum progType) 96501ee87180047dd04afc69103c31e1eae5374bf1Brian{ 97a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul /* 98a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul * These strings should match the VERT_ATTRIB_x and FRAG_ATTRIB_x tokens. 99a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul */ 100f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled static const char *const vertAttribs[] = { 101501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.position", 102501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.weight", 103501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.normal", 104501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.color.primary", 105501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.color.secondary", 106501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.fogcoord", 107f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "vertex.(six)", /* VERT_ATTRIB_COLOR_INDEX */ 108f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "vertex.(seven)", /* VERT_ATTRIB_EDGEFLAG */ 109501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.texcoord[0]", 110501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.texcoord[1]", 111501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.texcoord[2]", 112501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.texcoord[3]", 113501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.texcoord[4]", 114501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.texcoord[5]", 115501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.texcoord[6]", 116d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.texcoord[7]", 117f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "vertex.(sixteen)", /* VERT_ATTRIB_POINT_SIZE */ 118d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[0]", 119d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[1]", 120d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[2]", 121d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[3]", 122d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[4]", 123d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[5]", 124d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[6]", 125d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[7]", 126d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[8]", 127d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[9]", 128d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[10]", 129d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[11]", 130d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[12]", 131d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[13]", 132d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[14]", 133f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "vertex.attrib[15]" /* MAX_VARYING = 16 */ 134501ee87180047dd04afc69103c31e1eae5374bf1Brian }; 135f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled static const char *const fragAttribs[] = { 136501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.position", 137501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.color.primary", 138501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.color.secondary", 139501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.fogcoord", 140501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[0]", 141501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[1]", 142501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[2]", 143501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[3]", 144501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[4]", 145501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[5]", 146501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[6]", 147501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[7]", 148f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "fragment.(twelve)", /* FRAG_ATTRIB_FACE */ 149f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "fragment.(thirteen)", /* FRAG_ATTRIB_PNTC */ 150f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "fragment.(fourteen)", /* FRAG_ATTRIB_CLIP_DIST0 */ 151f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "fragment.(fifteen)", /* FRAG_ATTRIB_CLIP_DIST1 */ 152501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[0]", 153501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[1]", 154501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[2]", 155501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[3]", 156501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[4]", 157501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[5]", 158501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[6]", 159f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "fragment.varying[7]", 160f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "fragment.varying[8]", 161f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "fragment.varying[9]", 162f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "fragment.varying[10]", 163f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "fragment.varying[11]", 164f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "fragment.varying[12]", 165f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "fragment.varying[13]", 166f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "fragment.varying[14]", 1678ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[15]", 1688ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[16]", 1698ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[17]", 1708ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[18]", 1718ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[19]", 1728ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[20]", 1738ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[21]", 1748ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[22]", 1758ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[23]", 1768ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[24]", 1778ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[25]", 1788ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[26]", 1798ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[27]", 1808ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[28]", 1818ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[29]", 1828ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[30]", 1838ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "fragment.varying[31]", /* MAX_VARYING = 32 */ 184501ee87180047dd04afc69103c31e1eae5374bf1Brian }; 185501ee87180047dd04afc69103c31e1eae5374bf1Brian 18612ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul /* sanity checks */ 187f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled STATIC_ASSERT(Elements(vertAttribs) == VERT_ATTRIB_MAX); 188f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled STATIC_ASSERT(Elements(fragAttribs) == FRAG_ATTRIB_MAX); 18912ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul assert(strcmp(vertAttribs[VERT_ATTRIB_TEX0], "vertex.texcoord[0]") == 0); 19012ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul assert(strcmp(vertAttribs[VERT_ATTRIB_GENERIC15], "vertex.attrib[15]") == 0); 191f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled assert(strcmp(fragAttribs[FRAG_ATTRIB_TEX0], "fragment.texcoord[0]") == 0); 192f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled assert(strcmp(fragAttribs[FRAG_ATTRIB_VAR0+15], "fragment.varying[15]") == 0); 19312ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul 194501ee87180047dd04afc69103c31e1eae5374bf1Brian if (progType == GL_VERTEX_PROGRAM_ARB) { 195529fa775293ddd24e389f2ea6a43bd18f01a1609Brian Paul assert(index < Elements(vertAttribs)); 196501ee87180047dd04afc69103c31e1eae5374bf1Brian return vertAttribs[index]; 197501ee87180047dd04afc69103c31e1eae5374bf1Brian } 198501ee87180047dd04afc69103c31e1eae5374bf1Brian else { 199f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled assert(progType == GL_FRAGMENT_PROGRAM_ARB); 200529fa775293ddd24e389f2ea6a43bd18f01a1609Brian Paul assert(index < Elements(fragAttribs)); 201501ee87180047dd04afc69103c31e1eae5374bf1Brian return fragAttribs[index]; 202501ee87180047dd04afc69103c31e1eae5374bf1Brian } 203501ee87180047dd04afc69103c31e1eae5374bf1Brian} 204501ee87180047dd04afc69103c31e1eae5374bf1Brian 205501ee87180047dd04afc69103c31e1eae5374bf1Brian 206501ee87180047dd04afc69103c31e1eae5374bf1Brian/** 20712ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul * Print a vertex program's InputsRead field in human-readable format. 20812ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul * For debugging. 20912ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul */ 21012ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paulvoid 21112ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul_mesa_print_vp_inputs(GLbitfield inputs) 21212ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul{ 213298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("VP Inputs 0x%x: \n", inputs); 21412ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul while (inputs) { 2159a548c27aa704236cc1d8a5d4ebf68cea9c5c99cBrian Paul GLint attr = ffs(inputs) - 1; 21612ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul const char *name = arb_input_attrib_string(attr, 21712ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul GL_VERTEX_PROGRAM_ARB); 218298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" %d: %s\n", attr, name); 21912ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul inputs &= ~(1 << attr); 22012ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul } 22112ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul} 22212ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul 22312ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul 22412ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul/** 22512ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul * Print a fragment program's InputsRead field in human-readable format. 22612ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul * For debugging. 22712ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul */ 22812ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paulvoid 22912ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul_mesa_print_fp_inputs(GLbitfield inputs) 23012ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul{ 231298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("FP Inputs 0x%x: \n", inputs); 23212ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul while (inputs) { 2339a548c27aa704236cc1d8a5d4ebf68cea9c5c99cBrian Paul GLint attr = ffs(inputs) - 1; 23412ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul const char *name = arb_input_attrib_string(attr, 23512ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul GL_FRAGMENT_PROGRAM_ARB); 236298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" %d: %s\n", attr, name); 23712ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul inputs &= ~(1 << attr); 23812ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul } 23912ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul} 24012ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul 24112ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul 24212ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul 24312ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul/** 244501ee87180047dd04afc69103c31e1eae5374bf1Brian * Return ARB_v/f_prog-style output attrib string. 245501ee87180047dd04afc69103c31e1eae5374bf1Brian */ 246501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic const char * 247501ee87180047dd04afc69103c31e1eae5374bf1Brianarb_output_attrib_string(GLint index, GLenum progType) 248501ee87180047dd04afc69103c31e1eae5374bf1Brian{ 249a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul /* 250a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul * These strings should match the VERT_RESULT_x and FRAG_RESULT_x tokens. 251a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul */ 252f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled static const char *const vertResults[] = { 253501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.position", 254501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.color.primary", 255501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.color.secondary", 256501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.fogcoord", 257501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[0]", 258501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[1]", 259501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[2]", 260501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[3]", 261501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[4]", 262501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[5]", 263501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[6]", 264501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[7]", 265f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.pointsize", /* VERT_RESULT_PSIZ */ 266f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.(thirteen)", /* VERT_RESULT_BFC0 */ 267f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.(fourteen)", /* VERT_RESULT_BFC1 */ 268f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.(fifteen)", /* VERT_RESULT_EDGE */ 269f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.(sixteen)", /* VERT_RESULT_CLIP_VERTEX */ 270f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.(seventeen)", /* VERT_RESULT_CLIP_DIST0 */ 271f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.(eighteen)", /* VERT_RESULT_CLIP_DIST1 */ 272501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[0]", 273501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[1]", 274501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[2]", 275501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[3]", 276501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[4]", 277501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[5]", 278501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[6]", 279f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.varying[7]", 280f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.varying[8]", 281f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.varying[9]", 282f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.varying[10]", 283f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.varying[11]", 284f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.varying[12]", 285f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.varying[13]", 286f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.varying[14]", 2878ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[15]", 2888ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[16]", 2898ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[17]", 2908ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[18]", 2918ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[19]", 2928ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[20]", 2938ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[21]", 2948ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[22]", 2958ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[23]", 2968ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[24]", 2978ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[25]", 2988ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[26]", 2998ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[27]", 3008ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[28]", 3018ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[29]", 3028ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[30]", 3038ff8c91893cee8b1893de91e145c8496a12ab9caMarek Olšák "result.varying[31]", /* MAX_VARYING = 32 */ 304501ee87180047dd04afc69103c31e1eae5374bf1Brian }; 305f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled static const char *const fragResults[] = { 306f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.depth", /* FRAG_RESULT_DEPTH */ 307bb6fb7afd37e523256d1b8861b0d5e3030e31282nobled "result.(one)", /* FRAG_RESULT_STENCIL */ 308f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.color", /* FRAG_RESULT_COLOR */ 309f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.color[0]", /* FRAG_RESULT_DATA0 (named for GLSL's gl_FragData) */ 310a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul "result.color[1]", 311a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul "result.color[2]", 312f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.color[3]", 313f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.color[4]", 314f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.color[5]", 315f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.color[6]", 316f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled "result.color[7]" /* MAX_DRAW_BUFFERS = 8 */ 317501ee87180047dd04afc69103c31e1eae5374bf1Brian }; 318501ee87180047dd04afc69103c31e1eae5374bf1Brian 319f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled /* sanity checks */ 320f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled STATIC_ASSERT(Elements(vertResults) == VERT_RESULT_MAX); 321f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled STATIC_ASSERT(Elements(fragResults) == FRAG_RESULT_MAX); 322f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled assert(strcmp(vertResults[VERT_RESULT_HPOS], "result.position") == 0); 323f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled assert(strcmp(vertResults[VERT_RESULT_VAR0], "result.varying[0]") == 0); 324f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled assert(strcmp(fragResults[FRAG_RESULT_DATA0], "result.color[0]") == 0); 325f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled 326501ee87180047dd04afc69103c31e1eae5374bf1Brian if (progType == GL_VERTEX_PROGRAM_ARB) { 327529fa775293ddd24e389f2ea6a43bd18f01a1609Brian Paul assert(index < Elements(vertResults)); 328501ee87180047dd04afc69103c31e1eae5374bf1Brian return vertResults[index]; 329501ee87180047dd04afc69103c31e1eae5374bf1Brian } 330501ee87180047dd04afc69103c31e1eae5374bf1Brian else { 331f71984ee5b4a7369ce3cc86fb0253ac66d80388cnobled assert(progType == GL_FRAGMENT_PROGRAM_ARB); 332529fa775293ddd24e389f2ea6a43bd18f01a1609Brian Paul assert(index < Elements(fragResults)); 333501ee87180047dd04afc69103c31e1eae5374bf1Brian return fragResults[index]; 334501ee87180047dd04afc69103c31e1eae5374bf1Brian } 335501ee87180047dd04afc69103c31e1eae5374bf1Brian} 336501ee87180047dd04afc69103c31e1eae5374bf1Brian 337501ee87180047dd04afc69103c31e1eae5374bf1Brian 338501ee87180047dd04afc69103c31e1eae5374bf1Brian/** 339501ee87180047dd04afc69103c31e1eae5374bf1Brian * Return string representation of the given register. 340501ee87180047dd04afc69103c31e1eae5374bf1Brian * Note that some types of registers (like PROGRAM_UNIFORM) aren't defined 341501ee87180047dd04afc69103c31e1eae5374bf1Brian * by the ARB/NV program languages so we've taken some liberties here. 3421eee1bac1f6d911e6124daafc9b9291666d91cefVinson Lee * \param f the register file (PROGRAM_INPUT, PROGRAM_TEMPORARY, etc) 343501ee87180047dd04afc69103c31e1eae5374bf1Brian * \param index number of the register in the register file 344501ee87180047dd04afc69103c31e1eae5374bf1Brian * \param mode the output format/mode/style 345501ee87180047dd04afc69103c31e1eae5374bf1Brian * \param prog pointer to containing program 346501ee87180047dd04afc69103c31e1eae5374bf1Brian */ 347501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic const char * 348b4026d9be828bd0b6f60158456edf24994efb053Brian Paulreg_string(gl_register_file f, GLint index, gl_prog_print_mode mode, 349b4855288e4de9001b4107d3d4c2f7aff4a4680f9Zack Rusin GLboolean relAddr, const struct gl_program *prog, 3501491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin GLboolean hasIndex2, GLboolean relAddr2, GLint index2) 351501ee87180047dd04afc69103c31e1eae5374bf1Brian{ 352501ee87180047dd04afc69103c31e1eae5374bf1Brian static char str[100]; 353f88a9015985f1e308496803630221f284a94f397Brian Paul const char *addr = relAddr ? "ADDR+" : ""; 354501ee87180047dd04afc69103c31e1eae5374bf1Brian 355501ee87180047dd04afc69103c31e1eae5374bf1Brian str[0] = 0; 356501ee87180047dd04afc69103c31e1eae5374bf1Brian 357501ee87180047dd04afc69103c31e1eae5374bf1Brian switch (mode) { 358501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROG_PRINT_DEBUG: 359b8dacaf174517d3efa32711e0f85f8b861d0846bBrian Paul sprintf(str, "%s[%s%d]", 360b8dacaf174517d3efa32711e0f85f8b861d0846bBrian Paul _mesa_register_file_name(f), addr, index); 3611491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin if (hasIndex2) { 362b4855288e4de9001b4107d3d4c2f7aff4a4680f9Zack Rusin int offset = strlen(str); 3631491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin const char *addr2 = relAddr2 ? "ADDR+" : ""; 3641491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin sprintf(str+offset, "[%s%d]", addr2, index2); 365b4855288e4de9001b4107d3d4c2f7aff4a4680f9Zack Rusin } 366501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 367501ee87180047dd04afc69103c31e1eae5374bf1Brian 368501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROG_PRINT_ARB: 369501ee87180047dd04afc69103c31e1eae5374bf1Brian switch (f) { 370501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_INPUT: 371298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "%s", arb_input_attrib_string(index, prog->Target)); 372501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 373501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_OUTPUT: 374298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "%s", arb_output_attrib_string(index, prog->Target)); 375501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 376501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_TEMPORARY: 377298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "temp%d", index); 378501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 379501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_ENV_PARAM: 380298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "program.env[%s%d]", addr, index); 381501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 382501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_LOCAL_PARAM: 383298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "program.local[%s%d]", addr, index); 384501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 385501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_VARYING: /* extension */ 386298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "varying[%s%d]", addr, index); 387501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 388501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_CONSTANT: /* extension */ 389298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "constant[%s%d]", addr, index); 390501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 391501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_UNIFORM: /* extension */ 392298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "uniform[%s%d]", addr, index); 393501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 394379332f629153220614e651225b0521cd64c98b9Brian Paul case PROGRAM_SYSTEM_VALUE: 395379332f629153220614e651225b0521cd64c98b9Brian Paul sprintf(str, "sysvalue[%s%d]", addr, index); 396379332f629153220614e651225b0521cd64c98b9Brian Paul break; 397501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_STATE_VAR: 398501ee87180047dd04afc69103c31e1eae5374bf1Brian { 399501ee87180047dd04afc69103c31e1eae5374bf1Brian struct gl_program_parameter *param 400501ee87180047dd04afc69103c31e1eae5374bf1Brian = prog->Parameters->Parameters + index; 4019a64440154319738445e203339156e54232908eeBrian Paul char *state = _mesa_program_state_string(param->StateIndexes); 402a45f2ec7b7e929d705df23471ee92f05e233338cVinson Lee sprintf(str, "%s", state); 40332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(state); 404501ee87180047dd04afc69103c31e1eae5374bf1Brian } 405501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 406501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_ADDRESS: 407298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "A%d", index); 408501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 409501ee87180047dd04afc69103c31e1eae5374bf1Brian default: 410501ee87180047dd04afc69103c31e1eae5374bf1Brian _mesa_problem(NULL, "bad file in reg_string()"); 411501ee87180047dd04afc69103c31e1eae5374bf1Brian } 412501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 413501ee87180047dd04afc69103c31e1eae5374bf1Brian 414501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROG_PRINT_NV: 415501ee87180047dd04afc69103c31e1eae5374bf1Brian switch (f) { 416501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_INPUT: 417501ee87180047dd04afc69103c31e1eae5374bf1Brian if (prog->Target == GL_VERTEX_PROGRAM_ARB) 418298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "v[%d]", index); 419501ee87180047dd04afc69103c31e1eae5374bf1Brian else 420298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "f[%d]", index); 421501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 422501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_OUTPUT: 423298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "o[%d]", index); 424501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 425501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_TEMPORARY: 426298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "R%d", index); 427501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 428501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_ENV_PARAM: 429298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "c[%d]", index); 430501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 431501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_VARYING: /* extension */ 432298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "varying[%s%d]", addr, index); 433501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 434501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_UNIFORM: /* extension */ 435298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "uniform[%s%d]", addr, index); 436501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 437501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_CONSTANT: /* extension */ 438298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "constant[%s%d]", addr, index); 439501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 440501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_STATE_VAR: /* extension */ 441298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "state[%s%d]", addr, index); 442501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 443501ee87180047dd04afc69103c31e1eae5374bf1Brian default: 444501ee87180047dd04afc69103c31e1eae5374bf1Brian _mesa_problem(NULL, "bad file in reg_string()"); 445501ee87180047dd04afc69103c31e1eae5374bf1Brian } 446501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 447501ee87180047dd04afc69103c31e1eae5374bf1Brian 448501ee87180047dd04afc69103c31e1eae5374bf1Brian default: 449501ee87180047dd04afc69103c31e1eae5374bf1Brian _mesa_problem(NULL, "bad mode in reg_string()"); 450501ee87180047dd04afc69103c31e1eae5374bf1Brian } 451501ee87180047dd04afc69103c31e1eae5374bf1Brian 452501ee87180047dd04afc69103c31e1eae5374bf1Brian return str; 453501ee87180047dd04afc69103c31e1eae5374bf1Brian} 454501ee87180047dd04afc69103c31e1eae5374bf1Brian 455501ee87180047dd04afc69103c31e1eae5374bf1Brian 456501ee87180047dd04afc69103c31e1eae5374bf1Brian/** 45700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Return a string representation of the given swizzle word. 45800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * If extended is true, use extended (comma-separated) format. 4593a2815370d26012b41d742540237985a333b6ae4Brian * \param swizzle the swizzle field 4603a2815370d26012b41d742540237985a333b6ae4Brian * \param negateBase 4-bit negation vector 4613a2815370d26012b41d742540237985a333b6ae4Brian * \param extended if true, also allow 0, 1 values 46200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 463059376c855cbeb160e98f438a35edb8bd88b8bb2Brianconst char * 4647db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul_mesa_swizzle_string(GLuint swizzle, GLuint negateMask, GLboolean extended) 46500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 46674a19b0abd382574ff583eab81a374acead9254dBrian Paul static const char swz[] = "xyzw01!?"; /* See SWIZZLE_x definitions */ 46700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian static char s[20]; 46800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint i = 0; 46900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4707db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (!extended && swizzle == SWIZZLE_NOOP && negateMask == 0) 47100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return ""; /* no swizzle/negation */ 47200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 47300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (!extended) 47400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '.'; 47500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4767db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (negateMask & NEGATE_X) 47700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 47800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 0)]; 47900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 48000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (extended) { 48100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = ','; 48200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 48300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4847db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (negateMask & NEGATE_Y) 48500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 48600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 1)]; 48700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 48800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (extended) { 48900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = ','; 49000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 49100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4927db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (negateMask & NEGATE_Z) 49300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 49400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 2)]; 49500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 49600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (extended) { 49700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = ','; 49800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 49900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 5007db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (negateMask & NEGATE_W) 50100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 50200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 3)]; 50300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 50400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i] = 0; 50500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return s; 50600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 50700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 50800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 509511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paulvoid 510511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul_mesa_print_swizzle(GLuint swizzle) 511511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul{ 512511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul if (swizzle == SWIZZLE_XYZW) { 513298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(".xyzw\n"); 514511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul } 515511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul else { 516f9c574d7192d2193ff3e12629a8db1a74b6dbf55Michal Krol const char *s = _mesa_swizzle_string(swizzle, 0, 0); 517298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("%s\n", s); 518511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul } 519511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul} 520511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul 521511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul 522610c2461ce0683ca5412e4b2b7a496f67e9d3704Brian Paulconst char * 523610c2461ce0683ca5412e4b2b7a496f67e9d3704Brian Paul_mesa_writemask_string(GLuint writeMask) 52400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 52500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian static char s[10]; 52600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint i = 0; 52700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 52800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask == WRITEMASK_XYZW) 52900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return ""; 53000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 53100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '.'; 53200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask & WRITEMASK_X) 53300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = 'x'; 53400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask & WRITEMASK_Y) 53500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = 'y'; 53600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask & WRITEMASK_Z) 53700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = 'z'; 53800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask & WRITEMASK_W) 53900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = 'w'; 54000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 54100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i] = 0; 54200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return s; 54300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 54400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 5453a2815370d26012b41d742540237985a333b6ae4Brian 546d750861dc26e3898afa2b49e3969d709dc227664Brianconst char * 547d750861dc26e3898afa2b49e3969d709dc227664Brian_mesa_condcode_string(GLuint condcode) 5483a2815370d26012b41d742540237985a333b6ae4Brian{ 5493a2815370d26012b41d742540237985a333b6ae4Brian switch (condcode) { 5503a2815370d26012b41d742540237985a333b6ae4Brian case COND_GT: return "GT"; 5513a2815370d26012b41d742540237985a333b6ae4Brian case COND_EQ: return "EQ"; 5523a2815370d26012b41d742540237985a333b6ae4Brian case COND_LT: return "LT"; 5533a2815370d26012b41d742540237985a333b6ae4Brian case COND_UN: return "UN"; 5543a2815370d26012b41d742540237985a333b6ae4Brian case COND_GE: return "GE"; 5553a2815370d26012b41d742540237985a333b6ae4Brian case COND_LE: return "LE"; 5563a2815370d26012b41d742540237985a333b6ae4Brian case COND_NE: return "NE"; 5573a2815370d26012b41d742540237985a333b6ae4Brian case COND_TR: return "TR"; 5583a2815370d26012b41d742540237985a333b6ae4Brian case COND_FL: return "FL"; 5593a2815370d26012b41d742540237985a333b6ae4Brian default: return "cond???"; 5603a2815370d26012b41d742540237985a333b6ae4Brian } 5613a2815370d26012b41d742540237985a333b6ae4Brian} 5623a2815370d26012b41d742540237985a333b6ae4Brian 5633a2815370d26012b41d742540237985a333b6ae4Brian 56400cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void 565d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_dst_reg(FILE * f, 566d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct prog_dst_register *dstReg, 567d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul gl_prog_print_mode mode, 568d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog) 56900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 570298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s%s", 571298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg reg_string((gl_register_file) dstReg->File, 572b4855288e4de9001b4107d3d4c2f7aff4a4680f9Zack Rusin dstReg->Index, mode, dstReg->RelAddr, prog, 573b4855288e4de9001b4107d3d4c2f7aff4a4680f9Zack Rusin GL_FALSE, GL_FALSE, 0), 574298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_writemask_string(dstReg->WriteMask)); 575298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg 5761936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian if (dstReg->CondMask != COND_TR) { 577298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " (%s.%s)", 578298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(dstReg->CondMask), 579298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(dstReg->CondSwizzle, 580298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg GL_FALSE, GL_FALSE)); 5811936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian } 5821936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian 583501ee87180047dd04afc69103c31e1eae5374bf1Brian#if 0 584298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s[%d]%s", 585b8dacaf174517d3efa32711e0f85f8b861d0846bBrian Paul _mesa_register_file_name((gl_register_file) dstReg->File), 586298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg dstReg->Index, 587298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_writemask_string(dstReg->WriteMask)); 588501ee87180047dd04afc69103c31e1eae5374bf1Brian#endif 58900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 59000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 591d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 59200cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void 593d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_src_reg(FILE *f, 594d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct prog_src_register *srcReg, 595d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul gl_prog_print_mode mode, 596d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog) 59700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 598f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul const char *abs = srcReg->Abs ? "|" : ""; 599f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul 600298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s%s%s%s", 601298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg abs, 602298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg reg_string((gl_register_file) srcReg->File, 603b4855288e4de9001b4107d3d4c2f7aff4a4680f9Zack Rusin srcReg->Index, mode, srcReg->RelAddr, prog, 6041491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin srcReg->HasIndex2, srcReg->RelAddr2, srcReg->Index2), 605298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(srcReg->Swizzle, 606298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg srcReg->Negate, GL_FALSE), 607298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg abs); 608501ee87180047dd04afc69103c31e1eae5374bf1Brian#if 0 609298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s[%d]%s", 610b8dacaf174517d3efa32711e0f85f8b861d0846bBrian Paul _mesa_register_file_name((gl_register_file) srcReg->File), 611298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg srcReg->Index, 612298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(srcReg->Swizzle, 613298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg srcReg->Negate, GL_FALSE)); 614501ee87180047dd04afc69103c31e1eae5374bf1Brian#endif 61500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 61600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 617d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 61800cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void 619d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_comment(FILE *f, const struct prog_instruction *inst) 62000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 62100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->Comment) 622298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "; # %s\n", inst->Comment); 62300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian else 624298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ";\n"); 62500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 62600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 62700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 62872fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholtvoid 62972fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt_mesa_fprint_alu_instruction(FILE *f, 63072fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt const struct prog_instruction *inst, 63172fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt const char *opcode_string, GLuint numRegs, 63272fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt gl_prog_print_mode mode, 63372fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt const struct gl_program *prog) 63400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 63500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint j; 63600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 637298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s", opcode_string); 638b50280e95f3c044f53c0705d3a5619ebb2db4513Brian if (inst->CondUpdate) 639298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ".C"); 64000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 64100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* frag prog only */ 64200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->SaturateMode == SATURATE_ZERO_ONE) 643298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "_SAT"); 64400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 645298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 64600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->DstReg.File != PROGRAM_UNDEFINED) { 647d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_dst_reg(f, &inst->DstReg, mode, prog); 64800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 64900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian else { 650298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " ???"); 65100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 65200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 65300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (numRegs > 0) 654298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 65500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 65600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (j = 0; j < numRegs; j++) { 657d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, inst->SrcReg + j, mode, prog); 65800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (j + 1 < numRegs) 659298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 66000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 66100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 662d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 6630020d1022f4b5befe4adf783bedc4cf83e09f01fBrian} 6640020d1022f4b5befe4adf783bedc4cf83e09f01fBrian 6650020d1022f4b5befe4adf783bedc4cf83e09f01fBrian 6660020d1022f4b5befe4adf783bedc4cf83e09f01fBrianvoid 6670020d1022f4b5befe4adf783bedc4cf83e09f01fBrian_mesa_print_alu_instruction(const struct prog_instruction *inst, 6680020d1022f4b5befe4adf783bedc4cf83e09f01fBrian const char *opcode_string, GLuint numRegs) 6690020d1022f4b5befe4adf783bedc4cf83e09f01fBrian{ 67072fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt _mesa_fprint_alu_instruction(stderr, inst, opcode_string, 67172fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt numRegs, PROG_PRINT_DEBUG, NULL); 672501ee87180047dd04afc69103c31e1eae5374bf1Brian} 673501ee87180047dd04afc69103c31e1eae5374bf1Brian 674501ee87180047dd04afc69103c31e1eae5374bf1Brian 67500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 67600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Print a single vertex/fragment program instruction. 67700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 6782237d136cd8f964048a4ccdc87e0ffb48af0f73dNicolai HähnleGLint 679d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_instruction_opt(FILE *f, 680d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct prog_instruction *inst, 681d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul GLint indent, 682501ee87180047dd04afc69103c31e1eae5374bf1Brian gl_prog_print_mode mode, 683501ee87180047dd04afc69103c31e1eae5374bf1Brian const struct gl_program *prog) 68400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 6857b30053b264726156a018c822657270e745320ceBrian GLint i; 6865db088d70fbd14620c2fc7840096a05993f8e2b9Brian 6875db088d70fbd14620c2fc7840096a05993f8e2b9Brian if (inst->Opcode == OPCODE_ELSE || 6885db088d70fbd14620c2fc7840096a05993f8e2b9Brian inst->Opcode == OPCODE_ENDIF || 6895db088d70fbd14620c2fc7840096a05993f8e2b9Brian inst->Opcode == OPCODE_ENDLOOP || 6905db088d70fbd14620c2fc7840096a05993f8e2b9Brian inst->Opcode == OPCODE_ENDSUB) { 6915db088d70fbd14620c2fc7840096a05993f8e2b9Brian indent -= 3; 6925db088d70fbd14620c2fc7840096a05993f8e2b9Brian } 6935db088d70fbd14620c2fc7840096a05993f8e2b9Brian for (i = 0; i < indent; i++) { 694298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 6955db088d70fbd14620c2fc7840096a05993f8e2b9Brian } 6965db088d70fbd14620c2fc7840096a05993f8e2b9Brian 69700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (inst->Opcode) { 69800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_PRINT: 6998de5a292f70dba854a4bf06a2210bc38381e6bcfBrian Paul fprintf(f, "PRINT '%s'", (char *) inst->Data); 70000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) { 701298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 702298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s[%d]%s", 703b8dacaf174517d3efa32711e0f85f8b861d0846bBrian Paul _mesa_register_file_name((gl_register_file) inst->SrcReg[0].File), 704298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->SrcReg[0].Index, 705298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->SrcReg[0].Swizzle, 706298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->SrcReg[0].Negate, GL_FALSE)); 70700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 70800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->Comment) 709298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " # %s", inst->Comment); 710d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 71100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 71200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_SWZ: 713298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "SWZ"); 71400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->SaturateMode == SATURATE_ZERO_ONE) 715298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "_SAT"); 716298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 717d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_dst_reg(f, &inst->DstReg, mode, prog); 718298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", %s[%d], %s", 719b8dacaf174517d3efa32711e0f85f8b861d0846bBrian Paul _mesa_register_file_name((gl_register_file) inst->SrcReg[0].File), 720298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->SrcReg[0].Index, 721298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->SrcReg[0].Swizzle, 722298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->SrcReg[0].Negate, GL_TRUE)); 723d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 72400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 72500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_TEX: 72600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_TXP: 7274b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul case OPCODE_TXL: 72800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_TXB: 72919efd1442cc44b0307fe72938d7c2b66c544654fKenneth Graunke case OPCODE_TXD: 730298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s", _mesa_opcode_string(inst->Opcode)); 73100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->SaturateMode == SATURATE_ZERO_ONE) 732298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "_SAT"); 733298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 734d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_dst_reg(f, &inst->DstReg, mode, prog); 735298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 736d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, &inst->SrcReg[0], mode, prog); 73719efd1442cc44b0307fe72938d7c2b66c544654fKenneth Graunke if (inst->Opcode == OPCODE_TXD) { 73819efd1442cc44b0307fe72938d7c2b66c544654fKenneth Graunke fprintf(f, ", "); 73919efd1442cc44b0307fe72938d7c2b66c544654fKenneth Graunke fprint_src_reg(f, &inst->SrcReg[1], mode, prog); 74019efd1442cc44b0307fe72938d7c2b66c544654fKenneth Graunke fprintf(f, ", "); 74119efd1442cc44b0307fe72938d7c2b66c544654fKenneth Graunke fprint_src_reg(f, &inst->SrcReg[2], mode, prog); 74219efd1442cc44b0307fe72938d7c2b66c544654fKenneth Graunke } 743298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", texture[%d], ", inst->TexSrcUnit); 74400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (inst->TexSrcTarget) { 745298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_1D_INDEX: fprintf(f, "1D"); break; 746298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_2D_INDEX: fprintf(f, "2D"); break; 747298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_3D_INDEX: fprintf(f, "3D"); break; 748298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_CUBE_INDEX: fprintf(f, "CUBE"); break; 749298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_RECT_INDEX: fprintf(f, "RECT"); break; 7502c1619869a9af1420e0a23b65e31d40a694b7f46Brian Paul case TEXTURE_1D_ARRAY_INDEX: fprintf(f, "1D_ARRAY"); break; 7512c1619869a9af1420e0a23b65e31d40a694b7f46Brian Paul case TEXTURE_2D_ARRAY_INDEX: fprintf(f, "2D_ARRAY"); break; 75200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 75300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian ; 75400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 75544e018c09e7aeba9fd9f4c380da224bd6622c470Brian Paul if (inst->TexShadow) 756298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " SHADOW"); 757d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 75800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 7594b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 7604b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul case OPCODE_KIL: 761298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s", _mesa_opcode_string(inst->Opcode)); 762298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 763d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, &inst->SrcReg[0], mode, prog); 764d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 7654b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul break; 7664b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul case OPCODE_KIL_NV: 767298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s", _mesa_opcode_string(inst->Opcode)); 768298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 769298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s.%s", 770298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 771298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 772298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg GL_FALSE, GL_FALSE)); 773d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 7744b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul break; 7754b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 77600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_ARL: 777298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ARL "); 778d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_dst_reg(f, &inst->DstReg, mode, prog); 779298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 780d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, &inst->SrcReg[0], mode, prog); 781d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 78200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 78300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_BRA: 784298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "BRA %d (%s%s)", 785298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->BranchTarget, 786298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 787298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE)); 788d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 78900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 7905ae49cf3ed53fda6a904d7e90feef78495ae6903Brian case OPCODE_IF: 79163556fa9949f543a8134b6b5ff3d216acb71dd9fBrian if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) { 79263556fa9949f543a8134b6b5ff3d216acb71dd9fBrian /* Use ordinary register */ 793298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "IF "); 794d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, &inst->SrcReg[0], mode, prog); 795298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "; "); 79663556fa9949f543a8134b6b5ff3d216acb71dd9fBrian } 79763556fa9949f543a8134b6b5ff3d216acb71dd9fBrian else { 79863556fa9949f543a8134b6b5ff3d216acb71dd9fBrian /* Use cond codes */ 799298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "IF (%s%s);", 800298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 801298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 802298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg 0, GL_FALSE)); 80363556fa9949f543a8134b6b5ff3d216acb71dd9fBrian } 804298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " # (if false, goto %d)", inst->BranchTarget); 805d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 8065db088d70fbd14620c2fc7840096a05993f8e2b9Brian return indent + 3; 8075ae49cf3ed53fda6a904d7e90feef78495ae6903Brian case OPCODE_ELSE: 808298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ELSE; # (goto %d)\n", inst->BranchTarget); 8095db088d70fbd14620c2fc7840096a05993f8e2b9Brian return indent + 3; 8105ae49cf3ed53fda6a904d7e90feef78495ae6903Brian case OPCODE_ENDIF: 811298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ENDIF;\n"); 8125db088d70fbd14620c2fc7840096a05993f8e2b9Brian break; 8135db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_BGNLOOP: 814298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "BGNLOOP; # (end at %d)\n", inst->BranchTarget); 8155db088d70fbd14620c2fc7840096a05993f8e2b9Brian return indent + 3; 8165db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_ENDLOOP: 817298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ENDLOOP; # (goto %d)\n", inst->BranchTarget); 8185db088d70fbd14620c2fc7840096a05993f8e2b9Brian break; 8195db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_BRK: 820f22ed0986a743e033d827c78371612c7115ff913Brian case OPCODE_CONT: 821298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s (%s%s); # (goto %d)", 822298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_opcode_string(inst->Opcode), 823298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 824298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE), 825298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->BranchTarget); 826d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 8275db088d70fbd14620c2fc7840096a05993f8e2b9Brian break; 82863556fa9949f543a8134b6b5ff3d216acb71dd9fBrian 8295db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_BGNSUB: 830f407cada8aa0bfea1b8dfae766392162c702aaa4Brian if (mode == PROG_PRINT_NV) { 831298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s:\n", inst->Comment); /* comment is label */ 832f407cada8aa0bfea1b8dfae766392162c702aaa4Brian return indent; 833f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 834f407cada8aa0bfea1b8dfae766392162c702aaa4Brian else { 835298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "BGNSUB"); 836d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 837f407cada8aa0bfea1b8dfae766392162c702aaa4Brian return indent + 3; 838f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 8395db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_ENDSUB: 840f407cada8aa0bfea1b8dfae766392162c702aaa4Brian if (mode == PROG_PRINT_DEBUG) { 841298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ENDSUB"); 842d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 843f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 844f407cada8aa0bfea1b8dfae766392162c702aaa4Brian break; 845f407cada8aa0bfea1b8dfae766392162c702aaa4Brian case OPCODE_CAL: 846f407cada8aa0bfea1b8dfae766392162c702aaa4Brian if (mode == PROG_PRINT_NV) { 847298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "CAL %s; # (goto %d)\n", inst->Comment, inst->BranchTarget); 848f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 849f407cada8aa0bfea1b8dfae766392162c702aaa4Brian else { 850298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "CAL %u", inst->BranchTarget); 851d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 852f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 853f407cada8aa0bfea1b8dfae766392162c702aaa4Brian break; 854f407cada8aa0bfea1b8dfae766392162c702aaa4Brian case OPCODE_RET: 855298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "RET (%s%s)", 856298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 857298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE)); 858d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 8595ae49cf3ed53fda6a904d7e90feef78495ae6903Brian break; 860f407cada8aa0bfea1b8dfae766392162c702aaa4Brian 86100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_END: 862298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "END\n"); 86300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 8643a2815370d26012b41d742540237985a333b6ae4Brian case OPCODE_NOP: 865059376c855cbeb160e98f438a35edb8bd88b8bb2Brian if (mode == PROG_PRINT_DEBUG) { 866298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NOP"); 867d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 868059376c855cbeb160e98f438a35edb8bd88b8bb2Brian } 869059376c855cbeb160e98f438a35edb8bd88b8bb2Brian else if (inst->Comment) { 870059376c855cbeb160e98f438a35edb8bd88b8bb2Brian /* ARB/NV extensions don't have NOP instruction */ 871298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "# %s\n", inst->Comment); 872059376c855cbeb160e98f438a35edb8bd88b8bb2Brian } 8733a2815370d26012b41d742540237985a333b6ae4Brian break; 874da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case OPCODE_EMIT_VERTEX: 875da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin fprintf(f, "EMIT_VERTEX\n"); 876da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 877da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case OPCODE_END_PRIMITIVE: 878da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin fprintf(f, "END_PRIMITIVE\n"); 879da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 88000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* XXX may need other special-case instructions */ 88100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 882f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul if (inst->Opcode < MAX_OPCODE) { 883f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul /* typical alu instruction */ 88472fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt _mesa_fprint_alu_instruction(f, inst, 88572fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt _mesa_opcode_string(inst->Opcode), 88672fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt _mesa_num_inst_src_regs(inst->Opcode), 88772fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt mode, prog); 888f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul } 889f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul else { 89072fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt _mesa_fprint_alu_instruction(f, inst, 89172fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt _mesa_opcode_string(inst->Opcode), 89272fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt 3/*_mesa_num_inst_src_regs(inst->Opcode)*/, 89372fd0568db0ce5f25a1eee0266ec1e7cb3dafab0Eric Anholt mode, prog); 894f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul } 89500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 89600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 8975db088d70fbd14620c2fc7840096a05993f8e2b9Brian return indent; 89800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 89900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 90000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 901d0038930312f96468a9159a1221c3f4c56bddaa4Brian PaulGLint 902d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_instruction_opt(const struct prog_instruction *inst, 903d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul GLint indent, 904d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul gl_prog_print_mode mode, 905d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog) 906d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 90743a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin return _mesa_fprint_instruction_opt(stderr, inst, indent, mode, prog); 908d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 909d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 910d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 91100cdc0a472c55330cbc58317f01b07f8f90be5a5Brianvoid 912d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_instruction(const struct prog_instruction *inst) 91300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 914d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul /* note: 4th param should be ignored for PROG_PRINT_DEBUG */ 91543a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin _mesa_fprint_instruction_opt(stderr, inst, 0, PROG_PRINT_DEBUG, NULL); 916501ee87180047dd04afc69103c31e1eae5374bf1Brian} 917501ee87180047dd04afc69103c31e1eae5374bf1Brian 918501ee87180047dd04afc69103c31e1eae5374bf1Brian 919d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 920501ee87180047dd04afc69103c31e1eae5374bf1Brian/** 921501ee87180047dd04afc69103c31e1eae5374bf1Brian * Print program, with options. 922501ee87180047dd04afc69103c31e1eae5374bf1Brian */ 923d2eff33ab7fda9527458ea35d9eb109ec2988490Brian Paulvoid 924d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_program_opt(FILE *f, 925d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog, 926d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul gl_prog_print_mode mode, 927d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul GLboolean lineNumbers) 928501ee87180047dd04afc69103c31e1eae5374bf1Brian{ 9295db088d70fbd14620c2fc7840096a05993f8e2b9Brian GLuint i, indent = 0; 930501ee87180047dd04afc69103c31e1eae5374bf1Brian 931501ee87180047dd04afc69103c31e1eae5374bf1Brian switch (prog->Target) { 932501ee87180047dd04afc69103c31e1eae5374bf1Brian case GL_VERTEX_PROGRAM_ARB: 933501ee87180047dd04afc69103c31e1eae5374bf1Brian if (mode == PROG_PRINT_ARB) 934298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "!!ARBvp1.0\n"); 935501ee87180047dd04afc69103c31e1eae5374bf1Brian else if (mode == PROG_PRINT_NV) 936298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "!!VP1.0\n"); 937501ee87180047dd04afc69103c31e1eae5374bf1Brian else 938298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "# Vertex Program/Shader %u\n", prog->Id); 939501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 940501ee87180047dd04afc69103c31e1eae5374bf1Brian case GL_FRAGMENT_PROGRAM_ARB: 941501ee87180047dd04afc69103c31e1eae5374bf1Brian case GL_FRAGMENT_PROGRAM_NV: 942501ee87180047dd04afc69103c31e1eae5374bf1Brian if (mode == PROG_PRINT_ARB) 943298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "!!ARBfp1.0\n"); 944501ee87180047dd04afc69103c31e1eae5374bf1Brian else if (mode == PROG_PRINT_NV) 945298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "!!FP1.0\n"); 946501ee87180047dd04afc69103c31e1eae5374bf1Brian else 947298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "# Fragment Program/Shader %u\n", prog->Id); 948501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 949da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case MESA_GEOMETRY_PROGRAM: 950da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin fprintf(f, "# Geometry Shader\n"); 951501ee87180047dd04afc69103c31e1eae5374bf1Brian } 952501ee87180047dd04afc69103c31e1eae5374bf1Brian 95300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0; i < prog->NumInstructions; i++) { 954501ee87180047dd04afc69103c31e1eae5374bf1Brian if (lineNumbers) 955298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%3d: ", i); 956d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul indent = _mesa_fprint_instruction_opt(f, prog->Instructions + i, 957501ee87180047dd04afc69103c31e1eae5374bf1Brian indent, mode, prog); 95800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 95900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 96000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 96100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 96200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 96343a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin * Print program to stderr, default options. 96400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 96500cdc0a472c55330cbc58317f01b07f8f90be5a5Brianvoid 966d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_program(const struct gl_program *prog) 967d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 968a7400e736467b7b032ee0d8a8bad25a0a65e782bIan Romanick _mesa_fprint_program_opt(stderr, prog, PROG_PRINT_DEBUG, GL_TRUE); 969d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 970d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 971d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 972d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 973b5ddc7821a334177ff3f6c0ea3a5c24245ad194cBrian Paul * Return binary representation of 64-bit value (as a string). 974f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul * Insert a comma to separate each group of 8 bits. 975b5ddc7821a334177ff3f6c0ea3a5c24245ad194cBrian Paul * Note we return a pointer to local static storage so this is not 976b5ddc7821a334177ff3f6c0ea3a5c24245ad194cBrian Paul * re-entrant, etc. 977f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul * XXX move to imports.[ch] if useful elsewhere. 978f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul */ 979f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paulstatic const char * 9805606dfb572bf4b89b4882265924705bacc8c182bIan Romanickbinary(GLbitfield64 val) 981f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul{ 9825606dfb572bf4b89b4882265924705bacc8c182bIan Romanick static char buf[80]; 983f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul GLint i, len = 0; 9845606dfb572bf4b89b4882265924705bacc8c182bIan Romanick for (i = 63; i >= 0; --i) { 985e57689c6badee8521691966ff6aa56648a474ce9Brian Paul if (val & (BITFIELD64_BIT(i))) 986f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul buf[len++] = '1'; 987f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul else if (len > 0 || i == 0) 988f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul buf[len++] = '0'; 989f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul if (len > 0 && ((i-1) % 8) == 7) 990f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul buf[len++] = ','; 991f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul } 992f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul buf[len] = '\0'; 993f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul return buf; 994f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul} 995f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul 996f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul 997f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul/** 998d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print all of a program's parameters/fields to given file. 999d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 1000d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulstatic void 1001d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_program_parameters(FILE *f, 1002f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx, 1003d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog) 100400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 10054b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul GLuint i; 10064b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 1007df2d81ea59993a77bd1f1ef96c5cf19ac692d5f7Brian Paul fprintf(f, "InputsRead: %" PRIx64 " (0b%s)\n", 1008df2d81ea59993a77bd1f1ef96c5cf19ac692d5f7Brian Paul (uint64_t) prog->InputsRead, binary(prog->InputsRead)); 1009df2d81ea59993a77bd1f1ef96c5cf19ac692d5f7Brian Paul fprintf(f, "OutputsWritten: %" PRIx64 " (0b%s)\n", 1010df2d81ea59993a77bd1f1ef96c5cf19ac692d5f7Brian Paul (uint64_t) prog->OutputsWritten, binary(prog->OutputsWritten)); 1011298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumInstructions=%d\n", prog->NumInstructions); 1012298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumTemporaries=%d\n", prog->NumTemporaries); 1013298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumParameters=%d\n", prog->NumParameters); 1014298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumAttributes=%d\n", prog->NumAttributes); 1015298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumAddressRegs=%d\n", prog->NumAddressRegs); 101656643096f1eb01eefa1a532ac096b32d23b6b8baBrian Paul fprintf(f, "IndirectRegisterFiles: 0x%x (0b%s)\n", 101756643096f1eb01eefa1a532ac096b32d23b6b8baBrian Paul prog->IndirectRegisterFiles, binary(prog->IndirectRegisterFiles)); 1018298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "SamplersUsed: 0x%x (0b%s)\n", 1019f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul prog->SamplersUsed, binary(prog->SamplersUsed)); 1020298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "Samplers=[ "); 10214b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul for (i = 0; i < MAX_SAMPLERS; i++) { 1022298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%d ", prog->SamplerUnits[i]); 10234b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul } 1024298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "]\n"); 10254b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 102600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_load_state_parameters(ctx, prog->Parameters); 10274b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 102800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#if 0 1029298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "Local Params:\n"); 103000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0; i < MAX_PROGRAM_LOCAL_PARAMS; i++){ 103100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const GLfloat *p = prog->LocalParams[i]; 1032298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%2d: %f, %f, %f, %f\n", i, p[0], p[1], p[2], p[3]); 103300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 103400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#endif 103583ca3ff384ac09524ff6946134cded4174590d92Brian _mesa_print_parameter_list(prog->Parameters); 103683ca3ff384ac09524ff6946134cded4174590d92Brian} 103783ca3ff384ac09524ff6946134cded4174590d92Brian 103800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 1039d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 104043a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin * Print all of a program's parameters/fields to stderr. 1041d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 104283ca3ff384ac09524ff6946134cded4174590d92Brianvoid 1043f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_print_program_parameters(struct gl_context *ctx, const struct gl_program *prog) 1044d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 104543a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin _mesa_fprint_program_parameters(stderr, ctx, prog); 1046d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 1047d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1048d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1049d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 1050d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print a program parameter list to given file. 1051d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 1052d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulstatic void 1053d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_parameter_list(FILE *f, 1054d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program_parameter_list *list) 105583ca3ff384ac09524ff6946134cded4174590d92Brian{ 105683ca3ff384ac09524ff6946134cded4174590d92Brian GLuint i; 1057501ee87180047dd04afc69103c31e1eae5374bf1Brian 10584b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul if (!list) 10594b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul return; 10604b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 1061dfefde38c7dfe70a3531cb85215e55eeb6407180Brian Paul if (0) 1062298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "param list %p\n", (void *) list); 1063298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "dirty state flags: 0x%x\n", list->StateFlags); 106483ca3ff384ac09524ff6946134cded4174590d92Brian for (i = 0; i < list->NumParameters; i++){ 106583ca3ff384ac09524ff6946134cded4174590d92Brian struct gl_program_parameter *param = list->Parameters + i; 10666d89abadbcd68bbe9e08f041412549f8dc1fc73cBryan Cain const GLfloat *v = (GLfloat *) list->ParameterValues[i]; 1067298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "param[%d] sz=%d %s %s = {%.3g, %.3g, %.3g, %.3g}", 1068298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg i, param->Size, 1069b8dacaf174517d3efa32711e0f85f8b861d0846bBrian Paul _mesa_register_file_name(list->Parameters[i].Type), 1070298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg param->Name, v[0], v[1], v[2], v[3]); 1071f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_CENTROID) 1072298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " Centroid"); 1073f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_INVARIANT) 1074298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " Invariant"); 1075f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_FLAT) 1076298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " Flat"); 1077f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_LINEAR) 1078298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " Linear"); 1079298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "\n"); 1080d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul } 1081d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 1082d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1083d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1084d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 108543a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin * Print a program parameter list to stderr. 1086d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 1087d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulvoid 1088d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_parameter_list(const struct gl_program_parameter_list *list) 1089d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 109043a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin _mesa_fprint_parameter_list(stderr, list); 1091d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 1092d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1093d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1094d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 1095d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Write shader and associated info to a file. 1096d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 1097d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulvoid 1098d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_write_shader_to_file(const struct gl_shader *shader) 1099d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 1100d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const char *type; 1101d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul char filename[100]; 1102d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul FILE *f; 1103d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1104d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul if (shader->Type == GL_FRAGMENT_SHADER) 1105d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul type = "frag"; 1106da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin else if (shader->Type == GL_VERTEX_SHADER) 1107d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul type = "vert"; 1108da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin else 1109da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin type = "geom"; 1110d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 111178a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul _mesa_snprintf(filename, sizeof(filename), "shader_%u.%s", shader->Name, type); 1112d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul f = fopen(filename, "w"); 1113d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul if (!f) { 1114d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(stderr, "Unable to open %s for writing\n", filename); 1115d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul return; 111600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 1117d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1118a746ef28df9e6e594be7eb292d2dcad3546f739aBrian Paul fprintf(f, "/* Shader %u source, checksum %u */\n", shader->Name, shader->SourceChecksum); 1119d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fputs(shader->Source, f); 1120d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "\n"); 1121d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1122d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "/* Compile status: %s */\n", 1123d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul shader->CompileStatus ? "ok" : "fail"); 11248e181b629f97ada65cc1b8a17ba42edc2ea77254Eric Anholt fprintf(f, "/* Log Info: */\n"); 11252d83e3fa0de6e0b39307cdc67725ca88855d68d2Brian Paul if (shader->InfoLog) { 11262d83e3fa0de6e0b39307cdc67725ca88855d68d2Brian Paul fputs(shader->InfoLog, f); 11272d83e3fa0de6e0b39307cdc67725ca88855d68d2Brian Paul } 11288e181b629f97ada65cc1b8a17ba42edc2ea77254Eric Anholt if (shader->CompileStatus && shader->Program) { 1129d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "/* GPU code */\n"); 11306ce0c6e743b27cc284e8f164585cfe5892cd662aBrian Paul fprintf(f, "/*\n"); 1131d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprint_program_opt(f, shader->Program, PROG_PRINT_DEBUG, GL_TRUE); 11326ce0c6e743b27cc284e8f164585cfe5892cd662aBrian Paul fprintf(f, "*/\n"); 1133f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul fprintf(f, "/* Parameters / constants */\n"); 1134f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul fprintf(f, "/*\n"); 1135f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul _mesa_fprint_parameter_list(f, shader->Program->Parameters); 1136f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul fprintf(f, "*/\n"); 1137d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul } 1138d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1139d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fclose(f); 114000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 1141d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1142d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1143db598b899868ba6db8f3f525a22a45331589592eBrian Paul/** 1144db598b899868ba6db8f3f525a22a45331589592eBrian Paul * Append the shader's uniform info/values to the shader log file. 1145db598b899868ba6db8f3f525a22a45331589592eBrian Paul * The log file will typically have been created by the 1146db598b899868ba6db8f3f525a22a45331589592eBrian Paul * _mesa_write_shader_to_file function. 1147db598b899868ba6db8f3f525a22a45331589592eBrian Paul */ 1148db598b899868ba6db8f3f525a22a45331589592eBrian Paulvoid 1149118fd08b586970175af9ae269c81c0f501acba25Ian Romanick_mesa_append_uniforms_to_file(const struct gl_shader *shader) 1150db598b899868ba6db8f3f525a22a45331589592eBrian Paul{ 1151118fd08b586970175af9ae269c81c0f501acba25Ian Romanick const struct gl_program *const prog = shader->Program; 1152db598b899868ba6db8f3f525a22a45331589592eBrian Paul const char *type; 1153db598b899868ba6db8f3f525a22a45331589592eBrian Paul char filename[100]; 1154db598b899868ba6db8f3f525a22a45331589592eBrian Paul FILE *f; 1155db598b899868ba6db8f3f525a22a45331589592eBrian Paul 1156db598b899868ba6db8f3f525a22a45331589592eBrian Paul if (shader->Type == GL_FRAGMENT_SHADER) 1157db598b899868ba6db8f3f525a22a45331589592eBrian Paul type = "frag"; 1158db598b899868ba6db8f3f525a22a45331589592eBrian Paul else 1159db598b899868ba6db8f3f525a22a45331589592eBrian Paul type = "vert"; 1160db598b899868ba6db8f3f525a22a45331589592eBrian Paul 116178a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul _mesa_snprintf(filename, sizeof(filename), "shader_%u.%s", shader->Name, type); 1162db598b899868ba6db8f3f525a22a45331589592eBrian Paul f = fopen(filename, "a"); /* append */ 1163db598b899868ba6db8f3f525a22a45331589592eBrian Paul if (!f) { 1164db598b899868ba6db8f3f525a22a45331589592eBrian Paul fprintf(stderr, "Unable to open %s for appending\n", filename); 1165db598b899868ba6db8f3f525a22a45331589592eBrian Paul return; 1166db598b899868ba6db8f3f525a22a45331589592eBrian Paul } 1167db598b899868ba6db8f3f525a22a45331589592eBrian Paul 1168db598b899868ba6db8f3f525a22a45331589592eBrian Paul fprintf(f, "/* First-draw parameters / constants */\n"); 1169db598b899868ba6db8f3f525a22a45331589592eBrian Paul fprintf(f, "/*\n"); 117012199ed96ca0dd2307e9893c58300623cfa6c0eeBrian Paul _mesa_fprint_parameter_list(f, prog->Parameters); 1171db598b899868ba6db8f3f525a22a45331589592eBrian Paul fprintf(f, "*/\n"); 1172db598b899868ba6db8f3f525a22a45331589592eBrian Paul 1173db598b899868ba6db8f3f525a22a45331589592eBrian Paul fclose(f); 1174db598b899868ba6db8f3f525a22a45331589592eBrian Paul} 1175