From 18fb9ff6d8f58a08e559070cf29f26ed0caa567f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Wed, 26 May 2010 15:11:17 +0100 Subject: [PATCH] llvmpipe: Pass the fs variant to the rasterizer. --- src/gallium/drivers/llvmpipe/lp_rast.c | 6 +- src/gallium/drivers/llvmpipe/lp_rast.h | 8 +-- src/gallium/drivers/llvmpipe/lp_rast_priv.h | 3 +- src/gallium/drivers/llvmpipe/lp_setup.c | 14 ++--- src/gallium/drivers/llvmpipe/lp_setup.h | 8 +-- src/gallium/drivers/llvmpipe/lp_setup_tri.c | 3 +- src/gallium/drivers/llvmpipe/lp_state.h | 54 +---------------- src/gallium/drivers/llvmpipe/lp_state_fs.c | 5 +- src/gallium/drivers/llvmpipe/lp_state_fs.h | 93 +++++++++++++++++++++++++++++ 9 files changed, 113 insertions(+), 81 deletions(-) create mode 100644 src/gallium/drivers/llvmpipe/lp_state_fs.h diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c index 6bb868b..891a405 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast.c +++ b/src/gallium/drivers/llvmpipe/lp_rast.c @@ -413,6 +413,7 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task, struct lp_rasterizer *rast = task->rast; const struct lp_rast_state *state = task->current_state; const struct lp_rast_shader_inputs *inputs = arg.shade_tile; + struct lp_fragment_shader_variant *variant = state->variant; const unsigned tile_x = task->x, tile_y = task->y; unsigned x, y; @@ -434,7 +435,7 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task, depth = lp_rast_get_depth_block_pointer(rast, tile_x + x, tile_y + y); /* run shader on 4x4 block */ - state->jit_function[RAST_WHOLE]( &state->jit_context, + variant->jit_function[RAST_WHOLE]( &state->jit_context, tile_x + x, tile_y + y, inputs->facing, inputs->a0, @@ -461,6 +462,7 @@ void lp_rast_shade_quads( struct lp_rasterizer_task *task, int32_t c1, int32_t c2, int32_t c3) { const struct lp_rast_state *state = task->current_state; + struct lp_fragment_shader_variant *variant = state->variant; struct lp_rasterizer *rast = task->rast; uint8_t *color[PIPE_MAX_COLOR_BUFS]; void *depth; @@ -492,7 +494,7 @@ void lp_rast_shade_quads( struct lp_rasterizer_task *task, assert(lp_check_alignment(inputs->step[2], 16)); /* run shader on 4x4 block */ - state->jit_function[RAST_EDGE_TEST]( &state->jit_context, + variant->jit_function[RAST_EDGE_TEST]( &state->jit_context, x, y, inputs->facing, inputs->a0, diff --git a/src/gallium/drivers/llvmpipe/lp_rast.h b/src/gallium/drivers/llvmpipe/lp_rast.h index 881f475..ff0e3cf 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast.h +++ b/src/gallium/drivers/llvmpipe/lp_rast.h @@ -66,13 +66,9 @@ struct lp_rast_state { struct lp_jit_context jit_context; /* The shader itself. Probably we also need to pass a pointer to - * the tile color/z/stencil data somehow: - * jit_function[0] skips the triangle in/out test code - * jit_function[1] does triangle in/out testing + * the tile color/z/stencil data somehow */ - lp_jit_frag_func jit_function[2]; - - boolean opaque; + struct lp_fragment_shader_variant *variant; }; diff --git a/src/gallium/drivers/llvmpipe/lp_rast_priv.h b/src/gallium/drivers/llvmpipe/lp_rast_priv.h index efc013f..9c2d445 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast_priv.h +++ b/src/gallium/drivers/llvmpipe/lp_rast_priv.h @@ -205,6 +205,7 @@ lp_rast_shade_quads_all( struct lp_rasterizer_task *task, { struct lp_rasterizer *rast = task->rast; const struct lp_rast_state *state = task->current_state; + struct lp_fragment_shader_variant *variant = state->variant; uint8_t *color[PIPE_MAX_COLOR_BUFS]; void *depth; unsigned i; @@ -216,7 +217,7 @@ lp_rast_shade_quads_all( struct lp_rasterizer_task *task, depth = lp_rast_get_depth_block_pointer(rast, x, y); /* run shader on 4x4 block */ - state->jit_function[RAST_WHOLE]( &state->jit_context, + variant->jit_function[RAST_WHOLE]( &state->jit_context, x, y, inputs->facing, inputs->a0, diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c index 656e6cc..bdb40a2d 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup.c +++ b/src/gallium/drivers/llvmpipe/lp_setup.c @@ -415,18 +415,14 @@ lp_setup_set_fs_inputs( struct lp_setup_context *setup, } void -lp_setup_set_fs_functions( struct lp_setup_context *setup, - lp_jit_frag_func jit_function0, - lp_jit_frag_func jit_function1, - boolean opaque ) +lp_setup_set_fs_variant( struct lp_setup_context *setup, + struct lp_fragment_shader_variant *variant) { LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, - cast_lp_jit_frag_func_to_voidptr(jit_function0)); + variant); /* FIXME: reference count */ - setup->fs.current.jit_function[0] = jit_function0; - setup->fs.current.jit_function[1] = jit_function1; - setup->fs.current.opaque = opaque; + setup->fs.current.variant = variant; setup->dirty |= LP_SETUP_NEW_FS; } @@ -625,7 +621,7 @@ lp_setup_update_state( struct lp_setup_context *setup ) scene = lp_setup_get_current_scene(setup); - assert(setup->fs.current.jit_function); + assert(setup->fs.current.variant); /* Some of the 'draw' pipeline stages may have changed some driver state. * Make sure we've processed those state changes before anything else. diff --git a/src/gallium/drivers/llvmpipe/lp_setup.h b/src/gallium/drivers/llvmpipe/lp_setup.h index 10db03b..719cf98 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup.h +++ b/src/gallium/drivers/llvmpipe/lp_setup.h @@ -58,7 +58,7 @@ struct pipe_surface; struct pipe_blend_color; struct pipe_screen; struct pipe_framebuffer_state; -struct lp_fragment_shader; +struct lp_fragment_shader_variant; struct lp_jit_context; struct llvmpipe_query; @@ -100,10 +100,8 @@ lp_setup_set_fs_inputs( struct lp_setup_context *setup, unsigned nr ); void -lp_setup_set_fs_functions( struct lp_setup_context *setup, - lp_jit_frag_func jit_function0, - lp_jit_frag_func jit_function1, - boolean opaque ); +lp_setup_set_fs_variant( struct lp_setup_context *setup, + struct lp_fragment_shader_variant *variant ); void lp_setup_set_fs_constants(struct lp_setup_context *setup, diff --git a/src/gallium/drivers/llvmpipe/lp_setup_tri.c b/src/gallium/drivers/llvmpipe/lp_setup_tri.c index 34d7125..0fc4dd6 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup_tri.c +++ b/src/gallium/drivers/llvmpipe/lp_setup_tri.c @@ -34,6 +34,7 @@ #include "lp_perf.h" #include "lp_setup_context.h" #include "lp_rast.h" +#include "lp_state_fs.h" #define NUM_CHANNELS 4 @@ -579,7 +580,7 @@ do_triangle_ccw(struct lp_setup_context *setup, /* triangle covers the whole tile- shade whole tile */ LP_COUNT(nr_fully_covered_64); in = TRUE; - if(setup->fs.current.opaque) { + if (setup->fs.current.variant->opaque) { lp_scene_bin_reset( scene, x, y ); lp_scene_bin_command( scene, x, y, lp_rast_set_state, diff --git a/src/gallium/drivers/llvmpipe/lp_state.h b/src/gallium/drivers/llvmpipe/lp_state.h index bae5de0..c268f96 100644 --- a/src/gallium/drivers/llvmpipe/lp_state.h +++ b/src/gallium/drivers/llvmpipe/lp_state.h @@ -32,10 +32,9 @@ #define LP_STATE_H #include "pipe/p_state.h" -#include "tgsi/tgsi_scan.h" #include "lp_jit.h" +#include "lp_state_fs.h" #include "gallivm/lp_bld.h" -#include "gallivm/lp_bld_sample.h" /* for struct lp_sampler_static_state */ #define LP_NEW_VIEWPORT 0x1 @@ -60,57 +59,6 @@ struct vertex_info; struct pipe_context; struct llvmpipe_context; -struct lp_fragment_shader; - - -/** Indexes into jit_function[] array */ -#define RAST_WHOLE 0 -#define RAST_EDGE_TEST 1 - - -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; - unsigned nr_cbufs:8; - unsigned flatshade:1; - unsigned scissor:1; - unsigned occlusion_count:1; - - struct { - ubyte colormask; - } cbuf_blend[PIPE_MAX_COLOR_BUFS]; - - struct lp_sampler_static_state sampler[PIPE_MAX_SAMPLERS]; -}; - - -struct lp_fragment_shader_variant -{ - struct lp_fragment_shader_variant_key key; - - boolean opaque; - - LLVMValueRef function[2]; - - lp_jit_frag_func jit_function[2]; - - struct lp_fragment_shader_variant *next; -}; - - -/** Subclass of pipe_shader_state */ -struct lp_fragment_shader -{ - struct pipe_shader_state base; - - struct tgsi_shader_info info; - - struct lp_fragment_shader_variant *variants; -}; /** Subclass of pipe_shader_state */ diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c index 9ef78e6..a7e7451 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c @@ -1260,10 +1260,7 @@ llvmpipe_update_fs(struct llvmpipe_context *lp) LP_COUNT_ADD(nr_llvm_compiles, 2); /* emit vs. omit in/out test */ } - lp_setup_set_fs_functions(lp->setup, - variant->jit_function[RAST_WHOLE], - variant->jit_function[RAST_EDGE_TEST], - variant->opaque); + lp_setup_set_fs_variant(lp->setup, variant); } diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.h b/src/gallium/drivers/llvmpipe/lp_state_fs.h new file mode 100644 index 0000000..1d9279e --- /dev/null +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.h @@ -0,0 +1,93 @@ +/************************************************************************** + * + * Copyright 2010 VMware, Inc. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + **************************************************************************/ + + +#ifndef LP_STATE_FS_H_ +#define LP_STATE_FS_H_ + + +#include "pipe/p_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 */ + + +struct tgsi_token; +struct lp_fragment_shader; + + +/** Indexes into jit_function[] array */ +#define RAST_WHOLE 0 +#define RAST_EDGE_TEST 1 + + +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; + unsigned nr_cbufs:8; + unsigned flatshade:1; + unsigned scissor:1; + unsigned occlusion_count:1; + + struct { + ubyte colormask; + } cbuf_blend[PIPE_MAX_COLOR_BUFS]; + + struct lp_sampler_static_state sampler[PIPE_MAX_SAMPLERS]; +}; + + +struct lp_fragment_shader_variant +{ + struct lp_fragment_shader_variant_key key; + + boolean opaque; + + LLVMValueRef function[2]; + + lp_jit_frag_func jit_function[2]; + + struct lp_fragment_shader_variant *next; +}; + + +/** Subclass of pipe_shader_state */ +struct lp_fragment_shader +{ + struct pipe_shader_state base; + + struct tgsi_shader_info info; + + struct lp_fragment_shader_variant *variants; +}; + + +#endif /* LP_STATE_FS_H_ */ -- 2.7.4