
Go to the source code of this file.
Functions | |
| static void | i915_update_texture (struct i915_context *i915, uint unit, const struct i915_texture *tex, const struct i915_sampler_state *sampler, uint state[6]) |
| static void | update_sampler (struct i915_context *i915, uint unit, const struct i915_sampler_state *sampler, const struct i915_texture *tex, unsigned state[3]) |
| Compute i915 texture sampling state. | |
| void | i915_update_samplers (struct i915_context *i915) |
| static uint | translate_texture_format (enum pipe_format pipeFormat) |
| void | i915_update_textures (struct i915_context *i915) |
| void i915_update_samplers | ( | struct i915_context * | i915 | ) |
Definition at line 141 of file i915_state_sampler.c.
References i915_context::current, i915_context::hardware_dirty, I915_HW_MAP, I915_HW_SAMPLER, i915_update_texture(), i915_context::num_samplers, i915_context::num_textures, i915_state::sampler, i915_context::sampler, i915_state::sampler_enable_flags, i915_state::sampler_enable_nr, i915_state::texbuffer, i915_context::texture, and update_sampler().
00142 { 00143 uint unit; 00144 00145 i915->current.sampler_enable_nr = 0; 00146 i915->current.sampler_enable_flags = 0x0; 00147 00148 for (unit = 0; unit < i915->num_textures && unit < i915->num_samplers; 00149 unit++) { 00150 /* determine unit enable/disable by looking for a bound texture */ 00151 /* could also examine the fragment program? */ 00152 if (i915->texture[unit]) { 00153 update_sampler( i915, 00154 unit, 00155 i915->sampler[unit], /* sampler state */ 00156 i915->texture[unit], /* texture */ 00157 i915->current.sampler[unit] /* the result */ 00158 ); 00159 i915_update_texture( i915, 00160 unit, 00161 i915->texture[unit], /* texture */ 00162 i915->sampler[unit], /* sampler state */ 00163 i915->current.texbuffer[unit] ); 00164 00165 i915->current.sampler_enable_nr++; 00166 i915->current.sampler_enable_flags |= (1 << unit); 00167 } 00168 } 00169 00170 i915->hardware_dirty |= I915_HW_SAMPLER | I915_HW_MAP; 00171 }
| static void i915_update_texture | ( | struct i915_context * | i915, | |
| uint | unit, | |||
| const struct i915_texture * | tex, | |||
| const struct i915_sampler_state * | sampler, | |||
| uint | state[6] | |||
| ) | [static] |
Definition at line 226 of file i915_state_sampler.c.
References assert, i915_texture::base, pipe_texture::depth, pipe_texture::format, pipe_texture::height, pipe_texture::last_level, i915_sampler_state::maxlod, MS3_HEIGHT_SHIFT, MS3_TILED_SURFACE, MS3_USE_FENCE_REGS, MS3_WIDTH_SHIFT, MS4_CUBE_FACE_ENA_MASK, MS4_MAX_LOD_SHIFT, MS4_PITCH_SHIFT, MS4_VOLUME_DEPTH_SHIFT, i915_texture::stride, i915_texture::tiled, translate_texture_format(), and pipe_texture::width.
00231 { 00232 const struct pipe_texture *pt = &tex->base; 00233 uint format, pitch; 00234 const uint width = pt->width[0], height = pt->height[0], depth = pt->depth[0]; 00235 const uint num_levels = pt->last_level; 00236 unsigned max_lod = num_levels * 4; 00237 unsigned tiled = MS3_USE_FENCE_REGS; 00238 00239 assert(tex); 00240 assert(width); 00241 assert(height); 00242 assert(depth); 00243 00244 format = translate_texture_format(pt->format); 00245 pitch = tex->stride; 00246 00247 assert(format); 00248 assert(pitch); 00249 00250 if (tex->tiled) { 00251 assert(!((pitch - 1) & pitch)); 00252 tiled = MS3_TILED_SURFACE; 00253 } 00254 00255 /* MS3 state */ 00256 state[0] = 00257 (((height - 1) << MS3_HEIGHT_SHIFT) 00258 | ((width - 1) << MS3_WIDTH_SHIFT) 00259 | format 00260 | tiled); 00261 00262 /* 00263 * XXX When min_filter != mag_filter and there's just one mipmap level, 00264 * set max_lod = 1 to make sure i915 chooses between min/mag filtering. 00265 */ 00266 00267 /* See note at the top of file */ 00268 if (max_lod > (sampler->maxlod >> 2)) 00269 max_lod = sampler->maxlod >> 2; 00270 00271 /* MS4 state */ 00272 state[1] = 00273 ((((pitch / 4) - 1) << MS4_PITCH_SHIFT) 00274 | MS4_CUBE_FACE_ENA_MASK 00275 | ((max_lod) << MS4_MAX_LOD_SHIFT) 00276 | ((depth - 1) << MS4_VOLUME_DEPTH_SHIFT)); 00277 }
| void i915_update_textures | ( | struct i915_context * | i915 | ) |
Definition at line 281 of file i915_state_sampler.c.
References i915_context::current, i915_context::hardware_dirty, I915_HW_MAP, i915_update_texture(), i915_context::num_samplers, i915_context::num_textures, i915_context::sampler, i915_state::texbuffer, and i915_context::texture.
00282 { 00283 uint unit; 00284 00285 for (unit = 0; unit < i915->num_textures && unit < i915->num_samplers; 00286 unit++) { 00287 /* determine unit enable/disable by looking for a bound texture */ 00288 /* could also examine the fragment program? */ 00289 if (i915->texture[unit]) { 00290 i915_update_texture( i915, 00291 unit, 00292 i915->texture[unit], /* texture */ 00293 i915->sampler[unit], /* sampler state */ 00294 i915->current.texbuffer[unit] ); 00295 } 00296 } 00297 00298 i915->hardware_dirty |= I915_HW_MAP; 00299 }
| static uint translate_texture_format | ( | enum pipe_format | pipeFormat | ) | [static] |
Definition at line 175 of file i915_state_sampler.c.
References assert, debug_printf(), MAPSURF_16BIT, MAPSURF_32BIT, MAPSURF_422, MAPSURF_8BIT, MAPSURF_COMPRESSED, MT_16BIT_ARGB1555, MT_16BIT_ARGB4444, MT_16BIT_AY88, MT_16BIT_L16, MT_16BIT_RGB565, MT_32BIT_ARGB8888, MT_32BIT_xI824, MT_422_YCRCB_NORMAL, MT_422_YCRCB_SWAPY, MT_8BIT_A8, MT_8BIT_I8, MT_8BIT_L8, MT_COMPRESS_DXT1, MT_COMPRESS_DXT2_3, MT_COMPRESS_DXT4_5, MT_COMPRESS_FXT1, PIPE_FORMAT_A1R5G5B5_UNORM, PIPE_FORMAT_A4R4G4B4_UNORM, PIPE_FORMAT_A8_UNORM, PIPE_FORMAT_A8L8_UNORM, PIPE_FORMAT_A8R8G8B8_UNORM, PIPE_FORMAT_I8_UNORM, PIPE_FORMAT_L8_UNORM, PIPE_FORMAT_R5G6B5_UNORM, PIPE_FORMAT_S8Z24_UNORM, PIPE_FORMAT_YCBCR, PIPE_FORMAT_YCBCR_REV, and PIPE_FORMAT_Z16_UNORM.
00176 { 00177 switch (pipeFormat) { 00178 case PIPE_FORMAT_L8_UNORM: 00179 return MAPSURF_8BIT | MT_8BIT_L8; 00180 case PIPE_FORMAT_I8_UNORM: 00181 return MAPSURF_8BIT | MT_8BIT_I8; 00182 case PIPE_FORMAT_A8_UNORM: 00183 return MAPSURF_8BIT | MT_8BIT_A8; 00184 case PIPE_FORMAT_A8L8_UNORM: 00185 return MAPSURF_16BIT | MT_16BIT_AY88; 00186 case PIPE_FORMAT_R5G6B5_UNORM: 00187 return MAPSURF_16BIT | MT_16BIT_RGB565; 00188 case PIPE_FORMAT_A1R5G5B5_UNORM: 00189 return MAPSURF_16BIT | MT_16BIT_ARGB1555; 00190 case PIPE_FORMAT_A4R4G4B4_UNORM: 00191 return MAPSURF_16BIT | MT_16BIT_ARGB4444; 00192 case PIPE_FORMAT_A8R8G8B8_UNORM: 00193 return MAPSURF_32BIT | MT_32BIT_ARGB8888; 00194 case PIPE_FORMAT_YCBCR_REV: 00195 return (MAPSURF_422 | MT_422_YCRCB_NORMAL); 00196 case PIPE_FORMAT_YCBCR: 00197 return (MAPSURF_422 | MT_422_YCRCB_SWAPY); 00198 #if 0 00199 case PIPE_FORMAT_RGB_FXT1: 00200 case PIPE_FORMAT_RGBA_FXT1: 00201 return (MAPSURF_COMPRESSED | MT_COMPRESS_FXT1); 00202 #endif 00203 case PIPE_FORMAT_Z16_UNORM: 00204 return (MAPSURF_16BIT | MT_16BIT_L16); 00205 #if 0 00206 case PIPE_FORMAT_RGBA_DXT1: 00207 case PIPE_FORMAT_RGB_DXT1: 00208 return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT1); 00209 case PIPE_FORMAT_RGBA_DXT3: 00210 return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT2_3); 00211 case PIPE_FORMAT_RGBA_DXT5: 00212 return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT4_5); 00213 #endif 00214 case PIPE_FORMAT_S8Z24_UNORM: 00215 return (MAPSURF_32BIT | MT_32BIT_xI824); 00216 default: 00217 debug_printf("i915: translate_texture_format() bad image format %x\n", 00218 pipeFormat); 00219 assert(0); 00220 return 0; 00221 } 00222 }
| static void update_sampler | ( | struct i915_context * | i915, | |
| uint | unit, | |||
| const struct i915_sampler_state * | sampler, | |||
| const struct i915_texture * | tex, | |||
| unsigned | state[3] | |||
| ) | [static] |
Compute i915 texture sampling state.
Recalculate all state from scratch. Perhaps not the most efficient, but this has gotten complex enough that we need something which is understandable and reliable.
| state | returns the 3 words of compute state |
Definition at line 75 of file i915_state_sampler.c.
References assert, i915_texture::base, pipe_texture::format, pipe_texture::last_level, pipe_sampler_state::mag_img_filter, pipe_sampler_state::min_img_filter, i915_sampler_state::minlod, PIPE_FORMAT_YCBCR, PIPE_FORMAT_YCBCR_REV, PIPE_TEX_FILTER_NEAREST, PIPE_TEX_WRAP_CLAMP, PIPE_TEX_WRAP_CLAMP_TO_BORDER, PIPE_TEXTURE_3D, SS2_COLORSPACE_CONVERSION, SS3_MIN_LOD_SHIFT, SS3_TEXTUREMAP_INDEX_SHIFT, i915_sampler_state::state, pipe_texture::target, i915_sampler_state::templ, pipe_sampler_state::wrap_r, pipe_sampler_state::wrap_s, and pipe_sampler_state::wrap_t.
00080 { 00081 const struct pipe_texture *pt = &tex->base; 00082 unsigned minlod, lastlod; 00083 00084 /* Need to do this after updating the maps, which call the 00085 * intel_finalize_mipmap_tree and hence can update firstLevel: 00086 */ 00087 state[0] = sampler->state[0]; 00088 state[1] = sampler->state[1]; 00089 state[2] = sampler->state[2]; 00090 00091 if (pt->format == PIPE_FORMAT_YCBCR || 00092 pt->format == PIPE_FORMAT_YCBCR_REV) 00093 state[0] |= SS2_COLORSPACE_CONVERSION; 00094 00095 /* 3D textures don't seem to respect the border color. 00096 * Fallback if there's ever a danger that they might refer to 00097 * it. 00098 * 00099 * Effectively this means fallback on 3D clamp or 00100 * clamp_to_border. 00101 * 00102 * XXX: Check if this is true on i945. 00103 * XXX: Check if this bug got fixed in release silicon. 00104 */ 00105 #if 0 00106 { 00107 const unsigned ws = sampler->templ->wrap_s; 00108 const unsigned wt = sampler->templ->wrap_t; 00109 const unsigned wr = sampler->templ->wrap_r; 00110 if (pt->target == PIPE_TEXTURE_3D && 00111 (sampler->templ->min_img_filter != PIPE_TEX_FILTER_NEAREST || 00112 sampler->templ->mag_img_filter != PIPE_TEX_FILTER_NEAREST) && 00113 (ws == PIPE_TEX_WRAP_CLAMP || 00114 wt == PIPE_TEX_WRAP_CLAMP || 00115 wr == PIPE_TEX_WRAP_CLAMP || 00116 ws == PIPE_TEX_WRAP_CLAMP_TO_BORDER || 00117 wt == PIPE_TEX_WRAP_CLAMP_TO_BORDER || 00118 wr == PIPE_TEX_WRAP_CLAMP_TO_BORDER)) { 00119 if (i915->strict_conformance) { 00120 assert(0); 00121 /* sampler->fallback = true; */ 00122 /* TODO */ 00123 } 00124 } 00125 } 00126 #endif 00127 00128 /* See note at the top of file */ 00129 minlod = sampler->minlod; 00130 lastlod = pt->last_level << 4; 00131 00132 if (lastlod < minlod) { 00133 minlod = lastlod; 00134 } 00135 00136 state[1] |= (sampler->minlod << SS3_MIN_LOD_SHIFT); 00137 state[1] |= (unit << SS3_TEXTUREMAP_INDEX_SHIFT); 00138 }
1.5.4