prog_print.c revision 53d3f0c78818c93e7121857998ba207bfe9275fe
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, 26819659a50f9356023c59942794bd4e6e075f120bdZack Rusin GLboolean relAddr, const struct gl_program *prog) 269501ee87180047dd04afc69103c31e1eae5374bf1Brian{ 270501ee87180047dd04afc69103c31e1eae5374bf1Brian static char str[100]; 271f88a9015985f1e308496803630221f284a94f397Brian Paul const char *addr = relAddr ? "ADDR+" : ""; 272501ee87180047dd04afc69103c31e1eae5374bf1Brian 273501ee87180047dd04afc69103c31e1eae5374bf1Brian str[0] = 0; 274501ee87180047dd04afc69103c31e1eae5374bf1Brian 275501ee87180047dd04afc69103c31e1eae5374bf1Brian switch (mode) { 276501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROG_PRINT_DEBUG: 277298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "%s[%s%d]", file_string(f, mode), addr, index); 278501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 279501ee87180047dd04afc69103c31e1eae5374bf1Brian 280501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROG_PRINT_ARB: 281501ee87180047dd04afc69103c31e1eae5374bf1Brian switch (f) { 282501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_INPUT: 283298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "%s", arb_input_attrib_string(index, prog->Target)); 284501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 285501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_OUTPUT: 286298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "%s", arb_output_attrib_string(index, prog->Target)); 287501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 288501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_TEMPORARY: 289298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "temp%d", index); 290501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 291501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_ENV_PARAM: 292298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "program.env[%s%d]", addr, index); 293501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 294501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_LOCAL_PARAM: 295298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "program.local[%s%d]", addr, index); 296501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 297501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_VARYING: /* extension */ 298298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "varying[%s%d]", addr, index); 299501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 300501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_CONSTANT: /* extension */ 301298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "constant[%s%d]", addr, index); 302501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 303501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_UNIFORM: /* extension */ 304298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "uniform[%s%d]", addr, index); 305501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 306501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_STATE_VAR: 307501ee87180047dd04afc69103c31e1eae5374bf1Brian { 308501ee87180047dd04afc69103c31e1eae5374bf1Brian struct gl_program_parameter *param 309501ee87180047dd04afc69103c31e1eae5374bf1Brian = prog->Parameters->Parameters + index; 3109a64440154319738445e203339156e54232908eeBrian Paul char *state = _mesa_program_state_string(param->StateIndexes); 311a45f2ec7b7e929d705df23471ee92f05e233338cVinson Lee sprintf(str, "%s", state); 31232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(state); 313501ee87180047dd04afc69103c31e1eae5374bf1Brian } 314501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 315501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_ADDRESS: 316298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "A%d", index); 317501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 318501ee87180047dd04afc69103c31e1eae5374bf1Brian default: 319501ee87180047dd04afc69103c31e1eae5374bf1Brian _mesa_problem(NULL, "bad file in reg_string()"); 320501ee87180047dd04afc69103c31e1eae5374bf1Brian } 321501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 322501ee87180047dd04afc69103c31e1eae5374bf1Brian 323501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROG_PRINT_NV: 324501ee87180047dd04afc69103c31e1eae5374bf1Brian switch (f) { 325501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_INPUT: 326501ee87180047dd04afc69103c31e1eae5374bf1Brian if (prog->Target == GL_VERTEX_PROGRAM_ARB) 327298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "v[%d]", index); 328501ee87180047dd04afc69103c31e1eae5374bf1Brian else 329298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "f[%d]", index); 330501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 331501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_OUTPUT: 332298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "o[%d]", index); 333501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 334501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_TEMPORARY: 335298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "R%d", index); 336501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 337501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_ENV_PARAM: 338298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "c[%d]", index); 339501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 340501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_VARYING: /* extension */ 341298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "varying[%s%d]", addr, index); 342501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 343501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_UNIFORM: /* extension */ 344298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "uniform[%s%d]", addr, index); 345501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 346501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_CONSTANT: /* extension */ 347298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "constant[%s%d]", addr, index); 348501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 349501ee87180047dd04afc69103c31e1eae5374bf1Brian case PROGRAM_STATE_VAR: /* extension */ 350298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(str, "state[%s%d]", addr, index); 351501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 352501ee87180047dd04afc69103c31e1eae5374bf1Brian default: 353501ee87180047dd04afc69103c31e1eae5374bf1Brian _mesa_problem(NULL, "bad file in reg_string()"); 354501ee87180047dd04afc69103c31e1eae5374bf1Brian } 355501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 356501ee87180047dd04afc69103c31e1eae5374bf1Brian 357501ee87180047dd04afc69103c31e1eae5374bf1Brian default: 358501ee87180047dd04afc69103c31e1eae5374bf1Brian _mesa_problem(NULL, "bad mode in reg_string()"); 359501ee87180047dd04afc69103c31e1eae5374bf1Brian } 360501ee87180047dd04afc69103c31e1eae5374bf1Brian 361501ee87180047dd04afc69103c31e1eae5374bf1Brian return str; 362501ee87180047dd04afc69103c31e1eae5374bf1Brian} 363501ee87180047dd04afc69103c31e1eae5374bf1Brian 364501ee87180047dd04afc69103c31e1eae5374bf1Brian 365501ee87180047dd04afc69103c31e1eae5374bf1Brian/** 36600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Return a string representation of the given swizzle word. 36700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * If extended is true, use extended (comma-separated) format. 3683a2815370d26012b41d742540237985a333b6ae4Brian * \param swizzle the swizzle field 3693a2815370d26012b41d742540237985a333b6ae4Brian * \param negateBase 4-bit negation vector 3703a2815370d26012b41d742540237985a333b6ae4Brian * \param extended if true, also allow 0, 1 values 37100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 372059376c855cbeb160e98f438a35edb8bd88b8bb2Brianconst char * 3737db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul_mesa_swizzle_string(GLuint swizzle, GLuint negateMask, GLboolean extended) 37400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 37574a19b0abd382574ff583eab81a374acead9254dBrian Paul static const char swz[] = "xyzw01!?"; /* See SWIZZLE_x definitions */ 37600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian static char s[20]; 37700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint i = 0; 37800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3797db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (!extended && swizzle == SWIZZLE_NOOP && negateMask == 0) 38000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return ""; /* no swizzle/negation */ 38100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 38200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (!extended) 38300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '.'; 38400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3857db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (negateMask & NEGATE_X) 38600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 38700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 0)]; 38800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 38900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (extended) { 39000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = ','; 39100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 39200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3937db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (negateMask & NEGATE_Y) 39400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 39500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 1)]; 39600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 39700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (extended) { 39800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = ','; 39900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 40000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4017db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (negateMask & NEGATE_Z) 40200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 40300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 2)]; 40400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 40500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (extended) { 40600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = ','; 40700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 40800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4097db7ff878d3e5a6b345228e6eaee4797bb68b360Brian Paul if (negateMask & NEGATE_W) 41000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '-'; 41100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = swz[GET_SWZ(swizzle, 3)]; 41200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 41300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i] = 0; 41400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return s; 41500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 41600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 41700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 418511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paulvoid 419511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul_mesa_print_swizzle(GLuint swizzle) 420511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul{ 421511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul if (swizzle == SWIZZLE_XYZW) { 422298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(".xyzw\n"); 423511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul } 424511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul else { 425f9c574d7192d2193ff3e12629a8db1a74b6dbf55Michal Krol const char *s = _mesa_swizzle_string(swizzle, 0, 0); 426298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("%s\n", s); 427511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul } 428511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul} 429511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul 430511733b862d2cb6836beb0965bdc5d699e6a2233Brian Paul 431610c2461ce0683ca5412e4b2b7a496f67e9d3704Brian Paulconst char * 432610c2461ce0683ca5412e4b2b7a496f67e9d3704Brian Paul_mesa_writemask_string(GLuint writeMask) 43300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 43400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian static char s[10]; 43500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint i = 0; 43600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 43700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask == WRITEMASK_XYZW) 43800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return ""; 43900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 44000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = '.'; 44100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask & WRITEMASK_X) 44200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = 'x'; 44300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask & WRITEMASK_Y) 44400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = 'y'; 44500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask & WRITEMASK_Z) 44600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = 'z'; 44700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (writeMask & WRITEMASK_W) 44800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i++] = 'w'; 44900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 45000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian s[i] = 0; 45100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return s; 45200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 45300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4543a2815370d26012b41d742540237985a333b6ae4Brian 455d750861dc26e3898afa2b49e3969d709dc227664Brianconst char * 456d750861dc26e3898afa2b49e3969d709dc227664Brian_mesa_condcode_string(GLuint condcode) 4573a2815370d26012b41d742540237985a333b6ae4Brian{ 4583a2815370d26012b41d742540237985a333b6ae4Brian switch (condcode) { 4593a2815370d26012b41d742540237985a333b6ae4Brian case COND_GT: return "GT"; 4603a2815370d26012b41d742540237985a333b6ae4Brian case COND_EQ: return "EQ"; 4613a2815370d26012b41d742540237985a333b6ae4Brian case COND_LT: return "LT"; 4623a2815370d26012b41d742540237985a333b6ae4Brian case COND_UN: return "UN"; 4633a2815370d26012b41d742540237985a333b6ae4Brian case COND_GE: return "GE"; 4643a2815370d26012b41d742540237985a333b6ae4Brian case COND_LE: return "LE"; 4653a2815370d26012b41d742540237985a333b6ae4Brian case COND_NE: return "NE"; 4663a2815370d26012b41d742540237985a333b6ae4Brian case COND_TR: return "TR"; 4673a2815370d26012b41d742540237985a333b6ae4Brian case COND_FL: return "FL"; 4683a2815370d26012b41d742540237985a333b6ae4Brian default: return "cond???"; 4693a2815370d26012b41d742540237985a333b6ae4Brian } 4703a2815370d26012b41d742540237985a333b6ae4Brian} 4713a2815370d26012b41d742540237985a333b6ae4Brian 4723a2815370d26012b41d742540237985a333b6ae4Brian 47300cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void 474d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_dst_reg(FILE * f, 475d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct prog_dst_register *dstReg, 476d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul gl_prog_print_mode mode, 477d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog) 47800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 479298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s%s", 480298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg reg_string((gl_register_file) dstReg->File, 481298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg dstReg->Index, mode, dstReg->RelAddr, prog), 482298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_writemask_string(dstReg->WriteMask)); 483298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg 4841936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian if (dstReg->CondMask != COND_TR) { 485298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " (%s.%s)", 486298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(dstReg->CondMask), 487298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(dstReg->CondSwizzle, 488298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg GL_FALSE, GL_FALSE)); 4891936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian } 4901936b25ebd580c5ef9e8cb471a986da39ef46ca5Brian 491501ee87180047dd04afc69103c31e1eae5374bf1Brian#if 0 492298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s[%d]%s", 493298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg file_string((gl_register_file) dstReg->File, mode), 494298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg dstReg->Index, 495298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_writemask_string(dstReg->WriteMask)); 496501ee87180047dd04afc69103c31e1eae5374bf1Brian#endif 49700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 49800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 499d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 50000cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void 501d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_src_reg(FILE *f, 502d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct prog_src_register *srcReg, 503d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul gl_prog_print_mode mode, 504d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog) 50500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 506f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul const char *abs = srcReg->Abs ? "|" : ""; 507f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul 508298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s%s%s%s", 509298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg abs, 510298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg reg_string((gl_register_file) srcReg->File, 511298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg srcReg->Index, mode, srcReg->RelAddr, prog), 512298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(srcReg->Swizzle, 513298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg srcReg->Negate, GL_FALSE), 514298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg abs); 515501ee87180047dd04afc69103c31e1eae5374bf1Brian#if 0 516298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s[%d]%s", 517298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg file_string((gl_register_file) srcReg->File, mode), 518298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg srcReg->Index, 519298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(srcReg->Swizzle, 520298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg srcReg->Negate, GL_FALSE)); 521501ee87180047dd04afc69103c31e1eae5374bf1Brian#endif 52200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 52300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 524d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 52500cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void 526d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_comment(FILE *f, const struct prog_instruction *inst) 52700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 52800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->Comment) 529298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "; # %s\n", inst->Comment); 53000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian else 531298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ";\n"); 53200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 53300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 53400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 535501ee87180047dd04afc69103c31e1eae5374bf1Brianstatic void 536d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulfprint_alu_instruction(FILE *f, 537d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct prog_instruction *inst, 538d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const char *opcode_string, GLuint numRegs, 539d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul gl_prog_print_mode mode, 540d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog) 54100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 54200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint j; 54300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 544298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s", opcode_string); 545b50280e95f3c044f53c0705d3a5619ebb2db4513Brian if (inst->CondUpdate) 546298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ".C"); 54700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 54800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* frag prog only */ 54900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->SaturateMode == SATURATE_ZERO_ONE) 550298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "_SAT"); 55100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 552298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 55300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->DstReg.File != PROGRAM_UNDEFINED) { 554d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_dst_reg(f, &inst->DstReg, mode, prog); 55500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 55600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian else { 557298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " ???"); 55800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 55900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 56000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (numRegs > 0) 561298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 56200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 56300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (j = 0; j < numRegs; j++) { 564d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, inst->SrcReg + j, mode, prog); 56500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (j + 1 < numRegs) 566298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 56700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 56800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 569d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 5700020d1022f4b5befe4adf783bedc4cf83e09f01fBrian} 5710020d1022f4b5befe4adf783bedc4cf83e09f01fBrian 5720020d1022f4b5befe4adf783bedc4cf83e09f01fBrian 5730020d1022f4b5befe4adf783bedc4cf83e09f01fBrianvoid 5740020d1022f4b5befe4adf783bedc4cf83e09f01fBrian_mesa_print_alu_instruction(const struct prog_instruction *inst, 5750020d1022f4b5befe4adf783bedc4cf83e09f01fBrian const char *opcode_string, GLuint numRegs) 5760020d1022f4b5befe4adf783bedc4cf83e09f01fBrian{ 57743a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin fprint_alu_instruction(stderr, inst, opcode_string, 578d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul numRegs, PROG_PRINT_DEBUG, NULL); 579501ee87180047dd04afc69103c31e1eae5374bf1Brian} 580501ee87180047dd04afc69103c31e1eae5374bf1Brian 581501ee87180047dd04afc69103c31e1eae5374bf1Brian 58200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 58300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Print a single vertex/fragment program instruction. 58400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 5852237d136cd8f964048a4ccdc87e0ffb48af0f73dNicolai HähnleGLint 586d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_instruction_opt(FILE *f, 587d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct prog_instruction *inst, 588d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul GLint indent, 589501ee87180047dd04afc69103c31e1eae5374bf1Brian gl_prog_print_mode mode, 590501ee87180047dd04afc69103c31e1eae5374bf1Brian const struct gl_program *prog) 59100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 5927b30053b264726156a018c822657270e745320ceBrian GLint i; 5935db088d70fbd14620c2fc7840096a05993f8e2b9Brian 5945db088d70fbd14620c2fc7840096a05993f8e2b9Brian if (inst->Opcode == OPCODE_ELSE || 5955db088d70fbd14620c2fc7840096a05993f8e2b9Brian inst->Opcode == OPCODE_ENDIF || 5965db088d70fbd14620c2fc7840096a05993f8e2b9Brian inst->Opcode == OPCODE_ENDLOOP || 5975db088d70fbd14620c2fc7840096a05993f8e2b9Brian inst->Opcode == OPCODE_ENDSUB) { 5985db088d70fbd14620c2fc7840096a05993f8e2b9Brian indent -= 3; 5995db088d70fbd14620c2fc7840096a05993f8e2b9Brian } 6005db088d70fbd14620c2fc7840096a05993f8e2b9Brian for (i = 0; i < indent; i++) { 601298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 6025db088d70fbd14620c2fc7840096a05993f8e2b9Brian } 6035db088d70fbd14620c2fc7840096a05993f8e2b9Brian 60400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (inst->Opcode) { 60500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_PRINT: 6068de5a292f70dba854a4bf06a2210bc38381e6bcfBrian Paul fprintf(f, "PRINT '%s'", (char *) inst->Data); 60700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) { 608298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 609298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s[%d]%s", 610298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg file_string((gl_register_file) inst->SrcReg[0].File, 611298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg mode), 612298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->SrcReg[0].Index, 613298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->SrcReg[0].Swizzle, 614298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->SrcReg[0].Negate, GL_FALSE)); 61500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 61600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->Comment) 617298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " # %s", inst->Comment); 618d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 61900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 62000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_SWZ: 621298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "SWZ"); 62200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->SaturateMode == SATURATE_ZERO_ONE) 623298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "_SAT"); 624298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 625d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_dst_reg(f, &inst->DstReg, mode, prog); 626298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", %s[%d], %s", 627298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg file_string((gl_register_file) inst->SrcReg[0].File, 628298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg mode), 629298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->SrcReg[0].Index, 630298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->SrcReg[0].Swizzle, 631298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->SrcReg[0].Negate, GL_TRUE)); 632d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 63300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 63400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_TEX: 63500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_TXP: 6364b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul case OPCODE_TXL: 63700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_TXB: 638298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s", _mesa_opcode_string(inst->Opcode)); 63900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (inst->SaturateMode == SATURATE_ZERO_ONE) 640298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "_SAT"); 641298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 642d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_dst_reg(f, &inst->DstReg, mode, prog); 643298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 644d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, &inst->SrcReg[0], mode, prog); 645298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", texture[%d], ", inst->TexSrcUnit); 64600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (inst->TexSrcTarget) { 647298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_1D_INDEX: fprintf(f, "1D"); break; 648298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_2D_INDEX: fprintf(f, "2D"); break; 649298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_3D_INDEX: fprintf(f, "3D"); break; 650298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_CUBE_INDEX: fprintf(f, "CUBE"); break; 651298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg case TEXTURE_RECT_INDEX: fprintf(f, "RECT"); break; 6522c1619869a9af1420e0a23b65e31d40a694b7f46Brian Paul case TEXTURE_1D_ARRAY_INDEX: fprintf(f, "1D_ARRAY"); break; 6532c1619869a9af1420e0a23b65e31d40a694b7f46Brian Paul case TEXTURE_2D_ARRAY_INDEX: fprintf(f, "2D_ARRAY"); break; 65400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 65500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian ; 65600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 65744e018c09e7aeba9fd9f4c380da224bd6622c470Brian Paul if (inst->TexShadow) 658298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " SHADOW"); 659d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 66000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 6614b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 6624b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul case OPCODE_KIL: 663298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s", _mesa_opcode_string(inst->Opcode)); 664298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 665d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, &inst->SrcReg[0], mode, prog); 666d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 6674b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul break; 6684b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul case OPCODE_KIL_NV: 669298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s", _mesa_opcode_string(inst->Opcode)); 670298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " "); 671298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s.%s", 672298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 673298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 674298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg GL_FALSE, GL_FALSE)); 675d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 6764b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul break; 6774b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 67800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_ARL: 679298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ARL "); 680d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_dst_reg(f, &inst->DstReg, mode, prog); 681298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, ", "); 682d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, &inst->SrcReg[0], mode, prog); 683d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 68400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 68500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_BRA: 686298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "BRA %d (%s%s)", 687298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->BranchTarget, 688298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 689298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE)); 690d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 69100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 6925ae49cf3ed53fda6a904d7e90feef78495ae6903Brian case OPCODE_IF: 69363556fa9949f543a8134b6b5ff3d216acb71dd9fBrian if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) { 69463556fa9949f543a8134b6b5ff3d216acb71dd9fBrian /* Use ordinary register */ 695298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "IF "); 696d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_src_reg(f, &inst->SrcReg[0], mode, prog); 697298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "; "); 69863556fa9949f543a8134b6b5ff3d216acb71dd9fBrian } 69963556fa9949f543a8134b6b5ff3d216acb71dd9fBrian else { 70063556fa9949f543a8134b6b5ff3d216acb71dd9fBrian /* Use cond codes */ 701298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "IF (%s%s);", 702298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 703298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 704298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg 0, GL_FALSE)); 70563556fa9949f543a8134b6b5ff3d216acb71dd9fBrian } 706298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " # (if false, goto %d)", inst->BranchTarget); 707d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 7085db088d70fbd14620c2fc7840096a05993f8e2b9Brian return indent + 3; 7095ae49cf3ed53fda6a904d7e90feef78495ae6903Brian case OPCODE_ELSE: 710298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ELSE; # (goto %d)\n", inst->BranchTarget); 7115db088d70fbd14620c2fc7840096a05993f8e2b9Brian return indent + 3; 7125ae49cf3ed53fda6a904d7e90feef78495ae6903Brian case OPCODE_ENDIF: 713298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ENDIF;\n"); 7145db088d70fbd14620c2fc7840096a05993f8e2b9Brian break; 7155db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_BGNLOOP: 716298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "BGNLOOP; # (end at %d)\n", inst->BranchTarget); 7175db088d70fbd14620c2fc7840096a05993f8e2b9Brian return indent + 3; 7185db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_ENDLOOP: 719298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ENDLOOP; # (goto %d)\n", inst->BranchTarget); 7205db088d70fbd14620c2fc7840096a05993f8e2b9Brian break; 7215db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_BRK: 722f22ed0986a743e033d827c78371612c7115ff913Brian case OPCODE_CONT: 723298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s (%s%s); # (goto %d)", 724298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_opcode_string(inst->Opcode), 725298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 726298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE), 727298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inst->BranchTarget); 728d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 7295db088d70fbd14620c2fc7840096a05993f8e2b9Brian break; 73063556fa9949f543a8134b6b5ff3d216acb71dd9fBrian 7315db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_BGNSUB: 732f407cada8aa0bfea1b8dfae766392162c702aaa4Brian if (mode == PROG_PRINT_NV) { 733298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%s:\n", inst->Comment); /* comment is label */ 734f407cada8aa0bfea1b8dfae766392162c702aaa4Brian return indent; 735f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 736f407cada8aa0bfea1b8dfae766392162c702aaa4Brian else { 737298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "BGNSUB"); 738d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 739f407cada8aa0bfea1b8dfae766392162c702aaa4Brian return indent + 3; 740f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 7415db088d70fbd14620c2fc7840096a05993f8e2b9Brian case OPCODE_ENDSUB: 742f407cada8aa0bfea1b8dfae766392162c702aaa4Brian if (mode == PROG_PRINT_DEBUG) { 743298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "ENDSUB"); 744d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 745f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 746f407cada8aa0bfea1b8dfae766392162c702aaa4Brian break; 747f407cada8aa0bfea1b8dfae766392162c702aaa4Brian case OPCODE_CAL: 748f407cada8aa0bfea1b8dfae766392162c702aaa4Brian if (mode == PROG_PRINT_NV) { 749298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "CAL %s; # (goto %d)\n", inst->Comment, inst->BranchTarget); 750f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 751f407cada8aa0bfea1b8dfae766392162c702aaa4Brian else { 752298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "CAL %u", inst->BranchTarget); 753d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 754f407cada8aa0bfea1b8dfae766392162c702aaa4Brian } 755f407cada8aa0bfea1b8dfae766392162c702aaa4Brian break; 756f407cada8aa0bfea1b8dfae766392162c702aaa4Brian case OPCODE_RET: 757298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "RET (%s%s)", 758298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_condcode_string(inst->DstReg.CondMask), 759298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE)); 760d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 7615ae49cf3ed53fda6a904d7e90feef78495ae6903Brian break; 762f407cada8aa0bfea1b8dfae766392162c702aaa4Brian 76300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case OPCODE_END: 764298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "END\n"); 76500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 7663a2815370d26012b41d742540237985a333b6ae4Brian case OPCODE_NOP: 767059376c855cbeb160e98f438a35edb8bd88b8bb2Brian if (mode == PROG_PRINT_DEBUG) { 768298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NOP"); 769d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprint_comment(f, inst); 770059376c855cbeb160e98f438a35edb8bd88b8bb2Brian } 771059376c855cbeb160e98f438a35edb8bd88b8bb2Brian else if (inst->Comment) { 772059376c855cbeb160e98f438a35edb8bd88b8bb2Brian /* ARB/NV extensions don't have NOP instruction */ 773298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "# %s\n", inst->Comment); 774059376c855cbeb160e98f438a35edb8bd88b8bb2Brian } 7753a2815370d26012b41d742540237985a333b6ae4Brian break; 776da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case OPCODE_EMIT_VERTEX: 777da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin fprintf(f, "EMIT_VERTEX\n"); 778da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 779da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case OPCODE_END_PRIMITIVE: 780da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin fprintf(f, "END_PRIMITIVE\n"); 781da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 78200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* XXX may need other special-case instructions */ 78300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 784f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul if (inst->Opcode < MAX_OPCODE) { 785f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul /* typical alu instruction */ 786f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul fprint_alu_instruction(f, inst, 787f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul _mesa_opcode_string(inst->Opcode), 788f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul _mesa_num_inst_src_regs(inst->Opcode), 789f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul mode, prog); 790f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul } 791f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul else { 7927c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul fprint_alu_instruction(f, inst, 7937c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul _mesa_opcode_string(inst->Opcode), 7947c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul 3/*_mesa_num_inst_src_regs(inst->Opcode)*/, 7957c2fe42dedcd9f437f2b3fae92963d4c4c56fe03Brian Paul mode, prog); 796f787baff80235e8f90a72d43d4372b1ac977f161Brian Paul } 79700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 79800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 7995db088d70fbd14620c2fc7840096a05993f8e2b9Brian return indent; 80000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 80100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 80200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 803d0038930312f96468a9159a1221c3f4c56bddaa4Brian PaulGLint 804d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_instruction_opt(const struct prog_instruction *inst, 805d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul GLint indent, 806d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul gl_prog_print_mode mode, 807d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog) 808d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 80943a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin return _mesa_fprint_instruction_opt(stderr, inst, indent, mode, prog); 810d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 811d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 812d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 81300cdc0a472c55330cbc58317f01b07f8f90be5a5Brianvoid 814d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_instruction(const struct prog_instruction *inst) 81500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 816d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul /* note: 4th param should be ignored for PROG_PRINT_DEBUG */ 81743a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin _mesa_fprint_instruction_opt(stderr, inst, 0, PROG_PRINT_DEBUG, NULL); 818501ee87180047dd04afc69103c31e1eae5374bf1Brian} 819501ee87180047dd04afc69103c31e1eae5374bf1Brian 820501ee87180047dd04afc69103c31e1eae5374bf1Brian 821d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 822501ee87180047dd04afc69103c31e1eae5374bf1Brian/** 823501ee87180047dd04afc69103c31e1eae5374bf1Brian * Print program, with options. 824501ee87180047dd04afc69103c31e1eae5374bf1Brian */ 825d2eff33ab7fda9527458ea35d9eb109ec2988490Brian Paulvoid 826d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_program_opt(FILE *f, 827d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog, 828d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul gl_prog_print_mode mode, 829d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul GLboolean lineNumbers) 830501ee87180047dd04afc69103c31e1eae5374bf1Brian{ 8315db088d70fbd14620c2fc7840096a05993f8e2b9Brian GLuint i, indent = 0; 832501ee87180047dd04afc69103c31e1eae5374bf1Brian 833501ee87180047dd04afc69103c31e1eae5374bf1Brian switch (prog->Target) { 834501ee87180047dd04afc69103c31e1eae5374bf1Brian case GL_VERTEX_PROGRAM_ARB: 835501ee87180047dd04afc69103c31e1eae5374bf1Brian if (mode == PROG_PRINT_ARB) 836298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "!!ARBvp1.0\n"); 837501ee87180047dd04afc69103c31e1eae5374bf1Brian else if (mode == PROG_PRINT_NV) 838298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "!!VP1.0\n"); 839501ee87180047dd04afc69103c31e1eae5374bf1Brian else 840298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "# Vertex Program/Shader %u\n", prog->Id); 841501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 842501ee87180047dd04afc69103c31e1eae5374bf1Brian case GL_FRAGMENT_PROGRAM_ARB: 843501ee87180047dd04afc69103c31e1eae5374bf1Brian case GL_FRAGMENT_PROGRAM_NV: 844501ee87180047dd04afc69103c31e1eae5374bf1Brian if (mode == PROG_PRINT_ARB) 845298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "!!ARBfp1.0\n"); 846501ee87180047dd04afc69103c31e1eae5374bf1Brian else if (mode == PROG_PRINT_NV) 847298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "!!FP1.0\n"); 848501ee87180047dd04afc69103c31e1eae5374bf1Brian else 849298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "# Fragment Program/Shader %u\n", prog->Id); 850501ee87180047dd04afc69103c31e1eae5374bf1Brian break; 851da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case MESA_GEOMETRY_PROGRAM: 852da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin fprintf(f, "# Geometry Shader\n"); 853501ee87180047dd04afc69103c31e1eae5374bf1Brian } 854501ee87180047dd04afc69103c31e1eae5374bf1Brian 85500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0; i < prog->NumInstructions; i++) { 856501ee87180047dd04afc69103c31e1eae5374bf1Brian if (lineNumbers) 857298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%3d: ", i); 858d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul indent = _mesa_fprint_instruction_opt(f, prog->Instructions + i, 859501ee87180047dd04afc69103c31e1eae5374bf1Brian indent, mode, prog); 86000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 86100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 86200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 86300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 86400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 86543a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin * Print program to stderr, default options. 86600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 86700cdc0a472c55330cbc58317f01b07f8f90be5a5Brianvoid 868d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_program(const struct gl_program *prog) 869d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 870a7400e736467b7b032ee0d8a8bad25a0a65e782bIan Romanick _mesa_fprint_program_opt(stderr, prog, PROG_PRINT_DEBUG, GL_TRUE); 871d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 872d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 873d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 874d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 875b5ddc7821a334177ff3f6c0ea3a5c24245ad194cBrian Paul * Return binary representation of 64-bit value (as a string). 876f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul * Insert a comma to separate each group of 8 bits. 877b5ddc7821a334177ff3f6c0ea3a5c24245ad194cBrian Paul * Note we return a pointer to local static storage so this is not 878b5ddc7821a334177ff3f6c0ea3a5c24245ad194cBrian Paul * re-entrant, etc. 879f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul * XXX move to imports.[ch] if useful elsewhere. 880f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul */ 881f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paulstatic const char * 8825606dfb572bf4b89b4882265924705bacc8c182bIan Romanickbinary(GLbitfield64 val) 883f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul{ 8845606dfb572bf4b89b4882265924705bacc8c182bIan Romanick static char buf[80]; 885f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul GLint i, len = 0; 8865606dfb572bf4b89b4882265924705bacc8c182bIan Romanick for (i = 63; i >= 0; --i) { 887e57689c6badee8521691966ff6aa56648a474ce9Brian Paul if (val & (BITFIELD64_BIT(i))) 888f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul buf[len++] = '1'; 889f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul else if (len > 0 || i == 0) 890f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul buf[len++] = '0'; 891f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul if (len > 0 && ((i-1) % 8) == 7) 892f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul buf[len++] = ','; 893f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul } 894f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul buf[len] = '\0'; 895f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul return buf; 896f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul} 897f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul 898f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul 899f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul/** 900d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print all of a program's parameters/fields to given file. 901d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 902d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulstatic void 903d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_program_parameters(FILE *f, 904d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul GLcontext *ctx, 905d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program *prog) 90600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 9074b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul GLuint i; 9084b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 909298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "InputsRead: 0x%x (0b%s)\n", 910f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul prog->InputsRead, binary(prog->InputsRead)); 911298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "OutputsWritten: 0x%llx (0b%s)\n", 91253d3f0c78818c93e7121857998ba207bfe9275feJosé Fonseca (unsigned long long)prog->OutputsWritten, 91353d3f0c78818c93e7121857998ba207bfe9275feJosé Fonseca binary(prog->OutputsWritten)); 914298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumInstructions=%d\n", prog->NumInstructions); 915298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumTemporaries=%d\n", prog->NumTemporaries); 916298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumParameters=%d\n", prog->NumParameters); 917298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumAttributes=%d\n", prog->NumAttributes); 918298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "NumAddressRegs=%d\n", prog->NumAddressRegs); 919298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "SamplersUsed: 0x%x (0b%s)\n", 920f9ce0a91dccdfc8b4fcb3020965cb6b2d0d2f6d0Brian Paul prog->SamplersUsed, binary(prog->SamplersUsed)); 921298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "Samplers=[ "); 9224b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul for (i = 0; i < MAX_SAMPLERS; i++) { 923298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%d ", prog->SamplerUnits[i]); 9244b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul } 925298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "]\n"); 9264b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 92700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_load_state_parameters(ctx, prog->Parameters); 9284b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 92900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#if 0 930298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "Local Params:\n"); 93100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0; i < MAX_PROGRAM_LOCAL_PARAMS; i++){ 93200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const GLfloat *p = prog->LocalParams[i]; 933298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "%2d: %f, %f, %f, %f\n", i, p[0], p[1], p[2], p[3]); 93400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 93500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#endif 93683ca3ff384ac09524ff6946134cded4174590d92Brian _mesa_print_parameter_list(prog->Parameters); 93783ca3ff384ac09524ff6946134cded4174590d92Brian} 93883ca3ff384ac09524ff6946134cded4174590d92Brian 93900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 940d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 94143a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin * Print all of a program's parameters/fields to stderr. 942d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 94383ca3ff384ac09524ff6946134cded4174590d92Brianvoid 944d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_program_parameters(GLcontext *ctx, const struct gl_program *prog) 945d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 94643a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin _mesa_fprint_program_parameters(stderr, ctx, prog); 947d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 948d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 949d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 950d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 951d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Print a program parameter list to given file. 952d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 953d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulstatic void 954d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_fprint_parameter_list(FILE *f, 955d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const struct gl_program_parameter_list *list) 95683ca3ff384ac09524ff6946134cded4174590d92Brian{ 957501ee87180047dd04afc69103c31e1eae5374bf1Brian const gl_prog_print_mode mode = PROG_PRINT_DEBUG; 95883ca3ff384ac09524ff6946134cded4174590d92Brian GLuint i; 959501ee87180047dd04afc69103c31e1eae5374bf1Brian 9604b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul if (!list) 9614b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul return; 9624b6b0fd526b16d70bb5d1acc8d93af280660c810Brian Paul 963dfefde38c7dfe70a3531cb85215e55eeb6407180Brian Paul if (0) 964298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "param list %p\n", (void *) list); 965298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "dirty state flags: 0x%x\n", list->StateFlags); 96683ca3ff384ac09524ff6946134cded4174590d92Brian for (i = 0; i < list->NumParameters; i++){ 96783ca3ff384ac09524ff6946134cded4174590d92Brian struct gl_program_parameter *param = list->Parameters + i; 96883ca3ff384ac09524ff6946134cded4174590d92Brian const GLfloat *v = list->ParameterValues[i]; 969298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "param[%d] sz=%d %s %s = {%.3g, %.3g, %.3g, %.3g}", 970298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg i, param->Size, 971298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg file_string(list->Parameters[i].Type, mode), 972298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg param->Name, v[0], v[1], v[2], v[3]); 973f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_CENTROID) 974298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " Centroid"); 975f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_INVARIANT) 976298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " Invariant"); 977f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_FLAT) 978298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " Flat"); 979f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul if (param->Flags & PROG_PARAM_BIT_LINEAR) 980298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, " Linear"); 981298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg fprintf(f, "\n"); 982d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul } 983d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 984d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 985d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 986d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 98743a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin * Print a program parameter list to stderr. 988d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 989d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulvoid 990d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_print_parameter_list(const struct gl_program_parameter_list *list) 991d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 99243a064e06dd0d3f7ff7ae23f19248e312c0b03b1marvin _mesa_fprint_parameter_list(stderr, list); 993d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul} 994d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 995d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 996d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul/** 997d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul * Write shader and associated info to a file. 998d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul */ 999d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paulvoid 1000d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul_mesa_write_shader_to_file(const struct gl_shader *shader) 1001d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul{ 1002d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul const char *type; 1003d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul char filename[100]; 1004d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul FILE *f; 1005d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1006d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul if (shader->Type == GL_FRAGMENT_SHADER) 1007d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul type = "frag"; 1008da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin else if (shader->Type == GL_VERTEX_SHADER) 1009d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul type = "vert"; 1010da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin else 1011da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin type = "geom"; 1012d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 101378a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul _mesa_snprintf(filename, sizeof(filename), "shader_%u.%s", shader->Name, type); 1014d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul f = fopen(filename, "w"); 1015d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul if (!f) { 1016d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(stderr, "Unable to open %s for writing\n", filename); 1017d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul return; 101800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 1019d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1020a746ef28df9e6e594be7eb292d2dcad3546f739aBrian Paul fprintf(f, "/* Shader %u source, checksum %u */\n", shader->Name, shader->SourceChecksum); 1021d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fputs(shader->Source, f); 1022d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "\n"); 1023d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1024d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "/* Compile status: %s */\n", 1025d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul shader->CompileStatus ? "ok" : "fail"); 1026d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul if (!shader->CompileStatus) { 1027d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "/* Log Info: */\n"); 1028d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fputs(shader->InfoLog, f); 1029d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul } 1030d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul else { 1031d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fprintf(f, "/* GPU code */\n"); 10326ce0c6e743b27cc284e8f164585cfe5892cd662aBrian Paul fprintf(f, "/*\n"); 1033d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul _mesa_fprint_program_opt(f, shader->Program, PROG_PRINT_DEBUG, GL_TRUE); 10346ce0c6e743b27cc284e8f164585cfe5892cd662aBrian Paul fprintf(f, "*/\n"); 1035f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul fprintf(f, "/* Parameters / constants */\n"); 1036f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul fprintf(f, "/*\n"); 1037f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul _mesa_fprint_parameter_list(f, shader->Program->Parameters); 1038f95c0c06c0970d9a7700c7c8cea6396982b4b0dcBrian Paul fprintf(f, "*/\n"); 1039d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul } 1040d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1041d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul fclose(f); 104200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 1043d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1044d0038930312f96468a9159a1221c3f4c56bddaa4Brian Paul 1045db598b899868ba6db8f3f525a22a45331589592eBrian Paul/** 1046db598b899868ba6db8f3f525a22a45331589592eBrian Paul * Append the shader's uniform info/values to the shader log file. 1047db598b899868ba6db8f3f525a22a45331589592eBrian Paul * The log file will typically have been created by the 1048db598b899868ba6db8f3f525a22a45331589592eBrian Paul * _mesa_write_shader_to_file function. 1049db598b899868ba6db8f3f525a22a45331589592eBrian Paul */ 1050db598b899868ba6db8f3f525a22a45331589592eBrian Paulvoid 105112199ed96ca0dd2307e9893c58300623cfa6c0eeBrian Paul_mesa_append_uniforms_to_file(const struct gl_shader *shader, 105212199ed96ca0dd2307e9893c58300623cfa6c0eeBrian Paul const struct gl_program *prog) 1053db598b899868ba6db8f3f525a22a45331589592eBrian Paul{ 1054db598b899868ba6db8f3f525a22a45331589592eBrian Paul const char *type; 1055db598b899868ba6db8f3f525a22a45331589592eBrian Paul char filename[100]; 1056db598b899868ba6db8f3f525a22a45331589592eBrian Paul FILE *f; 1057db598b899868ba6db8f3f525a22a45331589592eBrian Paul 1058db598b899868ba6db8f3f525a22a45331589592eBrian Paul if (shader->Type == GL_FRAGMENT_SHADER) 1059db598b899868ba6db8f3f525a22a45331589592eBrian Paul type = "frag"; 1060db598b899868ba6db8f3f525a22a45331589592eBrian Paul else 1061db598b899868ba6db8f3f525a22a45331589592eBrian Paul type = "vert"; 1062db598b899868ba6db8f3f525a22a45331589592eBrian Paul 106378a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul _mesa_snprintf(filename, sizeof(filename), "shader_%u.%s", shader->Name, type); 1064db598b899868ba6db8f3f525a22a45331589592eBrian Paul f = fopen(filename, "a"); /* append */ 1065db598b899868ba6db8f3f525a22a45331589592eBrian Paul if (!f) { 1066db598b899868ba6db8f3f525a22a45331589592eBrian Paul fprintf(stderr, "Unable to open %s for appending\n", filename); 1067db598b899868ba6db8f3f525a22a45331589592eBrian Paul return; 1068db598b899868ba6db8f3f525a22a45331589592eBrian Paul } 1069db598b899868ba6db8f3f525a22a45331589592eBrian Paul 1070db598b899868ba6db8f3f525a22a45331589592eBrian Paul fprintf(f, "/* First-draw parameters / constants */\n"); 1071db598b899868ba6db8f3f525a22a45331589592eBrian Paul fprintf(f, "/*\n"); 107212199ed96ca0dd2307e9893c58300623cfa6c0eeBrian Paul _mesa_fprint_parameter_list(f, prog->Parameters); 1073db598b899868ba6db8f3f525a22a45331589592eBrian Paul fprintf(f, "*/\n"); 1074db598b899868ba6db8f3f525a22a45331589592eBrian Paul 1075db598b899868ba6db8f3f525a22a45331589592eBrian Paul fclose(f); 1076db598b899868ba6db8f3f525a22a45331589592eBrian Paul} 1077