Home | History | Annotate | Download | only in softpipe
      1 /**************************************************************************
      2  *
      3  * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
      4  * All Rights Reserved.
      5  * Copyright 2010 VMware, Inc.  All rights reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the
      9  * "Software"), to deal in the Software without restriction, including
     10  * without limitation the rights to use, copy, modify, merge, publish,
     11  * distribute, sub license, and/or sell copies of the Software, and to
     12  * permit persons to whom the Software is furnished to do so, subject to
     13  * the following conditions:
     14  *
     15  * The above copyright notice and this permission notice (including the
     16  * next paragraph) shall be included in all copies or substantial portions
     17  * of the Software.
     18  *
     19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     20  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     22  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
     23  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     24  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     25  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     26  *
     27  **************************************************************************/
     28 
     29 #ifndef SP_TEX_SAMPLE_H
     30 #define SP_TEX_SAMPLE_H
     31 
     32 
     33 #include "tgsi/tgsi_exec.h"
     34 
     35 struct sp_sampler_variant;
     36 
     37 typedef void (*wrap_nearest_func)(float s,
     38                                   unsigned size,
     39                                   int *icoord);
     40 
     41 typedef void (*wrap_linear_func)(float s,
     42                                  unsigned size,
     43                                  int *icoord0,
     44                                  int *icoord1,
     45                                  float *w);
     46 
     47 typedef float (*compute_lambda_func)(const struct sp_sampler_variant *sampler,
     48                                      const float s[TGSI_QUAD_SIZE],
     49                                      const float t[TGSI_QUAD_SIZE],
     50                                      const float p[TGSI_QUAD_SIZE]);
     51 
     52 typedef void (*img_filter_func)(struct tgsi_sampler *tgsi_sampler,
     53                                 float s,
     54                                 float t,
     55                                 float p,
     56                                 unsigned level,
     57                                 unsigned face_id,
     58                                 enum tgsi_sampler_control control,
     59                                 float *rgba);
     60 
     61 typedef void (*filter_func)(struct tgsi_sampler *tgsi_sampler,
     62                             const float s[TGSI_QUAD_SIZE],
     63                             const float t[TGSI_QUAD_SIZE],
     64                             const float p[TGSI_QUAD_SIZE],
     65                             const float c0[TGSI_QUAD_SIZE],
     66                             enum tgsi_sampler_control control,
     67                             float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
     68 
     69 
     70 union sp_sampler_key {
     71    struct {
     72       unsigned target:3;
     73       unsigned is_pot:1;
     74       unsigned processor:2;
     75       unsigned unit:4;
     76       unsigned swizzle_r:3;
     77       unsigned swizzle_g:3;
     78       unsigned swizzle_b:3;
     79       unsigned swizzle_a:3;
     80       unsigned pad:10;
     81    } bits;
     82    unsigned value;
     83 };
     84 
     85 /**
     86  * Subclass of tgsi_sampler
     87  */
     88 struct sp_sampler_variant
     89 {
     90    struct tgsi_sampler base;  /**< base class */
     91 
     92    union sp_sampler_key key;
     93 
     94    /* The owner of this struct:
     95     */
     96    const struct pipe_sampler_state *sampler;
     97 
     98 
     99    /* Currently bound texture:
    100     */
    101    const struct pipe_sampler_view *view;
    102    struct softpipe_tex_tile_cache *cache;
    103 
    104    unsigned processor;
    105 
    106    /* For sp_get_samples_2d_linear_POT:
    107     */
    108    unsigned xpot;
    109    unsigned ypot;
    110 
    111    unsigned faces[TGSI_QUAD_SIZE];
    112 
    113    wrap_nearest_func nearest_texcoord_s;
    114    wrap_nearest_func nearest_texcoord_t;
    115    wrap_nearest_func nearest_texcoord_p;
    116 
    117    wrap_linear_func linear_texcoord_s;
    118    wrap_linear_func linear_texcoord_t;
    119    wrap_linear_func linear_texcoord_p;
    120 
    121    img_filter_func min_img_filter;
    122    img_filter_func mag_img_filter;
    123 
    124    compute_lambda_func compute_lambda;
    125 
    126    filter_func mip_filter;
    127    filter_func compare;
    128    filter_func sample_target;
    129 
    130    /* Linked list:
    131     */
    132    struct sp_sampler_variant *next;
    133 };
    134 
    135 struct sp_sampler;
    136 
    137 /* Create a sampler variant for a given set of non-orthogonal state.  Currently the
    138  */
    139 struct sp_sampler_variant *
    140 sp_create_sampler_variant( const struct pipe_sampler_state *sampler,
    141                            const union sp_sampler_key key );
    142 
    143 void sp_sampler_variant_bind_view( struct sp_sampler_variant *variant,
    144                                    struct softpipe_tex_tile_cache *tex_cache,
    145                                    const struct pipe_sampler_view *view );
    146 
    147 void sp_sampler_variant_destroy( struct sp_sampler_variant * );
    148 
    149 
    150 
    151 static INLINE struct sp_sampler_variant *
    152 sp_sampler_variant(const struct tgsi_sampler *sampler)
    153 {
    154    return (struct sp_sampler_variant *) sampler;
    155 }
    156 
    157 extern void
    158 sp_get_samples(struct tgsi_sampler *tgsi_sampler,
    159                const float s[TGSI_QUAD_SIZE],
    160                const float t[TGSI_QUAD_SIZE],
    161                const float p[TGSI_QUAD_SIZE],
    162                float lodbias,
    163                float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
    164 
    165 
    166 #endif /* SP_TEX_SAMPLE_H */
    167