Browse Source

tgsi: scan for additional info: uses_fogcoord, uses_frontfacing

tags/mesa_20090313
Brian Paul 16 years ago
parent
commit
59a168d5c9
2 changed files with 37 additions and 15 deletions
  1. 35
    14
      src/gallium/auxiliary/tgsi/tgsi_scan.c
  2. 2
    1
      src/gallium/auxiliary/tgsi/tgsi_scan.h

+ 35
- 14
src/gallium/auxiliary/tgsi/tgsi_scan.c View File

* *
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
* All Rights Reserved. * All Rights Reserved.
* Copyright 2008 VMware, Inc. All rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the * copy of this software and associated documentation files (the
switch( parse.FullToken.Token.Type ) { switch( parse.FullToken.Token.Type ) {
case TGSI_TOKEN_TYPE_INSTRUCTION: case TGSI_TOKEN_TYPE_INSTRUCTION:
{ {
struct tgsi_full_instruction *fullinst
const struct tgsi_full_instruction *fullinst
= &parse.FullToken.FullInstruction; = &parse.FullToken.FullInstruction;


assert(fullinst->Instruction.Opcode < TGSI_OPCODE_LAST); assert(fullinst->Instruction.Opcode < TGSI_OPCODE_LAST);
info->opcode_count[fullinst->Instruction.Opcode]++; info->opcode_count[fullinst->Instruction.Opcode]++;

/* special case: scan fragment shaders for use of the fog
* input/attribute. The X component is fog, the Y component
* is the front/back-face flag.
*/
if (procType == TGSI_PROCESSOR_FRAGMENT) {
uint i;
for (i = 0; i < fullinst->Instruction.NumSrcRegs; i++) {
const struct tgsi_full_src_register *src =
&fullinst->FullSrcRegisters[i];
if (src->SrcRegister.File == TGSI_FILE_INPUT) {
const int ind = src->SrcRegister.Index;
if (info->input_semantic_name[ind] == TGSI_SEMANTIC_FOG) {
if (src->SrcRegister.SwizzleX == TGSI_SWIZZLE_X) {
info->uses_fogcoord = TRUE;
}
else if (src->SrcRegister.SwizzleX == TGSI_SWIZZLE_Y) {
info->uses_frontfacing = TRUE;
}
}
}
}
}
} }
break; break;


case TGSI_TOKEN_TYPE_DECLARATION: case TGSI_TOKEN_TYPE_DECLARATION:
{ {
struct tgsi_full_declaration *fulldecl
const struct tgsi_full_declaration *fulldecl
= &parse.FullToken.FullDeclaration; = &parse.FullToken.FullDeclaration;
uint file = fulldecl->Declaration.File; uint file = fulldecl->Declaration.File;
uint i;
for (i = fulldecl->DeclarationRange.First;
i <= fulldecl->DeclarationRange.Last;
i++) {
uint reg;
for (reg = fulldecl->DeclarationRange.First;
reg <= fulldecl->DeclarationRange.Last;
reg++) {


/* only first 32 regs will appear in this bitfield */ /* only first 32 regs will appear in this bitfield */
info->file_mask[file] |= (1 << i);
info->file_mask[file] |= (1 << reg);
info->file_count[file]++; info->file_count[file]++;
info->file_max[file] = MAX2(info->file_max[file], (int)i); info->file_max[file] = MAX2(info->file_max[file], (int)i);


if (file == TGSI_FILE_INPUT) { if (file == TGSI_FILE_INPUT) {
info->input_semantic_name[i] = (ubyte)fulldecl->Semantic.SemanticName;
info->input_semantic_index[i] = (ubyte)fulldecl->Semantic.SemanticIndex;
info->input_semantic_name[reg] = (ubyte)fulldecl->Semantic.SemanticName;
info->input_semantic_index[reg] = (ubyte)fulldecl->Semantic.SemanticIndex;
info->num_inputs++; info->num_inputs++;
} }


if (file == TGSI_FILE_OUTPUT) { if (file == TGSI_FILE_OUTPUT) {
info->output_semantic_name[i] = (ubyte)fulldecl->Semantic.SemanticName;
info->output_semantic_index[i] = (ubyte)fulldecl->Semantic.SemanticIndex;
info->output_semantic_name[reg] = (ubyte)fulldecl->Semantic.SemanticName;
info->output_semantic_index[reg] = (ubyte)fulldecl->Semantic.SemanticIndex;
info->num_outputs++; info->num_outputs++;
} }


} }
} }


assert( info->file_max[TGSI_FILE_INPUT] + 1 == info->num_inputs );
assert( info->file_max[TGSI_FILE_OUTPUT] + 1 == info->num_outputs );

info->uses_kill = (info->opcode_count[TGSI_OPCODE_KIL] || info->uses_kill = (info->opcode_count[TGSI_OPCODE_KIL] ||
info->opcode_count[TGSI_OPCODE_KILP]); info->opcode_count[TGSI_OPCODE_KILP]);



+ 2
- 1
src/gallium/auxiliary/tgsi/tgsi_scan.h View File

{ {
uint num_tokens; uint num_tokens;


/* XXX eventually remove the corresponding fields from pipe_shader_state: */
ubyte num_inputs; ubyte num_inputs;
ubyte num_outputs; ubyte num_outputs;
ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; /**< TGSI_SEMANTIC_x */ ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; /**< TGSI_SEMANTIC_x */


boolean writes_z; /**< does fragment shader write Z value? */ boolean writes_z; /**< does fragment shader write Z value? */
boolean uses_kill; /**< KIL or KILP instruction used? */ boolean uses_kill; /**< KIL or KILP instruction used? */
boolean uses_fogcoord; /**< fragment shader uses fog coord? */
boolean uses_frontfacing; /**< fragment shader uses front/back-face flag? */
}; };





Loading…
Cancel
Save