From 0a7824862eb753878fa79b153b2a111884ff1197 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 15 Sep 2010 17:04:26 -0600 Subject: gallivm: expand AoS sampling to cover all filtering modes ...and all texture targets (1D/2D/3D/CUBE). --- src/gallium/auxiliary/gallivm/lp_bld_sample.h | 164 +++++++++++++++++++++++++- 1 file changed, 163 insertions(+), 1 deletion(-) (limited to 'src/gallium/auxiliary/gallivm/lp_bld_sample.h') diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample.h b/src/gallium/auxiliary/gallivm/lp_bld_sample.h index caafc4eca0..ff72b8e9f1 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_sample.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample.h @@ -37,8 +37,11 @@ #include "pipe/p_format.h" - +#include "util/u_debug.h" #include "gallivm/lp_bld.h" +#include "gallivm/lp_bld_type.h" +#include "gallivm/lp_bld_swizzle.h" + struct pipe_resource; struct pipe_sampler_view; @@ -81,6 +84,10 @@ struct lp_sampler_static_state unsigned normalized_coords:1; float lod_bias, min_lod, max_lod; float border_color[4]; + + /* Aero hacks */ + unsigned force_nearest_s:1; + unsigned force_nearest_t:1; }; @@ -139,6 +146,96 @@ struct lp_sampler_dynamic_state }; +/** + * Keep all information for sampling code generation in a single place. + */ +struct lp_build_sample_context +{ + LLVMBuilderRef builder; + + const struct lp_sampler_static_state *static_state; + + struct lp_sampler_dynamic_state *dynamic_state; + + const struct util_format_description *format_desc; + + /** regular scalar float type */ + struct lp_type float_type; + struct lp_build_context float_bld; + + /** regular scalar float type */ + struct lp_type int_type; + struct lp_build_context int_bld; + + /** Incoming coordinates type and build context */ + struct lp_type coord_type; + struct lp_build_context coord_bld; + + /** Unsigned integer coordinates */ + struct lp_type uint_coord_type; + struct lp_build_context uint_coord_bld; + + /** Signed integer coordinates */ + struct lp_type int_coord_type; + struct lp_build_context int_coord_bld; + + /** Output texels type and build context */ + struct lp_type texel_type; + struct lp_build_context texel_bld; +}; + + + +/** + * We only support a few wrap modes in lp_build_sample_wrap_linear_int() at + * this time. Return whether the given mode is supported by that function. + */ +static INLINE boolean +lp_is_simple_wrap_mode(unsigned mode) +{ + switch (mode) { + case PIPE_TEX_WRAP_REPEAT: + case PIPE_TEX_WRAP_CLAMP_TO_EDGE: + return TRUE; + default: + return FALSE; + } +} + + +static INLINE void +apply_sampler_swizzle(struct lp_build_sample_context *bld, + LLVMValueRef *texel) +{ + unsigned char swizzles[4]; + + swizzles[0] = bld->static_state->swizzle_r; + swizzles[1] = bld->static_state->swizzle_g; + swizzles[2] = bld->static_state->swizzle_b; + swizzles[3] = bld->static_state->swizzle_a; + + lp_build_swizzle_soa_inplace(&bld->texel_bld, texel, swizzles); +} + + +static INLINE int +texture_dims(enum pipe_texture_target tex) +{ + switch (tex) { + case PIPE_TEXTURE_1D: + return 1; + case PIPE_TEXTURE_2D: + case PIPE_TEXTURE_CUBE: + return 2; + case PIPE_TEXTURE_3D: + return 3; + default: + assert(0 && "bad texture target in texture_dims()"); + return 2; + } +} + + /** * Derive the sampler static state. */ @@ -148,6 +245,71 @@ lp_sampler_static_state(struct lp_sampler_static_state *state, const struct pipe_sampler_state *sampler); +LLVMValueRef +lp_build_lod_selector(struct lp_build_sample_context *bld, + const LLVMValueRef ddx[4], + const LLVMValueRef ddy[4], + LLVMValueRef lod_bias, /* optional */ + LLVMValueRef explicit_lod, /* optional */ + LLVMValueRef width, + LLVMValueRef height, + LLVMValueRef depth); + +void +lp_build_nearest_mip_level(struct lp_build_sample_context *bld, + unsigned unit, + LLVMValueRef lod, + LLVMValueRef *level_out); + +void +lp_build_linear_mip_levels(struct lp_build_sample_context *bld, + unsigned unit, + LLVMValueRef lod, + LLVMValueRef *level0_out, + LLVMValueRef *level1_out, + LLVMValueRef *weight_out); + +LLVMValueRef +lp_build_get_mipmap_level(struct lp_build_sample_context *bld, + LLVMValueRef data_array, LLVMValueRef level); + +LLVMValueRef +lp_build_get_const_mipmap_level(struct lp_build_sample_context *bld, + LLVMValueRef data_array, int level); + + +void +lp_build_mipmap_level_sizes(struct lp_build_sample_context *bld, + unsigned dims, + LLVMValueRef width_vec, + LLVMValueRef height_vec, + LLVMValueRef depth_vec, + LLVMValueRef ilevel0, + LLVMValueRef ilevel1, + LLVMValueRef row_stride_array, + LLVMValueRef img_stride_array, + LLVMValueRef *width0_vec, + LLVMValueRef *width1_vec, + LLVMValueRef *height0_vec, + LLVMValueRef *height1_vec, + LLVMValueRef *depth0_vec, + LLVMValueRef *depth1_vec, + LLVMValueRef *row_stride0_vec, + LLVMValueRef *row_stride1_vec, + LLVMValueRef *img_stride0_vec, + LLVMValueRef *img_stride1_vec); + + +void +lp_build_cube_lookup(struct lp_build_sample_context *bld, + LLVMValueRef s, + LLVMValueRef t, + LLVMValueRef r, + LLVMValueRef *face, + LLVMValueRef *face_s, + LLVMValueRef *face_t); + + void lp_build_sample_partial_offset(struct lp_build_context *bld, unsigned block_length, -- cgit v1.2.3