X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fllvmpipe%2Flp_state_fs.h;h=aac4526601796be4523d1e700705948f530a9c69;hb=bff60c894a290260ab3dd2086445b44622a2800e;hp=64ead2a99738fb23e4bf9ad66f74f6710d2c953e;hpb=992382762a74fd834926fd2c3cd9e14a186e2dd5;p=mesa.git diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.h b/src/gallium/drivers/llvmpipe/lp_state_fs.h index 64ead2a9973..aac45266017 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.h +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.h @@ -34,6 +34,8 @@ #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_tgsi.h" /* for lp_tgsi_info */ +#include "lp_bld_interp.h" /* for struct lp_shader_input */ struct tgsi_token; @@ -45,23 +47,48 @@ struct lp_fragment_shader; #define RAST_EDGE_TEST 1 +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_fragment_shader_variant_key { struct pipe_depth_state depth; struct pipe_stencil_state stencil[2]; - struct pipe_alpha_state alpha; struct pipe_blend_state blend; - enum pipe_format zsbuf_format; + + struct { + unsigned enabled:1; + unsigned func:3; + } alpha; + unsigned nr_cbufs:8; + unsigned nr_samplers:8; /* actually derivable from just the shader */ + unsigned nr_sampler_views:8; /* actually derivable from just the shader */ unsigned flatshade:1; - unsigned scissor:1; unsigned occlusion_count:1; + unsigned resource_1d:1; - struct { - ubyte colormask; - } cbuf_blend[PIPE_MAX_COLOR_BUFS]; + enum pipe_format zsbuf_format; + enum pipe_format cbuf_format[PIPE_MAX_COLOR_BUFS]; - struct lp_sampler_static_state sampler[PIPE_MAX_SAMPLERS]; + struct lp_sampler_static_state state[PIPE_MAX_SHADER_SAMPLER_VIEWS]; +}; + + +/** doubly-linked list item */ +struct lp_fs_variant_list_item +{ + struct lp_fragment_shader_variant *base; + struct lp_fs_variant_list_item *next, *prev; }; @@ -70,12 +97,23 @@ struct lp_fragment_shader_variant struct lp_fragment_shader_variant_key key; boolean opaque; + uint8_t ps_inv_multiplier; + + struct gallivm_state *gallivm; + + LLVMTypeRef jit_context_ptr_type; + LLVMTypeRef jit_thread_data_ptr_type; + LLVMTypeRef jit_linear_context_ptr_type; LLVMValueRef function[2]; lp_jit_frag_func jit_function[2]; - struct lp_fragment_shader_variant *next; + /* Total number of LLVM instructions generated */ + unsigned nr_instrs; + + struct lp_fs_variant_list_item list_item_global, list_item_local; + struct lp_fragment_shader *shader; /* For debugging/profiling purposes */ unsigned no; @@ -87,14 +125,32 @@ struct lp_fragment_shader { struct pipe_shader_state base; - struct tgsi_shader_info info; + struct lp_tgsi_info info; + + struct lp_fs_variant_list_item variants; - struct lp_fragment_shader_variant *variants; + struct draw_fragment_shader *draw_data; /* For debugging/profiling purposes */ + unsigned variant_key_size; unsigned no; - unsigned variant_no; + unsigned variants_created; + unsigned variants_cached; + + /** Fragment shader input interpolation info */ + struct lp_shader_input inputs[PIPE_MAX_SHADER_INPUTS]; }; +void +lp_debug_fs_variant(const struct lp_fragment_shader_variant *variant); + +void +llvmpipe_remove_shader_variant(struct llvmpipe_context *lp, + struct lp_fragment_shader_variant *variant); + +boolean +llvmpipe_rasterization_disabled(struct llvmpipe_context *lp); + + #endif /* LP_STATE_FS_H_ */