diff options
Diffstat (limited to 'src/gallium/drivers/llvmpipe/lp_state_fs.h')
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_state_fs.h | 80 |
1 files changed, 40 insertions, 40 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.h b/src/gallium/drivers/llvmpipe/lp_state_fs.h index 9f43665d839..195cdd5960b 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.h +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.h @@ -30,16 +30,16 @@ #define LP_STATE_FS_H_ -#include "pipe/p_compiler.h" +#include "util/list.h" +#include "util/compiler.h" #include "pipe/p_state.h" -#include "tgsi/tgsi_scan.h" /* for tgsi_shader_info */ #include "gallivm/lp_bld_sample.h" /* for struct lp_sampler_static_state */ +#include "gallivm/lp_bld_jit_sample.h" #include "gallivm/lp_bld_tgsi.h" /* for lp_tgsi_info */ #include "lp_bld_interp.h" /* for struct lp_shader_input */ #include "util/u_inlines.h" #include "lp_jit.h" -struct tgsi_token; struct lp_fragment_shader; @@ -58,23 +58,6 @@ enum lp_fs_kind }; -struct lp_sampler_static_state -{ - /* - * These attributes are effectively interleaved for more sane key handling. - * However, there might be lots of null space if the amount of samplers and - * textures isn't the same. - */ - struct lp_static_sampler_state sampler_state; - struct lp_static_texture_state texture_state; -}; - - -struct lp_image_static_state -{ - struct lp_static_texture_state image_state; -}; - struct lp_depth_state { unsigned enabled:1; /**< depth test enabled? */ @@ -103,6 +86,7 @@ struct lp_fragment_shader_variant_key unsigned depth_clamp:1; unsigned multisample:1; unsigned no_ms_sample_mask_out:1; + unsigned restrict_depth_values:1; enum pipe_format zsbuf_format; enum pipe_format cbuf_format[PIPE_MAX_COLOR_BUFS]; @@ -111,9 +95,7 @@ struct lp_fragment_shader_variant_key uint8_t zsbuf_nr_samples; uint8_t coverage_samples; uint8_t min_samples; - - struct lp_sampler_static_state samplers[1]; - /* followed by variable number of images */ + /* followed by variable number of samplers + images */ }; #define LP_FS_MAX_VARIANT_KEY_SIZE \ @@ -124,24 +106,38 @@ struct lp_fragment_shader_variant_key static inline size_t lp_fs_variant_key_size(unsigned nr_samplers, unsigned nr_images) { - unsigned samplers = nr_samplers > 1 ? (nr_samplers - 1) : 0; return (sizeof(struct lp_fragment_shader_variant_key) + - samplers * sizeof(struct lp_sampler_static_state) + + nr_samplers * sizeof(struct lp_sampler_static_state) + nr_images * sizeof(struct lp_image_static_state)); } +static inline struct lp_sampler_static_state * +lp_fs_variant_key_samplers(const struct lp_fragment_shader_variant_key *key) +{ + return (struct lp_sampler_static_state *)&(key[1]); +} + +static inline struct lp_sampler_static_state * +lp_fs_variant_key_sampler_idx(const struct lp_fragment_shader_variant_key *key, int idx) +{ + if (idx >= key->nr_samplers) + return NULL; + return &lp_fs_variant_key_samplers(key)[idx]; +} + static inline struct lp_image_static_state * lp_fs_variant_key_images(struct lp_fragment_shader_variant_key *key) { return (struct lp_image_static_state *) - &key->samplers[key->nr_samplers]; + &(lp_fs_variant_key_samplers(key)[MAX2(key->nr_samplers, + key->nr_sampler_views)]); } /** doubly-linked list item */ struct lp_fs_variant_list_item { + struct list_head list; struct lp_fragment_shader_variant *base; - struct lp_fs_variant_list_item *next, *prev; }; @@ -152,20 +148,28 @@ struct lp_fragment_shader_variant */ unsigned potentially_opaque:1; + unsigned opaque:1; unsigned blit:1; unsigned linear_input_mask:16; struct pipe_reference reference; - boolean opaque; struct gallivm_state *gallivm; + LLVMTypeRef jit_context_type; LLVMTypeRef jit_context_ptr_type; + LLVMTypeRef jit_thread_data_type; + LLVMTypeRef jit_resources_type; + LLVMTypeRef jit_resources_ptr_type; LLVMTypeRef jit_thread_data_ptr_type; + LLVMTypeRef jit_linear_context_type; LLVMTypeRef jit_linear_context_ptr_type; + LLVMTypeRef jit_linear_func_type; + LLVMTypeRef jit_linear_inputs_type; + LLVMTypeRef jit_linear_textures_type; - LLVMValueRef function[2]; + LLVMValueRef function[2]; // [RAST_WHOLE], [RAST_EDGE_TEST] - lp_jit_frag_func jit_function[2]; + lp_jit_frag_func jit_function[2]; // [RAST_WHOLE], [RAST_EDGE_TEST] lp_jit_linear_func jit_linear; lp_jit_linear_func jit_linear_blit; @@ -200,13 +204,9 @@ struct lp_fragment_shader struct pipe_reference reference; struct lp_tgsi_info info; - /* - * Analysis results - */ - + /* Analysis results */ enum lp_fs_kind kind; - struct lp_fs_variant_list_item variants; struct draw_fragment_shader *draw_data; @@ -223,8 +223,7 @@ struct lp_fragment_shader void -llvmpipe_fs_analyse(struct lp_fragment_shader *shader, - const struct tgsi_token *tokens); +llvmpipe_fs_analyse_nir(struct lp_fragment_shader *shader); void llvmpipe_fs_variant_fastpath(struct lp_fragment_shader_variant *variant); @@ -243,7 +242,6 @@ lp_debug_fs_variant(struct lp_fragment_shader_variant *variant); const char * lp_debug_fs_kind(enum lp_fs_kind kind); - void lp_linear_check_variant(struct lp_fragment_shader_variant *variant); @@ -257,7 +255,8 @@ lp_fs_reference(struct llvmpipe_context *llvmpipe, struct lp_fragment_shader *shader) { struct lp_fragment_shader *old_ptr = *ptr; - if (pipe_reference(old_ptr ? &(*ptr)->reference : NULL, shader ? &shader->reference : NULL)) { + if (pipe_reference(old_ptr ? &(*ptr)->reference : NULL, + shader ? &shader->reference : NULL)) { llvmpipe_destroy_fs(llvmpipe, old_ptr); } *ptr = shader; @@ -273,7 +272,8 @@ lp_fs_variant_reference(struct llvmpipe_context *llvmpipe, struct lp_fragment_shader_variant *variant) { struct lp_fragment_shader_variant *old_ptr = *ptr; - if (pipe_reference(old_ptr ? &(*ptr)->reference : NULL, variant ? &variant->reference : NULL)) { + if (pipe_reference(old_ptr ? &(*ptr)->reference : NULL, + variant ? &variant->reference : NULL)) { llvmpipe_destroy_shader_variant(llvmpipe, old_ptr); } *ptr = variant; |