Path: blob/21.2-virgl/src/gallium/drivers/r300/compiler/r3xx_vertprog_dump.c
4574 views
/*1* Copyright 2009 Nicolai Hähnle <[email protected]>2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* on the rights to use, copy, modify, merge, publish, distribute, sub7* license, and/or sell copies of the Software, and to permit persons to whom8* the Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL17* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,18* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR19* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE20* USE OR OTHER DEALINGS IN THE SOFTWARE. */2122#include "radeon_compiler.h"23#include "radeon_code.h"24#include "r300_reg.h"2526#include <stdio.h>2728static char* r300_vs_ve_ops[] = {29/* R300 vector ops */30" VE_NO_OP",31" VE_DOT_PRODUCT",32" VE_MULTIPLY",33" VE_ADD",34" VE_MULTIPLY_ADD",35" VE_DISTANCE_FACTOR",36" VE_FRACTION",37" VE_MAXIMUM",38" VE_MINIMUM",39"VE_SET_GREATER_THAN_EQUAL",40" VE_SET_LESS_THAN",41" VE_MULTIPLYX2_ADD",42" VE_MULTIPLY_CLAMP",43" VE_FLT2FIX_DX",44" VE_FLT2FIX_DX_RND",45/* R500 vector ops */46" VE_PRED_SET_EQ_PUSH",47" VE_PRED_SET_GT_PUSH",48" VE_PRED_SET_GTE_PUSH",49" VE_PRED_SET_NEQ_PUSH",50" VE_COND_WRITE_EQ",51" VE_COND_WRITE_GT",52" VE_COND_WRITE_GTE",53" VE_COND_WRITE_NEQ",54" VE_COND_MUX_EQ",55" VE_COND_MUX_GT",56" VE_COND_MUX_GTE",57" VE_SET_GREATER_THAN",58" VE_SET_EQUAL",59" VE_SET_NOT_EQUAL",60" (reserved)",61" (reserved)",62" (reserved)",63};6465static char* r300_vs_me_ops[] = {66/* R300 math ops */67" ME_NO_OP",68" ME_EXP_BASE2_DX",69" ME_LOG_BASE2_DX",70" ME_EXP_BASEE_FF",71" ME_LIGHT_COEFF_DX",72" ME_POWER_FUNC_FF",73" ME_RECIP_DX",74" ME_RECIP_FF",75" ME_RECIP_SQRT_DX",76" ME_RECIP_SQRT_FF",77" ME_MULTIPLY",78" ME_EXP_BASE2_FULL_DX",79" ME_LOG_BASE2_FULL_DX",80" ME_POWER_FUNC_FF_CLAMP_B",81"ME_POWER_FUNC_FF_CLAMP_B1",82"ME_POWER_FUNC_FF_CLAMP_01",83" ME_SIN",84" ME_COS",85/* R500 math ops */86" ME_LOG_BASE2_IEEE",87" ME_RECIP_IEEE",88" ME_RECIP_SQRT_IEEE",89" ME_PRED_SET_EQ",90" ME_PRED_SET_GT",91" ME_PRED_SET_GTE",92" ME_PRED_SET_NEQ",93" ME_PRED_SET_CLR",94" ME_PRED_SET_INV",95" ME_PRED_SET_POP",96" ME_PRED_SET_RESTORE",97" (reserved)",98" (reserved)",99" (reserved)",100};101102/* XXX refactor to avoid clashing symbols */103static char* r300_vs_src_debug[] = {104"t",105"i",106"c",107"a",108};109110static char* r300_vs_dst_debug[] = {111"t",112"a0",113"o",114"ox",115"a",116"i",117"u",118"u",119};120121static char* r300_vs_swiz_debug[] = {122"X",123"Y",124"Z",125"W",126"0",127"1",128"U",129"U",130};131132133static void r300_vs_op_dump(uint32_t op)134{135fprintf(stderr, " dst: %d%s op: ",136(op >> 13) & 0x7f, r300_vs_dst_debug[(op >> 8) & 0x7]);137if ((op >> PVS_DST_PRED_ENABLE_SHIFT) & 0x1) {138fprintf(stderr, "PRED %u",139(op >> PVS_DST_PRED_SENSE_SHIFT) & 0x1);140}141if (op & 0x80) {142if (op & 0x1) {143fprintf(stderr, "PVS_MACRO_OP_2CLK_M2X_ADD\n");144} else {145fprintf(stderr, " PVS_MACRO_OP_2CLK_MADD\n");146}147} else if (op & 0x40) {148fprintf(stderr, "%s\n", r300_vs_me_ops[op & 0x1f]);149} else {150fprintf(stderr, "%s\n", r300_vs_ve_ops[op & 0x1f]);151}152}153154static void r300_vs_src_dump(uint32_t src)155{156fprintf(stderr, " reg: %d%s swiz: %s%s/%s%s/%s%s/%s%s\n",157(src >> 5) & 0xff, r300_vs_src_debug[src & 0x3],158src & (1 << 25) ? "-" : " ",159r300_vs_swiz_debug[(src >> 13) & 0x7],160src & (1 << 26) ? "-" : " ",161r300_vs_swiz_debug[(src >> 16) & 0x7],162src & (1 << 27) ? "-" : " ",163r300_vs_swiz_debug[(src >> 19) & 0x7],164src & (1 << 28) ? "-" : " ",165r300_vs_swiz_debug[(src >> 22) & 0x7]);166}167168void r300_vertex_program_dump(struct radeon_compiler *compiler, void *user)169{170struct r300_vertex_program_compiler *c = (struct r300_vertex_program_compiler*)compiler;171struct r300_vertex_program_code * vs = c->code;172unsigned instrcount = vs->length / 4;173unsigned i;174175fprintf(stderr, "Final vertex program code:\n");176177for(i = 0; i < instrcount; i++) {178unsigned offset = i*4;179unsigned src;180181fprintf(stderr, "%d: op: 0x%08x", i, vs->body.d[offset]);182r300_vs_op_dump(vs->body.d[offset]);183184for(src = 0; src < 3; ++src) {185fprintf(stderr, " src%i: 0x%08x", src, vs->body.d[offset+1+src]);186r300_vs_src_dump(vs->body.d[offset+1+src]);187}188}189190fprintf(stderr, "Flow Control Ops: 0x%08x\n",vs->fc_ops);191for(i = 0; i < vs->num_fc_ops; i++) {192unsigned is_loop = 0;193switch((vs->fc_ops >> (i * 2)) & 0x3 ) {194case 0: fprintf(stderr, "NOP"); break;195case 1: fprintf(stderr, "JUMP"); break;196case 2: fprintf(stderr, "LOOP"); is_loop = 1; break;197case 3: fprintf(stderr, "JSR"); break;198}199if (c->Base.is_r500) {200fprintf(stderr,": uw-> 0x%08x lw-> 0x%08x "201"loop data->0x%08x\n",202vs->fc_op_addrs.r500[i].uw,203vs->fc_op_addrs.r500[i].lw,204vs->fc_loop_index[i]);205if (is_loop) {206fprintf(stderr, "Before = %u First = %u Last = %u\n",207vs->fc_op_addrs.r500[i].lw & 0xffff,208(vs->fc_op_addrs.r500[i].uw >> 16) & 0xffff,209vs->fc_op_addrs.r500[i].uw & 0xffff);210}211} else {212fprintf(stderr,": 0x%08x\n", vs->fc_op_addrs.r300[i]);213}214}215}216217218