X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgallium%2Fdrivers%2Fsoftpipe%2Fsp_tex_sample.h;h=8b40a80406637dee87975341879c6786cfda6381;hb=ef17cc9cb697a7146cf2a3dba2eb0f6a968918cc;hp=b6e66c998aebd635b74f03bb98598c9a0a142435;hpb=4440428faa82f01b4dfb4be89618be2aaf153abd;p=mesa.git diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.h b/src/gallium/drivers/softpipe/sp_tex_sample.h index b6e66c998ae..8b40a804066 100644 --- a/src/gallium/drivers/softpipe/sp_tex_sample.h +++ b/src/gallium/drivers/softpipe/sp_tex_sample.h @@ -32,72 +32,96 @@ #include "tgsi/tgsi_exec.h" -struct sp_sampler_varient; -typedef void (*wrap_nearest_func)(const float s[4], +struct sp_sampler_view; +struct sp_sampler; + +typedef void (*wrap_nearest_func)(float s, unsigned size, - int icoord[4]); + int *icoord); -typedef void (*wrap_linear_func)(const float s[4], +typedef void (*wrap_linear_func)(float s, unsigned size, - int icoord0[4], - int icoord1[4], - float w[4]); - -typedef float (*compute_lambda_func)(const struct sp_sampler_varient *sampler, - const float s[QUAD_SIZE], - const float t[QUAD_SIZE], - const float p[QUAD_SIZE]); - -typedef void (*filter_func)(struct tgsi_sampler *tgsi_sampler, - const float s[QUAD_SIZE], - const float t[QUAD_SIZE], - const float p[QUAD_SIZE], - const float c0[QUAD_SIZE], + int *icoord0, + int *icoord1, + float *w); + +typedef float (*compute_lambda_func)(const struct sp_sampler_view *sp_sview, + const float s[TGSI_QUAD_SIZE], + const float t[TGSI_QUAD_SIZE], + const float p[TGSI_QUAD_SIZE]); + +typedef void (*img_filter_func)(struct sp_sampler_view *sp_sview, + struct sp_sampler *sp_samp, + float s, + float t, + float p, + unsigned level, + unsigned face_id, + float *rgba); + +typedef void (*mip_filter_func)(struct sp_sampler_view *sp_sview, + struct sp_sampler *sp_samp, + img_filter_func min_filter, + img_filter_func mag_filter, + const float s[TGSI_QUAD_SIZE], + const float t[TGSI_QUAD_SIZE], + const float p[TGSI_QUAD_SIZE], + const float c0[TGSI_QUAD_SIZE], + const float lod[TGSI_QUAD_SIZE], + enum tgsi_sampler_control control, + float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); + + +typedef void (*filter_func)(struct sp_sampler_view *sp_sview, + struct sp_sampler *sp_samp, + const float s[TGSI_QUAD_SIZE], + const float t[TGSI_QUAD_SIZE], + const float p[TGSI_QUAD_SIZE], + const float c0[TGSI_QUAD_SIZE], + const float lod[TGSI_QUAD_SIZE], enum tgsi_sampler_control control, - float rgba[NUM_CHANNELS][QUAD_SIZE]); - - -union sp_sampler_key { - struct { - unsigned target:3; - unsigned is_pot:1; - unsigned processor:2; - unsigned unit:4; - unsigned pad:22; - } bits; - unsigned value; -}; - -/** - * Subclass of tgsi_sampler - */ -struct sp_sampler_varient -{ - struct tgsi_sampler base; /**< base class */ + float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); - union sp_sampler_key key; - /* The owner of this struct: - */ - const struct pipe_sampler_state *sampler; +typedef void (*fetch_func)(struct sp_sampler_view *sp_sview, + const int i[TGSI_QUAD_SIZE], + const int j[TGSI_QUAD_SIZE], const int k[TGSI_QUAD_SIZE], + const int lod[TGSI_QUAD_SIZE], const int8_t offset[3], + float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); - /* Currently bound texture: - */ - const struct pipe_texture *texture; - struct softpipe_tex_tile_cache *cache; - - unsigned processor; +struct sp_sampler_view +{ + struct pipe_sampler_view base; /* For sp_get_samples_2d_linear_POT: */ unsigned xpot; unsigned ypot; - unsigned level; - unsigned faces[4]; - + boolean need_swizzle; + boolean pot2d; + + filter_func get_samples; + + /* this is just abusing the sampler_view object as local storage */ + unsigned faces[TGSI_QUAD_SIZE]; + + /* these are different per shader type */ + struct softpipe_tex_tile_cache *cache; + compute_lambda_func compute_lambda; + +}; + + +struct sp_sampler { + struct pipe_sampler_state base; + + boolean min_mag_equal_repeat_linear; + boolean min_mag_equal; + unsigned min_img_filter; + wrap_nearest_func nearest_texcoord_s; wrap_nearest_func nearest_texcoord_t; wrap_nearest_func nearest_texcoord_p; @@ -106,48 +130,38 @@ struct sp_sampler_varient wrap_linear_func linear_texcoord_t; wrap_linear_func linear_texcoord_p; - filter_func min_img_filter; - filter_func mag_img_filter; + mip_filter_func mip_filter; +}; - compute_lambda_func compute_lambda; - filter_func mip_filter; - filter_func compare; - - /* Linked list: - */ - struct sp_sampler_varient *next; +/** + * Subclass of tgsi_sampler + */ +struct sp_tgsi_sampler +{ + struct tgsi_sampler base; /**< base class */ + struct sp_sampler *sp_sampler[PIPE_MAX_SAMPLERS]; + struct sp_sampler_view sp_sview[PIPE_MAX_SHADER_SAMPLER_VIEWS]; + }; -struct sp_sampler; +compute_lambda_func +softpipe_get_lambda_func(const struct pipe_sampler_view *view, unsigned shader); -/* Create a sampler varient for a given set of non-orthogonal state. Currently the - */ -struct sp_sampler_varient * -sp_create_sampler_varient( const struct pipe_sampler_state *sampler, - const union sp_sampler_key key ); -void sp_sampler_varient_bind_texture( struct sp_sampler_varient *varient, - struct softpipe_tex_tile_cache *tex_cache, - const struct pipe_texture *tex ); +void * +softpipe_create_sampler_state(struct pipe_context *pipe, + const struct pipe_sampler_state *sampler); -void sp_sampler_varient_destroy( struct sp_sampler_varient * ); +struct pipe_sampler_view * +softpipe_create_sampler_view(struct pipe_context *pipe, + struct pipe_resource *resource, + const struct pipe_sampler_view *templ); -static INLINE struct sp_sampler_varient * -sp_sampler_varient(const struct tgsi_sampler *sampler) -{ - return (struct sp_sampler_varient *) sampler; -} - -extern void -sp_get_samples(struct tgsi_sampler *tgsi_sampler, - const float s[QUAD_SIZE], - const float t[QUAD_SIZE], - const float p[QUAD_SIZE], - float lodbias, - float rgba[NUM_CHANNELS][QUAD_SIZE]); +struct sp_tgsi_sampler * +sp_create_tgsi_sampler(void); #endif /* SP_TEX_SAMPLE_H */