diff options
author | José Fonseca <jfonseca@vmware.com> | 2009-09-07 14:52:39 +0100 |
---|---|---|
committer | José Fonseca <jfonseca@vmware.com> | 2009-09-07 15:02:08 +0100 |
commit | e4c76c02f77ed6e86537b546f4200f8f8132d114 (patch) | |
tree | 85ef1812f25eedbfffaeb63096e3046ee1ac349a /src/gallium/drivers/llvmpipe/lp_state_fs.c | |
parent | de8376e2f22a59a0bc18bb7ddab88ee3153678b8 (diff) | |
download | external_mesa3d-e4c76c02f77ed6e86537b546f4200f8f8132d114.zip external_mesa3d-e4c76c02f77ed6e86537b546f4200f8f8132d114.tar.gz external_mesa3d-e4c76c02f77ed6e86537b546f4200f8f8132d114.tar.bz2 |
llvmpipe: Code generate the texture sampling inside the shader.
Finally a substantial performance improvement: framerates of apps using
texturing tripled, and furthermore, enabling/disabling texturing only
affects around 15% of the framerate, which means the bottleneck is now
somewhere else.
Generated texture sampling code is not complete though -- we always
sample from the base level -- so final figures will be different.
Diffstat (limited to 'src/gallium/drivers/llvmpipe/lp_state_fs.c')
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_state_fs.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c index 80f705c..1a3e168 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c @@ -486,7 +486,13 @@ generate_fragment(struct llvmpipe_context *lp, a0_ptr, dadx_ptr, dady_ptr, x0, y0, 2, 0); +#if 0 + /* C texture sampling */ sampler = lp_c_sampler_soa_create(context_ptr); +#else + /* code generated texture sampling */ + sampler = lp_llvm_sampler_soa_create(key->sampler, context_ptr); +#endif for(i = 0; i < num_fs; ++i) { LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), i, 0); @@ -666,8 +672,11 @@ llvmpipe_set_constant_buffer(struct pipe_context *pipe, */ static void make_variant_key(struct llvmpipe_context *lp, + struct lp_fragment_shader *shader, struct lp_fragment_shader_variant_key *key) { + unsigned i; + memset(key, 0, sizeof *key); memcpy(&key->depth, &lp->depth_stencil->depth, sizeof key->depth); @@ -678,6 +687,10 @@ make_variant_key(struct llvmpipe_context *lp, /* alpha.ref_value is passed in jit_context */ memcpy(&key->blend, lp->blend, sizeof key->blend); + + for(i = 0; i < PIPE_MAX_SAMPLERS; ++i) + if(shader->info.file_mask[TGSI_FILE_SAMPLER] & (1 << i)) + lp_sampler_static_state(&key->sampler[i], lp->texture[i], lp->sampler[i]); } @@ -688,7 +701,7 @@ llvmpipe_update_fs(struct llvmpipe_context *lp) struct lp_fragment_shader_variant_key key; struct lp_fragment_shader_variant *variant; - make_variant_key(lp, &key); + make_variant_key(lp, shader, &key); variant = shader->variants; while(variant) { |