diff options
Diffstat (limited to 'lib/mesa/src/gallium/drivers/svga/svga_tgsi_emit.h')
-rw-r--r-- | lib/mesa/src/gallium/drivers/svga/svga_tgsi_emit.h | 318 |
1 files changed, 318 insertions, 0 deletions
diff --git a/lib/mesa/src/gallium/drivers/svga/svga_tgsi_emit.h b/lib/mesa/src/gallium/drivers/svga/svga_tgsi_emit.h new file mode 100644 index 000000000..1a1dac235 --- /dev/null +++ b/lib/mesa/src/gallium/drivers/svga/svga_tgsi_emit.h @@ -0,0 +1,318 @@ +/********************************************************** + * 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. + * + **********************************************************/ + +#ifndef SVGA_TGSI_EMIT_H +#define SVGA_TGSI_EMIT_H + +#include "tgsi/tgsi_scan.h" +#include "svga_hw_reg.h" +#include "svga_tgsi.h" +#include "svga3d_shaderdefs.h" + +struct src_register +{ + SVGA3dShaderSrcToken base; + SVGA3dShaderSrcToken indirect; +}; + + +struct svga_arl_consts +{ + int number; + int idx; + int swizzle; + int arl_num; +}; + + +/** + * This is the context/state used during TGSI->SVGA shader translation. + */ +struct svga_shader_emitter +{ + unsigned size; + char *buf; + char *ptr; + + struct svga_compile_key key; + struct tgsi_shader_info info; + int unit; + + int imm_start; + + int nr_hw_float_const; + int nr_hw_int_const; + int nr_hw_temp; + + int insn_offset; + + int internal_temp_count; + int internal_imm_count; + + int internal_color_idx[2]; /* diffuse, specular */ + int internal_color_count; + + boolean emitted_vface; + boolean emit_frontface; + int internal_frontface_idx; + + int ps30_input_count; + int vs30_output_count; + + int dynamic_branching_level; + + boolean in_main_func; + + boolean created_common_immediate; + int common_immediate_idx[2]; + + boolean created_loop_const; + int loop_const_idx; + + unsigned inverted_texcoords; /**< bitmask of which texcoords are flipped */ + struct src_register ps_true_texcoord[PIPE_MAX_ATTRIBS]; + struct src_register ps_inverted_texcoord[PIPE_MAX_ATTRIBS]; + unsigned ps_inverted_texcoord_input[PIPE_MAX_ATTRIBS]; + + unsigned label[32]; + unsigned nr_labels; + + /** input/output register mappings, indexed by register number */ + struct src_register input_map[PIPE_MAX_ATTRIBS]; + SVGA3dShaderDestToken output_map[PIPE_MAX_ATTRIBS]; + + boolean ps_reads_pos; + boolean emitted_depth_fog; + struct src_register ps_true_pos; + struct src_register ps_depth_pos; + SVGA3dShaderDestToken ps_temp_pos; + + /* shared input for depth and fog */ + struct src_register ps_depth_fog; + + struct src_register imm_0055; + SVGA3dShaderDestToken temp_pos; + SVGA3dShaderDestToken true_pos; + SVGA3dShaderDestToken depth_pos; + + /* shared output for depth and fog */ + SVGA3dShaderDestToken vs_depth_fog; + + /* PS output colors (indexed by color semantic index) */ + SVGA3dShaderDestToken temp_color_output[PIPE_MAX_COLOR_BUFS]; + SVGA3dShaderDestToken true_color_output[PIPE_MAX_COLOR_BUFS]; + + SVGA3dShaderDestToken temp_psiz; + SVGA3dShaderDestToken true_psiz; + + struct svga_arl_consts arl_consts[12]; + int num_arl_consts; + int current_arl; +}; + + +boolean +svga_shader_emit_dword(struct svga_shader_emitter *emit, unsigned dword); + +boolean +svga_shader_emit_dwords(struct svga_shader_emitter *emit, + const unsigned *dwords, unsigned nr); + +boolean +svga_shader_emit_opcode(struct svga_shader_emitter *emit, + unsigned opcode); + +boolean +svga_shader_emit_instructions(struct svga_shader_emitter *emit, + const struct tgsi_token *tokens); + +boolean +svga_translate_decl_sm30(struct svga_shader_emitter *emit, + const struct tgsi_full_declaration *decl); + + +#define TRANSLATE_SWIZZLE(x,y,z,w) ((x) | ((y) << 2) | ((z) << 4) | ((w) << 6)) +#define SWIZZLE_XYZW \ + TRANSLATE_SWIZZLE(TGSI_SWIZZLE_X,TGSI_SWIZZLE_Y,TGSI_SWIZZLE_Z,TGSI_SWIZZLE_W) +#define SWIZZLE_XXXX \ + TRANSLATE_SWIZZLE(TGSI_SWIZZLE_X,TGSI_SWIZZLE_X,TGSI_SWIZZLE_X,TGSI_SWIZZLE_X) +#define SWIZZLE_YYYY \ + TRANSLATE_SWIZZLE(TGSI_SWIZZLE_Y,TGSI_SWIZZLE_Y,TGSI_SWIZZLE_Y,TGSI_SWIZZLE_Y) +#define SWIZZLE_ZZZZ \ + TRANSLATE_SWIZZLE(TGSI_SWIZZLE_Z,TGSI_SWIZZLE_Z,TGSI_SWIZZLE_Z,TGSI_SWIZZLE_Z) +#define SWIZZLE_WWWW \ + TRANSLATE_SWIZZLE(TGSI_SWIZZLE_W,TGSI_SWIZZLE_W,TGSI_SWIZZLE_W,TGSI_SWIZZLE_W) + + +/** Emit the given SVGA3dShaderInstToken opcode */ +static inline boolean +emit_instruction(struct svga_shader_emitter *emit, + SVGA3dShaderInstToken opcode) +{ + return svga_shader_emit_opcode(emit, opcode.value); +} + + +/** Generate a SVGA3dShaderInstToken for the given SVGA3D shader opcode */ +static inline SVGA3dShaderInstToken +inst_token(unsigned opcode) +{ + SVGA3dShaderInstToken inst; + + inst.value = 0; + inst.op = opcode; + + return inst; +} + + +/** + * Generate a SVGA3dShaderInstToken for the given SVGA3D shader opcode + * with the predication flag set. + */ +static inline SVGA3dShaderInstToken +inst_token_predicated(unsigned opcode) +{ + SVGA3dShaderInstToken inst; + + inst.value = 0; + inst.op = opcode; + inst.predicated = 1; + + return inst; +} + + +/** + * Generate a SVGA3dShaderInstToken for a SETP instruction (set predicate) + * using the given comparison operator (one of SVGA3DOPCOMP_xx). + */ +static inline SVGA3dShaderInstToken +inst_token_setp(unsigned operator) +{ + SVGA3dShaderInstToken inst; + + inst.value = 0; + inst.op = SVGA3DOP_SETP; + inst.control = operator; + + return inst; +} + + +/** + * Create an instance of a SVGA3dShaderDestToken. + * Note that this function is used to create tokens for output registers, + * temp registers AND constants (see emit_def_const()). + */ +static inline SVGA3dShaderDestToken +dst_register(unsigned file, int number) +{ + SVGA3dShaderDestToken dest; + + /* check values against bitfield sizes */ + assert(number < (1 << 11)); + assert(file <= SVGA3DREG_PREDICATE); + + dest.value = 0; + dest.num = number; + dest.type_upper = file >> 3; + dest.relAddr = 0; + dest.reserved1 = 0; + dest.mask = 0xf; + dest.dstMod = 0; + dest.shfScale = 0; + dest.type_lower = file & 0x7; + dest.reserved0 = 1; /* is_reg */ + + return dest; +} + + +/** + * Apply a writemask to the given SVGA3dShaderDestToken, returning a + * new SVGA3dShaderDestToken. + */ +static inline SVGA3dShaderDestToken +writemask(SVGA3dShaderDestToken dest, unsigned mask) +{ + assert(dest.mask & mask); + dest.mask &= mask; + return dest; +} + + +/** Create a SVGA3dShaderSrcToken given a register file and number */ +static inline SVGA3dShaderSrcToken +src_token(unsigned file, int number) +{ + SVGA3dShaderSrcToken src; + + /* check values against bitfield sizes */ + assert(number < (1 << 11)); + assert(file <= SVGA3DREG_PREDICATE); + + src.value = 0; + src.num = number; + src.type_upper = file >> 3; + src.relAddr = 0; + src.reserved1 = 0; + src.swizzle = SWIZZLE_XYZW; + src.srcMod = 0; + src.type_lower = file & 0x7; + src.reserved0 = 1; /* is_reg */ + + return src; +} + + +/** Create a src_register given a register file and register number */ +static inline struct src_register +src_register(unsigned file, int number) +{ + struct src_register src; + + src.base = src_token(file, number); + src.indirect.value = 0; + + return src; +} + +/** Translate src_register into SVGA3dShaderDestToken */ +static inline SVGA3dShaderDestToken +dst(struct src_register src) +{ + return dst_register(SVGA3dShaderGetRegType(src.base.value), src.base.num); +} + + +/** Translate SVGA3dShaderDestToken to a src_register */ +static inline struct src_register +src(SVGA3dShaderDestToken dst) +{ + return src_register(SVGA3dShaderGetRegType(dst.value), dst.num); +} + +#endif |