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;
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,
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;
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,
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;
};
{
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;
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,
}
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;
}
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.
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;
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,
#include "lp_perf.h"
#include "lp_setup_context.h"
#include "lp_rast.h"
+#include "lp_state_fs.h"
#define NUM_CHANNELS 4
/* 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,
#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
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 */
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);
}
--- /dev/null
+/**************************************************************************
+ *
+ * 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_ */