mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 13:30:12 +01:00
llvmpipe: Basic implementation of pipe_context::set_sample_mask.
We don't support MSAA (ie, number of samples is always one) therefore sample_mask boils down to a synonym of the rasterizer_discard flag. Also, this change makes setup actually use the value received in lp_setup_set_rasterizer_discard instead of reaching out to llvmpipe upper layers to re-fetch it. Based on Si Chen's draft. With this patch `wgf11multisample Coverage passes 100%` on the UMD D3D10 state tracker. Reviewed-by: Roland Scheidegger <sroland@vmware.com> Reviewed-by: Si Chen <sichen@vmware.com>
This commit is contained in:
parent
95bf222603
commit
2d368b982a
5 changed files with 20 additions and 7 deletions
|
|
@ -69,6 +69,7 @@ struct llvmpipe_context {
|
|||
const struct lp_so_state *so;
|
||||
|
||||
/** Other rendering state */
|
||||
unsigned sample_mask;
|
||||
struct pipe_blend_color blend_color;
|
||||
struct pipe_stencil_ref stencil_ref;
|
||||
struct pipe_clip_state clip;
|
||||
|
|
|
|||
|
|
@ -66,9 +66,6 @@ static boolean try_update_scene_state( struct lp_setup_context *setup );
|
|||
static void
|
||||
lp_setup_get_empty_scene(struct lp_setup_context *setup)
|
||||
{
|
||||
struct llvmpipe_context *lp = llvmpipe_context(setup->pipe);
|
||||
boolean discard = lp->rasterizer ? lp->rasterizer->rasterizer_discard : FALSE;
|
||||
|
||||
assert(setup->scene == NULL);
|
||||
|
||||
setup->scene_idx++;
|
||||
|
|
@ -84,8 +81,8 @@ lp_setup_get_empty_scene(struct lp_setup_context *setup)
|
|||
lp_fence_wait(setup->scene->fence);
|
||||
}
|
||||
|
||||
lp_scene_begin_binning(setup->scene, &setup->fb, discard);
|
||||
|
||||
lp_scene_begin_binning(setup->scene, &setup->fb, setup->rasterizer_discard);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -177,6 +177,13 @@ static void
|
|||
llvmpipe_set_sample_mask(struct pipe_context *pipe,
|
||||
unsigned sample_mask)
|
||||
{
|
||||
struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
|
||||
|
||||
if (sample_mask != llvmpipe->sample_mask) {
|
||||
llvmpipe->sample_mask = sample_mask;
|
||||
|
||||
llvmpipe->dirty |= LP_NEW_RASTERIZER;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -194,4 +201,6 @@ llvmpipe_init_blend_funcs(struct llvmpipe_context *llvmpipe)
|
|||
|
||||
llvmpipe->pipe.set_stencil_ref = llvmpipe_set_stencil_ref;
|
||||
llvmpipe->pipe.set_sample_mask = llvmpipe_set_sample_mask;
|
||||
|
||||
llvmpipe->sample_mask = ~0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -185,6 +185,14 @@ void llvmpipe_update_derived( struct llvmpipe_context *llvmpipe )
|
|||
LP_NEW_OCCLUSION_QUERY))
|
||||
llvmpipe_update_fs( llvmpipe );
|
||||
|
||||
if (llvmpipe->dirty & (LP_NEW_RASTERIZER)) {
|
||||
boolean discard =
|
||||
(llvmpipe->sample_mask & 1) == 0 ||
|
||||
(llvmpipe->rasterizer ? llvmpipe->rasterizer->rasterizer_discard : FALSE);
|
||||
|
||||
lp_setup_set_rasterizer_discard(llvmpipe->setup, discard);
|
||||
}
|
||||
|
||||
if (llvmpipe->dirty & (LP_NEW_FS |
|
||||
LP_NEW_FRAMEBUFFER |
|
||||
LP_NEW_RASTERIZER))
|
||||
|
|
|
|||
|
|
@ -119,8 +119,6 @@ llvmpipe_bind_rasterizer_state(struct pipe_context *pipe, void *handle)
|
|||
state->lp_state.bottom_edge_rule);
|
||||
lp_setup_set_flatshade_first( llvmpipe->setup,
|
||||
state->lp_state.flatshade_first);
|
||||
lp_setup_set_rasterizer_discard( llvmpipe->setup,
|
||||
state->lp_state.rasterizer_discard);
|
||||
lp_setup_set_line_state( llvmpipe->setup,
|
||||
state->lp_state.line_width);
|
||||
lp_setup_set_point_state( llvmpipe->setup,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue