Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2011 Intel Corporation
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21.  * IN THE SOFTWARE.
  22.  */
  23.  
  24. #ifndef BRW_PROGRAM_H
  25. #define BRW_PROGRAM_H
  26.  
  27. /**
  28.  * Program key structures.
  29.  *
  30.  * When drawing, we look for the currently bound shaders in the program
  31.  * cache.  This is essentially a hash table lookup, and these are the keys.
  32.  *
  33.  * Sometimes OpenGL features specified as state need to be simulated via
  34.  * shader code, due to a mismatch between the API and the hardware.  This
  35.  * is often referred to as "non-orthagonal state" or "NOS".  We store NOS
  36.  * in the program key so it's considered when searching for a program.  If
  37.  * we haven't seen a particular combination before, we have to recompile a
  38.  * new specialized version.
  39.  *
  40.  * Shader compilation should not look up state in gl_context directly, but
  41.  * instead use the copy in the program key.  This guarantees recompiles will
  42.  * happen correctly.
  43.  *
  44.  *  @{
  45.  */
  46.  
  47. enum PACKED gen6_gather_sampler_wa {
  48.    WA_SIGN = 1,      /* whether we need to sign extend */
  49.    WA_8BIT = 2,      /* if we have an 8bit format needing wa */
  50.    WA_16BIT = 4,     /* if we have a 16bit format needing wa */
  51. };
  52.  
  53. /**
  54.  * Sampler information needed by VS, WM, and GS program cache keys.
  55.  */
  56. struct brw_sampler_prog_key_data {
  57.    /**
  58.     * EXT_texture_swizzle and DEPTH_TEXTURE_MODE swizzles.
  59.     */
  60.    uint16_t swizzles[MAX_SAMPLERS];
  61.  
  62.    uint32_t gl_clamp_mask[3];
  63.  
  64.    /**
  65.     * For RG32F, gather4's channel select is broken.
  66.     */
  67.    uint32_t gather_channel_quirk_mask;
  68.  
  69.    /**
  70.     * Whether this sampler uses the compressed multisample surface layout.
  71.     */
  72.    uint32_t compressed_multisample_layout_mask;
  73.  
  74.    /**
  75.     * For Sandybridge, which shader w/a we need for gather quirks.
  76.     */
  77.    enum gen6_gather_sampler_wa gen6_gather_wa[MAX_SAMPLERS];
  78. };
  79.  
  80.  
  81. struct brw_vue_prog_key {
  82.    unsigned program_string_id;
  83.  
  84.    /**
  85.     * True if at least one clip flag is enabled, regardless of whether the
  86.     * shader uses clip planes or gl_ClipDistance.
  87.     */
  88.    bool userclip_active:1;
  89.  
  90.    /**
  91.     * How many user clipping planes are being uploaded to the vertex shader as
  92.     * push constants.
  93.     */
  94.    unsigned nr_userclip_plane_consts:4;
  95.  
  96.    struct brw_sampler_prog_key_data tex;
  97. };
  98.  
  99. /** The program key for Vertex Shaders. */
  100. struct brw_vs_prog_key {
  101.    struct brw_vue_prog_key base;
  102.  
  103.    /*
  104.     * Per-attribute workaround flags
  105.     */
  106.    uint8_t gl_attrib_wa_flags[VERT_ATTRIB_MAX];
  107.  
  108.    bool copy_edgeflag:1;
  109.  
  110.    bool clamp_vertex_color:1;
  111.  
  112.    /**
  113.     * For pre-Gen6 hardware, a bitfield indicating which texture coordinates
  114.     * are going to be replaced with point coordinates (as a consequence of a
  115.     * call to glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE)).  Because
  116.     * our SF thread requires exact matching between VS outputs and FS inputs,
  117.     * these texture coordinates will need to be unconditionally included in
  118.     * the VUE, even if they aren't written by the vertex shader.
  119.     */
  120.    uint8_t point_coord_replace;
  121. };
  122.  
  123. /** The program key for Geometry Shaders. */
  124. struct brw_gs_prog_key
  125. {
  126.    struct brw_vue_prog_key base;
  127.  
  128.    uint64_t input_varyings;
  129. };
  130.  
  131. /** The program key for Fragment/Pixel Shaders. */
  132. struct brw_wm_prog_key {
  133.    uint8_t iz_lookup;
  134.    bool stats_wm:1;
  135.    bool flat_shade:1;
  136.    bool persample_shading:1;
  137.    bool persample_2x:1;
  138.    unsigned nr_color_regions:5;
  139.    bool replicate_alpha:1;
  140.    bool render_to_fbo:1;
  141.    bool clamp_fragment_color:1;
  142.    bool compute_pos_offset:1;
  143.    bool compute_sample_id:1;
  144.    unsigned line_aa:2;
  145.    bool high_quality_derivatives:1;
  146.  
  147.    uint16_t drawable_height;
  148.    uint64_t input_slots_valid;
  149.    unsigned program_string_id;
  150.    GLenum alpha_test_func;          /* < For Gen4/5 MRT alpha test */
  151.    float alpha_test_ref;
  152.  
  153.    struct brw_sampler_prog_key_data tex;
  154. };
  155.  
  156. /** @} */
  157.  
  158. #ifdef __cplusplus
  159. extern "C" {
  160. #endif
  161.  
  162. void brw_populate_sampler_prog_key_data(struct gl_context *ctx,
  163.                                         const struct gl_program *prog,
  164.                                         unsigned sampler_count,
  165.                                         struct brw_sampler_prog_key_data *key);
  166. bool brw_debug_recompile_sampler_key(struct brw_context *brw,
  167.                                      const struct brw_sampler_prog_key_data *old_key,
  168.                                      const struct brw_sampler_prog_key_data *key);
  169. void brw_add_texrect_params(struct gl_program *prog);
  170.  
  171. void
  172. brw_mark_surface_used(struct brw_stage_prog_data *prog_data,
  173.                       unsigned surf_index);
  174.  
  175. bool
  176. brw_stage_prog_data_compare(const struct brw_stage_prog_data *a,
  177.                             const struct brw_stage_prog_data *b);
  178.  
  179. void
  180. brw_stage_prog_data_free(const void *prog_data);
  181.  
  182. void
  183. brw_dump_ir(const char *stage, struct gl_shader_program *shader_prog,
  184.             struct gl_shader *shader, struct gl_program *prog);
  185.  
  186. #ifdef __cplusplus
  187. } /* extern "C" */
  188. #endif
  189.  
  190. #endif
  191.