• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 *
sp_sampler_variant(const struct tgsi_sampler * sampler)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