1848b8605Smrg/************************************************************************** 2848b8605Smrg * 3848b8605Smrg * Copyright 2007-2008 VMware, Inc. 4848b8605Smrg * All Rights Reserved. 5848b8605Smrg * Copyright 2009-2010 VMware, Inc. All rights Reserved. 6848b8605Smrg * 7848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a 8848b8605Smrg * copy of this software and associated documentation files (the 9848b8605Smrg * "Software"), to deal in the Software without restriction, including 10848b8605Smrg * without limitation the rights to use, copy, modify, merge, publish, 11848b8605Smrg * distribute, sub license, and/or sell copies of the Software, and to 12848b8605Smrg * permit persons to whom the Software is furnished to do so, subject to 13848b8605Smrg * the following conditions: 14848b8605Smrg * 15848b8605Smrg * The above copyright notice and this permission notice (including the 16848b8605Smrg * next paragraph) shall be included in all copies or substantial portions 17848b8605Smrg * of the Software. 18848b8605Smrg * 19848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21848b8605Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22848b8605Smrg * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 23848b8605Smrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24848b8605Smrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25848b8605Smrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26848b8605Smrg * 27848b8605Smrg **************************************************************************/ 28848b8605Smrg 29848b8605Smrg#ifndef TGSI_EXEC_H 30848b8605Smrg#define TGSI_EXEC_H 31848b8605Smrg 32848b8605Smrg#include "pipe/p_compiler.h" 33848b8605Smrg#include "pipe/p_state.h" 34848b8605Smrg#include "pipe/p_shader_tokens.h" 35848b8605Smrg 36848b8605Smrg#if defined __cplusplus 37848b8605Smrgextern "C" { 38848b8605Smrg#endif 39848b8605Smrg 40848b8605Smrg#define TGSI_CHAN_X 0 41848b8605Smrg#define TGSI_CHAN_Y 1 42848b8605Smrg#define TGSI_CHAN_Z 2 43848b8605Smrg#define TGSI_CHAN_W 3 44848b8605Smrg 45848b8605Smrg#define TGSI_NUM_CHANNELS 4 /* R,G,B,A */ 46848b8605Smrg#define TGSI_QUAD_SIZE 4 /* 4 pixel/quad */ 47848b8605Smrg 48848b8605Smrg#define TGSI_FOR_EACH_CHANNEL( CHAN )\ 49848b8605Smrg for (CHAN = 0; CHAN < TGSI_NUM_CHANNELS; CHAN++) 50848b8605Smrg 51848b8605Smrg#define TGSI_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\ 52848b8605Smrg ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN))) 53848b8605Smrg 54848b8605Smrg#define TGSI_IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\ 55848b8605Smrg if (TGSI_IS_DST0_CHANNEL_ENABLED( INST, CHAN )) 56848b8605Smrg 57848b8605Smrg#define TGSI_FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\ 58848b8605Smrg TGSI_FOR_EACH_CHANNEL( CHAN )\ 59848b8605Smrg TGSI_IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN ) 60848b8605Smrg 61b8e80941Smrg#define TGSI_IS_DST1_CHANNEL_ENABLED( INST, CHAN )\ 62b8e80941Smrg ((INST)->Dst[1].Register.WriteMask & (1 << (CHAN))) 63b8e80941Smrg 64b8e80941Smrg#define TGSI_IF_IS_DST1_CHANNEL_ENABLED( INST, CHAN )\ 65b8e80941Smrg if (TGSI_IS_DST1_CHANNEL_ENABLED( INST, CHAN )) 66b8e80941Smrg 67b8e80941Smrg#define TGSI_FOR_EACH_DST1_ENABLED_CHANNEL( INST, CHAN )\ 68b8e80941Smrg TGSI_FOR_EACH_CHANNEL( CHAN )\ 69b8e80941Smrg TGSI_IF_IS_DST1_CHANNEL_ENABLED( INST, CHAN ) 70848b8605Smrg 71848b8605Smrg/** 72848b8605Smrg * Registers may be treated as float, signed int or unsigned int. 73848b8605Smrg */ 74848b8605Smrgunion tgsi_exec_channel 75848b8605Smrg{ 76848b8605Smrg float f[TGSI_QUAD_SIZE]; 77848b8605Smrg int i[TGSI_QUAD_SIZE]; 78848b8605Smrg unsigned u[TGSI_QUAD_SIZE]; 79848b8605Smrg}; 80848b8605Smrg 81848b8605Smrg/** 82848b8605Smrg * A vector[RGBA] of channels[4 pixels] 83848b8605Smrg */ 84848b8605Smrgstruct tgsi_exec_vector 85848b8605Smrg{ 86848b8605Smrg union tgsi_exec_channel xyzw[TGSI_NUM_CHANNELS]; 87848b8605Smrg}; 88848b8605Smrg 89848b8605Smrg/** 90848b8605Smrg * For fragment programs, information for computing fragment input 91848b8605Smrg * values from plane equation of the triangle/line. 92848b8605Smrg */ 93848b8605Smrgstruct tgsi_interp_coef 94848b8605Smrg{ 95848b8605Smrg float a0[TGSI_NUM_CHANNELS]; /* in an xyzw layout */ 96848b8605Smrg float dadx[TGSI_NUM_CHANNELS]; 97848b8605Smrg float dady[TGSI_NUM_CHANNELS]; 98848b8605Smrg}; 99848b8605Smrg 100b8e80941Smrgenum tgsi_sampler_control 101b8e80941Smrg{ 102b8e80941Smrg TGSI_SAMPLER_LOD_NONE, 103b8e80941Smrg TGSI_SAMPLER_LOD_BIAS, 104b8e80941Smrg TGSI_SAMPLER_LOD_EXPLICIT, 105b8e80941Smrg TGSI_SAMPLER_LOD_ZERO, 106b8e80941Smrg TGSI_SAMPLER_DERIVS_EXPLICIT, 107b8e80941Smrg TGSI_SAMPLER_GATHER, 108b8e80941Smrg}; 109b8e80941Smrg 110b8e80941Smrgstruct tgsi_image_params { 111b8e80941Smrg unsigned unit; 112b8e80941Smrg unsigned tgsi_tex_instr; 113b8e80941Smrg enum pipe_format format; 114b8e80941Smrg unsigned execmask; 115b8e80941Smrg}; 116b8e80941Smrg 117b8e80941Smrgstruct tgsi_image { 118b8e80941Smrg /* image interfaces */ 119b8e80941Smrg void (*load)(const struct tgsi_image *image, 120b8e80941Smrg const struct tgsi_image_params *params, 121b8e80941Smrg const int s[TGSI_QUAD_SIZE], 122b8e80941Smrg const int t[TGSI_QUAD_SIZE], 123b8e80941Smrg const int r[TGSI_QUAD_SIZE], 124b8e80941Smrg const int sample[TGSI_QUAD_SIZE], 125b8e80941Smrg float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 126b8e80941Smrg 127b8e80941Smrg void (*store)(const struct tgsi_image *image, 128b8e80941Smrg const struct tgsi_image_params *params, 129b8e80941Smrg const int s[TGSI_QUAD_SIZE], 130b8e80941Smrg const int t[TGSI_QUAD_SIZE], 131b8e80941Smrg const int r[TGSI_QUAD_SIZE], 132b8e80941Smrg const int sample[TGSI_QUAD_SIZE], 133b8e80941Smrg float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 134b8e80941Smrg 135b8e80941Smrg void (*op)(const struct tgsi_image *image, 136b8e80941Smrg const struct tgsi_image_params *params, 137b8e80941Smrg enum tgsi_opcode opcode, 138b8e80941Smrg const int s[TGSI_QUAD_SIZE], 139b8e80941Smrg const int t[TGSI_QUAD_SIZE], 140b8e80941Smrg const int r[TGSI_QUAD_SIZE], 141b8e80941Smrg const int sample[TGSI_QUAD_SIZE], 142b8e80941Smrg float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE], 143b8e80941Smrg float rgba2[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 144b8e80941Smrg 145b8e80941Smrg void (*get_dims)(const struct tgsi_image *image, 146b8e80941Smrg const struct tgsi_image_params *params, 147b8e80941Smrg int dims[4]); 148b8e80941Smrg}; 149b8e80941Smrg 150b8e80941Smrgstruct tgsi_buffer_params { 151b8e80941Smrg unsigned unit; 152b8e80941Smrg unsigned execmask; 153b8e80941Smrg unsigned writemask; 154b8e80941Smrg}; 155b8e80941Smrg 156b8e80941Smrgstruct tgsi_buffer { 157b8e80941Smrg /* buffer interfaces */ 158b8e80941Smrg void (*load)(const struct tgsi_buffer *buffer, 159b8e80941Smrg const struct tgsi_buffer_params *params, 160b8e80941Smrg const int s[TGSI_QUAD_SIZE], 161b8e80941Smrg float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 162b8e80941Smrg 163b8e80941Smrg void (*store)(const struct tgsi_buffer *buffer, 164b8e80941Smrg const struct tgsi_buffer_params *params, 165b8e80941Smrg const int s[TGSI_QUAD_SIZE], 166b8e80941Smrg float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 167b8e80941Smrg 168b8e80941Smrg void (*op)(const struct tgsi_buffer *buffer, 169b8e80941Smrg const struct tgsi_buffer_params *params, 170b8e80941Smrg enum tgsi_opcode opcode, 171b8e80941Smrg const int s[TGSI_QUAD_SIZE], 172b8e80941Smrg float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE], 173b8e80941Smrg float rgba2[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 174b8e80941Smrg 175b8e80941Smrg void (*get_dims)(const struct tgsi_buffer *buffer, 176b8e80941Smrg const struct tgsi_buffer_params *params, 177b8e80941Smrg int *dim); 178848b8605Smrg}; 179848b8605Smrg 180848b8605Smrg/** 181848b8605Smrg * Information for sampling textures, which must be implemented 182848b8605Smrg * by code outside the TGSI executor. 183848b8605Smrg */ 184848b8605Smrgstruct tgsi_sampler 185848b8605Smrg{ 186848b8605Smrg /** Get samples for four fragments in a quad */ 187848b8605Smrg /* this interface contains 5 sets of channels that vary 188848b8605Smrg * depending on the sampler. 189848b8605Smrg * s - the first texture coordinate for sampling. 190848b8605Smrg * t - the second texture coordinate for sampling - unused for 1D, 191848b8605Smrg layer for 1D arrays. 192848b8605Smrg * r - the third coordinate for sampling for 3D, cube, cube arrays, 193848b8605Smrg * layer for 2D arrays. Compare value for 1D/2D shadows. 194848b8605Smrg * c0 - Compare value for shadow cube and shadow 2d arrays, 195848b8605Smrg * layer for cube arrays. 196848b8605Smrg * derivs - explicit derivatives. 197848b8605Smrg * offset - texel offsets 198848b8605Smrg * lod - lod value, except for shadow cube arrays (compare value there). 199848b8605Smrg */ 200848b8605Smrg void (*get_samples)(struct tgsi_sampler *sampler, 201848b8605Smrg const unsigned sview_index, 202848b8605Smrg const unsigned sampler_index, 203848b8605Smrg const float s[TGSI_QUAD_SIZE], 204848b8605Smrg const float t[TGSI_QUAD_SIZE], 205848b8605Smrg const float r[TGSI_QUAD_SIZE], 206848b8605Smrg const float c0[TGSI_QUAD_SIZE], 207848b8605Smrg const float c1[TGSI_QUAD_SIZE], 208848b8605Smrg float derivs[3][2][TGSI_QUAD_SIZE], 209848b8605Smrg const int8_t offset[3], 210848b8605Smrg enum tgsi_sampler_control control, 211848b8605Smrg float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 212848b8605Smrg void (*get_dims)(struct tgsi_sampler *sampler, 213848b8605Smrg const unsigned sview_index, 214848b8605Smrg int level, int dims[4]); 215848b8605Smrg void (*get_texel)(struct tgsi_sampler *sampler, 216848b8605Smrg const unsigned sview_index, 217848b8605Smrg const int i[TGSI_QUAD_SIZE], 218848b8605Smrg const int j[TGSI_QUAD_SIZE], const int k[TGSI_QUAD_SIZE], 219848b8605Smrg const int lod[TGSI_QUAD_SIZE], const int8_t offset[3], 220848b8605Smrg float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 221b8e80941Smrg void (*query_lod)(const struct tgsi_sampler *tgsi_sampler, 222b8e80941Smrg const unsigned sview_index, 223b8e80941Smrg const unsigned sampler_index, 224b8e80941Smrg const float s[TGSI_QUAD_SIZE], 225b8e80941Smrg const float t[TGSI_QUAD_SIZE], 226b8e80941Smrg const float p[TGSI_QUAD_SIZE], 227b8e80941Smrg const float c0[TGSI_QUAD_SIZE], 228b8e80941Smrg const enum tgsi_sampler_control control, 229b8e80941Smrg float mipmap[TGSI_QUAD_SIZE], 230b8e80941Smrg float lod[TGSI_QUAD_SIZE]); 231848b8605Smrg}; 232848b8605Smrg 233848b8605Smrg#define TGSI_EXEC_NUM_TEMPS 4096 234848b8605Smrg 235848b8605Smrg/* 236848b8605Smrg * Locations of various utility registers (_I = Index, _C = Channel) 237848b8605Smrg */ 238848b8605Smrg#define TGSI_EXEC_TEMP_00000000_I (TGSI_EXEC_NUM_TEMPS + 0) 239848b8605Smrg#define TGSI_EXEC_TEMP_00000000_C 0 240848b8605Smrg 241848b8605Smrg#define TGSI_EXEC_TEMP_7FFFFFFF_I (TGSI_EXEC_NUM_TEMPS + 0) 242848b8605Smrg#define TGSI_EXEC_TEMP_7FFFFFFF_C 1 243848b8605Smrg 244848b8605Smrg#define TGSI_EXEC_TEMP_80000000_I (TGSI_EXEC_NUM_TEMPS + 0) 245848b8605Smrg#define TGSI_EXEC_TEMP_80000000_C 2 246848b8605Smrg 247848b8605Smrg#define TGSI_EXEC_TEMP_FFFFFFFF_I (TGSI_EXEC_NUM_TEMPS + 0) 248848b8605Smrg#define TGSI_EXEC_TEMP_FFFFFFFF_C 3 249848b8605Smrg 250848b8605Smrg#define TGSI_EXEC_TEMP_ONE_I (TGSI_EXEC_NUM_TEMPS + 1) 251848b8605Smrg#define TGSI_EXEC_TEMP_ONE_C 0 252848b8605Smrg 253848b8605Smrg#define TGSI_EXEC_TEMP_TWO_I (TGSI_EXEC_NUM_TEMPS + 1) 254848b8605Smrg#define TGSI_EXEC_TEMP_TWO_C 1 255848b8605Smrg 256848b8605Smrg#define TGSI_EXEC_TEMP_128_I (TGSI_EXEC_NUM_TEMPS + 1) 257848b8605Smrg#define TGSI_EXEC_TEMP_128_C 2 258848b8605Smrg 259848b8605Smrg#define TGSI_EXEC_TEMP_MINUS_128_I (TGSI_EXEC_NUM_TEMPS + 1) 260848b8605Smrg#define TGSI_EXEC_TEMP_MINUS_128_C 3 261848b8605Smrg 262848b8605Smrg#define TGSI_EXEC_TEMP_KILMASK_I (TGSI_EXEC_NUM_TEMPS + 2) 263848b8605Smrg#define TGSI_EXEC_TEMP_KILMASK_C 0 264848b8605Smrg 265848b8605Smrg#define TGSI_EXEC_TEMP_OUTPUT_I (TGSI_EXEC_NUM_TEMPS + 2) 266848b8605Smrg#define TGSI_EXEC_TEMP_OUTPUT_C 1 267848b8605Smrg 268848b8605Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_I (TGSI_EXEC_NUM_TEMPS + 2) 269848b8605Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_C 2 270848b8605Smrg 271848b8605Smrg#define TGSI_EXEC_TEMP_THREE_I (TGSI_EXEC_NUM_TEMPS + 2) 272848b8605Smrg#define TGSI_EXEC_TEMP_THREE_C 3 273848b8605Smrg 274848b8605Smrg#define TGSI_EXEC_TEMP_HALF_I (TGSI_EXEC_NUM_TEMPS + 3) 275848b8605Smrg#define TGSI_EXEC_TEMP_HALF_C 0 276848b8605Smrg 277848b8605Smrg/* 4 register buffer for various purposes */ 278848b8605Smrg#define TGSI_EXEC_TEMP_R0 (TGSI_EXEC_NUM_TEMPS + 4) 279848b8605Smrg#define TGSI_EXEC_NUM_TEMP_R 4 280848b8605Smrg 281848b8605Smrg#define TGSI_EXEC_TEMP_ADDR (TGSI_EXEC_NUM_TEMPS + 8) 282b8e80941Smrg#define TGSI_EXEC_NUM_ADDRS 3 283848b8605Smrg 284b8e80941Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_S1_I (TGSI_EXEC_NUM_TEMPS + 11) 285b8e80941Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_S1_C 0 286b8e80941Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_S2_I (TGSI_EXEC_NUM_TEMPS + 12) 287b8e80941Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_S2_C 1 288b8e80941Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_S3_I (TGSI_EXEC_NUM_TEMPS + 13) 289b8e80941Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_S3_C 2 290848b8605Smrg 291b8e80941Smrg#define TGSI_EXEC_NUM_TEMP_EXTRAS 14 292848b8605Smrg 293848b8605Smrg 294848b8605Smrg 295848b8605Smrg#define TGSI_EXEC_MAX_NESTING 32 296848b8605Smrg#define TGSI_EXEC_MAX_COND_NESTING TGSI_EXEC_MAX_NESTING 297848b8605Smrg#define TGSI_EXEC_MAX_LOOP_NESTING TGSI_EXEC_MAX_NESTING 298848b8605Smrg#define TGSI_EXEC_MAX_SWITCH_NESTING TGSI_EXEC_MAX_NESTING 299848b8605Smrg#define TGSI_EXEC_MAX_CALL_NESTING TGSI_EXEC_MAX_NESTING 300848b8605Smrg 301848b8605Smrg/* The maximum number of input attributes per vertex. For 2D 302848b8605Smrg * input register files, this is the stride between two 1D 303848b8605Smrg * arrays. 304848b8605Smrg */ 305b8e80941Smrg#define TGSI_EXEC_MAX_INPUT_ATTRIBS 32 306848b8605Smrg 307848b8605Smrg/* The maximum number of bytes per constant buffer. 308848b8605Smrg */ 309848b8605Smrg#define TGSI_EXEC_MAX_CONST_BUFFER_SIZE (4096 * sizeof(float[4])) 310848b8605Smrg 311848b8605Smrg/* The maximum number of vertices per primitive */ 312848b8605Smrg#define TGSI_MAX_PRIM_VERTICES 6 313848b8605Smrg 314848b8605Smrg/* The maximum number of primitives to be generated */ 315848b8605Smrg#define TGSI_MAX_PRIMITIVES 64 316848b8605Smrg 317848b8605Smrg/* The maximum total number of vertices */ 318848b8605Smrg#define TGSI_MAX_TOTAL_VERTICES (TGSI_MAX_PRIM_VERTICES * TGSI_MAX_PRIMITIVES * PIPE_MAX_ATTRIBS) 319848b8605Smrg 320848b8605Smrg#define TGSI_MAX_MISC_INPUTS 8 321848b8605Smrg 322b8e80941Smrg#define TGSI_MAX_VERTEX_STREAMS 4 323b8e80941Smrg 324848b8605Smrg/** function call/activation record */ 325848b8605Smrgstruct tgsi_call_record 326848b8605Smrg{ 327848b8605Smrg uint CondStackTop; 328848b8605Smrg uint LoopStackTop; 329848b8605Smrg uint ContStackTop; 330848b8605Smrg int SwitchStackTop; 331848b8605Smrg int BreakStackTop; 332848b8605Smrg uint ReturnAddr; 333848b8605Smrg}; 334848b8605Smrg 335848b8605Smrg 336848b8605Smrg/* Switch-case block state. */ 337848b8605Smrgstruct tgsi_switch_record { 338848b8605Smrg uint mask; /**< execution mask */ 339848b8605Smrg union tgsi_exec_channel selector; /**< a value case statements are compared to */ 340848b8605Smrg uint defaultMask; /**< non-execute mask for default case */ 341848b8605Smrg}; 342848b8605Smrg 343848b8605Smrg 344848b8605Smrgenum tgsi_break_type { 345848b8605Smrg TGSI_EXEC_BREAK_INSIDE_LOOP, 346848b8605Smrg TGSI_EXEC_BREAK_INSIDE_SWITCH 347848b8605Smrg}; 348848b8605Smrg 349848b8605Smrg 350848b8605Smrg#define TGSI_EXEC_MAX_BREAK_STACK (TGSI_EXEC_MAX_LOOP_NESTING + TGSI_EXEC_MAX_SWITCH_NESTING) 351848b8605Smrg 352b8e80941Smrgtypedef float float4[4]; 353b8e80941Smrg 354b8e80941Smrgstruct tgsi_exec_machine; 355b8e80941Smrg 356b8e80941Smrgtypedef void (* apply_sample_offset_func)( 357b8e80941Smrg const struct tgsi_exec_machine *mach, 358b8e80941Smrg unsigned attrib, 359b8e80941Smrg unsigned chan, 360b8e80941Smrg float ofs_x, 361b8e80941Smrg float ofs_y, 362b8e80941Smrg union tgsi_exec_channel *out_chan); 363848b8605Smrg 364848b8605Smrg/** 365848b8605Smrg * Run-time virtual machine state for executing TGSI shader. 366848b8605Smrg */ 367848b8605Smrgstruct tgsi_exec_machine 368848b8605Smrg{ 369848b8605Smrg /* Total = program temporaries + internal temporaries 370848b8605Smrg */ 371848b8605Smrg struct tgsi_exec_vector Temps[TGSI_EXEC_NUM_TEMPS + 372848b8605Smrg TGSI_EXEC_NUM_TEMP_EXTRAS]; 373848b8605Smrg 374b8e80941Smrg unsigned ImmsReserved; 375b8e80941Smrg float4 *Imms; 376848b8605Smrg 377848b8605Smrg struct tgsi_exec_vector *Inputs; 378848b8605Smrg struct tgsi_exec_vector *Outputs; 379b8e80941Smrg apply_sample_offset_func *InputSampleOffsetApply; 380848b8605Smrg 381848b8605Smrg /* System values */ 382848b8605Smrg unsigned SysSemanticToIndex[TGSI_SEMANTIC_COUNT]; 383b8e80941Smrg struct tgsi_exec_vector SystemValue[TGSI_MAX_MISC_INPUTS]; 384848b8605Smrg 385848b8605Smrg struct tgsi_exec_vector *Addrs; 386848b8605Smrg 387848b8605Smrg struct tgsi_sampler *Sampler; 388848b8605Smrg 389b8e80941Smrg struct tgsi_image *Image; 390b8e80941Smrg struct tgsi_buffer *Buffer; 391848b8605Smrg unsigned ImmLimit; 392848b8605Smrg 393848b8605Smrg const void *Consts[PIPE_MAX_CONSTANT_BUFFERS]; 394848b8605Smrg unsigned ConstsSize[PIPE_MAX_CONSTANT_BUFFERS]; 395848b8605Smrg 396848b8605Smrg const struct tgsi_token *Tokens; /**< Declarations, instructions */ 397b8e80941Smrg enum pipe_shader_type ShaderType; /**< PIPE_SHADER_x */ 398848b8605Smrg 399848b8605Smrg /* GEOMETRY processor only. */ 400b8e80941Smrg unsigned *Primitives[TGSI_MAX_VERTEX_STREAMS]; 401b8e80941Smrg unsigned *PrimitiveOffsets[TGSI_MAX_VERTEX_STREAMS]; 402848b8605Smrg unsigned NumOutputs; 403848b8605Smrg unsigned MaxGeometryShaderOutputs; 404848b8605Smrg unsigned MaxOutputVertices; 405848b8605Smrg 406848b8605Smrg /* FRAGMENT processor only. */ 407848b8605Smrg const struct tgsi_interp_coef *InterpCoefs; 408848b8605Smrg struct tgsi_exec_vector QuadPos; 409848b8605Smrg float Face; /**< +1 if front facing, -1 if back facing */ 410848b8605Smrg bool flatshade_color; 411b8e80941Smrg 412b8e80941Smrg /* Compute Only */ 413b8e80941Smrg void *LocalMem; 414b8e80941Smrg unsigned LocalMemSize; 415b8e80941Smrg 416b8e80941Smrg /* See GLSL 4.50 specification for definition of helper invocations */ 417b8e80941Smrg uint NonHelperMask; /**< non-helpers */ 418848b8605Smrg /* Conditional execution masks */ 419848b8605Smrg uint CondMask; /**< For IF/ELSE/ENDIF */ 420848b8605Smrg uint LoopMask; /**< For BGNLOOP/ENDLOOP */ 421848b8605Smrg uint ContMask; /**< For loop CONT statements */ 422848b8605Smrg uint FuncMask; /**< For function calls */ 423848b8605Smrg uint ExecMask; /**< = CondMask & LoopMask */ 424848b8605Smrg 425848b8605Smrg /* Current switch-case state. */ 426848b8605Smrg struct tgsi_switch_record Switch; 427848b8605Smrg 428848b8605Smrg /* Current break type. */ 429848b8605Smrg enum tgsi_break_type BreakType; 430848b8605Smrg 431848b8605Smrg /** Condition mask stack (for nested conditionals) */ 432848b8605Smrg uint CondStack[TGSI_EXEC_MAX_COND_NESTING]; 433848b8605Smrg int CondStackTop; 434848b8605Smrg 435848b8605Smrg /** Loop mask stack (for nested loops) */ 436848b8605Smrg uint LoopStack[TGSI_EXEC_MAX_LOOP_NESTING]; 437848b8605Smrg int LoopStackTop; 438848b8605Smrg 439848b8605Smrg /** Loop label stack */ 440848b8605Smrg uint LoopLabelStack[TGSI_EXEC_MAX_LOOP_NESTING]; 441848b8605Smrg int LoopLabelStackTop; 442848b8605Smrg 443848b8605Smrg /** Loop continue mask stack (see comments in tgsi_exec.c) */ 444848b8605Smrg uint ContStack[TGSI_EXEC_MAX_LOOP_NESTING]; 445848b8605Smrg int ContStackTop; 446848b8605Smrg 447848b8605Smrg /** Switch case stack */ 448848b8605Smrg struct tgsi_switch_record SwitchStack[TGSI_EXEC_MAX_SWITCH_NESTING]; 449848b8605Smrg int SwitchStackTop; 450848b8605Smrg 451848b8605Smrg enum tgsi_break_type BreakStack[TGSI_EXEC_MAX_BREAK_STACK]; 452848b8605Smrg int BreakStackTop; 453848b8605Smrg 454848b8605Smrg /** Function execution mask stack (for executing subroutine code) */ 455848b8605Smrg uint FuncStack[TGSI_EXEC_MAX_CALL_NESTING]; 456848b8605Smrg int FuncStackTop; 457848b8605Smrg 458848b8605Smrg /** Function call stack for saving/restoring the program counter */ 459848b8605Smrg struct tgsi_call_record CallStack[TGSI_EXEC_MAX_CALL_NESTING]; 460848b8605Smrg int CallStackTop; 461848b8605Smrg 462848b8605Smrg struct tgsi_full_instruction *Instructions; 463848b8605Smrg uint NumInstructions; 464848b8605Smrg 465848b8605Smrg struct tgsi_full_declaration *Declarations; 466848b8605Smrg uint NumDeclarations; 467848b8605Smrg 468848b8605Smrg struct tgsi_declaration_sampler_view 469848b8605Smrg SamplerViews[PIPE_MAX_SHADER_SAMPLER_VIEWS]; 470848b8605Smrg 471848b8605Smrg boolean UsedGeometryShader; 472b8e80941Smrg 473b8e80941Smrg int pc; 474848b8605Smrg}; 475848b8605Smrg 476848b8605Smrgstruct tgsi_exec_machine * 477b8e80941Smrgtgsi_exec_machine_create(enum pipe_shader_type shader_type); 478848b8605Smrg 479848b8605Smrgvoid 480848b8605Smrgtgsi_exec_machine_destroy(struct tgsi_exec_machine *mach); 481848b8605Smrg 482848b8605Smrg 483848b8605Smrgvoid 484848b8605Smrgtgsi_exec_machine_bind_shader( 485848b8605Smrg struct tgsi_exec_machine *mach, 486848b8605Smrg const struct tgsi_token *tokens, 487b8e80941Smrg struct tgsi_sampler *sampler, 488b8e80941Smrg struct tgsi_image *image, 489b8e80941Smrg struct tgsi_buffer *buffer); 490848b8605Smrg 491848b8605Smrguint 492848b8605Smrgtgsi_exec_machine_run( 493b8e80941Smrg struct tgsi_exec_machine *mach, int start_pc ); 494848b8605Smrg 495848b8605Smrg 496848b8605Smrgvoid 497848b8605Smrgtgsi_exec_machine_free_data(struct tgsi_exec_machine *mach); 498848b8605Smrg 499848b8605Smrg 500848b8605Smrgboolean 501848b8605Smrgtgsi_check_soa_dependencies(const struct tgsi_full_instruction *inst); 502848b8605Smrg 503848b8605Smrg 504848b8605Smrgextern void 505848b8605Smrgtgsi_exec_set_constant_buffers(struct tgsi_exec_machine *mach, 506848b8605Smrg unsigned num_bufs, 507848b8605Smrg const void **bufs, 508848b8605Smrg const unsigned *buf_sizes); 509848b8605Smrg 510848b8605Smrg 511b8e80941Smrgstatic inline int 512848b8605Smrgtgsi_exec_get_shader_param(enum pipe_shader_cap param) 513848b8605Smrg{ 514848b8605Smrg switch(param) { 515848b8605Smrg case PIPE_SHADER_CAP_MAX_INSTRUCTIONS: 516848b8605Smrg case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS: 517848b8605Smrg case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS: 518848b8605Smrg case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS: 519848b8605Smrg return INT_MAX; 520848b8605Smrg case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH: 521848b8605Smrg return TGSI_EXEC_MAX_NESTING; 522848b8605Smrg case PIPE_SHADER_CAP_MAX_INPUTS: 523848b8605Smrg return TGSI_EXEC_MAX_INPUT_ATTRIBS; 524b8e80941Smrg case PIPE_SHADER_CAP_MAX_OUTPUTS: 525b8e80941Smrg return 32; 526848b8605Smrg case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: 527848b8605Smrg return TGSI_EXEC_MAX_CONST_BUFFER_SIZE; 528848b8605Smrg case PIPE_SHADER_CAP_MAX_CONST_BUFFERS: 529848b8605Smrg return PIPE_MAX_CONSTANT_BUFFERS; 530848b8605Smrg case PIPE_SHADER_CAP_MAX_TEMPS: 531848b8605Smrg return TGSI_EXEC_NUM_TEMPS; 532848b8605Smrg case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED: 533848b8605Smrg return 1; 534848b8605Smrg case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR: 535848b8605Smrg case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR: 536848b8605Smrg case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR: 537848b8605Smrg case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR: 538848b8605Smrg return 1; 539848b8605Smrg case PIPE_SHADER_CAP_SUBROUTINES: 540848b8605Smrg return 1; 541848b8605Smrg case PIPE_SHADER_CAP_INTEGERS: 542848b8605Smrg return 1; 543b8e80941Smrg case PIPE_SHADER_CAP_INT64_ATOMICS: 544b8e80941Smrg case PIPE_SHADER_CAP_FP16: 545b8e80941Smrg return 0; 546848b8605Smrg case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: 547848b8605Smrg return PIPE_MAX_SAMPLERS; 548848b8605Smrg case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: 549848b8605Smrg return PIPE_MAX_SHADER_SAMPLER_VIEWS; 550848b8605Smrg case PIPE_SHADER_CAP_PREFERRED_IR: 551848b8605Smrg return PIPE_SHADER_IR_TGSI; 552b8e80941Smrg case PIPE_SHADER_CAP_SUPPORTED_IRS: 553b8e80941Smrg return 1 << PIPE_SHADER_IR_TGSI; 554848b8605Smrg case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED: 555848b8605Smrg return 1; 556b8e80941Smrg case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: 557b8e80941Smrg case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED: 558b8e80941Smrg case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: 559b8e80941Smrg return 1; 560b8e80941Smrg case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED: 561b8e80941Smrg case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: 562b8e80941Smrg case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD: 563b8e80941Smrg case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS: 564b8e80941Smrg case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS: 565b8e80941Smrg case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS: 566848b8605Smrg return 0; 567b8e80941Smrg case PIPE_SHADER_CAP_SCALAR_ISA: 568b8e80941Smrg return 1; 569b8e80941Smrg case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS: 570b8e80941Smrg return PIPE_MAX_SHADER_BUFFERS; 571b8e80941Smrg case PIPE_SHADER_CAP_MAX_SHADER_IMAGES: 572b8e80941Smrg return PIPE_MAX_SHADER_IMAGES; 573b8e80941Smrg 574b8e80941Smrg case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: 575b8e80941Smrg return 32; 576848b8605Smrg } 577848b8605Smrg /* if we get here, we missed a shader cap above (and should have seen 578848b8605Smrg * a compiler warning.) 579848b8605Smrg */ 580848b8605Smrg return 0; 581848b8605Smrg} 582848b8605Smrg 583848b8605Smrg#if defined __cplusplus 584848b8605Smrg} /* extern "C" */ 585848b8605Smrg#endif 586848b8605Smrg 587848b8605Smrg#endif /* TGSI_EXEC_H */ 588