diff options
Diffstat (limited to 'src/gallium/drivers/r300/r300_state.c')
-rw-r--r-- | src/gallium/drivers/r300/r300_state.c | 91 |
1 files changed, 74 insertions, 17 deletions
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index a5f96831081..1e7cff91f9a 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -440,8 +440,27 @@ static void r300_bind_blend_state(struct pipe_context* pipe, void* state) { struct r300_context* r300 = r300_context(pipe); + struct r300_blend_state *blend = (struct r300_blend_state*)state; + boolean last_alpha_to_one = r300->alpha_to_one; + boolean last_alpha_to_coverage = r300->alpha_to_coverage; UPDATE_STATE(state, r300->blend_state); + + if (!blend) + return; + + r300->alpha_to_one = blend->state.alpha_to_one; + r300->alpha_to_coverage = blend->state.alpha_to_coverage; + + if (r300->alpha_to_one != last_alpha_to_one && r300->msaa_enable && + r300->fs_status == FRAGMENT_SHADER_VALID) { + r300->fs_status = FRAGMENT_SHADER_MAYBE_DIRTY; + } + + if (r300->alpha_to_coverage != last_alpha_to_coverage && + r300->msaa_enable) { + r300_mark_atom_dirty(r300, &r300->dsa_state); + } } /* Free blend state. */ @@ -553,13 +572,6 @@ static void r300_set_clip_state(struct pipe_context* pipe, } } -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. @@ -816,6 +828,25 @@ void r300_mark_fb_state_dirty(struct r300_context *r300, /* The size of the rest of atoms stays the same. */ } +static unsigned r300_get_num_samples(struct r300_context *r300) +{ + struct pipe_framebuffer_state* fb = + (struct pipe_framebuffer_state*)r300->fb_state.state; + unsigned num_samples; + + if (fb->nr_cbufs) + num_samples = fb->cbufs[0]->texture->nr_samples; + else if (fb->zsbuf) + num_samples = fb->zsbuf->texture->nr_samples; + else + num_samples = 1; + + if (!num_samples) + num_samples = 1; + + return num_samples; +} + static void r300_set_framebuffer_state(struct pipe_context* pipe, const struct pipe_framebuffer_state* state) @@ -911,22 +942,22 @@ r300_set_framebuffer_state(struct pipe_context* pipe, } } - /* Set up AA config. */ - if (state->nr_cbufs && state->cbufs[0]->texture->nr_samples > 1) { - aa->aa_config = R300_GB_AA_CONFIG_AA_ENABLE; + r300->num_samples = r300_get_num_samples(r300); - switch (state->cbufs[0]->texture->nr_samples) { + /* Set up AA config. */ + if (r300->num_samples > 1) { + switch (r300->num_samples) { case 2: - aa->aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_2; - break; - case 3: - aa->aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_3; + aa->aa_config = R300_GB_AA_CONFIG_AA_ENABLE | + R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_2; break; case 4: - aa->aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_4; + aa->aa_config = R300_GB_AA_CONFIG_AA_ENABLE | + R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_4; break; case 6: - aa->aa_config |= R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_6; + aa->aa_config = R300_GB_AA_CONFIG_AA_ENABLE | + R300_GB_AA_CONFIG_NUM_AA_SUBSAMPLES_6; break; } } else { @@ -1251,6 +1282,7 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state) struct r300_rs_state* rs = (struct r300_rs_state*)state; int last_sprite_coord_enable = r300->sprite_coord_enable; boolean last_two_sided_color = r300->two_sided_color; + boolean last_msaa_enable = r300->msaa_enable; if (r300->draw && rs) { draw_set_rasterizer_state(r300->draw, &rs->rs_draw, state); @@ -1260,10 +1292,12 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state) r300->polygon_offset_enabled = rs->polygon_offset_enable; r300->sprite_coord_enable = rs->rs.sprite_coord_enable; r300->two_sided_color = rs->rs.light_twoside; + r300->msaa_enable = rs->rs.multisample; } else { r300->polygon_offset_enabled = FALSE; r300->sprite_coord_enable = 0; r300->two_sided_color = FALSE; + r300->msaa_enable = FALSE; } UPDATE_STATE(state, r300->rs_state); @@ -1273,6 +1307,19 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state) last_two_sided_color != r300->two_sided_color) { r300_mark_atom_dirty(r300, &r300->rs_block_state); } + + if (last_msaa_enable != r300->msaa_enable) { + r300_mark_atom_dirty(r300, &r300->fb_state_pipelined); + + if (r300->alpha_to_coverage) { + r300_mark_atom_dirty(r300, &r300->dsa_state); + } + + if (r300->alpha_to_one && + r300->fs_status == FRAGMENT_SHADER_VALID) { + r300->fs_status = FRAGMENT_SHADER_MAYBE_DIRTY; + } + } } /* Free rasterizer state. */ @@ -1542,6 +1589,16 @@ r300_sampler_view_destroy(struct pipe_context *pipe, FREE(view); } +static void r300_set_sample_mask(struct pipe_context *pipe, + unsigned mask) +{ + struct r300_context* r300 = r300_context(pipe); + + *((unsigned*)r300->sample_mask.state) = mask; + + r300_mark_atom_dirty(r300, &r300->sample_mask); +} + static void r300_set_scissor_state(struct pipe_context* pipe, const struct pipe_scissor_state* state) { |