prog_print.c revision 56643096f1eb01eefa1a532ac096b32d23b6b8ba
100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/* 200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Mesa 3-D graphics library 3f4361540f8dd3016571523863b33481cba7a0c07Brian Paul * Version: 7.3 400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 5f4361540f8dd3016571523863b33481cba7a0c07Brian Paul * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Permission is hereby granted, free of charge, to any person obtaining a 900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * copy of this software and associated documentation files (the "Software"), 1000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * to deal in the Software without restriction, including without limitation 1100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * and/or sell copies of the Software, and to permit persons to whom the 1300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Software is furnished to do so, subject to the following conditions: 1400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 1500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * The above copyright notice and this permission notice shall be included 1600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * in all copies or substantial portions of the Software. 1700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 1800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 2500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 2600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 2700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \file prog_print.c 2800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Print vertex/fragment programs - for debugging. 2900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \author Brian Paul 3000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 3100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 32bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/glheader.h" 33bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/context.h" 34bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/imports.h" 3500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_instruction.h" 3600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_parameter.h" 3700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_print.h" 3800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_statevars.h" 3900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 41501ee87180047dd04afc69103c31e1eae5374bf1Brian 4200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 4300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Return string name for given program/register file. 4400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 4500cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic const char * 46b4026d9be828bd0b6f60158456edf24994efb053Brian Paulfile_string(gl_register_file f, gl_prog_print_mode mode) 4700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 4800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (f) { 4900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_TEMPORARY: 5000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "TEMP"; 5100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_LOCAL_PARAM: 5200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "LOCAL"; 5300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_ENV_PARAM: 5400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "ENV"; 5500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_STATE_VAR: 5600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "STATE"; 5700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_INPUT: 5800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "INPUT"; 5900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_OUTPUT: 6000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "OUTPUT"; 6100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_NAMED_PARAM: 6200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "NAMED"; 6300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_CONSTANT: 6400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "CONST"; 6500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_UNIFORM: 6600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "UNIFORM"; 6700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_VARYING: 6800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "VARYING"; 6900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_WRITE_ONLY: 7000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "WRITE_ONLY"; 7100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case PROGRAM_ADDRESS: 7200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return "ADDR"; 73b2ab693d68f2ba1358b9c3f8bab53b9ebfb586feBrian case PROGRAM_SAMPLER: 74b2ab693d68f2ba1358b9c3f8bab53b9ebfb586feBrian return "SAMPLER"; 75bc7d2c4f51c56787b261e6ab6f9a77d39c3493e1Brian Paul case PROGRAM_UNDEFINED: 76bc7d2c4f51c56787b261e6ab6f9a77d39c3493e1Brian Paul return "UNDEFINED"; 7700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 787c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul { 797c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul static char s[20]; 8078a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul _mesa_snprintf(s, sizeof(s), "FILE%u", f); 817c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul return s; 827c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul } 8300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 8400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 8500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 8600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 8700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 88501ee87180047dd04afc69103c31e1eae5374bf1Brian * Return ARB_v/f_prog-style input attrib string. 89501ee87180047dd04afc69103c31e1eae5374bf1Brian */ 90501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic const char * 91501ee87180047dd04afc69103c31e1eae5374bf1Brianarb_input_attrib_string(GLint index, GLenum progType) 92501ee87180047dd04afc69103c31e1eae5374bf1Brian{ 93a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul /* 94a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul * These strings should match the VERT_ATTRIB_x and FRAG_ATTRIB_x tokens. 95a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul */ 96501ee87180047dd04afc69103c31e1eae5374bf1Brian const char *vertAttribs[] = { 97501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.position", 98501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.weight", 99501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.normal", 100501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.color.primary", 101501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.color.secondary", 102501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.fogcoord", 103501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.(six)", 104501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.(seven)", 105501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.texcoord[0]", 106501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.texcoord[1]", 107501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.texcoord[2]", 108501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.texcoord[3]", 109501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.texcoord[4]", 110501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.texcoord[5]", 111501ee87180047dd04afc69103c31e1eae5374bf1Brian "vertex.texcoord[6]", 112d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.texcoord[7]", 113d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[0]", 114d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[1]", 115d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[2]", 116d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[3]", 117d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[4]", 118d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[5]", 119d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[6]", 120d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[7]", 121d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[8]", 122d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[9]", 123d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[10]", 124d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[11]", 125d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[12]", 126d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[13]", 127d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[14]", 128d787850ae6d60f8287ff320d4da2adf4254589c3Markus Amsler "vertex.attrib[15]" 129501ee87180047dd04afc69103c31e1eae5374bf1Brian }; 130501ee87180047dd04afc69103c31e1eae5374bf1Brian const char *fragAttribs[] = { 131501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.position", 132501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.color.primary", 133501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.color.secondary", 134501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.fogcoord", 135501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[0]", 136501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[1]", 137501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[2]", 138501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[3]", 139501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[4]", 140501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[5]", 141501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[6]", 142501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.texcoord[7]", 143501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[0]", 144501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[1]", 145501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[2]", 146501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[3]", 147501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[4]", 148501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[5]", 149501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[6]", 150501ee87180047dd04afc69103c31e1eae5374bf1Brian "fragment.varying[7]" 151501ee87180047dd04afc69103c31e1eae5374bf1Brian }; 152501ee87180047dd04afc69103c31e1eae5374bf1Brian 15312ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul /* sanity checks */ 15412ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul assert(strcmp(vertAttribs[VERT_ATTRIB_TEX0], "vertex.texcoord[0]") == 0); 15512ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul assert(strcmp(vertAttribs[VERT_ATTRIB_GENERIC15], "vertex.attrib[15]") == 0); 15612ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul 157501ee87180047dd04afc69103c31e1eae5374bf1Brian if (progType == GL_VERTEX_PROGRAM_ARB) { 158501ee87180047dd04afc69103c31e1eae5374bf1Brian assert(index < sizeof(vertAttribs) / sizeof(vertAttribs[0])); 159501ee87180047dd04afc69103c31e1eae5374bf1Brian return vertAttribs[index]; 160501ee87180047dd04afc69103c31e1eae5374bf1Brian } 161501ee87180047dd04afc69103c31e1eae5374bf1Brian else { 162501ee87180047dd04afc69103c31e1eae5374bf1Brian assert(index < sizeof(fragAttribs) / sizeof(fragAttribs[0])); 163501ee87180047dd04afc69103c31e1eae5374bf1Brian return fragAttribs[index]; 164501ee87180047dd04afc69103c31e1eae5374bf1Brian } 165501ee87180047dd04afc69103c31e1eae5374bf1Brian} 166501ee87180047dd04afc69103c31e1eae5374bf1Brian 167501ee87180047dd04afc69103c31e1eae5374bf1Brian 168501ee87180047dd04afc69103c31e1eae5374bf1Brian/** 16912ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul * Print a vertex program's InputsRead field in human-readable format. 17012ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul * For debugging. 17112ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul */ 17212ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paulvoid 17312ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul_mesa_print_vp_inputs(GLbitfield inputs) 17412ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul{ 175298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("VP Inputs 0x%x: \n", inputs); 17612ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul while (inputs) { 17712ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul GLint attr = _mesa_ffs(inputs) - 1; 17812ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul const char *name = arb_input_attrib_string(attr, 17912ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul GL_VERTEX_PROGRAM_ARB); 180298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" %d: %s\n", attr, name); 18112ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul inputs &= ~(1 << attr); 18212ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul } 18312ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul} 18412ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul 18512ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul 18612ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul/** 18712ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul * Print a fragment program's InputsRead field in human-readable format. 18812ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul * For debugging. 18912ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul */ 19012ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paulvoid 19112ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul_mesa_print_fp_inputs(GLbitfield inputs) 19212ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul{ 193298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("FP Inputs 0x%x: \n", inputs); 19412ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul while (inputs) { 19512ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul GLint attr = _mesa_ffs(inputs) - 1; 19612ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul const char *name = arb_input_attrib_string(attr, 19712ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul GL_FRAGMENT_PROGRAM_ARB); 198298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" %d: %s\n", attr, name); 19912ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul inputs &= ~(1 << attr); 20012ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul } 20112ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul} 20212ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul 20312ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul 20412ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul 20512ffee5d58de487cd03e274f7d6f7118d9ad8206Brian Paul/** 206501ee87180047dd04afc69103c31e1eae5374bf1Brian * Return ARB_v/f_prog-style output attrib string. 207501ee87180047dd04afc69103c31e1eae5374bf1Brian */ 208501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic const char * 209501ee87180047dd04afc69103c31e1eae5374bf1Brianarb_output_attrib_string(GLint index, GLenum progType) 210501ee87180047dd04afc69103c31e1eae5374bf1Brian{ 211a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul /* 212a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul * These strings should match the VERT_RESULT_x and FRAG_RESULT_x tokens. 213a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul */ 214501ee87180047dd04afc69103c31e1eae5374bf1Brian const char *vertResults[] = { 215501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.position", 216501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.color.primary", 217501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.color.secondary", 218501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.fogcoord", 219501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[0]", 220501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[1]", 221501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[2]", 222501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[3]", 223501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[4]", 224501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[5]", 225501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[6]", 226501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.texcoord[7]", 227501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[0]", 228501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[1]", 229501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[2]", 230501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[3]", 231501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[4]", 232501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[5]", 233501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[6]", 234501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.varying[7]" 235501ee87180047dd04afc69103c31e1eae5374bf1Brian }; 236501ee87180047dd04afc69103c31e1eae5374bf1Brian const char *fragResults[] = { 237501ee87180047dd04afc69103c31e1eae5374bf1Brian "result.color", 238a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul "result.color(half)", 239a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul "result.depth", 240a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul "result.color[0]", 241a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul "result.color[1]", 242a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul "result.color[2]", 243a070937c00828ef0c0d618df7cc4845b0a21bbf3Brian Paul "result.color[3]" 244501ee87180047dd04afc69103c31e1eae5374bf1Brian }; 245501ee87180047dd04afc69103c31e1eae5374bf1Brian 246501ee87180047dd04afc69103c31e1eae5374bf1Brian if (progType == GL_VERTEX_PROGRAM_ARB) { 247501ee87180047dd04afc69103c31e1eae5374bf1Brian assert(index < sizeof(vertResults) / sizeof(vertResults[0])); 248501ee87180047dd04afc69103c31e1eae5374bf1Brian return vertResults[index]; 249501ee87180047dd04afc69103c31e1eae5374bf1Brian } 250501ee87180047dd04afc69103c31e1eae5374bf1Brian else { 251501ee87180047dd04afc69103c31e1eae5374bf1Brian assert(index < sizeof(fragResults) / sizeof(fragResults[0])); 252501ee87180047dd04afc69103c31e1eae5374bf1Brian return fragResults[index]; 253501ee87180047dd04afc69103c31e1eae5374bf1Brian } 254501ee87180047dd04afc69103c31e1eae5374bf1Brian} 255501ee87180047dd04afc69103c31e1eae5374bf1Brian 256501ee87180047dd04afc69103c31e1eae5374bf1Brian 257501ee87180047dd04afc69103c31e1eae5374bf1Brian/** 258501ee87180047dd04afc69103c31e1eae5374bf1Brian * Return string representation of the given register. 259501ee87180047dd04afc69103c31e1eae5374bf1Brian * Note that some types of registers (like PROGRAM_UNIFORM) aren't defined 260501ee87180047dd04afc69103c31e1eae5374bf1Brian * by the ARB/NV program languages so we've taken some liberties here. 2611eee1bac1f6d911e6124daafc9b9291666d91cefVinson Lee * \param f the register file (PROGRAM_INPUT, PROGRAM_TEMPORARY, etc) 262501ee87180047dd04afc69103c31e1eae5374bf1Brian * \param index number of the register in the register file 263501ee87180047dd04afc69103c31e1eae5374bf1Brian * \param mode the output format/mode/style 264501ee87180047dd04afc69103c31e1eae5374bf1Brian * \param prog pointer to containing program 265501ee87180047dd04afc69103c31e1eae5374bf1Brian */ 266501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic const char * 267b4026d9be828bd0b6f60158456edf24994efb053Brian Paulreg_string(gl_register_file f, GLint index, gl_prog_print_mode mode, 268b4855288e4de9001b4107d3d4c2f7aff4a4680f9Zack Rusin GLboolean relAddr, const struct gl_program *prog, 2691491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin GLboolean hasIndex2, GLboolean relAddr2, GLint index2) 270501ee87180047dd04afc69103c31e1eae5374bf1Brian{ 271501ee87180047dd04afc69103c31e1eae5374bf1Brian static char str[100]; 272f88a9015985f1e308496803630221f284a94f397Brian Paul const char *addr = relAddr ? "ADDR+" : ""; 273501ee87180047dd04afc69103c31e1eae5374bf1Brian 274501ee87180047dd04afc69103c31e1eae5374bf1Brian str[0] = 0; 275501ee87180047dd04afc69103c31e1eae5374bf1Brian 276501ee87180047dd04afc69103c31e1eae5374bf1Brian switch (mode) { 277501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROG_PRINT_DEBUG: 278298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "%s[%s%d]", file_string(f, mode), addr, index); 2791491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin if (hasIndex2) { 280b4855288e4de9001b4107d3d4c2f7aff4a4680f9Zack Rusin int offset = strlen(str); 2811491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin const char *addr2 = relAddr2 ? "ADDR+" : ""; 2821491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin sprintf(str+offset, "[%s%d]", addr2, index2); 283b4855288e4de9001b4107d3d4c2f7aff4a4680f9Zack Rusin } 284501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 285501ee87180047dd04afc69103c31e1eae5374bf1Brian 286501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROG_PRINT_ARB: 287501ee87180047dd04afc69103c31e1eae5374bf1Brian switch (f) { 288501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_INPUT: 289298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "%s", arb_input_attrib_string(index, prog->Target)); 290501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 291501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_OUTPUT: 292298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "%s", arb_output_attrib_string(index, prog->Target)); 293501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 294501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_TEMPORARY: 295298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "temp%d", index); 296501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 297501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_ENV_PARAM: 298298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "program.env[%s%d]", addr, index); 299501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 300501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_LOCAL_PARAM: 301298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "program.local[%s%d]", addr, index); 302501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 303501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_VARYING: /* extension */ 304298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "varying[%s%d]", addr, index); 305501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 306501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_CONSTANT: /* extension */ 307298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "constant[%s%d]", addr, index); 308501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 309501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_UNIFORM: /* extension */ 310298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "uniform[%s%d]", addr, index); 311501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 312501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_STATE_VAR: 313501ee87180047dd04afc69103c31e1eae5374bf1Brian { 314501ee87180047dd04afc69103c31e1eae5374bf1Brian struct gl_program_parameter *param 315501ee87180047dd04afc69103c31e1eae5374bf1Brian = prog->Parameters->Parameters + index; 3169a64440154319738445e203339156e54232908eeBrian Paul char *state = _mesa_program_state_string(param->StateIndexes); 317a45f2ec7b7e929d705df23471ee92f05e233338cVinson Lee sprintf(str, "%s", state); 31832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(state); 319501ee87180047dd04afc69103c31e1eae5374bf1Brian } 320501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 321501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_ADDRESS: 322298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "A%d", index); 323501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 324501ee87180047dd04afc69103c31e1eae5374bf1Brian default: 325501ee87180047dd04afc69103c31e1eae5374bf1Brian _mesa_problem(NULL, "bad file in reg_string()"); 326501ee87180047dd04afc69103c31e1eae5374bf1Brian } 327501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 328501ee87180047dd04afc69103c31e1eae5374bf1Brian 329501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROG_PRINT_NV: 330501ee87180047dd04afc69103c31e1eae5374bf1Brian switch (f) { 331501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_INPUT: 332501ee87180047dd04afc69103c31e1eae5374bf1Brian if (prog->Target == GL_VERTEX_PROGRAM_ARB) 333298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "v[%d]", index); 334501ee87180047dd04afc69103c31e1eae5374bf1Brian else 335298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "f[%d]", index); 336501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 337501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_OUTPUT: 338298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "o[%d]", index); 339501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 340501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_TEMPORARY: 341298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "R%d", index); 342501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 343501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_ENV_PARAM: 344298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "c[%d]", index); 345501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 346501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_VARYING: /* extension */ 347298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "varying[%s%d]", addr, index); 348501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 349501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_UNIFORM: /* extension */ 350298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "uniform[%s%d]", addr, index); 351501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 352501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_CONSTANT: /* extension */ 353298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "constant[%s%d]", addr, index); 354501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 355501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_STATE_VAR: /* extension */ 356298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "state[%s%d]", addr, index); 357501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 358501ee87180047dd04afc69103c31e1eae5374bf1Brian default: 359501ee87180047dd04afc69103c31e1eae5374bf1Brian _mesa_problem(NULL, "bad file in reg_string()"); 360501ee87180047dd04afc69103c31e1eae5374bf1Brian } 361501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 362501ee87180047dd04afc69103c31e1eae5374bf1Brian 363501ee87180047dd04afc69103c31e1eae5374bf1Brian default: 364501ee87180047dd04afc69103c31e1eae5374bf1Brian _mesa_problem(NULL, "bad mode in reg_string()"); 365501ee87180047dd04afc69103c31e1eae5374bf1Brian } 366501ee87180047dd04afc69103c31e1eae5374bf1Brian 367501ee87180047dd04afc69103c31e1eae5374bf1Brian return str; 368501ee87180047dd04afc69103c31e1eae5374bf1Brian} 369501ee87180047dd04afc69103c31e1eae5374bf1Brian 370501ee87180047dd04afc69103c31e1eae5374bf1Brian 371501ee87180047dd04afc69103c31e1eae5374bf1Brian/** 37200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Return a string representation of the given swizzle word. 37300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * If extended is true, use extended (comma-separated) format. 3743a2815370d26012b41d742540237985a333b6ae4Brian * \param swizzle the swizzle field 3753a2815370d26012b41d742540237985a333b6ae4Brian * \param negateBase 4-bit negation vector 3763a2815370d26012b41d742540237985a333b6ae4Brian * \param extended if true, also allow 0, 1 values 37700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 378059376c855cbeb160e98f438a35edb8bd88b8bb2Brianconst char * 3797db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul_mesa_swizzle_string(GLuint swizzle, GLuint negateMask, GLboolean extended) 38000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 38174a19b0abd382574ff583eab81a374acead9254dBrian Paul static const char swz[] = "xyzw01!?"; /* See SWIZZLE_x definitions */ 38200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian static char s[20]; 38300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint i = 0; 38400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3857db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (!extended && swizzle == SWIZZLE_NOOP && negateMask == 0) 38600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return ""; /* no swizzle/negation */ 38700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 38800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (!extended) 38900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '.'; 39000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3917db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (negateMask & NEGATE_X) 39200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 39300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 0)]; 39400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 39500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (extended) { 39600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = ','; 39700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 39800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3997db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (negateMask & NEGATE_Y) 40000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 40100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 1)]; 40200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 40300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (extended) { 40400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = ','; 40500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 40600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4077db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (negateMask & NEGATE_Z) 40800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 40900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 2)]; 41000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 41100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (extended) { 41200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = ','; 41300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 41400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4157db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (negateMask & NEGATE_W) 41600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 41700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 3)]; 41800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 41900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i] = 0; 42000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return s; 42100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 42200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 42300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 424511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paulvoid 425511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul_mesa_print_swizzle(GLuint swizzle) 426511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul{ 427511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul if (swizzle == SWIZZLE_XYZW) { 428298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(".xyzw\n"); 429511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul } 430511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul else { 431f9c574d7192d2193ff3e12629a8db1a74b6dbf55Michal Krol const char *s = _mesa_swizzle_string(swizzle, 0, 0); 432298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("%s\n", s); 433511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul } 434511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul} 435511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul 436511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul 437610c2461ce0683ca5412e4b2b7a496f67e9d3704Brian Paulconst char * 438610c2461ce0683ca5412e4b2b7a496f67e9d3704Brian Paul_mesa_writemask_string(GLuint writeMask) 43900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 44000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian static char s[10]; 44100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint i = 0; 44200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 44300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask == WRITEMASK_XYZW) 44400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return ""; 44500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 44600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '.'; 44700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask & WRITEMASK_X) 44800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = 'x'; 44900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask & WRITEMASK_Y) 45000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = 'y'; 45100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask & WRITEMASK_Z) 45200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = 'z'; 45300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask & WRITEMASK_W) 45400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = 'w'; 45500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 45600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i] = 0; 45700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return s; 45800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 45900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4603a2815370d26012b41d742540237985a333b6ae4Brian 461d750861dc26e3898afa2b49e3969d709dc227664Brianconst char * 462d750861dc26e3898afa2b49e3969d709dc227664Brian_mesa_condcode_string(GLuint condcode) 4633a2815370d26012b41d742540237985a333b6ae4Brian{ 4643a2815370d26012b41d742540237985a333b6ae4Brian switch (condcode) { 4653a2815370d26012b41d742540237985a333b6ae4Brian case COND_GT: return "GT"; 4663a2815370d26012b41d742540237985a333b6ae4Brian case COND_EQ: return "EQ"; 4673a2815370d26012b41d742540237985a333b6ae4Brian case COND_LT: return "LT"; 4683a2815370d26012b41d742540237985a333b6ae4Brian case COND_UN: return "UN"; 4693a2815370d26012b41d742540237985a333b6ae4Brian case COND_GE: return "GE"; 4703a2815370d26012b41d742540237985a333b6ae4Brian case COND_LE: return "LE"; 4713a2815370d26012b41d742540237985a333b6ae4Brian case COND_NE: return "NE"; 4723a2815370d26012b41d742540237985a333b6ae4Brian case COND_TR: return "TR"; 4733a2815370d26012b41d742540237985a333b6ae4Brian case COND_FL: return "FL"; 4743a2815370d26012b41d742540237985a333b6ae4Brian default: return "cond???"; 4753a2815370d26012b41d742540237985a333b6ae4Brian } 4763a2815370d26012b41d742540237985a333b6ae4Brian} 4773a2815370d26012b41d742540237985a333b6ae4Brian 4783a2815370d26012b41d742540237985a333b6ae4Brian 47900cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void 480d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_dst_reg(FILE * f, 481d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct prog_dst_register *dstReg, 482d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul gl_prog_print_mode mode, 483d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog) 48400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 485298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s%s", 486298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg reg_string((gl_register_file) dstReg->File, 487b4855288e4de9001b4107d3d4c2f7aff4a4680f9Zack Rusin dstReg->Index, mode, dstReg->RelAddr, prog, 488b4855288e4de9001b4107d3d4c2f7aff4a4680f9Zack Rusin GL_FALSE, GL_FALSE, 0), 489298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_writemask_string(dstReg->WriteMask)); 490298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg 4911936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian if (dstReg->CondMask != COND_TR) { 492298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " (%s.%s)", 493298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(dstReg->CondMask), 494298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(dstReg->CondSwizzle, 495298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg GL_FALSE, GL_FALSE)); 4961936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian } 4971936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian 498501ee87180047dd04afc69103c31e1eae5374bf1Brian#if 0 499298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s[%d]%s", 500298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg file_string((gl_register_file) dstReg->File, mode), 501298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg dstReg->Index, 502298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_writemask_string(dstReg->WriteMask)); 503501ee87180047dd04afc69103c31e1eae5374bf1Brian#endif 50400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 50500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 506d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 50700cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void 508d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_src_reg(FILE *f, 509d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct prog_src_register *srcReg, 510d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul gl_prog_print_mode mode, 511d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog) 51200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 513f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul const char *abs = srcReg->Abs ? "|" : ""; 514f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul 515298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s%s%s%s", 516298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg abs, 517298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg reg_string((gl_register_file) srcReg->File, 518b4855288e4de9001b4107d3d4c2f7aff4a4680f9Zack Rusin srcReg->Index, mode, srcReg->RelAddr, prog, 5191491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin srcReg->HasIndex2, srcReg->RelAddr2, srcReg->Index2), 520298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(srcReg->Swizzle, 521298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg srcReg->Negate, GL_FALSE), 522298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg abs); 523501ee87180047dd04afc69103c31e1eae5374bf1Brian#if 0 524298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s[%d]%s", 525298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg file_string((gl_register_file) srcReg->File, mode), 526298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg srcReg->Index, 527298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(srcReg->Swizzle, 528298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg srcReg->Negate, GL_FALSE)); 529501ee87180047dd04afc69103c31e1eae5374bf1Brian#endif 53000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 53100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 532d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 53300cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void 534d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_comment(FILE *f, const struct prog_instruction *inst) 53500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 53600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->Comment) 537298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "; # %s\n", inst->Comment); 53800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian else 539298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ";\n"); 54000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 54100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 54200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 543501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic void 544d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_alu_instruction(FILE *f, 545d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct prog_instruction *inst, 546d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const char *opcode_string, GLuint numRegs, 547d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul gl_prog_print_mode mode, 548d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog) 54900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 55000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint j; 55100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 552298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s", opcode_string); 553b50280e95f3c044f53c0705d3a5619ebb2db4513Brian if (inst->CondUpdate) 554298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ".C"); 55500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 55600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* frag prog only */ 55700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->SaturateMode == SATURATE_ZERO_ONE) 558298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "_SAT"); 55900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 560298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 56100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->DstReg.File != PROGRAM_UNDEFINED) { 562d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_dst_reg(f, &inst->DstReg, mode, prog); 56300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 56400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian else { 565298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " ???"); 56600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 56700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 56800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (numRegs > 0) 569298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 57000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 57100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (j = 0; j < numRegs; j++) { 572d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, inst->SrcReg + j, mode, prog); 57300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (j + 1 < numRegs) 574298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 57500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 57600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 577d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 5780020d1022f4b5befe4adf783bedc4cf83e09f01fBrian} 5790020d1022f4b5befe4adf783bedc4cf83e09f01fBrian 5800020d1022f4b5befe4adf783bedc4cf83e09f01fBrian 5810020d1022f4b5befe4adf783bedc4cf83e09f01fBrianvoid 5820020d1022f4b5befe4adf783bedc4cf83e09f01fBrian_mesa_print_alu_instruction(const struct prog_instruction *inst, 5830020d1022f4b5befe4adf783bedc4cf83e09f01fBrian const char *opcode_string, GLuint numRegs) 5840020d1022f4b5befe4adf783bedc4cf83e09f01fBrian{ 58543a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin fprint_alu_instruction(stderr, inst, opcode_string, 586d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul numRegs, PROG_PRINT_DEBUG, NULL); 587501ee87180047dd04afc69103c31e1eae5374bf1Brian} 588501ee87180047dd04afc69103c31e1eae5374bf1Brian 589501ee87180047dd04afc69103c31e1eae5374bf1Brian 59000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 59100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Print a single vertex/fragment program instruction. 59200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 5932237d136cd8f964048a4ccdc87e0ffb48af0f73dNicolai HähnleGLint 594d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_instruction_opt(FILE *f, 595d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct prog_instruction *inst, 596d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul GLint indent, 597501ee87180047dd04afc69103c31e1eae5374bf1Brian gl_prog_print_mode mode, 598501ee87180047dd04afc69103c31e1eae5374bf1Brian const struct gl_program *prog) 59900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 6007b30053b264726156a018c822657270e745320ceBrian GLint i; 6015db088d70fbd14620c2fc7840096a05993f8e2b9Brian 6025db088d70fbd14620c2fc7840096a05993f8e2b9Brian if (inst->Opcode == OPCODE_ELSE || 6035db088d70fbd14620c2fc7840096a05993f8e2b9Brian inst->Opcode == OPCODE_ENDIF || 6045db088d70fbd14620c2fc7840096a05993f8e2b9Brian inst->Opcode == OPCODE_ENDLOOP || 6055db088d70fbd14620c2fc7840096a05993f8e2b9Brian inst->Opcode == OPCODE_ENDSUB) { 6065db088d70fbd14620c2fc7840096a05993f8e2b9Brian indent -= 3; 6075db088d70fbd14620c2fc7840096a05993f8e2b9Brian } 6085db088d70fbd14620c2fc7840096a05993f8e2b9Brian for (i = 0; i < indent; i++) { 609298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 6105db088d70fbd14620c2fc7840096a05993f8e2b9Brian } 6115db088d70fbd14620c2fc7840096a05993f8e2b9Brian 61200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (inst->Opcode) { 61300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_PRINT: 6148de5a292f70dba854a4bf06a2210bc38381e6bcfBrian Paul fprintf(f, "PRINT '%s'", (char *) inst->Data); 61500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) { 616298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 617298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s[%d]%s", 618298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg file_string((gl_register_file) inst->SrcReg[0].File, 619298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg mode), 620298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->SrcReg[0].Index, 621298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->SrcReg[0].Swizzle, 622298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->SrcReg[0].Negate, GL_FALSE)); 62300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 62400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->Comment) 625298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " # %s", inst->Comment); 626d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 62700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 62800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_SWZ: 629298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "SWZ"); 63000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->SaturateMode == SATURATE_ZERO_ONE) 631298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "_SAT"); 632298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 633d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_dst_reg(f, &inst->DstReg, mode, prog); 634298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", %s[%d], %s", 635298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg file_string((gl_register_file) inst->SrcReg[0].File, 636298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg mode), 637298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->SrcReg[0].Index, 638298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->SrcReg[0].Swizzle, 639298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->SrcReg[0].Negate, GL_TRUE)); 640d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 64100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 64200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_TEX: 64300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_TXP: 6444b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul case OPCODE_TXL: 64500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_TXB: 646298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s", _mesa_opcode_string(inst->Opcode)); 64700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->SaturateMode == SATURATE_ZERO_ONE) 648298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "_SAT"); 649298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 650d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_dst_reg(f, &inst->DstReg, mode, prog); 651298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 652d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, &inst->SrcReg[0], mode, prog); 653298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", texture[%d], ", inst->TexSrcUnit); 65400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (inst->TexSrcTarget) { 655298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_1D_INDEX: fprintf(f, "1D"); break; 656298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_2D_INDEX: fprintf(f, "2D"); break; 657298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_3D_INDEX: fprintf(f, "3D"); break; 658298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_CUBE_INDEX: fprintf(f, "CUBE"); break; 659298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_RECT_INDEX: fprintf(f, "RECT"); break; 6602c1619869a9af1420e0a23b65e31d40a694b7f46Brian Paul case TEXTURE_1D_ARRAY_INDEX: fprintf(f, "1D_ARRAY"); break; 6612c1619869a9af1420e0a23b65e31d40a694b7f46Brian Paul case TEXTURE_2D_ARRAY_INDEX: fprintf(f, "2D_ARRAY"); break; 66200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 66300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian ; 66400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 66544e018c09e7aeba9fd9f4c380da224bd6622c470Brian Paul if (inst->TexShadow) 666298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " SHADOW"); 667d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 66800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 6694b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 6704b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul case OPCODE_KIL: 671298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s", _mesa_opcode_string(inst->Opcode)); 672298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 673d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, &inst->SrcReg[0], mode, prog); 674d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 6754b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul break; 6764b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul case OPCODE_KIL_NV: 677298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s", _mesa_opcode_string(inst->Opcode)); 678298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 679298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s.%s", 680298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 681298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 682298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg GL_FALSE, GL_FALSE)); 683d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 6844b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul break; 6854b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 68600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_ARL: 687298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ARL "); 688d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_dst_reg(f, &inst->DstReg, mode, prog); 689298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 690d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, &inst->SrcReg[0], mode, prog); 691d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 69200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 69300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_BRA: 694298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "BRA %d (%s%s)", 695298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->BranchTarget, 696298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 697298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE)); 698d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 69900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 7005ae49cf3ed53fda6a904d7e90feef78495ae6903Brian case OPCODE_IF: 70163556fa9949f543a8134b6b5ff3d216acb71dd9fBrian if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) { 70263556fa9949f543a8134b6b5ff3d216acb71dd9fBrian /* Use ordinary register */ 703298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "IF "); 704d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, &inst->SrcReg[0], mode, prog); 705298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "; "); 70663556fa9949f543a8134b6b5ff3d216acb71dd9fBrian } 70763556fa9949f543a8134b6b5ff3d216acb71dd9fBrian else { 70863556fa9949f543a8134b6b5ff3d216acb71dd9fBrian /* Use cond codes */ 709298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "IF (%s%s);", 710298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 711298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 712298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg 0, GL_FALSE)); 71363556fa9949f543a8134b6b5ff3d216acb71dd9fBrian } 714298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " # (if false, goto %d)", inst->BranchTarget); 715d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 7165db088d70fbd14620c2fc7840096a05993f8e2b9Brian return indent + 3; 7175ae49cf3ed53fda6a904d7e90feef78495ae6903Brian case OPCODE_ELSE: 718298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ELSE; # (goto %d)\n", inst->BranchTarget); 7195db088d70fbd14620c2fc7840096a05993f8e2b9Brian return indent + 3; 7205ae49cf3ed53fda6a904d7e90feef78495ae6903Brian case OPCODE_ENDIF: 721298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ENDIF;\n"); 7225db088d70fbd14620c2fc7840096a05993f8e2b9Brian break; 7235db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_BGNLOOP: 724298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "BGNLOOP; # (end at %d)\n", inst->BranchTarget); 7255db088d70fbd14620c2fc7840096a05993f8e2b9Brian return indent + 3; 7265db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_ENDLOOP: 727298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ENDLOOP; # (goto %d)\n", inst->BranchTarget); 7285db088d70fbd14620c2fc7840096a05993f8e2b9Brian break; 7295db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_BRK: 730f22ed0986a743e033d827c78371612c7115ff913Brian case OPCODE_CONT: 731298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s (%s%s); # (goto %d)", 732298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_opcode_string(inst->Opcode), 733298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 734298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE), 735298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->BranchTarget); 736d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 7375db088d70fbd14620c2fc7840096a05993f8e2b9Brian break; 73863556fa9949f543a8134b6b5ff3d216acb71dd9fBrian 7395db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_BGNSUB: 740f407cada8aa0bfea1b8dfae766392162c702aaa4Brian if (mode == PROG_PRINT_NV) { 741298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s:\n", inst->Comment); /* comment is label */ 742f407cada8aa0bfea1b8dfae766392162c702aaa4Brian return indent; 743f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 744f407cada8aa0bfea1b8dfae766392162c702aaa4Brian else { 745298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "BGNSUB"); 746d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 747f407cada8aa0bfea1b8dfae766392162c702aaa4Brian return indent + 3; 748f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 7495db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_ENDSUB: 750f407cada8aa0bfea1b8dfae766392162c702aaa4Brian if (mode == PROG_PRINT_DEBUG) { 751298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ENDSUB"); 752d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 753f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 754f407cada8aa0bfea1b8dfae766392162c702aaa4Brian break; 755f407cada8aa0bfea1b8dfae766392162c702aaa4Brian case OPCODE_CAL: 756f407cada8aa0bfea1b8dfae766392162c702aaa4Brian if (mode == PROG_PRINT_NV) { 757298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "CAL %s; # (goto %d)\n", inst->Comment, inst->BranchTarget); 758f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 759f407cada8aa0bfea1b8dfae766392162c702aaa4Brian else { 760298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "CAL %u", inst->BranchTarget); 761d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 762f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 763f407cada8aa0bfea1b8dfae766392162c702aaa4Brian break; 764f407cada8aa0bfea1b8dfae766392162c702aaa4Brian case OPCODE_RET: 765298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "RET (%s%s)", 766298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 767298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE)); 768d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 7695ae49cf3ed53fda6a904d7e90feef78495ae6903Brian break; 770f407cada8aa0bfea1b8dfae766392162c702aaa4Brian 77100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_END: 772298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "END\n"); 77300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 7743a2815370d26012b41d742540237985a333b6ae4Brian case OPCODE_NOP: 775059376c855cbeb160e98f438a35edb8bd88b8bb2Brian if (mode == PROG_PRINT_DEBUG) { 776298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NOP"); 777d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 778059376c855cbeb160e98f438a35edb8bd88b8bb2Brian } 779059376c855cbeb160e98f438a35edb8bd88b8bb2Brian else if (inst->Comment) { 780059376c855cbeb160e98f438a35edb8bd88b8bb2Brian /* ARB/NV extensions don't have NOP instruction */ 781298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "# %s\n", inst->Comment); 782059376c855cbeb160e98f438a35edb8bd88b8bb2Brian } 7833a2815370d26012b41d742540237985a333b6ae4Brian break; 784da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case OPCODE_EMIT_VERTEX: 785da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin fprintf(f, "EMIT_VERTEX\n"); 786da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 787da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case OPCODE_END_PRIMITIVE: 788da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin fprintf(f, "END_PRIMITIVE\n"); 789da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 79000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* XXX may need other special-case instructions */ 79100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 792f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul if (inst->Opcode < MAX_OPCODE) { 793f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul /* typical alu instruction */ 794f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul fprint_alu_instruction(f, inst, 795f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul _mesa_opcode_string(inst->Opcode), 796f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul _mesa_num_inst_src_regs(inst->Opcode), 797f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul mode, prog); 798f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul } 799f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul else { 8007c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul fprint_alu_instruction(f, inst, 8017c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul _mesa_opcode_string(inst->Opcode), 8027c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul 3/*_mesa_num_inst_src_regs(inst->Opcode)*/, 8037c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul mode, prog); 804f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul } 80500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 80600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 8075db088d70fbd14620c2fc7840096a05993f8e2b9Brian return indent; 80800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 80900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 81000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 811d0038930312f96468a9159a1221c3f4c56bddaa4Brian PaulGLint 812d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_instruction_opt(const struct prog_instruction *inst, 813d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul GLint indent, 814d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul gl_prog_print_mode mode, 815d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog) 816d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 81743a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin return _mesa_fprint_instruction_opt(stderr, inst, indent, mode, prog); 818d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 819d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 820d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 82100cdc0a472c55330cbc58317f01b07f8f90be5a5Brianvoid 822d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_instruction(const struct prog_instruction *inst) 82300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 824d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul /* note: 4th param should be ignored for PROG_PRINT_DEBUG */ 82543a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin _mesa_fprint_instruction_opt(stderr, inst, 0, PROG_PRINT_DEBUG, NULL); 826501ee87180047dd04afc69103c31e1eae5374bf1Brian} 827501ee87180047dd04afc69103c31e1eae5374bf1Brian 828501ee87180047dd04afc69103c31e1eae5374bf1Brian 829d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 830501ee87180047dd04afc69103c31e1eae5374bf1Brian/** 831501ee87180047dd04afc69103c31e1eae5374bf1Brian * Print program, with options. 832501ee87180047dd04afc69103c31e1eae5374bf1Brian */ 833d2eff33ab7fda9527458ea35d9eb109ec2988490Brian Paulvoid 834d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_program_opt(FILE *f, 835d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog, 836d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul gl_prog_print_mode mode, 837d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul GLboolean lineNumbers) 838501ee87180047dd04afc69103c31e1eae5374bf1Brian{ 8395db088d70fbd14620c2fc7840096a05993f8e2b9Brian GLuint i, indent = 0; 840501ee87180047dd04afc69103c31e1eae5374bf1Brian 841501ee87180047dd04afc69103c31e1eae5374bf1Brian switch (prog->Target) { 842501ee87180047dd04afc69103c31e1eae5374bf1Brian case GL_VERTEX_PROGRAM_ARB: 843501ee87180047dd04afc69103c31e1eae5374bf1Brian if (mode == PROG_PRINT_ARB) 844298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "!!ARBvp1.0\n"); 845501ee87180047dd04afc69103c31e1eae5374bf1Brian else if (mode == PROG_PRINT_NV) 846298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "!!VP1.0\n"); 847501ee87180047dd04afc69103c31e1eae5374bf1Brian else 848298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "# Vertex Program/Shader %u\n", prog->Id); 849501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 850501ee87180047dd04afc69103c31e1eae5374bf1Brian case GL_FRAGMENT_PROGRAM_ARB: 851501ee87180047dd04afc69103c31e1eae5374bf1Brian case GL_FRAGMENT_PROGRAM_NV: 852501ee87180047dd04afc69103c31e1eae5374bf1Brian if (mode == PROG_PRINT_ARB) 853298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "!!ARBfp1.0\n"); 854501ee87180047dd04afc69103c31e1eae5374bf1Brian else if (mode == PROG_PRINT_NV) 855298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "!!FP1.0\n"); 856501ee87180047dd04afc69103c31e1eae5374bf1Brian else 857298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "# Fragment Program/Shader %u\n", prog->Id); 858501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 859da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case MESA_GEOMETRY_PROGRAM: 860da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin fprintf(f, "# Geometry Shader\n"); 861501ee87180047dd04afc69103c31e1eae5374bf1Brian } 862501ee87180047dd04afc69103c31e1eae5374bf1Brian 86300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0; i < prog->NumInstructions; i++) { 864501ee87180047dd04afc69103c31e1eae5374bf1Brian if (lineNumbers) 865298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%3d: ", i); 866d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul indent = _mesa_fprint_instruction_opt(f, prog->Instructions + i, 867501ee87180047dd04afc69103c31e1eae5374bf1Brian indent, mode, prog); 86800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 86900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 87000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 87100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 87200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 87343a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin * Print program to stderr, default options. 87400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 87500cdc0a472c55330cbc58317f01b07f8f90be5a5Brianvoid 876d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_program(const struct gl_program *prog) 877d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 878a7400e736467b7b032ee0d8a8bad25a0a65e782bIan Romanick _mesa_fprint_program_opt(stderr, prog, PROG_PRINT_DEBUG, GL_TRUE); 879d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 880d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 881d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 882d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 883b5ddc7821a334177ff3f6c0ea3a5c24245ad194cBrian Paul * Return binary representation of 64-bit value (as a string). 884f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul * Insert a comma to separate each group of 8 bits. 885b5ddc7821a334177ff3f6c0ea3a5c24245ad194cBrian Paul * Note we return a pointer to local static storage so this is not 886b5ddc7821a334177ff3f6c0ea3a5c24245ad194cBrian Paul * re-entrant, etc. 887f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul * XXX move to imports.[ch] if useful elsewhere. 888f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul */ 889f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paulstatic const char * 8905606dfb572bf4b89b4882265924705bacc8c182bIan Romanickbinary(GLbitfield64 val) 891f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul{ 8925606dfb572bf4b89b4882265924705bacc8c182bIan Romanick static char buf[80]; 893f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul GLint i, len = 0; 8945606dfb572bf4b89b4882265924705bacc8c182bIan Romanick for (i = 63; i >= 0; --i) { 895e57689c6badee8521691966ff6aa56648a474ce9Brian Paul if (val & (BITFIELD64_BIT(i))) 896f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul buf[len++] = '1'; 897f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul else if (len > 0 || i == 0) 898f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul buf[len++] = '0'; 899f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul if (len > 0 && ((i-1) % 8) == 7) 900f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul buf[len++] = ','; 901f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul } 902f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul buf[len] = '\0'; 903f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul return buf; 904f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul} 905f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul 906f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul 907f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul/** 908d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print all of a program's parameters/fields to given file. 909d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 910d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulstatic void 911d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_program_parameters(FILE *f, 912d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul GLcontext *ctx, 913d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog) 91400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 9154b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul GLuint i; 9164b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 917298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "InputsRead: 0x%x (0b%s)\n", 918f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul prog->InputsRead, binary(prog->InputsRead)); 919298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "OutputsWritten: 0x%llx (0b%s)\n", 92053d3f0c78818c93e7121857998ba207bfe9275feJosé Fonseca (unsigned long long)prog->OutputsWritten, 92153d3f0c78818c93e7121857998ba207bfe9275feJosé Fonseca binary(prog->OutputsWritten)); 922298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumInstructions=%d\n", prog->NumInstructions); 923298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumTemporaries=%d\n", prog->NumTemporaries); 924298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumParameters=%d\n", prog->NumParameters); 925298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumAttributes=%d\n", prog->NumAttributes); 926298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumAddressRegs=%d\n", prog->NumAddressRegs); 92756643096f1eb01eefa1a532ac096b32d23b6b8baBrian Paul fprintf(f, "IndirectRegisterFiles: 0x%x (0b%s)\n", 92856643096f1eb01eefa1a532ac096b32d23b6b8baBrian Paul prog->IndirectRegisterFiles, binary(prog->IndirectRegisterFiles)); 929298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "SamplersUsed: 0x%x (0b%s)\n", 930f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul prog->SamplersUsed, binary(prog->SamplersUsed)); 931298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "Samplers=[ "); 9324b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul for (i = 0; i < MAX_SAMPLERS; i++) { 933298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%d ", prog->SamplerUnits[i]); 9344b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul } 935298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "]\n"); 9364b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 93700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_load_state_parameters(ctx, prog->Parameters); 9384b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 93900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#if 0 940298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "Local Params:\n"); 94100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0; i < MAX_PROGRAM_LOCAL_PARAMS; i++){ 94200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const GLfloat *p = prog->LocalParams[i]; 943298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%2d: %f, %f, %f, %f\n", i, p[0], p[1], p[2], p[3]); 94400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 94500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#endif 94683ca3ff384ac09524ff6946134cded4174590d92Brian _mesa_print_parameter_list(prog->Parameters); 94783ca3ff384ac09524ff6946134cded4174590d92Brian} 94883ca3ff384ac09524ff6946134cded4174590d92Brian 94900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 950d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 95143a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin * Print all of a program's parameters/fields to stderr. 952d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 95383ca3ff384ac09524ff6946134cded4174590d92Brianvoid 954d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_program_parameters(GLcontext *ctx, const struct gl_program *prog) 955d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 95643a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin _mesa_fprint_program_parameters(stderr, ctx, prog); 957d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 958d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 959d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 960d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 961d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print a program parameter list to given file. 962d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 963d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulstatic void 964d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_parameter_list(FILE *f, 965d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program_parameter_list *list) 96683ca3ff384ac09524ff6946134cded4174590d92Brian{ 967501ee87180047dd04afc69103c31e1eae5374bf1Brian const gl_prog_print_mode mode = PROG_PRINT_DEBUG; 96883ca3ff384ac09524ff6946134cded4174590d92Brian GLuint i; 969501ee87180047dd04afc69103c31e1eae5374bf1Brian 9704b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul if (!list) 9714b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul return; 9724b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 973dfefde38c7dfe70a3531cb85215e55eeb6407180Brian Paul if (0) 974298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "param list %p\n", (void *) list); 975298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "dirty state flags: 0x%x\n", list->StateFlags); 97683ca3ff384ac09524ff6946134cded4174590d92Brian for (i = 0; i < list->NumParameters; i++){ 97783ca3ff384ac09524ff6946134cded4174590d92Brian struct gl_program_parameter *param = list->Parameters + i; 97883ca3ff384ac09524ff6946134cded4174590d92Brian const GLfloat *v = list->ParameterValues[i]; 979298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "param[%d] sz=%d %s %s = {%.3g, %.3g, %.3g, %.3g}", 980298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg i, param->Size, 981298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg file_string(list->Parameters[i].Type, mode), 982298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg param->Name, v[0], v[1], v[2], v[3]); 983f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_CENTROID) 984298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " Centroid"); 985f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_INVARIANT) 986298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " Invariant"); 987f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_FLAT) 988298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " Flat"); 989f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_LINEAR) 990298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " Linear"); 991298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "\n"); 992d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul } 993d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 994d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 995d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 996d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 99743a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin * Print a program parameter list to stderr. 998d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 999d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulvoid 1000d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_parameter_list(const struct gl_program_parameter_list *list) 1001d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 100243a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin _mesa_fprint_parameter_list(stderr, list); 1003d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 1004d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1005d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1006d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 1007d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Write shader and associated info to a file. 1008d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 1009d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulvoid 1010d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_write_shader_to_file(const struct gl_shader *shader) 1011d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 1012d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const char *type; 1013d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul char filename[100]; 1014d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul FILE *f; 1015d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1016d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul if (shader->Type == GL_FRAGMENT_SHADER) 1017d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul type = "frag"; 1018da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin else if (shader->Type == GL_VERTEX_SHADER) 1019d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul type = "vert"; 1020da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin else 1021da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin type = "geom"; 1022d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 102378a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul _mesa_snprintf(filename, sizeof(filename), "shader_%u.%s", shader->Name, type); 1024d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul f = fopen(filename, "w"); 1025d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul if (!f) { 1026d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(stderr, "Unable to open %s for writing\n", filename); 1027d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul return; 102800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 1029d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1030a746ef28df9e6e594be7eb292d2dcad3546f739aBrian Paul fprintf(f, "/* Shader %u source, checksum %u */\n", shader->Name, shader->SourceChecksum); 1031d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fputs(shader->Source, f); 1032d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "\n"); 1033d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1034d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "/* Compile status: %s */\n", 1035d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul shader->CompileStatus ? "ok" : "fail"); 1036d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul if (!shader->CompileStatus) { 1037d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "/* Log Info: */\n"); 1038d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fputs(shader->InfoLog, f); 1039d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul } 1040d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul else { 1041d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "/* GPU code */\n"); 10426ce0c6e743b27cc284e8f164585cfe5892cd662aBrian Paul fprintf(f, "/*\n"); 1043d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprint_program_opt(f, shader->Program, PROG_PRINT_DEBUG, GL_TRUE); 10446ce0c6e743b27cc284e8f164585cfe5892cd662aBrian Paul fprintf(f, "*/\n"); 1045f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul fprintf(f, "/* Parameters / constants */\n"); 1046f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul fprintf(f, "/*\n"); 1047f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul _mesa_fprint_parameter_list(f, shader->Program->Parameters); 1048f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul fprintf(f, "*/\n"); 1049d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul } 1050d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1051d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fclose(f); 105200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 1053d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1054d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1055db598b899868ba6db8f3f525a22a45331589592eBrian Paul/** 1056db598b899868ba6db8f3f525a22a45331589592eBrian Paul * Append the shader's uniform info/values to the shader log file. 1057db598b899868ba6db8f3f525a22a45331589592eBrian Paul * The log file will typically have been created by the 1058db598b899868ba6db8f3f525a22a45331589592eBrian Paul * _mesa_write_shader_to_file function. 1059db598b899868ba6db8f3f525a22a45331589592eBrian Paul */ 1060db598b899868ba6db8f3f525a22a45331589592eBrian Paulvoid 106112199ed96ca0dd2307e9893c58300623cfa6c0eeBrian Paul_mesa_append_uniforms_to_file(const struct gl_shader *shader, 106212199ed96ca0dd2307e9893c58300623cfa6c0eeBrian Paul const struct gl_program *prog) 1063db598b899868ba6db8f3f525a22a45331589592eBrian Paul{ 1064db598b899868ba6db8f3f525a22a45331589592eBrian Paul const char *type; 1065db598b899868ba6db8f3f525a22a45331589592eBrian Paul char filename[100]; 1066db598b899868ba6db8f3f525a22a45331589592eBrian Paul FILE *f; 1067db598b899868ba6db8f3f525a22a45331589592eBrian Paul 1068db598b899868ba6db8f3f525a22a45331589592eBrian Paul if (shader->Type == GL_FRAGMENT_SHADER) 1069db598b899868ba6db8f3f525a22a45331589592eBrian Paul type = "frag"; 1070db598b899868ba6db8f3f525a22a45331589592eBrian Paul else 1071db598b899868ba6db8f3f525a22a45331589592eBrian Paul type = "vert"; 1072db598b899868ba6db8f3f525a22a45331589592eBrian Paul 107378a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul _mesa_snprintf(filename, sizeof(filename), "shader_%u.%s", shader->Name, type); 1074db598b899868ba6db8f3f525a22a45331589592eBrian Paul f = fopen(filename, "a"); /* append */ 1075db598b899868ba6db8f3f525a22a45331589592eBrian Paul if (!f) { 1076db598b899868ba6db8f3f525a22a45331589592eBrian Paul fprintf(stderr, "Unable to open %s for appending\n", filename); 1077db598b899868ba6db8f3f525a22a45331589592eBrian Paul return; 1078db598b899868ba6db8f3f525a22a45331589592eBrian Paul } 1079db598b899868ba6db8f3f525a22a45331589592eBrian Paul 1080db598b899868ba6db8f3f525a22a45331589592eBrian Paul fprintf(f, "/* First-draw parameters / constants */\n"); 1081db598b899868ba6db8f3f525a22a45331589592eBrian Paul fprintf(f, "/*\n"); 108212199ed96ca0dd2307e9893c58300623cfa6c0eeBrian Paul _mesa_fprint_parameter_list(f, prog->Parameters); 1083db598b899868ba6db8f3f525a22a45331589592eBrian Paul fprintf(f, "*/\n"); 1084db598b899868ba6db8f3f525a22a45331589592eBrian Paul 1085db598b899868ba6db8f3f525a22a45331589592eBrian Paul fclose(f); 1086db598b899868ba6db8f3f525a22a45331589592eBrian Paul} 1087