mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-20 01:20:44 +02:00
llvmpipe: Pass the fs variant to the rasterizer.
This commit is contained in:
parent
dc10943038
commit
18fb9ff6d8
9 changed files with 113 additions and 81 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
93
src/gallium/drivers/llvmpipe/lp_state_fs.h
Normal file
93
src/gallium/drivers/llvmpipe/lp_state_fs.h
Normal file
|
|
@ -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_ */
|
||||
Loading…
Add table
Reference in a new issue