LIBNAME = svga
C_SOURCES = \
- svgadump/st_shader_dump.c \
- svgadump/st_shader_op.c \
+ svgadump/svga_shader_dump.c \
+ svgadump/svga_shader_op.c \
svgadump/svga_dump.c \
svga_cmd.c \
svga_context.c \
'svga_tgsi_insn.c',
'svgadump/svga_dump.c',
- 'svgadump/st_shader_dump.c',
- 'svgadump/st_shader_op.c',
+ 'svgadump/svga_shader_dump.c',
+ 'svgadump/svga_shader_op.c',
]
svga = env.ConvenienceLibrary(
#include "tgsi/tgsi_scan.h"
#include "util/u_memory.h"
-#include "svgadump/st_shader_dump.h"
+#include "svgadump/svga_shader_dump.h"
#include "svga_context.h"
#include "svga_tgsi.h"
+++ /dev/null
-/**********************************************************
- * Copyright 2007-2009 VMware, Inc. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- **********************************************************/
-
-/**
- * @file
- * SVGA Shader Token Definitions
- *
- * @author Michal Krol <michal@vmware.com>
- */
-
-#ifndef ST_SHADER_SVGA_H
-#define ST_SHADER_SVGA_H
-
-#include "pipe/p_compiler.h"
-
-struct sh_op
-{
- unsigned opcode:16;
- unsigned control:8;
- unsigned length:4;
- unsigned predicated:1;
- unsigned unused:1;
- unsigned coissue:1;
- unsigned is_reg:1;
-};
-
-struct sh_reg
-{
- unsigned number:11;
- unsigned type_hi:2;
- unsigned relative:1;
- unsigned unused:14;
- unsigned type_lo:3;
- unsigned is_reg:1;
-};
-
-static INLINE unsigned
-sh_reg_type( struct sh_reg reg )
-{
- return reg.type_lo | (reg.type_hi << 3);
-}
-
-struct sh_cdata
-{
- float xyzw[4];
-};
-
-struct sh_def
-{
- struct sh_op op;
- struct sh_reg reg;
- struct sh_cdata cdata;
-};
-
-struct sh_defb
-{
- struct sh_op op;
- struct sh_reg reg;
- uint data;
-};
-
-struct sh_idata
-{
- int xyzw[4];
-};
-
-struct sh_defi
-{
- struct sh_op op;
- struct sh_reg reg;
- struct sh_idata idata;
-};
-
-#define PS_TEXTURETYPE_UNKNOWN SVGA3DSAMP_UNKNOWN
-#define PS_TEXTURETYPE_2D SVGA3DSAMP_2D
-#define PS_TEXTURETYPE_CUBE SVGA3DSAMP_CUBE
-#define PS_TEXTURETYPE_VOLUME SVGA3DSAMP_VOLUME
-
-struct ps_sampleinfo
-{
- unsigned unused:27;
- unsigned texture_type:4;
- unsigned is_reg:1;
-};
-
-struct vs_semantic
-{
- unsigned usage:5;
- unsigned unused1:11;
- unsigned usage_index:4;
- unsigned unused2:12;
-};
-
-struct sh_dstreg
-{
- unsigned number:11;
- unsigned type_hi:2;
- unsigned relative:1;
- unsigned unused:2;
- unsigned write_mask:4;
- unsigned modifier:4;
- unsigned shift_scale:4;
- unsigned type_lo:3;
- unsigned is_reg:1;
-};
-
-static INLINE unsigned
-sh_dstreg_type( struct sh_dstreg reg )
-{
- return reg.type_lo | (reg.type_hi << 3);
-}
-
-struct sh_dcl
-{
- struct sh_op op;
- union {
- struct {
- struct ps_sampleinfo sampleinfo;
- } ps;
- struct {
- struct vs_semantic semantic;
- } vs;
- } u;
- struct sh_dstreg reg;
-};
-
-
-struct sh_srcreg
-{
- unsigned number:11;
- unsigned type_hi:2;
- unsigned relative:1;
- unsigned unused:2;
- unsigned swizzle_x:2;
- unsigned swizzle_y:2;
- unsigned swizzle_z:2;
- unsigned swizzle_w:2;
- unsigned modifier:4;
- unsigned type_lo:3;
- unsigned is_reg:1;
-};
-
-static INLINE unsigned
-sh_srcreg_type( struct sh_srcreg reg )
-{
- return reg.type_lo | (reg.type_hi << 3);
-}
-
-struct sh_dstop
-{
- struct sh_op op;
- struct sh_dstreg dst;
-};
-
-struct sh_srcop
-{
- struct sh_op op;
- struct sh_srcreg src;
-};
-
-struct sh_src2op
-{
- struct sh_op op;
- struct sh_srcreg src0;
- struct sh_srcreg src1;
-};
-
-struct sh_unaryop
-{
- struct sh_op op;
- struct sh_dstreg dst;
- struct sh_srcreg src;
-};
-
-struct sh_binaryop
-{
- struct sh_op op;
- struct sh_dstreg dst;
- struct sh_srcreg src0;
- struct sh_srcreg src1;
-};
-
-struct sh_trinaryop
-{
- struct sh_op op;
- struct sh_dstreg dst;
- struct sh_srcreg src0;
- struct sh_srcreg src1;
- struct sh_srcreg src2;
-};
-
-#endif /* ST_SHADER_SVGA_H */
+++ /dev/null
-/**********************************************************
- * Copyright 2008-2009 VMware, Inc. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- **********************************************************/
-
-/**
- * @file
- * SVGA Shader Dump Facilities
- *
- * @author Michal Krol <michal@vmware.com>
- */
-
-#include "st_shader.h"
-#include "st_shader_dump.h"
-#include "st_shader_op.h"
-#include "util/u_debug.h"
-
-#include "../svga_hw_reg.h"
-#include "svga3d_shaderdefs.h"
-
-struct dump_info
-{
- SVGA3dShaderVersion version;
- boolean is_ps;
-};
-
-static void dump_op( struct sh_op op, const char *mnemonic )
-{
- assert( op.predicated == 0 );
- assert( op.is_reg == 0 );
-
- if (op.coissue)
- debug_printf( "+" );
- debug_printf( "%s", mnemonic );
- switch (op.control) {
- case 0:
- break;
- case SVGA3DOPCONT_PROJECT:
- debug_printf( "p" );
- break;
- case SVGA3DOPCONT_BIAS:
- debug_printf( "b" );
- break;
- default:
- assert( 0 );
- }
-}
-
-
-static void dump_comp_op( struct sh_op op, const char *mnemonic )
-{
- assert( op.is_reg == 0 );
-
- if (op.coissue)
- debug_printf( "+" );
- debug_printf( "%s", mnemonic );
- switch (op.control) {
- case SVGA3DOPCOMP_RESERVED0:
- break;
- case SVGA3DOPCOMP_GT:
- debug_printf("_gt");
- break;
- case SVGA3DOPCOMP_EQ:
- debug_printf("_eq");
- break;
- case SVGA3DOPCOMP_GE:
- debug_printf("_ge");
- break;
- case SVGA3DOPCOMP_LT:
- debug_printf("_lt");
- break;
- case SVGA3DOPCOMPC_NE:
- debug_printf("_ne");
- break;
- case SVGA3DOPCOMP_LE:
- debug_printf("_le");
- break;
- case SVGA3DOPCOMP_RESERVED1:
- default:
- assert( 0 );
- }
-}
-
-
-static void dump_reg( struct sh_reg reg, struct sh_srcreg *indreg, const struct dump_info *di )
-{
- assert( sh_reg_type( reg ) == SVGA3DREG_CONST || reg.relative == 0 );
- assert( reg.is_reg == 1 );
-
- switch (sh_reg_type( reg )) {
- case SVGA3DREG_TEMP:
- debug_printf( "r%u", reg.number );
- break;
-
- case SVGA3DREG_INPUT:
- debug_printf( "v%u", reg.number );
- break;
-
- case SVGA3DREG_CONST:
- if (reg.relative) {
- if (sh_srcreg_type( *indreg ) == SVGA3DREG_LOOP)
- debug_printf( "c[aL+%u]", reg.number );
- else
- debug_printf( "c[a%u.x+%u]", indreg->number, reg.number );
- }
- else
- debug_printf( "c%u", reg.number );
- break;
-
- case SVGA3DREG_ADDR: /* VS */
- /* SVGA3DREG_TEXTURE */ /* PS */
- if (di->is_ps)
- debug_printf( "t%u", reg.number );
- else
- debug_printf( "a%u", reg.number );
- break;
-
- case SVGA3DREG_RASTOUT:
- switch (reg.number) {
- case 0 /*POSITION*/:
- debug_printf( "oPos" );
- break;
- case 1 /*FOG*/:
- debug_printf( "oFog" );
- break;
- case 2 /*POINT_SIZE*/:
- debug_printf( "oPts" );
- break;
- default:
- assert( 0 );
- debug_printf( "???" );
- }
- break;
-
- case SVGA3DREG_ATTROUT:
- assert( reg.number < 2 );
- debug_printf( "oD%u", reg.number );
- break;
-
- case SVGA3DREG_TEXCRDOUT:
- /* SVGA3DREG_OUTPUT */
- debug_printf( "oT%u", reg.number );
- break;
-
- case SVGA3DREG_COLOROUT:
- debug_printf( "oC%u", reg.number );
- break;
-
- case SVGA3DREG_DEPTHOUT:
- debug_printf( "oD%u", reg.number );
- break;
-
- case SVGA3DREG_SAMPLER:
- debug_printf( "s%u", reg.number );
- break;
-
- case SVGA3DREG_CONSTBOOL:
- assert( !reg.relative );
- debug_printf( "b%u", reg.number );
- break;
-
- case SVGA3DREG_CONSTINT:
- assert( !reg.relative );
- debug_printf( "i%u", reg.number );
- break;
-
- case SVGA3DREG_LOOP:
- assert( reg.number == 0 );
- debug_printf( "aL" );
- break;
-
- case SVGA3DREG_MISCTYPE:
- switch (reg.number) {
- case SVGA3DMISCREG_POSITION:
- debug_printf( "vPos" );
- break;
- case SVGA3DMISCREG_FACE:
- debug_printf( "vFace" );
- break;
- default:
- assert(0);
- break;
- }
- break;
-
- case SVGA3DREG_LABEL:
- debug_printf( "l%u", reg.number );
- break;
-
- case SVGA3DREG_PREDICATE:
- debug_printf( "p%u", reg.number );
- break;
-
-
- default:
- assert( 0 );
- debug_printf( "???" );
- }
-}
-
-static void dump_cdata( struct sh_cdata cdata )
-{
- debug_printf( "%f, %f, %f, %f", cdata.xyzw[0], cdata.xyzw[1], cdata.xyzw[2], cdata.xyzw[3] );
-}
-
-static void dump_idata( struct sh_idata idata )
-{
- debug_printf( "%d, %d, %d, %d", idata.xyzw[0], idata.xyzw[1], idata.xyzw[2], idata.xyzw[3] );
-}
-
-static void dump_bdata( boolean bdata )
-{
- debug_printf( bdata ? "TRUE" : "FALSE" );
-}
-
-static void dump_sampleinfo( struct ps_sampleinfo sampleinfo )
-{
- switch (sampleinfo.texture_type) {
- case SVGA3DSAMP_2D:
- debug_printf( "_2d" );
- break;
- case SVGA3DSAMP_CUBE:
- debug_printf( "_cube" );
- break;
- case SVGA3DSAMP_VOLUME:
- debug_printf( "_volume" );
- break;
- default:
- assert( 0 );
- }
-}
-
-
-static void dump_usageinfo( struct vs_semantic semantic )
-{
- switch (semantic.usage) {
- case SVGA3D_DECLUSAGE_POSITION:
- debug_printf("_position" );
- break;
- case SVGA3D_DECLUSAGE_BLENDWEIGHT:
- debug_printf("_blendweight" );
- break;
- case SVGA3D_DECLUSAGE_BLENDINDICES:
- debug_printf("_blendindices" );
- break;
- case SVGA3D_DECLUSAGE_NORMAL:
- debug_printf("_normal" );
- break;
- case SVGA3D_DECLUSAGE_PSIZE:
- debug_printf("_psize" );
- break;
- case SVGA3D_DECLUSAGE_TEXCOORD:
- debug_printf("_texcoord");
- break;
- case SVGA3D_DECLUSAGE_TANGENT:
- debug_printf("_tangent" );
- break;
- case SVGA3D_DECLUSAGE_BINORMAL:
- debug_printf("_binormal" );
- break;
- case SVGA3D_DECLUSAGE_TESSFACTOR:
- debug_printf("_tessfactor" );
- break;
- case SVGA3D_DECLUSAGE_POSITIONT:
- debug_printf("_positiont" );
- break;
- case SVGA3D_DECLUSAGE_COLOR:
- debug_printf("_color" );
- break;
- case SVGA3D_DECLUSAGE_FOG:
- debug_printf("_fog" );
- break;
- case SVGA3D_DECLUSAGE_DEPTH:
- debug_printf("_depth" );
- break;
- case SVGA3D_DECLUSAGE_SAMPLE:
- debug_printf("_sample");
- break;
- default:
- assert( 0 );
- return;
- }
-
- if (semantic.usage_index != 0) {
- debug_printf("%d", semantic.usage_index );
- }
-}
-
-static void dump_dstreg( struct sh_dstreg dstreg, const struct dump_info *di )
-{
- union {
- struct sh_reg reg;
- struct sh_dstreg dstreg;
- } u;
-
- assert( (dstreg.modifier & (SVGA3DDSTMOD_SATURATE | SVGA3DDSTMOD_PARTIALPRECISION)) == dstreg.modifier );
-
- if (dstreg.modifier & SVGA3DDSTMOD_SATURATE)
- debug_printf( "_sat" );
- if (dstreg.modifier & SVGA3DDSTMOD_PARTIALPRECISION)
- debug_printf( "_pp" );
- switch (dstreg.shift_scale) {
- case 0:
- break;
- case 1:
- debug_printf( "_x2" );
- break;
- case 2:
- debug_printf( "_x4" );
- break;
- case 3:
- debug_printf( "_x8" );
- break;
- case 13:
- debug_printf( "_d8" );
- break;
- case 14:
- debug_printf( "_d4" );
- break;
- case 15:
- debug_printf( "_d2" );
- break;
- default:
- assert( 0 );
- }
- debug_printf( " " );
-
- u.dstreg = dstreg;
- dump_reg( u.reg, NULL, di );
- if (dstreg.write_mask != SVGA3DWRITEMASK_ALL) {
- debug_printf( "." );
- if (dstreg.write_mask & SVGA3DWRITEMASK_0)
- debug_printf( "x" );
- if (dstreg.write_mask & SVGA3DWRITEMASK_1)
- debug_printf( "y" );
- if (dstreg.write_mask & SVGA3DWRITEMASK_2)
- debug_printf( "z" );
- if (dstreg.write_mask & SVGA3DWRITEMASK_3)
- debug_printf( "w" );
- }
-}
-
-static void dump_srcreg( struct sh_srcreg srcreg, struct sh_srcreg *indreg, const struct dump_info *di )
-{
- union {
- struct sh_reg reg;
- struct sh_srcreg srcreg;
- } u;
-
- switch (srcreg.modifier) {
- case SVGA3DSRCMOD_NEG:
- case SVGA3DSRCMOD_BIASNEG:
- case SVGA3DSRCMOD_SIGNNEG:
- case SVGA3DSRCMOD_X2NEG:
- debug_printf( "-" );
- break;
- case SVGA3DSRCMOD_ABS:
- debug_printf( "|" );
- break;
- case SVGA3DSRCMOD_ABSNEG:
- debug_printf( "-|" );
- break;
- case SVGA3DSRCMOD_COMP:
- debug_printf( "1-" );
- break;
- case SVGA3DSRCMOD_NOT:
- debug_printf( "!" );
- }
-
- u.srcreg = srcreg;
- dump_reg( u.reg, indreg, di );
- switch (srcreg.modifier) {
- case SVGA3DSRCMOD_NONE:
- case SVGA3DSRCMOD_NEG:
- case SVGA3DSRCMOD_COMP:
- case SVGA3DSRCMOD_NOT:
- break;
- case SVGA3DSRCMOD_ABS:
- case SVGA3DSRCMOD_ABSNEG:
- debug_printf( "|" );
- break;
- case SVGA3DSRCMOD_BIAS:
- case SVGA3DSRCMOD_BIASNEG:
- debug_printf( "_bias" );
- break;
- case SVGA3DSRCMOD_SIGN:
- case SVGA3DSRCMOD_SIGNNEG:
- debug_printf( "_bx2" );
- break;
- case SVGA3DSRCMOD_X2:
- case SVGA3DSRCMOD_X2NEG:
- debug_printf( "_x2" );
- break;
- case SVGA3DSRCMOD_DZ:
- debug_printf( "_dz" );
- break;
- case SVGA3DSRCMOD_DW:
- debug_printf( "_dw" );
- break;
- default:
- assert( 0 );
- }
- if (srcreg.swizzle_x != 0 || srcreg.swizzle_y != 1 || srcreg.swizzle_z != 2 || srcreg.swizzle_w != 3) {
- debug_printf( "." );
- if (srcreg.swizzle_x == srcreg.swizzle_y && srcreg.swizzle_y == srcreg.swizzle_z && srcreg.swizzle_z == srcreg.swizzle_w) {
- debug_printf( "%c", "xyzw"[srcreg.swizzle_x] );
- }
- else {
- debug_printf( "%c", "xyzw"[srcreg.swizzle_x] );
- debug_printf( "%c", "xyzw"[srcreg.swizzle_y] );
- debug_printf( "%c", "xyzw"[srcreg.swizzle_z] );
- debug_printf( "%c", "xyzw"[srcreg.swizzle_w] );
- }
- }
-}
-
-void
-sh_svga_dump(
- const unsigned *assem,
- unsigned dwords,
- unsigned do_binary )
-{
- const unsigned *start = assem;
- boolean finished = FALSE;
- struct dump_info di;
- unsigned i;
-
- if (do_binary) {
- for (i = 0; i < dwords; i++)
- debug_printf(" 0x%08x,\n", assem[i]);
-
- debug_printf("\n\n");
- }
-
- di.version.value = *assem++;
- di.is_ps = (di.version.type == SVGA3D_PS_TYPE);
-
- debug_printf(
- "%s_%u_%u\n",
- di.is_ps ? "ps" : "vs",
- di.version.major,
- di.version.minor );
-
- while (!finished) {
- struct sh_op op = *(struct sh_op *) assem;
-
- if (assem - start >= dwords) {
- debug_printf("... ran off end of buffer\n");
- assert(0);
- return;
- }
-
- switch (op.opcode) {
- case SVGA3DOP_DCL:
- {
- struct sh_dcl dcl = *(struct sh_dcl *) assem;
-
- debug_printf( "dcl" );
- if (sh_dstreg_type( dcl.reg ) == SVGA3DREG_SAMPLER)
- dump_sampleinfo( dcl.u.ps.sampleinfo );
- else if (di.is_ps) {
- if (di.version.major == 3 &&
- sh_dstreg_type( dcl.reg ) != SVGA3DREG_MISCTYPE)
- dump_usageinfo( dcl.u.vs.semantic );
- }
- else
- dump_usageinfo( dcl.u.vs.semantic );
- dump_dstreg( dcl.reg, &di );
- debug_printf( "\n" );
- assem += sizeof( struct sh_dcl ) / sizeof( unsigned );
- }
- break;
-
- case SVGA3DOP_DEFB:
- {
- struct sh_defb defb = *(struct sh_defb *) assem;
-
- debug_printf( "defb " );
- dump_reg( defb.reg, NULL, &di );
- debug_printf( ", " );
- dump_bdata( defb.data );
- debug_printf( "\n" );
- assem += sizeof( struct sh_defb ) / sizeof( unsigned );
- }
- break;
-
- case SVGA3DOP_DEFI:
- {
- struct sh_defi defi = *(struct sh_defi *) assem;
-
- debug_printf( "defi " );
- dump_reg( defi.reg, NULL, &di );
- debug_printf( ", " );
- dump_idata( defi.idata );
- debug_printf( "\n" );
- assem += sizeof( struct sh_defi ) / sizeof( unsigned );
- }
- break;
-
- case SVGA3DOP_TEXCOORD:
- assert( di.is_ps );
- dump_op( op, "texcoord" );
- if (0) {
- struct sh_dstop dstop = *(struct sh_dstop *) assem;
- dump_dstreg( dstop.dst, &di );
- assem += sizeof( struct sh_dstop ) / sizeof( unsigned );
- }
- else {
- struct sh_unaryop unaryop = *(struct sh_unaryop *) assem;
- dump_dstreg( unaryop.dst, &di );
- debug_printf( ", " );
- dump_srcreg( unaryop.src, NULL, &di );
- assem += sizeof( struct sh_unaryop ) / sizeof( unsigned );
- }
- debug_printf( "\n" );
- break;
-
- case SVGA3DOP_TEX:
- assert( di.is_ps );
- if (0) {
- dump_op( op, "tex" );
- if (0) {
- struct sh_dstop dstop = *(struct sh_dstop *) assem;
-
- dump_dstreg( dstop.dst, &di );
- assem += sizeof( struct sh_dstop ) / sizeof( unsigned );
- }
- else {
- struct sh_unaryop unaryop = *(struct sh_unaryop *) assem;
-
- dump_dstreg( unaryop.dst, &di );
- debug_printf( ", " );
- dump_srcreg( unaryop.src, NULL, &di );
- assem += sizeof( struct sh_unaryop ) / sizeof( unsigned );
- }
- }
- else {
- struct sh_binaryop binaryop = *(struct sh_binaryop *) assem;
-
- dump_op( op, "texld" );
- dump_dstreg( binaryop.dst, &di );
- debug_printf( ", " );
- dump_srcreg( binaryop.src0, NULL, &di );
- debug_printf( ", " );
- dump_srcreg( binaryop.src1, NULL, &di );
- assem += sizeof( struct sh_binaryop ) / sizeof( unsigned );
- }
- debug_printf( "\n" );
- break;
-
- case SVGA3DOP_DEF:
- {
- struct sh_def def = *(struct sh_def *) assem;
-
- debug_printf( "def " );
- dump_reg( def.reg, NULL, &di );
- debug_printf( ", " );
- dump_cdata( def.cdata );
- debug_printf( "\n" );
- assem += sizeof( struct sh_def ) / sizeof( unsigned );
- }
- break;
-
- case SVGA3DOP_PHASE:
- debug_printf( "phase\n" );
- assem += sizeof( struct sh_op ) / sizeof( unsigned );
- break;
-
- case SVGA3DOP_COMMENT:
- assert( 0 );
- break;
-
- case SVGA3DOP_RET:
- debug_printf( "ret\n" );
- assem += sizeof( struct sh_op ) / sizeof( unsigned );
- break;
-
- case SVGA3DOP_END:
- debug_printf( "end\n" );
- finished = TRUE;
- break;
-
- default:
- {
- const struct sh_opcode_info *info = sh_svga_opcode_info( op.opcode );
- uint i;
- uint num_src = info->num_src + op.predicated;
- boolean not_first_arg = FALSE;
-
- assert( info->num_dst <= 1 );
-
- if (op.opcode == SVGA3DOP_SINCOS && di.version.major < 3)
- num_src += 2;
-
- dump_comp_op( op, info->mnemonic );
- assem += sizeof( struct sh_op ) / sizeof( unsigned );
-
- if (info->num_dst > 0) {
- struct sh_dstreg dstreg = *(struct sh_dstreg *) assem;
-
- dump_dstreg( dstreg, &di );
- assem += sizeof( struct sh_dstreg ) / sizeof( unsigned );
- not_first_arg = TRUE;
- }
-
- for (i = 0; i < num_src; i++) {
- struct sh_srcreg srcreg;
- struct sh_srcreg indreg;
-
- srcreg = *(struct sh_srcreg *) assem;
- assem += sizeof( struct sh_srcreg ) / sizeof( unsigned );
- if (srcreg.relative && !di.is_ps && di.version.major >= 2) {
- indreg = *(struct sh_srcreg *) assem;
- assem += sizeof( struct sh_srcreg ) / sizeof( unsigned );
- }
-
- if (not_first_arg)
- debug_printf( ", " );
- else
- debug_printf( " " );
- dump_srcreg( srcreg, &indreg, &di );
- not_first_arg = TRUE;
- }
-
- debug_printf( "\n" );
- }
- }
- }
-}
+++ /dev/null
-/**********************************************************
- * Copyright 2008-2009 VMware, Inc. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- **********************************************************/
-
-/**
- * @file
- * SVGA Shader Dump Facilities
- *
- * @author Michal Krol <michal@vmware.com>
- */
-
-#ifndef ST_SHADER_SVGA_DUMP_H
-#define ST_SHADER_SVGA_DUMP_H
-
-void
-sh_svga_dump(
- const unsigned *assem,
- unsigned dwords,
- unsigned do_binary );
-
-#endif /* ST_SHADER_SVGA_DUMP_H */
+++ /dev/null
-/**********************************************************
- * Copyright 2008-2009 VMware, Inc. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- **********************************************************/
-
-/**
- * @file
- * SVGA Shader Token Opcode Info
- *
- * @author Michal Krol <michal@vmware.com>
- */
-
-#include "util/u_debug.h"
-#include "st_shader_op.h"
-
-#include "../svga_hw_reg.h"
-#include "svga3d_shaderdefs.h"
-
-#define SVGA3DOP_INVALID SVGA3DOP_END
-#define TGSI_OPCODE_INVALID TGSI_OPCODE_LAST
-
-static struct sh_opcode_info opcode_info[] =
-{
- { "nop", 0, 0, SVGA3DOP_NOP },
- { "mov", 1, 1, SVGA3DOP_MOV, },
- { "add", 1, 2, SVGA3DOP_ADD, },
- { "sub", 1, 2, SVGA3DOP_SUB, },
- { "mad", 1, 3, SVGA3DOP_MAD, },
- { "mul", 1, 2, SVGA3DOP_MUL, },
- { "rcp", 1, 1, SVGA3DOP_RCP, },
- { "rsq", 1, 1, SVGA3DOP_RSQ, },
- { "dp3", 1, 2, SVGA3DOP_DP3, },
- { "dp4", 1, 2, SVGA3DOP_DP4, },
- { "min", 1, 2, SVGA3DOP_MIN, },
- { "max", 1, 2, SVGA3DOP_MAX, },
- { "slt", 1, 2, SVGA3DOP_SLT, },
- { "sge", 1, 2, SVGA3DOP_SGE, },
- { "exp", 1, 1, SVGA3DOP_EXP, },
- { "log", 1, 1, SVGA3DOP_LOG, },
- { "lit", 1, 1, SVGA3DOP_LIT, },
- { "dst", 1, 2, SVGA3DOP_DST, },
- { "lrp", 1, 3, SVGA3DOP_LRP, },
- { "frc", 1, 1, SVGA3DOP_FRC, },
- { "m4x4", 1, 2, SVGA3DOP_M4x4, },
- { "m4x3", 1, 2, SVGA3DOP_M4x3, },
- { "m3x4", 1, 2, SVGA3DOP_M3x4, },
- { "m3x3", 1, 2, SVGA3DOP_M3x3, },
- { "m3x2", 1, 2, SVGA3DOP_M3x2, },
- { "call", 0, 1, SVGA3DOP_CALL, },
- { "callnz", 0, 2, SVGA3DOP_CALLNZ, },
- { "loop", 0, 2, SVGA3DOP_LOOP, },
- { "ret", 0, 0, SVGA3DOP_RET, },
- { "endloop", 0, 0, SVGA3DOP_ENDLOOP, },
- { "label", 0, 1, SVGA3DOP_LABEL, },
- { "dcl", 0, 0, SVGA3DOP_DCL, },
- { "pow", 1, 2, SVGA3DOP_POW, },
- { "crs", 1, 2, SVGA3DOP_CRS, },
- { "sgn", 1, 3, SVGA3DOP_SGN, },
- { "abs", 1, 1, SVGA3DOP_ABS, },
- { "nrm", 1, 1, SVGA3DOP_NRM, }, /* 3-componenet normalization */
- { "sincos", 1, 1, SVGA3DOP_SINCOS, },
- { "rep", 0, 1, SVGA3DOP_REP, },
- { "endrep", 0, 0, SVGA3DOP_ENDREP, },
- { "if", 0, 1, SVGA3DOP_IF, },
- { "ifc", 0, 2, SVGA3DOP_IFC, },
- { "else", 0, 0, SVGA3DOP_ELSE, },
- { "endif", 0, 0, SVGA3DOP_ENDIF, },
- { "break", 0, 0, SVGA3DOP_BREAK, },
- { "breakc", 0, 0, SVGA3DOP_BREAKC, },
- { "mova", 1, 1, SVGA3DOP_MOVA, },
- { "defb", 0, 0, SVGA3DOP_DEFB, },
- { "defi", 0, 0, SVGA3DOP_DEFI, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "???", 0, 0, SVGA3DOP_INVALID, },
- { "texcoord", 0, 0, SVGA3DOP_TEXCOORD, },
- { "texkill", 1, 0, SVGA3DOP_TEXKILL, },
- { "tex", 0, 0, SVGA3DOP_TEX, },
- { "texbem", 1, 1, SVGA3DOP_TEXBEM, },
- { "texbeml", 1, 1, SVGA3DOP_TEXBEML, },
- { "texreg2ar", 1, 1, SVGA3DOP_TEXREG2AR, },
- { "texreg2gb", 1, 1, SVGA3DOP_TEXREG2GB, },
- { "texm3x2pad", 1, 1, SVGA3DOP_TEXM3x2PAD, },
- { "texm3x2tex", 1, 1, SVGA3DOP_TEXM3x2TEX, },
- { "texm3x3pad", 1, 1, SVGA3DOP_TEXM3x3PAD, },
- { "texm3x3tex", 1, 1, SVGA3DOP_TEXM3x3TEX, },
- { "reserved0", 0, 0, SVGA3DOP_RESERVED0, },
- { "texm3x3spec", 1, 2, SVGA3DOP_TEXM3x3SPEC, },
- { "texm3x3vspec", 1, 1, SVGA3DOP_TEXM3x3VSPEC,},
- { "expp", 1, 1, SVGA3DOP_EXPP, },
- { "logp", 1, 1, SVGA3DOP_LOGP, },
- { "cnd", 1, 3, SVGA3DOP_CND, },
- { "def", 0, 0, SVGA3DOP_DEF, },
- { "texreg2rgb", 1, 1, SVGA3DOP_TEXREG2RGB, },
- { "texdp3tex", 1, 1, SVGA3DOP_TEXDP3TEX, },
- { "texm3x2depth", 1, 1, SVGA3DOP_TEXM3x2DEPTH,},
- { "texdp3", 1, 1, SVGA3DOP_TEXDP3, },
- { "texm3x3", 1, 1, SVGA3DOP_TEXM3x3, },
- { "texdepth", 1, 0, SVGA3DOP_TEXDEPTH, },
- { "cmp", 1, 3, SVGA3DOP_CMP, },
- { "bem", 1, 2, SVGA3DOP_BEM, },
- { "dp2add", 1, 3, SVGA3DOP_DP2ADD, },
- { "dsx", 1, 1, SVGA3DOP_INVALID, },
- { "dsy", 1, 1, SVGA3DOP_INVALID, },
- { "texldd", 1, 1, SVGA3DOP_INVALID, },
- { "setp", 1, 2, SVGA3DOP_SETP, },
- { "texldl", 1, 1, SVGA3DOP_INVALID, },
- { "breakp", 1, 1, SVGA3DOP_INVALID, },
-};
-
-const struct sh_opcode_info *sh_svga_opcode_info( uint op )
-{
- struct sh_opcode_info *info;
-
- if (op >= sizeof( opcode_info ) / sizeof( opcode_info[0] )) {
- /* The opcode is either PHASE, COMMENT, END or out of range.
- */
- assert( 0 );
- return NULL;
- }
-
- info = &opcode_info[op];
-
- if (info->svga_opcode == SVGA3DOP_INVALID) {
- /* No valid information. Please provide number of dst/src registers.
- */
- assert( 0 );
- return NULL;
- }
-
- /* Sanity check.
- */
- assert( op == info->svga_opcode );
-
- return info;
-}
+++ /dev/null
-/**********************************************************
- * Copyright 2008-2009 VMware, Inc. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- **********************************************************/
-
-/**
- * @file
- * SVGA Shader Token Opcode Info
- *
- * @author Michal Krol <michal@vmware.com>
- */
-
-#ifndef ST_SHADER_SVGA_OP_H
-#define ST_SHADER_SVGA_OP_H
-
-struct sh_opcode_info
-{
- const char *mnemonic;
- unsigned num_dst:8;
- unsigned num_src:8;
- unsigned svga_opcode:16;
-};
-
-const struct sh_opcode_info *sh_svga_opcode_info( unsigned op );
-
-#endif /* ST_SHADER_SVGA_OP_H */
*/
#include "svga_types.h"
-#include "st_shader_dump.h"
+#include "svga_shader_dump.h"
#include "svga3d_reg.h"
#include "util/u_debug.h"
print ' */'
print
print '#include "svga_types.h"'
- print '#include "shader_dump/st_shader_dump.h"'
+ print '#include "svga_shader_dump.h"'
print '#include "svga3d_reg.h"'
print
print '#include "pipe/p_debug.h"'
--- /dev/null
+/**********************************************************
+ * Copyright 2007-2009 VMware, Inc. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ **********************************************************/
+
+/**
+ * @file
+ * SVGA Shader Token Definitions
+ *
+ * @author Michal Krol <michal@vmware.com>
+ */
+
+#ifndef ST_SHADER_SVGA_H
+#define ST_SHADER_SVGA_H
+
+#include "pipe/p_compiler.h"
+
+struct sh_op
+{
+ unsigned opcode:16;
+ unsigned control:8;
+ unsigned length:4;
+ unsigned predicated:1;
+ unsigned unused:1;
+ unsigned coissue:1;
+ unsigned is_reg:1;
+};
+
+struct sh_reg
+{
+ unsigned number:11;
+ unsigned type_hi:2;
+ unsigned relative:1;
+ unsigned unused:14;
+ unsigned type_lo:3;
+ unsigned is_reg:1;
+};
+
+static INLINE unsigned
+sh_reg_type( struct sh_reg reg )
+{
+ return reg.type_lo | (reg.type_hi << 3);
+}
+
+struct sh_cdata
+{
+ float xyzw[4];
+};
+
+struct sh_def
+{
+ struct sh_op op;
+ struct sh_reg reg;
+ struct sh_cdata cdata;
+};
+
+struct sh_defb
+{
+ struct sh_op op;
+ struct sh_reg reg;
+ uint data;
+};
+
+struct sh_idata
+{
+ int xyzw[4];
+};
+
+struct sh_defi
+{
+ struct sh_op op;
+ struct sh_reg reg;
+ struct sh_idata idata;
+};
+
+#define PS_TEXTURETYPE_UNKNOWN SVGA3DSAMP_UNKNOWN
+#define PS_TEXTURETYPE_2D SVGA3DSAMP_2D
+#define PS_TEXTURETYPE_CUBE SVGA3DSAMP_CUBE
+#define PS_TEXTURETYPE_VOLUME SVGA3DSAMP_VOLUME
+
+struct ps_sampleinfo
+{
+ unsigned unused:27;
+ unsigned texture_type:4;
+ unsigned is_reg:1;
+};
+
+struct vs_semantic
+{
+ unsigned usage:5;
+ unsigned unused1:11;
+ unsigned usage_index:4;
+ unsigned unused2:12;
+};
+
+struct sh_dstreg
+{
+ unsigned number:11;
+ unsigned type_hi:2;
+ unsigned relative:1;
+ unsigned unused:2;
+ unsigned write_mask:4;
+ unsigned modifier:4;
+ unsigned shift_scale:4;
+ unsigned type_lo:3;
+ unsigned is_reg:1;
+};
+
+static INLINE unsigned
+sh_dstreg_type( struct sh_dstreg reg )
+{
+ return reg.type_lo | (reg.type_hi << 3);
+}
+
+struct sh_dcl
+{
+ struct sh_op op;
+ union {
+ struct {
+ struct ps_sampleinfo sampleinfo;
+ } ps;
+ struct {
+ struct vs_semantic semantic;
+ } vs;
+ } u;
+ struct sh_dstreg reg;
+};
+
+
+struct sh_srcreg
+{
+ unsigned number:11;
+ unsigned type_hi:2;
+ unsigned relative:1;
+ unsigned unused:2;
+ unsigned swizzle_x:2;
+ unsigned swizzle_y:2;
+ unsigned swizzle_z:2;
+ unsigned swizzle_w:2;
+ unsigned modifier:4;
+ unsigned type_lo:3;
+ unsigned is_reg:1;
+};
+
+static INLINE unsigned
+sh_srcreg_type( struct sh_srcreg reg )
+{
+ return reg.type_lo | (reg.type_hi << 3);
+}
+
+struct sh_dstop
+{
+ struct sh_op op;
+ struct sh_dstreg dst;
+};
+
+struct sh_srcop
+{
+ struct sh_op op;
+ struct sh_srcreg src;
+};
+
+struct sh_src2op
+{
+ struct sh_op op;
+ struct sh_srcreg src0;
+ struct sh_srcreg src1;
+};
+
+struct sh_unaryop
+{
+ struct sh_op op;
+ struct sh_dstreg dst;
+ struct sh_srcreg src;
+};
+
+struct sh_binaryop
+{
+ struct sh_op op;
+ struct sh_dstreg dst;
+ struct sh_srcreg src0;
+ struct sh_srcreg src1;
+};
+
+struct sh_trinaryop
+{
+ struct sh_op op;
+ struct sh_dstreg dst;
+ struct sh_srcreg src0;
+ struct sh_srcreg src1;
+ struct sh_srcreg src2;
+};
+
+#endif /* ST_SHADER_SVGA_H */
--- /dev/null
+/**********************************************************
+ * Copyright 2008-2009 VMware, Inc. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ **********************************************************/
+
+/**
+ * @file
+ * SVGA Shader Dump Facilities
+ *
+ * @author Michal Krol <michal@vmware.com>
+ */
+
+#include "svga_shader.h"
+#include "svga_shader_dump.h"
+#include "svga_shader_op.h"
+#include "util/u_debug.h"
+
+#include "../svga_hw_reg.h"
+#include "svga3d_shaderdefs.h"
+
+struct dump_info
+{
+ SVGA3dShaderVersion version;
+ boolean is_ps;
+};
+
+static void dump_op( struct sh_op op, const char *mnemonic )
+{
+ assert( op.predicated == 0 );
+ assert( op.is_reg == 0 );
+
+ if (op.coissue)
+ debug_printf( "+" );
+ debug_printf( "%s", mnemonic );
+ switch (op.control) {
+ case 0:
+ break;
+ case SVGA3DOPCONT_PROJECT:
+ debug_printf( "p" );
+ break;
+ case SVGA3DOPCONT_BIAS:
+ debug_printf( "b" );
+ break;
+ default:
+ assert( 0 );
+ }
+}
+
+
+static void dump_comp_op( struct sh_op op, const char *mnemonic )
+{
+ assert( op.is_reg == 0 );
+
+ if (op.coissue)
+ debug_printf( "+" );
+ debug_printf( "%s", mnemonic );
+ switch (op.control) {
+ case SVGA3DOPCOMP_RESERVED0:
+ break;
+ case SVGA3DOPCOMP_GT:
+ debug_printf("_gt");
+ break;
+ case SVGA3DOPCOMP_EQ:
+ debug_printf("_eq");
+ break;
+ case SVGA3DOPCOMP_GE:
+ debug_printf("_ge");
+ break;
+ case SVGA3DOPCOMP_LT:
+ debug_printf("_lt");
+ break;
+ case SVGA3DOPCOMPC_NE:
+ debug_printf("_ne");
+ break;
+ case SVGA3DOPCOMP_LE:
+ debug_printf("_le");
+ break;
+ case SVGA3DOPCOMP_RESERVED1:
+ default:
+ assert( 0 );
+ }
+}
+
+
+static void dump_reg( struct sh_reg reg, struct sh_srcreg *indreg, const struct dump_info *di )
+{
+ assert( sh_reg_type( reg ) == SVGA3DREG_CONST || reg.relative == 0 );
+ assert( reg.is_reg == 1 );
+
+ switch (sh_reg_type( reg )) {
+ case SVGA3DREG_TEMP:
+ debug_printf( "r%u", reg.number );
+ break;
+
+ case SVGA3DREG_INPUT:
+ debug_printf( "v%u", reg.number );
+ break;
+
+ case SVGA3DREG_CONST:
+ if (reg.relative) {
+ if (sh_srcreg_type( *indreg ) == SVGA3DREG_LOOP)
+ debug_printf( "c[aL+%u]", reg.number );
+ else
+ debug_printf( "c[a%u.x+%u]", indreg->number, reg.number );
+ }
+ else
+ debug_printf( "c%u", reg.number );
+ break;
+
+ case SVGA3DREG_ADDR: /* VS */
+ /* SVGA3DREG_TEXTURE */ /* PS */
+ if (di->is_ps)
+ debug_printf( "t%u", reg.number );
+ else
+ debug_printf( "a%u", reg.number );
+ break;
+
+ case SVGA3DREG_RASTOUT:
+ switch (reg.number) {
+ case 0 /*POSITION*/:
+ debug_printf( "oPos" );
+ break;
+ case 1 /*FOG*/:
+ debug_printf( "oFog" );
+ break;
+ case 2 /*POINT_SIZE*/:
+ debug_printf( "oPts" );
+ break;
+ default:
+ assert( 0 );
+ debug_printf( "???" );
+ }
+ break;
+
+ case SVGA3DREG_ATTROUT:
+ assert( reg.number < 2 );
+ debug_printf( "oD%u", reg.number );
+ break;
+
+ case SVGA3DREG_TEXCRDOUT:
+ /* SVGA3DREG_OUTPUT */
+ debug_printf( "oT%u", reg.number );
+ break;
+
+ case SVGA3DREG_COLOROUT:
+ debug_printf( "oC%u", reg.number );
+ break;
+
+ case SVGA3DREG_DEPTHOUT:
+ debug_printf( "oD%u", reg.number );
+ break;
+
+ case SVGA3DREG_SAMPLER:
+ debug_printf( "s%u", reg.number );
+ break;
+
+ case SVGA3DREG_CONSTBOOL:
+ assert( !reg.relative );
+ debug_printf( "b%u", reg.number );
+ break;
+
+ case SVGA3DREG_CONSTINT:
+ assert( !reg.relative );
+ debug_printf( "i%u", reg.number );
+ break;
+
+ case SVGA3DREG_LOOP:
+ assert( reg.number == 0 );
+ debug_printf( "aL" );
+ break;
+
+ case SVGA3DREG_MISCTYPE:
+ switch (reg.number) {
+ case SVGA3DMISCREG_POSITION:
+ debug_printf( "vPos" );
+ break;
+ case SVGA3DMISCREG_FACE:
+ debug_printf( "vFace" );
+ break;
+ default:
+ assert(0);
+ break;
+ }
+ break;
+
+ case SVGA3DREG_LABEL:
+ debug_printf( "l%u", reg.number );
+ break;
+
+ case SVGA3DREG_PREDICATE:
+ debug_printf( "p%u", reg.number );
+ break;
+
+
+ default:
+ assert( 0 );
+ debug_printf( "???" );
+ }
+}
+
+static void dump_cdata( struct sh_cdata cdata )
+{
+ debug_printf( "%f, %f, %f, %f", cdata.xyzw[0], cdata.xyzw[1], cdata.xyzw[2], cdata.xyzw[3] );
+}
+
+static void dump_idata( struct sh_idata idata )
+{
+ debug_printf( "%d, %d, %d, %d", idata.xyzw[0], idata.xyzw[1], idata.xyzw[2], idata.xyzw[3] );
+}
+
+static void dump_bdata( boolean bdata )
+{
+ debug_printf( bdata ? "TRUE" : "FALSE" );
+}
+
+static void dump_sampleinfo( struct ps_sampleinfo sampleinfo )
+{
+ switch (sampleinfo.texture_type) {
+ case SVGA3DSAMP_2D:
+ debug_printf( "_2d" );
+ break;
+ case SVGA3DSAMP_CUBE:
+ debug_printf( "_cube" );
+ break;
+ case SVGA3DSAMP_VOLUME:
+ debug_printf( "_volume" );
+ break;
+ default:
+ assert( 0 );
+ }
+}
+
+
+static void dump_usageinfo( struct vs_semantic semantic )
+{
+ switch (semantic.usage) {
+ case SVGA3D_DECLUSAGE_POSITION:
+ debug_printf("_position" );
+ break;
+ case SVGA3D_DECLUSAGE_BLENDWEIGHT:
+ debug_printf("_blendweight" );
+ break;
+ case SVGA3D_DECLUSAGE_BLENDINDICES:
+ debug_printf("_blendindices" );
+ break;
+ case SVGA3D_DECLUSAGE_NORMAL:
+ debug_printf("_normal" );
+ break;
+ case SVGA3D_DECLUSAGE_PSIZE:
+ debug_printf("_psize" );
+ break;
+ case SVGA3D_DECLUSAGE_TEXCOORD:
+ debug_printf("_texcoord");
+ break;
+ case SVGA3D_DECLUSAGE_TANGENT:
+ debug_printf("_tangent" );
+ break;
+ case SVGA3D_DECLUSAGE_BINORMAL:
+ debug_printf("_binormal" );
+ break;
+ case SVGA3D_DECLUSAGE_TESSFACTOR:
+ debug_printf("_tessfactor" );
+ break;
+ case SVGA3D_DECLUSAGE_POSITIONT:
+ debug_printf("_positiont" );
+ break;
+ case SVGA3D_DECLUSAGE_COLOR:
+ debug_printf("_color" );
+ break;
+ case SVGA3D_DECLUSAGE_FOG:
+ debug_printf("_fog" );
+ break;
+ case SVGA3D_DECLUSAGE_DEPTH:
+ debug_printf("_depth" );
+ break;
+ case SVGA3D_DECLUSAGE_SAMPLE:
+ debug_printf("_sample");
+ break;
+ default:
+ assert( 0 );
+ return;
+ }
+
+ if (semantic.usage_index != 0) {
+ debug_printf("%d", semantic.usage_index );
+ }
+}
+
+static void dump_dstreg( struct sh_dstreg dstreg, const struct dump_info *di )
+{
+ union {
+ struct sh_reg reg;
+ struct sh_dstreg dstreg;
+ } u;
+
+ assert( (dstreg.modifier & (SVGA3DDSTMOD_SATURATE | SVGA3DDSTMOD_PARTIALPRECISION)) == dstreg.modifier );
+
+ if (dstreg.modifier & SVGA3DDSTMOD_SATURATE)
+ debug_printf( "_sat" );
+ if (dstreg.modifier & SVGA3DDSTMOD_PARTIALPRECISION)
+ debug_printf( "_pp" );
+ switch (dstreg.shift_scale) {
+ case 0:
+ break;
+ case 1:
+ debug_printf( "_x2" );
+ break;
+ case 2:
+ debug_printf( "_x4" );
+ break;
+ case 3:
+ debug_printf( "_x8" );
+ break;
+ case 13:
+ debug_printf( "_d8" );
+ break;
+ case 14:
+ debug_printf( "_d4" );
+ break;
+ case 15:
+ debug_printf( "_d2" );
+ break;
+ default:
+ assert( 0 );
+ }
+ debug_printf( " " );
+
+ u.dstreg = dstreg;
+ dump_reg( u.reg, NULL, di );
+ if (dstreg.write_mask != SVGA3DWRITEMASK_ALL) {
+ debug_printf( "." );
+ if (dstreg.write_mask & SVGA3DWRITEMASK_0)
+ debug_printf( "x" );
+ if (dstreg.write_mask & SVGA3DWRITEMASK_1)
+ debug_printf( "y" );
+ if (dstreg.write_mask & SVGA3DWRITEMASK_2)
+ debug_printf( "z" );
+ if (dstreg.write_mask & SVGA3DWRITEMASK_3)
+ debug_printf( "w" );
+ }
+}
+
+static void dump_srcreg( struct sh_srcreg srcreg, struct sh_srcreg *indreg, const struct dump_info *di )
+{
+ union {
+ struct sh_reg reg;
+ struct sh_srcreg srcreg;
+ } u;
+
+ switch (srcreg.modifier) {
+ case SVGA3DSRCMOD_NEG:
+ case SVGA3DSRCMOD_BIASNEG:
+ case SVGA3DSRCMOD_SIGNNEG:
+ case SVGA3DSRCMOD_X2NEG:
+ debug_printf( "-" );
+ break;
+ case SVGA3DSRCMOD_ABS:
+ debug_printf( "|" );
+ break;
+ case SVGA3DSRCMOD_ABSNEG:
+ debug_printf( "-|" );
+ break;
+ case SVGA3DSRCMOD_COMP:
+ debug_printf( "1-" );
+ break;
+ case SVGA3DSRCMOD_NOT:
+ debug_printf( "!" );
+ }
+
+ u.srcreg = srcreg;
+ dump_reg( u.reg, indreg, di );
+ switch (srcreg.modifier) {
+ case SVGA3DSRCMOD_NONE:
+ case SVGA3DSRCMOD_NEG:
+ case SVGA3DSRCMOD_COMP:
+ case SVGA3DSRCMOD_NOT:
+ break;
+ case SVGA3DSRCMOD_ABS:
+ case SVGA3DSRCMOD_ABSNEG:
+ debug_printf( "|" );
+ break;
+ case SVGA3DSRCMOD_BIAS:
+ case SVGA3DSRCMOD_BIASNEG:
+ debug_printf( "_bias" );
+ break;
+ case SVGA3DSRCMOD_SIGN:
+ case SVGA3DSRCMOD_SIGNNEG:
+ debug_printf( "_bx2" );
+ break;
+ case SVGA3DSRCMOD_X2:
+ case SVGA3DSRCMOD_X2NEG:
+ debug_printf( "_x2" );
+ break;
+ case SVGA3DSRCMOD_DZ:
+ debug_printf( "_dz" );
+ break;
+ case SVGA3DSRCMOD_DW:
+ debug_printf( "_dw" );
+ break;
+ default:
+ assert( 0 );
+ }
+ if (srcreg.swizzle_x != 0 || srcreg.swizzle_y != 1 || srcreg.swizzle_z != 2 || srcreg.swizzle_w != 3) {
+ debug_printf( "." );
+ if (srcreg.swizzle_x == srcreg.swizzle_y && srcreg.swizzle_y == srcreg.swizzle_z && srcreg.swizzle_z == srcreg.swizzle_w) {
+ debug_printf( "%c", "xyzw"[srcreg.swizzle_x] );
+ }
+ else {
+ debug_printf( "%c", "xyzw"[srcreg.swizzle_x] );
+ debug_printf( "%c", "xyzw"[srcreg.swizzle_y] );
+ debug_printf( "%c", "xyzw"[srcreg.swizzle_z] );
+ debug_printf( "%c", "xyzw"[srcreg.swizzle_w] );
+ }
+ }
+}
+
+void
+sh_svga_dump(
+ const unsigned *assem,
+ unsigned dwords,
+ unsigned do_binary )
+{
+ const unsigned *start = assem;
+ boolean finished = FALSE;
+ struct dump_info di;
+ unsigned i;
+
+ if (do_binary) {
+ for (i = 0; i < dwords; i++)
+ debug_printf(" 0x%08x,\n", assem[i]);
+
+ debug_printf("\n\n");
+ }
+
+ di.version.value = *assem++;
+ di.is_ps = (di.version.type == SVGA3D_PS_TYPE);
+
+ debug_printf(
+ "%s_%u_%u\n",
+ di.is_ps ? "ps" : "vs",
+ di.version.major,
+ di.version.minor );
+
+ while (!finished) {
+ struct sh_op op = *(struct sh_op *) assem;
+
+ if (assem - start >= dwords) {
+ debug_printf("... ran off end of buffer\n");
+ assert(0);
+ return;
+ }
+
+ switch (op.opcode) {
+ case SVGA3DOP_DCL:
+ {
+ struct sh_dcl dcl = *(struct sh_dcl *) assem;
+
+ debug_printf( "dcl" );
+ if (sh_dstreg_type( dcl.reg ) == SVGA3DREG_SAMPLER)
+ dump_sampleinfo( dcl.u.ps.sampleinfo );
+ else if (di.is_ps) {
+ if (di.version.major == 3 &&
+ sh_dstreg_type( dcl.reg ) != SVGA3DREG_MISCTYPE)
+ dump_usageinfo( dcl.u.vs.semantic );
+ }
+ else
+ dump_usageinfo( dcl.u.vs.semantic );
+ dump_dstreg( dcl.reg, &di );
+ debug_printf( "\n" );
+ assem += sizeof( struct sh_dcl ) / sizeof( unsigned );
+ }
+ break;
+
+ case SVGA3DOP_DEFB:
+ {
+ struct sh_defb defb = *(struct sh_defb *) assem;
+
+ debug_printf( "defb " );
+ dump_reg( defb.reg, NULL, &di );
+ debug_printf( ", " );
+ dump_bdata( defb.data );
+ debug_printf( "\n" );
+ assem += sizeof( struct sh_defb ) / sizeof( unsigned );
+ }
+ break;
+
+ case SVGA3DOP_DEFI:
+ {
+ struct sh_defi defi = *(struct sh_defi *) assem;
+
+ debug_printf( "defi " );
+ dump_reg( defi.reg, NULL, &di );
+ debug_printf( ", " );
+ dump_idata( defi.idata );
+ debug_printf( "\n" );
+ assem += sizeof( struct sh_defi ) / sizeof( unsigned );
+ }
+ break;
+
+ case SVGA3DOP_TEXCOORD:
+ assert( di.is_ps );
+ dump_op( op, "texcoord" );
+ if (0) {
+ struct sh_dstop dstop = *(struct sh_dstop *) assem;
+ dump_dstreg( dstop.dst, &di );
+ assem += sizeof( struct sh_dstop ) / sizeof( unsigned );
+ }
+ else {
+ struct sh_unaryop unaryop = *(struct sh_unaryop *) assem;
+ dump_dstreg( unaryop.dst, &di );
+ debug_printf( ", " );
+ dump_srcreg( unaryop.src, NULL, &di );
+ assem += sizeof( struct sh_unaryop ) / sizeof( unsigned );
+ }
+ debug_printf( "\n" );
+ break;
+
+ case SVGA3DOP_TEX:
+ assert( di.is_ps );
+ if (0) {
+ dump_op( op, "tex" );
+ if (0) {
+ struct sh_dstop dstop = *(struct sh_dstop *) assem;
+
+ dump_dstreg( dstop.dst, &di );
+ assem += sizeof( struct sh_dstop ) / sizeof( unsigned );
+ }
+ else {
+ struct sh_unaryop unaryop = *(struct sh_unaryop *) assem;
+
+ dump_dstreg( unaryop.dst, &di );
+ debug_printf( ", " );
+ dump_srcreg( unaryop.src, NULL, &di );
+ assem += sizeof( struct sh_unaryop ) / sizeof( unsigned );
+ }
+ }
+ else {
+ struct sh_binaryop binaryop = *(struct sh_binaryop *) assem;
+
+ dump_op( op, "texld" );
+ dump_dstreg( binaryop.dst, &di );
+ debug_printf( ", " );
+ dump_srcreg( binaryop.src0, NULL, &di );
+ debug_printf( ", " );
+ dump_srcreg( binaryop.src1, NULL, &di );
+ assem += sizeof( struct sh_binaryop ) / sizeof( unsigned );
+ }
+ debug_printf( "\n" );
+ break;
+
+ case SVGA3DOP_DEF:
+ {
+ struct sh_def def = *(struct sh_def *) assem;
+
+ debug_printf( "def " );
+ dump_reg( def.reg, NULL, &di );
+ debug_printf( ", " );
+ dump_cdata( def.cdata );
+ debug_printf( "\n" );
+ assem += sizeof( struct sh_def ) / sizeof( unsigned );
+ }
+ break;
+
+ case SVGA3DOP_PHASE:
+ debug_printf( "phase\n" );
+ assem += sizeof( struct sh_op ) / sizeof( unsigned );
+ break;
+
+ case SVGA3DOP_COMMENT:
+ assert( 0 );
+ break;
+
+ case SVGA3DOP_RET:
+ debug_printf( "ret\n" );
+ assem += sizeof( struct sh_op ) / sizeof( unsigned );
+ break;
+
+ case SVGA3DOP_END:
+ debug_printf( "end\n" );
+ finished = TRUE;
+ break;
+
+ default:
+ {
+ const struct sh_opcode_info *info = sh_svga_opcode_info( op.opcode );
+ uint i;
+ uint num_src = info->num_src + op.predicated;
+ boolean not_first_arg = FALSE;
+
+ assert( info->num_dst <= 1 );
+
+ if (op.opcode == SVGA3DOP_SINCOS && di.version.major < 3)
+ num_src += 2;
+
+ dump_comp_op( op, info->mnemonic );
+ assem += sizeof( struct sh_op ) / sizeof( unsigned );
+
+ if (info->num_dst > 0) {
+ struct sh_dstreg dstreg = *(struct sh_dstreg *) assem;
+
+ dump_dstreg( dstreg, &di );
+ assem += sizeof( struct sh_dstreg ) / sizeof( unsigned );
+ not_first_arg = TRUE;
+ }
+
+ for (i = 0; i < num_src; i++) {
+ struct sh_srcreg srcreg;
+ struct sh_srcreg indreg;
+
+ srcreg = *(struct sh_srcreg *) assem;
+ assem += sizeof( struct sh_srcreg ) / sizeof( unsigned );
+ if (srcreg.relative && !di.is_ps && di.version.major >= 2) {
+ indreg = *(struct sh_srcreg *) assem;
+ assem += sizeof( struct sh_srcreg ) / sizeof( unsigned );
+ }
+
+ if (not_first_arg)
+ debug_printf( ", " );
+ else
+ debug_printf( " " );
+ dump_srcreg( srcreg, &indreg, &di );
+ not_first_arg = TRUE;
+ }
+
+ debug_printf( "\n" );
+ }
+ }
+ }
+}
--- /dev/null
+/**********************************************************
+ * Copyright 2008-2009 VMware, Inc. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ **********************************************************/
+
+/**
+ * @file
+ * SVGA Shader Dump Facilities
+ *
+ * @author Michal Krol <michal@vmware.com>
+ */
+
+#ifndef ST_SHADER_SVGA_DUMP_H
+#define ST_SHADER_SVGA_DUMP_H
+
+void
+sh_svga_dump(
+ const unsigned *assem,
+ unsigned dwords,
+ unsigned do_binary );
+
+#endif /* ST_SHADER_SVGA_DUMP_H */
--- /dev/null
+/**********************************************************
+ * Copyright 2008-2009 VMware, Inc. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ **********************************************************/
+
+/**
+ * @file
+ * SVGA Shader Token Opcode Info
+ *
+ * @author Michal Krol <michal@vmware.com>
+ */
+
+#include "util/u_debug.h"
+#include "svga_shader_op.h"
+
+#include "../svga_hw_reg.h"
+#include "svga3d_shaderdefs.h"
+
+#define SVGA3DOP_INVALID SVGA3DOP_END
+#define TGSI_OPCODE_INVALID TGSI_OPCODE_LAST
+
+static struct sh_opcode_info opcode_info[] =
+{
+ { "nop", 0, 0, SVGA3DOP_NOP },
+ { "mov", 1, 1, SVGA3DOP_MOV, },
+ { "add", 1, 2, SVGA3DOP_ADD, },
+ { "sub", 1, 2, SVGA3DOP_SUB, },
+ { "mad", 1, 3, SVGA3DOP_MAD, },
+ { "mul", 1, 2, SVGA3DOP_MUL, },
+ { "rcp", 1, 1, SVGA3DOP_RCP, },
+ { "rsq", 1, 1, SVGA3DOP_RSQ, },
+ { "dp3", 1, 2, SVGA3DOP_DP3, },
+ { "dp4", 1, 2, SVGA3DOP_DP4, },
+ { "min", 1, 2, SVGA3DOP_MIN, },
+ { "max", 1, 2, SVGA3DOP_MAX, },
+ { "slt", 1, 2, SVGA3DOP_SLT, },
+ { "sge", 1, 2, SVGA3DOP_SGE, },
+ { "exp", 1, 1, SVGA3DOP_EXP, },
+ { "log", 1, 1, SVGA3DOP_LOG, },
+ { "lit", 1, 1, SVGA3DOP_LIT, },
+ { "dst", 1, 2, SVGA3DOP_DST, },
+ { "lrp", 1, 3, SVGA3DOP_LRP, },
+ { "frc", 1, 1, SVGA3DOP_FRC, },
+ { "m4x4", 1, 2, SVGA3DOP_M4x4, },
+ { "m4x3", 1, 2, SVGA3DOP_M4x3, },
+ { "m3x4", 1, 2, SVGA3DOP_M3x4, },
+ { "m3x3", 1, 2, SVGA3DOP_M3x3, },
+ { "m3x2", 1, 2, SVGA3DOP_M3x2, },
+ { "call", 0, 1, SVGA3DOP_CALL, },
+ { "callnz", 0, 2, SVGA3DOP_CALLNZ, },
+ { "loop", 0, 2, SVGA3DOP_LOOP, },
+ { "ret", 0, 0, SVGA3DOP_RET, },
+ { "endloop", 0, 0, SVGA3DOP_ENDLOOP, },
+ { "label", 0, 1, SVGA3DOP_LABEL, },
+ { "dcl", 0, 0, SVGA3DOP_DCL, },
+ { "pow", 1, 2, SVGA3DOP_POW, },
+ { "crs", 1, 2, SVGA3DOP_CRS, },
+ { "sgn", 1, 3, SVGA3DOP_SGN, },
+ { "abs", 1, 1, SVGA3DOP_ABS, },
+ { "nrm", 1, 1, SVGA3DOP_NRM, }, /* 3-componenet normalization */
+ { "sincos", 1, 1, SVGA3DOP_SINCOS, },
+ { "rep", 0, 1, SVGA3DOP_REP, },
+ { "endrep", 0, 0, SVGA3DOP_ENDREP, },
+ { "if", 0, 1, SVGA3DOP_IF, },
+ { "ifc", 0, 2, SVGA3DOP_IFC, },
+ { "else", 0, 0, SVGA3DOP_ELSE, },
+ { "endif", 0, 0, SVGA3DOP_ENDIF, },
+ { "break", 0, 0, SVGA3DOP_BREAK, },
+ { "breakc", 0, 0, SVGA3DOP_BREAKC, },
+ { "mova", 1, 1, SVGA3DOP_MOVA, },
+ { "defb", 0, 0, SVGA3DOP_DEFB, },
+ { "defi", 0, 0, SVGA3DOP_DEFI, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "???", 0, 0, SVGA3DOP_INVALID, },
+ { "texcoord", 0, 0, SVGA3DOP_TEXCOORD, },
+ { "texkill", 1, 0, SVGA3DOP_TEXKILL, },
+ { "tex", 0, 0, SVGA3DOP_TEX, },
+ { "texbem", 1, 1, SVGA3DOP_TEXBEM, },
+ { "texbeml", 1, 1, SVGA3DOP_TEXBEML, },
+ { "texreg2ar", 1, 1, SVGA3DOP_TEXREG2AR, },
+ { "texreg2gb", 1, 1, SVGA3DOP_TEXREG2GB, },
+ { "texm3x2pad", 1, 1, SVGA3DOP_TEXM3x2PAD, },
+ { "texm3x2tex", 1, 1, SVGA3DOP_TEXM3x2TEX, },
+ { "texm3x3pad", 1, 1, SVGA3DOP_TEXM3x3PAD, },
+ { "texm3x3tex", 1, 1, SVGA3DOP_TEXM3x3TEX, },
+ { "reserved0", 0, 0, SVGA3DOP_RESERVED0, },
+ { "texm3x3spec", 1, 2, SVGA3DOP_TEXM3x3SPEC, },
+ { "texm3x3vspec", 1, 1, SVGA3DOP_TEXM3x3VSPEC,},
+ { "expp", 1, 1, SVGA3DOP_EXPP, },
+ { "logp", 1, 1, SVGA3DOP_LOGP, },
+ { "cnd", 1, 3, SVGA3DOP_CND, },
+ { "def", 0, 0, SVGA3DOP_DEF, },
+ { "texreg2rgb", 1, 1, SVGA3DOP_TEXREG2RGB, },
+ { "texdp3tex", 1, 1, SVGA3DOP_TEXDP3TEX, },
+ { "texm3x2depth", 1, 1, SVGA3DOP_TEXM3x2DEPTH,},
+ { "texdp3", 1, 1, SVGA3DOP_TEXDP3, },
+ { "texm3x3", 1, 1, SVGA3DOP_TEXM3x3, },
+ { "texdepth", 1, 0, SVGA3DOP_TEXDEPTH, },
+ { "cmp", 1, 3, SVGA3DOP_CMP, },
+ { "bem", 1, 2, SVGA3DOP_BEM, },
+ { "dp2add", 1, 3, SVGA3DOP_DP2ADD, },
+ { "dsx", 1, 1, SVGA3DOP_INVALID, },
+ { "dsy", 1, 1, SVGA3DOP_INVALID, },
+ { "texldd", 1, 1, SVGA3DOP_INVALID, },
+ { "setp", 1, 2, SVGA3DOP_SETP, },
+ { "texldl", 1, 1, SVGA3DOP_INVALID, },
+ { "breakp", 1, 1, SVGA3DOP_INVALID, },
+};
+
+const struct sh_opcode_info *sh_svga_opcode_info( uint op )
+{
+ struct sh_opcode_info *info;
+
+ if (op >= sizeof( opcode_info ) / sizeof( opcode_info[0] )) {
+ /* The opcode is either PHASE, COMMENT, END or out of range.
+ */
+ assert( 0 );
+ return NULL;
+ }
+
+ info = &opcode_info[op];
+
+ if (info->svga_opcode == SVGA3DOP_INVALID) {
+ /* No valid information. Please provide number of dst/src registers.
+ */
+ assert( 0 );
+ return NULL;
+ }
+
+ /* Sanity check.
+ */
+ assert( op == info->svga_opcode );
+
+ return info;
+}
--- /dev/null
+/**********************************************************
+ * Copyright 2008-2009 VMware, Inc. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ **********************************************************/
+
+/**
+ * @file
+ * SVGA Shader Token Opcode Info
+ *
+ * @author Michal Krol <michal@vmware.com>
+ */
+
+#ifndef ST_SHADER_SVGA_OP_H
+#define ST_SHADER_SVGA_OP_H
+
+struct sh_opcode_info
+{
+ const char *mnemonic;
+ unsigned num_dst:8;
+ unsigned num_src:8;
+ unsigned svga_opcode:16;
+};
+
+const struct sh_opcode_info *sh_svga_opcode_info( unsigned op );
+
+#endif /* ST_SHADER_SVGA_OP_H */