radeonsi: implement set_min_samples
This is how per-sample shading is enabled.
This commit is contained in:
parent
fe98bfb261
commit
501fee2511
|
@ -107,6 +107,9 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen, void *
|
|||
sctx->cache_flush = si_atom_cache_flush;
|
||||
sctx->atoms.s.cache_flush = &sctx->cache_flush;
|
||||
|
||||
sctx->msaa_config = si_atom_msaa_config;
|
||||
sctx->atoms.s.msaa_config = &sctx->msaa_config;
|
||||
|
||||
sctx->atoms.s.streamout_begin = &sctx->b.streamout.begin_atom;
|
||||
sctx->atoms.s.streamout_enable = &sctx->b.streamout.enable_atom;
|
||||
|
||||
|
|
|
@ -114,6 +114,7 @@ struct si_context {
|
|||
struct r600_atom *streamout_begin;
|
||||
struct r600_atom *streamout_enable; /* must be after streamout_begin */
|
||||
struct r600_atom *framebuffer;
|
||||
struct r600_atom *msaa_config;
|
||||
} s;
|
||||
struct r600_atom *array[0];
|
||||
} atoms;
|
||||
|
@ -136,6 +137,9 @@ struct si_context {
|
|||
struct r600_resource *border_color_table;
|
||||
unsigned border_color_offset;
|
||||
|
||||
struct r600_atom msaa_config;
|
||||
int ps_iter_samples;
|
||||
|
||||
unsigned default_ps_gprs, default_vs_gprs;
|
||||
|
||||
/* Below are variables from the old r600_context.
|
||||
|
|
|
@ -1921,8 +1921,9 @@ static void si_set_framebuffer_state(struct pipe_context *ctx,
|
|||
sctx->framebuffer.atom.num_dw = state->nr_cbufs*15 + (8 - state->nr_cbufs)*3;
|
||||
sctx->framebuffer.atom.num_dw += state->zsbuf ? 23 : 4;
|
||||
sctx->framebuffer.atom.num_dw += 3; /* WINDOW_SCISSOR_BR */
|
||||
sctx->framebuffer.atom.num_dw += 28; /* MSAA */
|
||||
sctx->framebuffer.atom.num_dw += 18; /* MSAA sample locations */
|
||||
sctx->framebuffer.atom.dirty = true;
|
||||
sctx->msaa_config.dirty = true;
|
||||
}
|
||||
|
||||
static void si_emit_framebuffer_state(struct si_context *sctx, struct r600_atom *atom)
|
||||
|
@ -2026,7 +2027,30 @@ static void si_emit_framebuffer_state(struct si_context *sctx, struct r600_atom
|
|||
S_028208_BR_X(state->width) | S_028208_BR_Y(state->height));
|
||||
|
||||
cayman_emit_msaa_sample_locs(cs, sctx->framebuffer.nr_samples);
|
||||
cayman_emit_msaa_config(cs, sctx->framebuffer.nr_samples, 1);
|
||||
}
|
||||
|
||||
static void si_emit_msaa_config(struct r600_common_context *rctx, struct r600_atom *atom)
|
||||
{
|
||||
struct si_context *sctx = (struct si_context *)rctx;
|
||||
struct radeon_winsys_cs *cs = sctx->b.rings.gfx.cs;
|
||||
|
||||
cayman_emit_msaa_config(cs, sctx->framebuffer.nr_samples,
|
||||
sctx->ps_iter_samples);
|
||||
}
|
||||
|
||||
const struct r600_atom si_atom_msaa_config = { si_emit_msaa_config, 10 }; /* number of CS dwords */
|
||||
|
||||
static void si_set_min_samples(struct pipe_context *ctx, unsigned min_samples)
|
||||
{
|
||||
struct si_context *sctx = (struct si_context *)ctx;
|
||||
|
||||
if (sctx->ps_iter_samples == min_samples)
|
||||
return;
|
||||
|
||||
sctx->ps_iter_samples = min_samples;
|
||||
|
||||
if (sctx->framebuffer.nr_samples > 1)
|
||||
sctx->msaa_config.dirty = true;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -3025,6 +3049,8 @@ void si_init_state_functions(struct si_context *sctx)
|
|||
|
||||
sctx->b.b.texture_barrier = si_texture_barrier;
|
||||
sctx->b.b.set_polygon_stipple = si_set_polygon_stipple;
|
||||
sctx->b.b.set_min_samples = si_set_min_samples;
|
||||
|
||||
sctx->b.dma_copy = si_dma_copy;
|
||||
sctx->b.set_occlusion_query_state = si_set_occlusion_query_state;
|
||||
sctx->b.need_gfx_cs_space = si_need_gfx_cs_space;
|
||||
|
|
|
@ -239,6 +239,7 @@ unsigned si_tile_mode_index(struct r600_texture *rtex, unsigned level, bool sten
|
|||
|
||||
/* si_state_draw.c */
|
||||
extern const struct r600_atom si_atom_cache_flush;
|
||||
extern const struct r600_atom si_atom_msaa_config;
|
||||
void si_emit_cache_flush(struct r600_common_context *sctx, struct r600_atom *atom);
|
||||
void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo);
|
||||
|
||||
|
|
Loading…
Reference in New Issue