mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-30 10:00:14 +01:00
gallium: implement set_sample_mask() in all drivers
prevents segfault when state trackers try to set default mask. Other option would be to make this required only for drivers supporting multisampling, but this seems more clean. Only dummy implementations (for normal drivers) provided (no driver supports multisampling yet neither).
This commit is contained in:
parent
2a15553e43
commit
43234cee40
16 changed files with 116 additions and 1 deletions
|
|
@ -125,6 +125,7 @@ cell_set_stencil_ref(struct pipe_context *pipe,
|
|||
cell->dirty |= CELL_NEW_DEPTH_STENCIL;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
cell_set_clip_state(struct pipe_context *pipe,
|
||||
const struct pipe_clip_state *clip)
|
||||
|
|
@ -136,6 +137,12 @@ cell_set_clip_state(struct pipe_context *pipe,
|
|||
}
|
||||
|
||||
|
||||
static void
|
||||
cell_set_sample_mask(struct pipe_context *pipe,
|
||||
unsigned sample_mask)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/* Called when driver state tracker notices changes to the viewport
|
||||
* matrix:
|
||||
|
|
@ -430,7 +437,6 @@ cell_set_framebuffer_state(struct pipe_context *pipe,
|
|||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
cell_init_state_functions(struct cell_context *cell)
|
||||
{
|
||||
|
|
@ -457,6 +463,7 @@ cell_init_state_functions(struct cell_context *cell)
|
|||
cell->pipe.set_blend_color = cell_set_blend_color;
|
||||
cell->pipe.set_stencil_ref = cell_set_stencil_ref;
|
||||
cell->pipe.set_clip_state = cell_set_clip_state;
|
||||
cell->pipe.set_sample_mask = cell_set_sample_mask;
|
||||
|
||||
cell->pipe.set_framebuffer_state = cell_set_framebuffer_state;
|
||||
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@
|
|||
#define FO_NEW_CLEAR_COLOR 0x20000
|
||||
#define FO_NEW_VERTEX_BUFFER 0x40000
|
||||
#define FO_NEW_VERTEX_ELEMENT 0x80000
|
||||
#define FO_NEW_SAMPLE_MASK 0x100000
|
||||
|
||||
|
||||
|
||||
|
|
@ -90,6 +91,7 @@ struct failover_context {
|
|||
struct pipe_blend_color blend_color;
|
||||
struct pipe_stencil_ref stencil_ref;
|
||||
struct pipe_clip_state clip;
|
||||
unsigned sample_mask;
|
||||
struct pipe_framebuffer_state framebuffer;
|
||||
struct pipe_poly_stipple poly_stipple;
|
||||
struct pipe_scissor_state scissor;
|
||||
|
|
|
|||
|
|
@ -125,6 +125,19 @@ failover_set_clip_state( struct pipe_context *pipe,
|
|||
failover->hw->set_clip_state( failover->hw, clip );
|
||||
}
|
||||
|
||||
static void
|
||||
failover_set_sample_mask(struct pipe_context *pipe,
|
||||
unsigned sample_mask)
|
||||
{
|
||||
struct failover_context *failover = failover_context(pipe);
|
||||
|
||||
failover->sample_mask = sample_mask;
|
||||
failover->dirty |= FO_NEW_SAMPLE_MASK;
|
||||
failover->sw->set_sample_mask( failover->sw, sample_mask );
|
||||
failover->hw->set_sample_mask( failover->hw, sample_mask );
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
failover_create_depth_stencil_state(struct pipe_context *pipe,
|
||||
|
|
@ -614,6 +627,7 @@ failover_init_state_functions( struct failover_context *failover )
|
|||
failover->pipe.set_blend_color = failover_set_blend_color;
|
||||
failover->pipe.set_stencil_ref = failover_set_stencil_ref;
|
||||
failover->pipe.set_clip_state = failover_set_clip_state;
|
||||
failover->pipe.set_sample_mask = failover_set_sample_mask;
|
||||
failover->pipe.set_framebuffer_state = failover_set_framebuffer_state;
|
||||
failover->pipe.set_polygon_stipple = failover_set_polygon_stipple;
|
||||
failover->pipe.set_scissor_state = failover_set_scissor_state;
|
||||
|
|
|
|||
|
|
@ -63,6 +63,9 @@ failover_state_emit( struct failover_context *failover )
|
|||
if (failover->dirty & FO_NEW_CLIP)
|
||||
failover->sw->set_clip_state( failover->sw, &failover->clip );
|
||||
|
||||
if (failover->dirty & FO_NEW_SAMPLE_MASK)
|
||||
failover->sw->set_sample_mask( failover->sw, failover->sample_mask );
|
||||
|
||||
if (failover->dirty & FO_NEW_DEPTH_STENCIL)
|
||||
failover->sw->bind_depth_stencil_alpha_state( failover->sw,
|
||||
failover->depth_stencil->sw_state );
|
||||
|
|
|
|||
|
|
@ -806,6 +806,12 @@ i915_delete_vertex_elements_state(struct pipe_context *pipe, void *velems)
|
|||
FREE( velems );
|
||||
}
|
||||
|
||||
static void
|
||||
i915_set_sample_mask(struct pipe_context *pipe,
|
||||
unsigned sample_mask)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
i915_init_state_functions( struct i915_context *i915 )
|
||||
{
|
||||
|
|
@ -837,6 +843,7 @@ i915_init_state_functions( struct i915_context *i915 )
|
|||
i915->base.set_blend_color = i915_set_blend_color;
|
||||
i915->base.set_stencil_ref = i915_set_stencil_ref;
|
||||
i915->base.set_clip_state = i915_set_clip_state;
|
||||
i915->base.set_sample_mask = i915_set_sample_mask;
|
||||
i915->base.set_constant_buffer = i915_set_constant_buffer;
|
||||
i915->base.set_framebuffer_state = i915_set_framebuffer_state;
|
||||
|
||||
|
|
|
|||
|
|
@ -167,12 +167,19 @@ static void brw_set_stencil_ref(struct pipe_context *pipe,
|
|||
brw->state.dirty.mesa |= PIPE_NEW_DEPTH_STENCIL_ALPHA;
|
||||
}
|
||||
|
||||
static void
|
||||
brw_set_sample_mask(struct pipe_context *pipe,
|
||||
unsigned sample_mask)
|
||||
{
|
||||
}
|
||||
|
||||
void brw_pipe_depth_stencil_init( struct brw_context *brw )
|
||||
{
|
||||
brw->base.set_stencil_ref = brw_set_stencil_ref;
|
||||
brw->base.create_depth_stencil_alpha_state = brw_create_depth_stencil_state;
|
||||
brw->base.bind_depth_stencil_alpha_state = brw_bind_depth_stencil_state;
|
||||
brw->base.delete_depth_stencil_alpha_state = brw_delete_depth_stencil_state;
|
||||
brw->base.set_sample_mask = brw_set_sample_mask;
|
||||
}
|
||||
|
||||
void brw_pipe_depth_stencil_cleanup( struct brw_context *brw )
|
||||
|
|
|
|||
|
|
@ -451,6 +451,17 @@ identity_set_clip_state(struct pipe_context *_pipe,
|
|||
clip);
|
||||
}
|
||||
|
||||
static void
|
||||
identity_set_sample_mask(struct pipe_context *_pipe,
|
||||
unsigned sample_mask)
|
||||
{
|
||||
struct identity_context *id_pipe = identity_context(_pipe);
|
||||
struct pipe_context *pipe = id_pipe->pipe;
|
||||
|
||||
pipe->set_sample_mask(pipe,
|
||||
sample_mask);
|
||||
}
|
||||
|
||||
static void
|
||||
identity_set_constant_buffer(struct pipe_context *_pipe,
|
||||
uint shader,
|
||||
|
|
@ -892,6 +903,7 @@ identity_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
|
|||
id_pipe->base.set_blend_color = identity_set_blend_color;
|
||||
id_pipe->base.set_stencil_ref = identity_set_stencil_ref;
|
||||
id_pipe->base.set_clip_state = identity_set_clip_state;
|
||||
id_pipe->base.set_sample_mask = identity_set_sample_mask;
|
||||
id_pipe->base.set_constant_buffer = identity_set_constant_buffer;
|
||||
id_pipe->base.set_framebuffer_state = identity_set_framebuffer_state;
|
||||
id_pipe->base.set_polygon_stipple = identity_set_polygon_stipple;
|
||||
|
|
|
|||
|
|
@ -148,6 +148,11 @@ llvmpipe_set_stencil_ref(struct pipe_context *pipe,
|
|||
llvmpipe->dirty |= LP_NEW_DEPTH_STENCIL_ALPHA;
|
||||
}
|
||||
|
||||
static void
|
||||
llvmpipe_set_sample_mask(struct pipe_context *pipe,
|
||||
unsigned sample_mask)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
llvmpipe_init_blend_funcs(struct llvmpipe_context *llvmpipe)
|
||||
|
|
@ -163,4 +168,5 @@ llvmpipe_init_blend_funcs(struct llvmpipe_context *llvmpipe)
|
|||
llvmpipe->pipe.set_blend_color = llvmpipe_set_blend_color;
|
||||
|
||||
llvmpipe->pipe.set_stencil_ref = llvmpipe_set_stencil_ref;
|
||||
llvmpipe->pipe.set_sample_mask = llvmpipe_set_sample_mask;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -688,6 +688,12 @@ nv50_set_clip_state(struct pipe_context *pipe,
|
|||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_set_sample_mask(struct pipe_context *pipe,
|
||||
unsigned sample_mask)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
|
||||
struct pipe_resource *buf )
|
||||
|
|
@ -833,6 +839,7 @@ nv50_init_state_functions(struct nv50_context *nv50)
|
|||
nv50->pipe.set_blend_color = nv50_set_blend_color;
|
||||
nv50->pipe.set_stencil_ref = nv50_set_stencil_ref;
|
||||
nv50->pipe.set_clip_state = nv50_set_clip_state;
|
||||
nv50->pipe_set_sample_mask = nv50_set_sample_mask;
|
||||
nv50->pipe.set_constant_buffer = nv50_set_constant_buffer;
|
||||
nv50->pipe.set_framebuffer_state = nv50_set_framebuffer_state;
|
||||
nv50->pipe.set_polygon_stipple = nv50_set_polygon_stipple;
|
||||
|
|
|
|||
|
|
@ -505,6 +505,12 @@ nvfx_set_clip_state(struct pipe_context *pipe,
|
|||
nvfx->draw_dirty |= NVFX_NEW_UCP;
|
||||
}
|
||||
|
||||
static void
|
||||
nvfx_set_sample_mask(struct pipe_context *pipe,
|
||||
unsigned sample_mask)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
nvfx_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
|
||||
struct pipe_resource *buf )
|
||||
|
|
@ -644,6 +650,7 @@ nvfx_init_state_functions(struct nvfx_context *nvfx)
|
|||
nvfx->pipe.set_blend_color = nvfx_set_blend_color;
|
||||
nvfx->pipe.set_stencil_ref = nvfx_set_stencil_ref;
|
||||
nvfx->pipe.set_clip_state = nvfx_set_clip_state;
|
||||
nvfx->pipe.set_sample_mask = nvfx_set_sample_mask;
|
||||
nvfx->pipe.set_constant_buffer = nvfx_set_constant_buffer;
|
||||
nvfx->pipe.set_framebuffer_state = nvfx_set_framebuffer_state;
|
||||
nvfx->pipe.set_polygon_stipple = nvfx_set_polygon_stipple;
|
||||
|
|
|
|||
|
|
@ -404,6 +404,13 @@ static void r300_set_clip_state(struct pipe_context* pipe,
|
|||
r300->clip_state.dirty = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
r300_set_sample_mask(struct pipe_context *pipe,
|
||||
unsigned sample_mask)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/* Create a new depth, stencil, and alpha state based on the CSO dsa state.
|
||||
*
|
||||
* This contains the depth buffer, stencil buffer, alpha test, and such.
|
||||
|
|
@ -1502,6 +1509,7 @@ void r300_init_state_functions(struct r300_context* r300)
|
|||
r300->context.set_blend_color = r300_set_blend_color;
|
||||
|
||||
r300->context.set_clip_state = r300_set_clip_state;
|
||||
r300->context.set_sample_mask = r300_set_sample_mask;
|
||||
|
||||
r300->context.set_constant_buffer = r300_set_constant_buffer;
|
||||
|
||||
|
|
|
|||
|
|
@ -251,6 +251,7 @@ softpipe_create_context( struct pipe_screen *screen,
|
|||
softpipe->pipe.set_blend_color = softpipe_set_blend_color;
|
||||
softpipe->pipe.set_stencil_ref = softpipe_set_stencil_ref;
|
||||
softpipe->pipe.set_clip_state = softpipe_set_clip_state;
|
||||
softpipe->pipe.set_sample_mask = softpipe_set_sample_mask;
|
||||
softpipe->pipe.set_constant_buffer = softpipe_set_constant_buffer;
|
||||
softpipe->pipe.set_framebuffer_state = softpipe_set_framebuffer_state;
|
||||
softpipe->pipe.set_polygon_stipple = softpipe_set_polygon_stipple;
|
||||
|
|
|
|||
|
|
@ -148,6 +148,9 @@ void softpipe_set_stencil_ref( struct pipe_context *pipe,
|
|||
void softpipe_set_clip_state( struct pipe_context *,
|
||||
const struct pipe_clip_state * );
|
||||
|
||||
void softpipe_set_sample_mask( struct pipe_context *,
|
||||
unsigned sample_mask );
|
||||
|
||||
void softpipe_set_constant_buffer(struct pipe_context *,
|
||||
uint shader, uint index,
|
||||
struct pipe_resource *buf);
|
||||
|
|
|
|||
|
|
@ -111,3 +111,10 @@ void softpipe_set_stencil_ref( struct pipe_context *pipe,
|
|||
|
||||
softpipe->dirty |= SP_NEW_DEPTH_STENCIL_ALPHA;
|
||||
}
|
||||
|
||||
void
|
||||
softpipe_set_sample_mask(struct pipe_context *pipe,
|
||||
unsigned sample_mask)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -147,6 +147,12 @@ static void svga_set_stencil_ref( struct pipe_context *pipe,
|
|||
svga->dirty |= SVGA_NEW_STENCIL_REF;
|
||||
}
|
||||
|
||||
static void
|
||||
svga_set_sample_mask(struct pipe_context *pipe,
|
||||
unsigned sample_mask)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void svga_init_depth_stencil_functions( struct svga_context *svga )
|
||||
{
|
||||
|
|
@ -155,6 +161,7 @@ void svga_init_depth_stencil_functions( struct svga_context *svga )
|
|||
svga->pipe.delete_depth_stencil_alpha_state = svga_delete_depth_stencil_state;
|
||||
|
||||
svga->pipe.set_stencil_ref = svga_set_stencil_ref;
|
||||
svga->pipe.set_sample_mask = svga_set_sample_mask;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -876,6 +876,22 @@ trace_context_set_clip_state(struct pipe_context *_pipe,
|
|||
trace_dump_call_end();
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
trace_context_set_sample_mask(struct pipe_context *_pipe,
|
||||
unsigned sample_mask)
|
||||
{
|
||||
struct trace_context *tr_ctx = trace_context(_pipe);
|
||||
struct pipe_context *pipe = tr_ctx->pipe;
|
||||
|
||||
trace_dump_call_begin("pipe_context", "set_sample_mask");
|
||||
|
||||
trace_dump_arg(ptr, pipe);
|
||||
trace_dump_arg(uint, sample_mask);
|
||||
|
||||
pipe->set_sample_mask(pipe, sample_mask);
|
||||
|
||||
trace_dump_call_end();
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
trace_context_set_constant_buffer(struct pipe_context *_pipe,
|
||||
|
|
@ -1561,6 +1577,7 @@ trace_context_create(struct trace_screen *tr_scr,
|
|||
tr_ctx->base.set_blend_color = trace_context_set_blend_color;
|
||||
tr_ctx->base.set_stencil_ref = trace_context_set_stencil_ref;
|
||||
tr_ctx->base.set_clip_state = trace_context_set_clip_state;
|
||||
tr_ctx->base.set_sample_mask = trace_context_set_sample_mask;
|
||||
tr_ctx->base.set_constant_buffer = trace_context_set_constant_buffer;
|
||||
tr_ctx->base.set_framebuffer_state = trace_context_set_framebuffer_state;
|
||||
tr_ctx->base.set_polygon_stipple = trace_context_set_polygon_stipple;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue