r600g: implement timestamp query and get_timestamp hook
[mesa.git] / src / gallium / drivers / r600 / r600_state.c
index c1061ddbe0c8dfd46bceaf812fef32f3f1fc8656..b4f61a48a4635b2f28ebbdaee84b40ea26622039 100644 (file)
@@ -753,6 +753,15 @@ static void *r600_create_blend_state(struct pipe_context *ctx,
                if (i == 0)
                        r600_pipe_state_add_reg(rstate, R_028804_CB_BLEND_CONTROL, bc);
        }
+
+       r600_pipe_state_add_reg(rstate, R_028D44_DB_ALPHA_TO_MASK,
+                               S_028D44_ALPHA_TO_MASK_ENABLE(state->alpha_to_coverage) |
+                               S_028D44_ALPHA_TO_MASK_OFFSET0(2) |
+                               S_028D44_ALPHA_TO_MASK_OFFSET1(2) |
+                               S_028D44_ALPHA_TO_MASK_OFFSET2(2) |
+                               S_028D44_ALPHA_TO_MASK_OFFSET3(2));
+
+       blend->alpha_to_one = state->alpha_to_one;
        return rstate;
 }
 
@@ -846,6 +855,7 @@ static void *r600_create_rs_state(struct pipe_context *ctx,
                S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) |
                S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) |
                S_028810_DX_LINEAR_ATTR_CLIP_ENA(1);
+       rs->multisample_enable = state->multisample;
 
        /* offset */
        rs->offset_units = state->offset_units;
@@ -1126,10 +1136,6 @@ static void r600_set_polygon_stipple(struct pipe_context *ctx,
 {
 }
 
-static void r600_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask)
-{
-}
-
 void r600_set_scissor_state(struct r600_context *rctx,
                            const struct pipe_scissor_state *state)
 {
@@ -1398,6 +1404,8 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx,
        /* build states */
        rctx->export_16bpc = true;
        rctx->nr_cbufs = state->nr_cbufs;
+       rctx->cb0_is_integer = state->nr_cbufs &&
+                              util_format_is_pure_integer(state->cbufs[0]->format);
 
        for (i = 0; i < state->nr_cbufs; i++) {
                surf = (struct r600_surface*)state->cbufs[i];
@@ -1742,6 +1750,15 @@ static void r600_emit_seamless_cube_map(struct r600_context *rctx, struct r600_a
        r600_write_config_reg(cs, R_009508_TA_CNTL_AUX, tmp);
 }
 
+static void r600_emit_sample_mask(struct r600_context *rctx, struct r600_atom *a)
+{
+       struct r600_sample_mask *s = (struct r600_sample_mask*)a;
+       uint8_t mask = s->sample_mask;
+
+       r600_write_context_reg(rctx->cs, R_028C48_PA_SC_AA_MASK,
+                              mask | (mask << 8) | (mask << 16) | (mask << 24));
+}
+
 void r600_init_state_functions(struct r600_context *rctx)
 {
        r600_init_atom(&rctx->seamless_cube_map.atom, r600_emit_seamless_cube_map, 3, 0);
@@ -1761,6 +1778,10 @@ void r600_init_state_functions(struct r600_context *rctx)
        r600_init_atom(&rctx->vs_samplers.atom_sampler, r600_emit_vs_sampler, 0, EMIT_EARLY);
        r600_init_atom(&rctx->ps_samplers.atom_sampler, r600_emit_ps_sampler, 0, EMIT_EARLY);
 
+       r600_init_atom(&rctx->sample_mask.atom, r600_emit_sample_mask, 3, 0);
+       rctx->sample_mask.sample_mask = ~0;
+       r600_atom_dirty(rctx, &rctx->sample_mask.atom);
+
        rctx->context.create_blend_state = r600_create_blend_state;
        rctx->context.create_depth_stencil_alpha_state = r600_create_dsa_state;
        rctx->context.create_fs_state = r600_create_shader_state_ps;
@@ -2115,8 +2136,6 @@ void r600_init_atom_start_cs(struct r600_context *rctx)
        r600_store_value(cb, 0); /* R_028D2C_DB_SRESULTS_COMPARE_STATE1 */
        r600_store_value(cb, 0); /* R_028D30_DB_PRELOAD_CONTROL */
 
-       r600_store_context_reg(cb, R_028D44_DB_ALPHA_TO_MASK, 0xAA00);
-
        r600_store_context_reg(cb, R_028820_PA_CL_NANINF_CNTL, 0);
        r600_store_context_reg(cb, R_028A48_PA_SC_MPASS_PS_CNTL, 0);
 
@@ -2156,8 +2175,6 @@ void r600_init_atom_start_cs(struct r600_context *rctx)
        r600_store_value(cb, 0xFF);       /* R_028C38_CB_CLRCMP_DST */
        r600_store_value(cb, 0xFFFFFFFF); /* R_028C3C_CB_CLRCMP_MSK */
 
-       r600_store_context_reg(cb, R_028C48_PA_SC_AA_MASK, 0xFFFFFFFF);
-
        r600_store_context_reg_seq(cb, R_028030_PA_SC_SCREEN_SCISSOR_TL, 2);
        r600_store_value(cb, 0); /* R_028030_PA_SC_SCREEN_SCISSOR_TL */
        r600_store_value(cb, S_028034_BR_X(8192) | S_028034_BR_Y(8192)); /* R_028034_PA_SC_SCREEN_SCISSOR_BR */