1 /************************************************************************** 2 * 3 * Copyright 2003 VMware, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 /* 29 * Authors: 30 * Keith Whitwell <keithw (at) vmware.com> 31 */ 32 33 34 #ifndef ST_PROGRAM_H 35 #define ST_PROGRAM_H 36 37 #include "main/mtypes.h" 38 #include "main/atifragshader.h" 39 #include "program/program.h" 40 #include "pipe/p_state.h" 41 #include "st_context.h" 42 #include "st_texture.h" 43 #include "st_glsl_to_tgsi.h" 44 45 46 #ifdef __cplusplus 47 extern "C" { 48 #endif 49 50 #define ST_DOUBLE_ATTRIB_PLACEHOLDER 0xffffffff 51 52 struct st_external_sampler_key 53 { 54 GLuint lower_nv12; /**< bitmask of 2 plane YUV samplers */ 55 GLuint lower_iyuv; /**< bitmask of 3 plane YUV samplers */ 56 }; 57 58 static inline struct st_external_sampler_key 59 st_get_external_sampler_key(struct st_context *st, struct gl_program *prog) 60 { 61 unsigned mask = prog->ExternalSamplersUsed; 62 struct st_external_sampler_key key; 63 64 memset(&key, 0, sizeof(key)); 65 66 while (unlikely(mask)) { 67 unsigned unit = u_bit_scan(&mask); 68 struct st_texture_object *stObj = 69 st_get_texture_object(st->ctx, prog, unit); 70 71 switch (st_get_view_format(stObj)) { 72 case PIPE_FORMAT_NV12: 73 key.lower_nv12 |= (1 << unit); 74 break; 75 case PIPE_FORMAT_IYUV: 76 key.lower_iyuv |= (1 << unit); 77 break; 78 default: 79 break; 80 } 81 } 82 83 return key; 84 } 85 86 /** Fragment program variant key */ 87 struct st_fp_variant_key 88 { 89 struct st_context *st; /**< variants are per-context */ 90 91 /** for glBitmap */ 92 GLuint bitmap:1; /**< glBitmap variant? */ 93 94 /** for glDrawPixels */ 95 GLuint drawpixels:1; /**< glDrawPixels variant */ 96 GLuint scaleAndBias:1; /**< glDrawPixels w/ scale and/or bias? */ 97 GLuint pixelMaps:1; /**< glDrawPixels w/ pixel lookup map? */ 98 99 /** for ARB_color_buffer_float */ 100 GLuint clamp_color:1; 101 102 /** for ARB_sample_shading */ 103 GLuint persample_shading:1; 104 105 /** needed for ATI_fragment_shader */ 106 GLuint fog:2; 107 108 /** needed for ATI_fragment_shader */ 109 char texture_targets[MAX_NUM_FRAGMENT_REGISTERS_ATI]; 110 111 struct st_external_sampler_key external; 112 }; 113 114 115 /** 116 * Variant of a fragment program. 117 */ 118 struct st_fp_variant 119 { 120 /** Parameters which generated this version of fragment program */ 121 struct st_fp_variant_key key; 122 123 /** Driver's compiled shader */ 124 void *driver_shader; 125 126 /** For glBitmap variants */ 127 uint bitmap_sampler; 128 129 /** For glDrawPixels variants */ 130 unsigned drawpix_sampler; 131 unsigned pixelmap_sampler; 132 133 /** next in linked list */ 134 struct st_fp_variant *next; 135 }; 136 137 138 /** 139 * Derived from Mesa gl_program: 140 */ 141 struct st_fragment_program 142 { 143 struct gl_program Base; 144 struct pipe_shader_state tgsi; 145 struct glsl_to_tgsi_visitor* glsl_to_tgsi; 146 struct ati_fragment_shader *ati_fs; 147 uint64_t affected_states; /**< ST_NEW_* flags to mark dirty when binding */ 148 149 /* used when bypassing glsl_to_tgsi: */ 150 struct gl_shader_program *shader_program; 151 152 struct st_fp_variant *variants; 153 }; 154 155 156 157 /** Vertex program variant key */ 158 struct st_vp_variant_key 159 { 160 struct st_context *st; /**< variants are per-context */ 161 boolean passthrough_edgeflags; 162 163 /** for ARB_color_buffer_float */ 164 boolean clamp_color; 165 }; 166 167 168 /** 169 * This represents a vertex program, especially translated to match 170 * the inputs of a particular fragment shader. 171 */ 172 struct st_vp_variant 173 { 174 /* Parameters which generated this translated version of a vertex 175 * shader: 176 */ 177 struct st_vp_variant_key key; 178 179 /** 180 * TGSI tokens (to later generate a 'draw' module shader for 181 * selection/feedback/rasterpos) 182 */ 183 struct pipe_shader_state tgsi; 184 185 /** Driver's compiled shader */ 186 void *driver_shader; 187 188 /** For using our private draw module (glRasterPos) */ 189 struct draw_vertex_shader *draw_shader; 190 191 /** Next in linked list */ 192 struct st_vp_variant *next; 193 194 /** similar to that in st_vertex_program, but with edgeflags info too */ 195 GLuint num_inputs; 196 }; 197 198 199 /** 200 * Derived from Mesa gl_program: 201 */ 202 struct st_vertex_program 203 { 204 struct gl_program Base; /**< The Mesa vertex program */ 205 struct pipe_shader_state tgsi; 206 struct glsl_to_tgsi_visitor* glsl_to_tgsi; 207 uint64_t affected_states; /**< ST_NEW_* flags to mark dirty when binding */ 208 209 /* used when bypassing glsl_to_tgsi: */ 210 struct gl_shader_program *shader_program; 211 212 /** maps a Mesa VERT_ATTRIB_x to a packed TGSI input index */ 213 /** maps a TGSI input index back to a Mesa VERT_ATTRIB_x */ 214 GLuint index_to_input[PIPE_MAX_SHADER_INPUTS]; 215 GLuint num_inputs; 216 217 /** Maps VARYING_SLOT_x to slot */ 218 GLuint result_to_output[VARYING_SLOT_MAX]; 219 220 /** List of translated variants of this vertex program. 221 */ 222 struct st_vp_variant *variants; 223 }; 224 225 226 227 /** Key shared by all shaders except VP, FP */ 228 struct st_basic_variant_key 229 { 230 struct st_context *st; /**< variants are per-context */ 231 }; 232 233 234 /** 235 * Geometry program variant. 236 */ 237 struct st_basic_variant 238 { 239 /* Parameters which generated this variant. */ 240 struct st_basic_variant_key key; 241 242 void *driver_shader; 243 244 struct st_basic_variant *next; 245 }; 246 247 248 /** 249 * Derived from Mesa gl_program: 250 */ 251 struct st_geometry_program 252 { 253 struct gl_program Base; /**< The Mesa geometry program */ 254 struct pipe_shader_state tgsi; 255 struct glsl_to_tgsi_visitor* glsl_to_tgsi; 256 uint64_t affected_states; /**< ST_NEW_* flags to mark dirty when binding */ 257 258 struct st_basic_variant *variants; 259 }; 260 261 262 /** 263 * Derived from Mesa gl_program: 264 */ 265 struct st_tessctrl_program 266 { 267 struct gl_program Base; /**< The Mesa tess ctrl program */ 268 struct pipe_shader_state tgsi; 269 struct glsl_to_tgsi_visitor* glsl_to_tgsi; 270 uint64_t affected_states; /**< ST_NEW_* flags to mark dirty when binding */ 271 272 struct st_basic_variant *variants; 273 }; 274 275 276 /** 277 * Derived from Mesa gl_program: 278 */ 279 struct st_tesseval_program 280 { 281 struct gl_program Base; /**< The Mesa tess eval program */ 282 struct pipe_shader_state tgsi; 283 struct glsl_to_tgsi_visitor* glsl_to_tgsi; 284 uint64_t affected_states; /**< ST_NEW_* flags to mark dirty when binding */ 285 286 struct st_basic_variant *variants; 287 }; 288 289 290 /** 291 * Derived from Mesa gl_program: 292 */ 293 struct st_compute_program 294 { 295 struct gl_program Base; /**< The Mesa compute program */ 296 struct pipe_compute_state tgsi; 297 struct glsl_to_tgsi_visitor* glsl_to_tgsi; 298 uint64_t affected_states; /**< ST_NEW_* flags to mark dirty when binding */ 299 300 struct st_basic_variant *variants; 301 }; 302 303 304 static inline struct st_fragment_program * 305 st_fragment_program( struct gl_program *fp ) 306 { 307 return (struct st_fragment_program *)fp; 308 } 309 310 311 static inline struct st_vertex_program * 312 st_vertex_program( struct gl_program *vp ) 313 { 314 return (struct st_vertex_program *)vp; 315 } 316 317 static inline struct st_geometry_program * 318 st_geometry_program( struct gl_program *gp ) 319 { 320 return (struct st_geometry_program *)gp; 321 } 322 323 static inline struct st_tessctrl_program * 324 st_tessctrl_program( struct gl_program *tcp ) 325 { 326 return (struct st_tessctrl_program *)tcp; 327 } 328 329 static inline struct st_tesseval_program * 330 st_tesseval_program( struct gl_program *tep ) 331 { 332 return (struct st_tesseval_program *)tep; 333 } 334 335 static inline struct st_compute_program * 336 st_compute_program( struct gl_program *cp ) 337 { 338 return (struct st_compute_program *)cp; 339 } 340 341 static inline void 342 st_reference_vertprog(struct st_context *st, 343 struct st_vertex_program **ptr, 344 struct st_vertex_program *prog) 345 { 346 _mesa_reference_program(st->ctx, 347 (struct gl_program **) ptr, 348 (struct gl_program *) prog); 349 } 350 351 static inline void 352 st_reference_geomprog(struct st_context *st, 353 struct st_geometry_program **ptr, 354 struct st_geometry_program *prog) 355 { 356 _mesa_reference_program(st->ctx, 357 (struct gl_program **) ptr, 358 (struct gl_program *) prog); 359 } 360 361 static inline void 362 st_reference_fragprog(struct st_context *st, 363 struct st_fragment_program **ptr, 364 struct st_fragment_program *prog) 365 { 366 _mesa_reference_program(st->ctx, 367 (struct gl_program **) ptr, 368 (struct gl_program *) prog); 369 } 370 371 static inline void 372 st_reference_tesscprog(struct st_context *st, 373 struct st_tessctrl_program **ptr, 374 struct st_tessctrl_program *prog) 375 { 376 _mesa_reference_program(st->ctx, 377 (struct gl_program **) ptr, 378 (struct gl_program *) prog); 379 } 380 381 static inline void 382 st_reference_tesseprog(struct st_context *st, 383 struct st_tesseval_program **ptr, 384 struct st_tesseval_program *prog) 385 { 386 _mesa_reference_program(st->ctx, 387 (struct gl_program **) ptr, 388 (struct gl_program *) prog); 389 } 390 391 static inline void 392 st_reference_compprog(struct st_context *st, 393 struct st_compute_program **ptr, 394 struct st_compute_program *prog) 395 { 396 _mesa_reference_program(st->ctx, 397 (struct gl_program **) ptr, 398 (struct gl_program *) prog); 399 } 400 401 /** 402 * This defines mapping from Mesa VARYING_SLOTs to TGSI GENERIC slots. 403 */ 404 static inline unsigned 405 st_get_generic_varying_index(struct st_context *st, GLuint attr) 406 { 407 if (attr >= VARYING_SLOT_VAR0) { 408 if (st->needs_texcoord_semantic) 409 return attr - VARYING_SLOT_VAR0; 410 else 411 return 9 + (attr - VARYING_SLOT_VAR0); 412 } 413 if (attr == VARYING_SLOT_PNTC) { 414 assert(!st->needs_texcoord_semantic); 415 return 8; 416 } 417 if (attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7) { 418 assert(!st->needs_texcoord_semantic); 419 return attr - VARYING_SLOT_TEX0; 420 } 421 422 assert(0); 423 return 0; 424 } 425 426 427 extern struct st_vp_variant * 428 st_get_vp_variant(struct st_context *st, 429 struct st_vertex_program *stvp, 430 const struct st_vp_variant_key *key); 431 432 433 extern struct st_fp_variant * 434 st_get_fp_variant(struct st_context *st, 435 struct st_fragment_program *stfp, 436 const struct st_fp_variant_key *key); 437 438 extern struct st_basic_variant * 439 st_get_cp_variant(struct st_context *st, 440 struct pipe_compute_state *tgsi, 441 struct st_basic_variant **variants); 442 443 extern struct st_basic_variant * 444 st_get_basic_variant(struct st_context *st, 445 unsigned pipe_shader, 446 struct pipe_shader_state *tgsi, 447 struct st_basic_variant **variants); 448 449 extern void 450 st_release_vp_variants( struct st_context *st, 451 struct st_vertex_program *stvp ); 452 453 extern void 454 st_release_fp_variants( struct st_context *st, 455 struct st_fragment_program *stfp ); 456 457 extern void 458 st_release_cp_variants(struct st_context *st, 459 struct st_compute_program *stcp); 460 461 extern void 462 st_release_basic_variants(struct st_context *st, GLenum target, 463 struct st_basic_variant **variants, 464 struct pipe_shader_state *tgsi); 465 466 extern void 467 st_destroy_program_variants(struct st_context *st); 468 469 extern bool 470 st_translate_vertex_program(struct st_context *st, 471 struct st_vertex_program *stvp); 472 473 extern bool 474 st_translate_fragment_program(struct st_context *st, 475 struct st_fragment_program *stfp); 476 477 extern bool 478 st_translate_geometry_program(struct st_context *st, 479 struct st_geometry_program *stgp); 480 481 extern bool 482 st_translate_tessctrl_program(struct st_context *st, 483 struct st_tessctrl_program *sttcp); 484 485 extern bool 486 st_translate_tesseval_program(struct st_context *st, 487 struct st_tesseval_program *sttep); 488 489 extern bool 490 st_translate_compute_program(struct st_context *st, 491 struct st_compute_program *stcp); 492 493 extern void 494 st_print_current_vertex_program(void); 495 496 extern void 497 st_precompile_shader_variant(struct st_context *st, 498 struct gl_program *prog); 499 500 #ifdef __cplusplus 501 } 502 #endif 503 504 #endif 505