Home | History | Annotate | Download | only in softpipe
      1 /**************************************************************************
      2  *
      3  * Copyright 2007 VMware, Inc.
      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 VMWARE 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 
     36 struct sp_sampler_view;
     37 struct sp_sampler;
     38 
     39 typedef void (*wrap_nearest_func)(float s,
     40                                   unsigned size,
     41                                   int offset,
     42                                   int *icoord);
     43 
     44 typedef void (*wrap_linear_func)(float s,
     45                                  unsigned size,
     46                                  int offset,
     47                                  int *icoord0,
     48                                  int *icoord1,
     49                                  float *w);
     50 
     51 typedef float (*compute_lambda_func)(const struct sp_sampler_view *sp_sview,
     52                                      const float s[TGSI_QUAD_SIZE],
     53                                      const float t[TGSI_QUAD_SIZE],
     54                                      const float p[TGSI_QUAD_SIZE]);
     55 
     56 struct img_filter_args {
     57    float s;
     58    float t;
     59    float p;
     60    unsigned level;
     61    unsigned face_id;
     62    const int8_t *offset;
     63    bool gather_only;
     64    int gather_comp;
     65 };
     66 
     67 typedef void (*img_filter_func)(const struct sp_sampler_view *sp_sview,
     68                                 const struct sp_sampler *sp_samp,
     69                                 const struct img_filter_args *args,
     70                                 float *rgba);
     71 
     72 struct filter_args {
     73    enum tgsi_sampler_control control;
     74    const int8_t *offset;
     75    const uint *faces;
     76 };
     77 
     78 typedef void (*mip_filter_func)(const struct sp_sampler_view *sp_sview,
     79                                 const struct sp_sampler *sp_samp,
     80                                 img_filter_func min_filter,
     81                                 img_filter_func mag_filter,
     82                                 const float s[TGSI_QUAD_SIZE],
     83                                 const float t[TGSI_QUAD_SIZE],
     84                                 const float p[TGSI_QUAD_SIZE],
     85                                 const float c0[TGSI_QUAD_SIZE],
     86                                 const float lod[TGSI_QUAD_SIZE],
     87                                 const struct filter_args *args,
     88                                 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
     89 
     90 
     91 typedef void (*mip_level_func)(const struct sp_sampler_view *sp_sview,
     92                                const struct sp_sampler *sp_samp,
     93                                const float lod[TGSI_QUAD_SIZE],
     94                                float level[TGSI_QUAD_SIZE]);
     95 
     96 typedef void (*fetch_func)(struct sp_sampler_view *sp_sview,
     97                            const int i[TGSI_QUAD_SIZE],
     98                            const int j[TGSI_QUAD_SIZE], const int k[TGSI_QUAD_SIZE],
     99                            const int lod[TGSI_QUAD_SIZE], const int8_t offset[3],
    100                            float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
    101 
    102 
    103 struct sp_sampler_view
    104 {
    105    struct pipe_sampler_view base;
    106 
    107    /* For sp_get_samples_2d_linear_POT:
    108     */
    109    unsigned xpot;
    110    unsigned ypot;
    111 
    112    boolean need_swizzle;
    113    boolean pot2d;
    114    boolean need_cube_convert;
    115 
    116    /* these are different per shader type */
    117    struct softpipe_tex_tile_cache *cache;
    118    compute_lambda_func compute_lambda;
    119 
    120 };
    121 
    122 struct sp_filter_funcs {
    123    mip_level_func relative_level;
    124    mip_filter_func filter;
    125 };
    126 
    127 struct sp_sampler {
    128    struct pipe_sampler_state base;
    129 
    130    boolean min_mag_equal_repeat_linear;
    131    boolean min_mag_equal;
    132    unsigned min_img_filter;
    133 
    134    wrap_nearest_func nearest_texcoord_s;
    135    wrap_nearest_func nearest_texcoord_t;
    136    wrap_nearest_func nearest_texcoord_p;
    137 
    138    wrap_linear_func linear_texcoord_s;
    139    wrap_linear_func linear_texcoord_t;
    140    wrap_linear_func linear_texcoord_p;
    141 
    142    const struct sp_filter_funcs *filter_funcs;
    143 };
    144 
    145 
    146 /**
    147  * Subclass of tgsi_sampler
    148  */
    149 struct sp_tgsi_sampler
    150 {
    151    struct tgsi_sampler base;  /**< base class */
    152    struct sp_sampler *sp_sampler[PIPE_MAX_SAMPLERS];
    153    struct sp_sampler_view sp_sview[PIPE_MAX_SHADER_SAMPLER_VIEWS];
    154 
    155 };
    156 
    157 compute_lambda_func
    158 softpipe_get_lambda_func(const struct pipe_sampler_view *view, unsigned shader);
    159 
    160 
    161 void *
    162 softpipe_create_sampler_state(struct pipe_context *pipe,
    163                               const struct pipe_sampler_state *sampler);
    164 
    165 
    166 struct pipe_sampler_view *
    167 softpipe_create_sampler_view(struct pipe_context *pipe,
    168                              struct pipe_resource *resource,
    169                              const struct pipe_sampler_view *templ);
    170 
    171 
    172 struct sp_tgsi_sampler *
    173 sp_create_tgsi_sampler(void);
    174 
    175 
    176 #endif /* SP_TEX_SAMPLE_H */
    177