Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**********************************************************
  2.  * Copyright 2008-2009 VMware, Inc.  All rights reserved.
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person
  5.  * obtaining a copy of this software and associated documentation
  6.  * files (the "Software"), to deal in the Software without
  7.  * restriction, including without limitation the rights to use, copy,
  8.  * modify, merge, publish, distribute, sublicense, and/or sell copies
  9.  * of the Software, and to permit persons to whom the Software is
  10.  * furnished to do so, subject to the following conditions:
  11.  *
  12.  * The above copyright notice and this permission notice shall be
  13.  * included in all copies or substantial portions of the Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  16.  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  17.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  18.  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  19.  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  20.  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  21.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  22.  * SOFTWARE.
  23.  *
  24.  **********************************************************/
  25.  
  26. #ifndef SVGA_TGSI_H
  27. #define SVGA_TGSI_H
  28.  
  29. #include "pipe/p_state.h"
  30.  
  31. #include "svga_hw_reg.h"
  32.  
  33.  
  34. /**
  35.  * We use a 32-bit mask to keep track of the generic indexes.
  36.  */
  37. #define MAX_GENERIC_VARYING 32
  38.  
  39.  
  40. struct svga_fragment_shader;
  41. struct svga_vertex_shader;
  42. struct svga_shader;
  43. struct tgsi_shader_info;
  44. struct tgsi_token;
  45.  
  46.  
  47. struct svga_vs_compile_key
  48. {
  49.    unsigned fs_generic_inputs;
  50.    unsigned need_prescale:1;
  51.    unsigned allow_psiz:1;
  52.    unsigned adjust_attrib_range:16;
  53.    unsigned adjust_attrib_w_1:16;
  54. };
  55.  
  56. struct svga_fs_compile_key
  57. {
  58.    unsigned light_twoside:1;
  59.    unsigned front_ccw:1;
  60.    unsigned white_fragments:1;
  61.    unsigned write_color0_to_n_cbufs:3;
  62.    unsigned num_textures:8;
  63.    unsigned num_unnormalized_coords:8;
  64.    unsigned sprite_origin_lower_left:1;
  65.    struct {
  66.       unsigned compare_mode:1;
  67.       unsigned compare_func:3;
  68.       unsigned unnormalized:1;
  69.       unsigned width_height_idx:7;
  70.       unsigned texture_target:8;
  71.       unsigned sprite_texgen:1;
  72.       unsigned swizzle_r:3;
  73.       unsigned swizzle_g:3;
  74.       unsigned swizzle_b:3;
  75.       unsigned swizzle_a:3;
  76.    } tex[PIPE_MAX_SAMPLERS];
  77. };
  78.  
  79. /**
  80.  * Key/index for identifying shader variants.
  81.  */
  82. struct svga_compile_key {
  83.    struct svga_vs_compile_key vkey;
  84.    struct svga_fs_compile_key fkey;
  85.    int8_t generic_remap_table[MAX_GENERIC_VARYING];
  86. };
  87.  
  88.  
  89. /**
  90.  * A single TGSI shader may be compiled into different variants of
  91.  * SVGA3D shaders depending on the compile key.  Each user shader
  92.  * will have a linked list of these variants.
  93.  */
  94. struct svga_shader_variant
  95. {
  96.    const struct svga_shader *shader;
  97.  
  98.    /** Parameters used to generate this variant */
  99.    struct svga_compile_key key;
  100.  
  101.    /* Compiled shader tokens:
  102.     */
  103.    const unsigned *tokens;
  104.    unsigned nr_tokens;
  105.  
  106.    /** Per-context shader identifier used with SVGA_3D_CMD_SHADER_DEFINE,
  107.     * SVGA_3D_CMD_SET_SHADER and SVGA_3D_CMD_SHADER_DESTROY.
  108.     */
  109.    unsigned id;
  110.    
  111.    /* GB object buffer containing the bytecode */
  112.    struct svga_winsys_gb_shader *gb_shader;
  113.  
  114.    /** Next variant */
  115.    struct svga_shader_variant *next;
  116. };
  117.  
  118.  
  119. /* TGSI doesn't provide use with VS input semantics (they're actually
  120.  * pretty meaningless), so we just generate some plausible ones here.
  121.  * This is called both from within the TGSI translator and when
  122.  * building vdecls to ensure they match up.
  123.  *
  124.  * The real use of this information is matching vertex elements to
  125.  * fragment shader inputs in the case where vertex shader is disabled.
  126.  */
  127. static INLINE void svga_generate_vdecl_semantics( unsigned idx,
  128.                                                   unsigned *usage,
  129.                                                   unsigned *usage_index )
  130. {
  131.    if (idx == 0) {
  132.       *usage = SVGA3D_DECLUSAGE_POSITION;
  133.       *usage_index = 0;
  134.    }
  135.    else {
  136.       *usage = SVGA3D_DECLUSAGE_TEXCOORD;
  137.       *usage_index = idx - 1;
  138.    }
  139. }
  140.  
  141.  
  142.  
  143. static INLINE unsigned svga_vs_key_size( const struct svga_vs_compile_key *key )
  144. {
  145.    return sizeof *key;
  146. }
  147.  
  148. static INLINE unsigned svga_fs_key_size( const struct svga_fs_compile_key *key )
  149. {
  150.    return (const char *)&key->tex[key->num_textures] - (const char *)key;
  151. }
  152.  
  153. struct svga_shader_variant *
  154. svga_translate_fragment_program( const struct svga_fragment_shader *fs,
  155.                                  const struct svga_fs_compile_key *fkey );
  156.  
  157. struct svga_shader_variant *
  158. svga_translate_vertex_program( const struct svga_vertex_shader *fs,
  159.                                const struct svga_vs_compile_key *vkey );
  160.  
  161.  
  162. unsigned
  163. svga_get_generic_inputs_mask(const struct tgsi_shader_info *info);
  164.  
  165. unsigned
  166. svga_get_generic_outputs_mask(const struct tgsi_shader_info *info);
  167.  
  168. void
  169. svga_remap_generics(unsigned generics_mask,
  170.                     int8_t remap_table[MAX_GENERIC_VARYING]);
  171.  
  172. int
  173. svga_remap_generic_index(int8_t remap_table[MAX_GENERIC_VARYING],
  174.                          int generic_index);
  175.  
  176. #endif
  177.