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 typedef float (*compute_lambda_from_grad_func)(const struct sp_sampler_view *sp_sview, 57 const float derivs[3][2][TGSI_QUAD_SIZE], 58 uint quad); 59 60 struct img_filter_args { 61 float s; 62 float t; 63 float p; 64 unsigned level; 65 unsigned face_id; 66 const int8_t *offset; 67 bool gather_only; 68 int gather_comp; 69 }; 70 71 typedef void (*img_filter_func)(const struct sp_sampler_view *sp_sview, 72 const struct sp_sampler *sp_samp, 73 const struct img_filter_args *args, 74 float *rgba); 75 76 struct filter_args { 77 enum tgsi_sampler_control control; 78 const int8_t *offset; 79 const uint *faces; 80 }; 81 82 typedef void (*mip_filter_func)(const struct sp_sampler_view *sp_sview, 83 const struct sp_sampler *sp_samp, 84 img_filter_func min_filter, 85 img_filter_func mag_filter, 86 const float s[TGSI_QUAD_SIZE], 87 const float t[TGSI_QUAD_SIZE], 88 const float p[TGSI_QUAD_SIZE], 89 int gather_comp, 90 const float lod[TGSI_QUAD_SIZE], 91 const struct filter_args *args, 92 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 93 94 95 typedef void (*mip_level_func)(const struct sp_sampler_view *sp_sview, 96 const struct sp_sampler *sp_samp, 97 const float lod[TGSI_QUAD_SIZE], 98 float level[TGSI_QUAD_SIZE]); 99 100 typedef void (*fetch_func)(struct sp_sampler_view *sp_sview, 101 const int i[TGSI_QUAD_SIZE], 102 const int j[TGSI_QUAD_SIZE], const int k[TGSI_QUAD_SIZE], 103 const int lod[TGSI_QUAD_SIZE], const int8_t offset[3], 104 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 105 106 107 struct sp_sampler_view 108 { 109 struct pipe_sampler_view base; 110 111 /* For sp_get_samples_2d_linear_POT: 112 */ 113 unsigned xpot; 114 unsigned ypot; 115 116 boolean need_swizzle; 117 boolean pot2d; 118 boolean need_cube_convert; 119 120 /* these are different per shader type */ 121 struct softpipe_tex_tile_cache *cache; 122 compute_lambda_func compute_lambda; 123 compute_lambda_from_grad_func compute_lambda_from_grad; 124 union pipe_color_union border_color; 125 /* Value to use for PIPE_SWIZZLE_1 (integer vs float) */ 126 float oneval; 127 }; 128 129 struct sp_filter_funcs { 130 mip_level_func relative_level; 131 mip_filter_func filter; 132 }; 133 134 struct sp_sampler { 135 struct pipe_sampler_state base; 136 137 boolean min_mag_equal_repeat_linear; 138 boolean min_mag_equal; 139 unsigned min_img_filter; 140 141 wrap_nearest_func nearest_texcoord_s; 142 wrap_nearest_func nearest_texcoord_t; 143 wrap_nearest_func nearest_texcoord_p; 144 145 wrap_linear_func linear_texcoord_s; 146 wrap_linear_func linear_texcoord_t; 147 wrap_linear_func linear_texcoord_p; 148 149 const struct sp_filter_funcs *filter_funcs; 150 }; 151 152 153 /** 154 * Subclass of tgsi_sampler 155 */ 156 struct sp_tgsi_sampler 157 { 158 struct tgsi_sampler base; /**< base class */ 159 struct sp_sampler *sp_sampler[PIPE_MAX_SAMPLERS]; 160 struct sp_sampler_view sp_sview[PIPE_MAX_SHADER_SAMPLER_VIEWS]; 161 162 }; 163 164 compute_lambda_func 165 softpipe_get_lambda_func(const struct pipe_sampler_view *view, 166 enum pipe_shader_type shader); 167 168 compute_lambda_from_grad_func 169 softpipe_get_lambda_from_grad_func(const struct pipe_sampler_view *view, 170 enum pipe_shader_type shader); 171 172 void * 173 softpipe_create_sampler_state(struct pipe_context *pipe, 174 const struct pipe_sampler_state *sampler); 175 176 177 struct pipe_sampler_view * 178 softpipe_create_sampler_view(struct pipe_context *pipe, 179 struct pipe_resource *resource, 180 const struct pipe_sampler_view *templ); 181 182 183 struct sp_tgsi_sampler * 184 sp_create_tgsi_sampler(void); 185 186 187 #endif /* SP_TEX_SAMPLE_H */ 188