created a new state to set some bits which are needed for queries.
---
 src/gallium/drivers/r600/evergreen_state.c |   19 ++++++++++++-
 src/gallium/drivers/r600/evergreend.h      |    2 +-
 src/gallium/drivers/r600/r600_pipe.h       |    4 +++
 src/gallium/drivers/r600/r600_state2.c     |   39 +++++++++++++++++++++++++--
 4 files changed, 58 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/r600/evergreen_state.c 
b/src/gallium/drivers/r600/evergreen_state.c
index c54b78a..5026f21 100644
--- a/src/gallium/drivers/r600/evergreen_state.c
+++ b/src/gallium/drivers/r600/evergreen_state.c
@@ -213,7 +213,7 @@ static void *evergreen_create_dsa_state(struct pipe_context 
*ctx,
        db_render_override = S_02800C_FORCE_HIZ_ENABLE(V_02800C_FORCE_DISABLE) |
                S_02800C_FORCE_HIS_ENABLE0(V_02800C_FORCE_DISABLE) |
                S_02800C_FORCE_HIS_ENABLE1(V_02800C_FORCE_DISABLE);
-       /* TODO db_render_override depends on query */
+
        r600_pipe_state_add_reg(rstate, EVERGREEN_GROUP_CONTEXT, 
R_028028_DB_STENCIL_CLEAR, 0x00000000, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, EVERGREEN_GROUP_CONTEXT, 
R_02802C_DB_DEPTH_CLEAR, 0x3F800000, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, EVERGREEN_GROUP_CONTEXT, 
R_028410_SX_ALPHA_TEST_CONTROL, alpha_test_control, 0xFFFFFFFF, NULL);
@@ -226,9 +226,15 @@ static void *evergreen_create_dsa_state(struct 
pipe_context *ctx,
        r600_pipe_state_add_reg(rstate, EVERGREEN_GROUP_CONTEXT, 
R_028438_SX_ALPHA_REF, alpha_ref, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, EVERGREEN_GROUP_CONTEXT, 
R_0286DC_SPI_FOG_CNTL, 0x00000000, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, EVERGREEN_GROUP_CONTEXT, 
R_028800_DB_DEPTH_CONTROL, db_depth_control, 0xFFFFFFFF, NULL);
+       
+       /* masked bits are set by the shader state */
        r600_pipe_state_add_reg(rstate, EVERGREEN_GROUP_CONTEXT, 
R_02880C_DB_SHADER_CONTROL, db_shader_control, 0xFFFFFFBE, NULL);
+       
        r600_pipe_state_add_reg(rstate, EVERGREEN_GROUP_CONTEXT, 
R_028000_DB_RENDER_CONTROL, db_render_control, 0xFFFFFFFF, NULL);
-       r600_pipe_state_add_reg(rstate, EVERGREEN_GROUP_CONTEXT, 
R_02800C_DB_RENDER_OVERRIDE, db_render_override, 0xFFFFFFFF, NULL);
+       
+       /* masked bits are set by the query state */
+       r600_pipe_state_add_reg(rstate, EVERGREEN_GROUP_CONTEXT, 
R_02800C_DB_RENDER_OVERRIDE, db_render_override, 0xFFFFFDFF, NULL);
+       
        r600_pipe_state_add_reg(rstate, EVERGREEN_GROUP_CONTEXT, 
R_028AC0_DB_SRESULTS_COMPARE_STATE0, 0x0, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, EVERGREEN_GROUP_CONTEXT, 
R_028AC4_DB_SRESULTS_COMPARE_STATE1, 0x0, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, EVERGREEN_GROUP_CONTEXT, 
R_028AC8_DB_PRELOAD_CONTROL, 0x0, 0xFFFFFFFF, NULL);
@@ -1624,3 +1630,12 @@ void evergreen_pipe_shader_vs(struct pipe_context *ctx, 
struct r600_pipe_shader
                        R_0288A4_SQ_PGM_START_FS,
                        0x00000000, 0xFFFFFFFF, shader->bo);
 }
+
+void evergreen_init_query_states(struct r600_pipe_context *rctx)
+{
+       r600_pipe_state_add_reg(&rctx->query_state_enabled, 
EVERGREEN_GROUP_CONTEXT, R_028004_DB_COUNT_CONTROL, 
S_028004_PERFECT_ZPASS_COUNTS(1), 0xFFFFFFFF, NULL);
+       r600_pipe_state_add_reg(&rctx->query_state_enabled, 
EVERGREEN_GROUP_CONTEXT, R_02800C_DB_RENDER_OVERRIDE, 
S_02800C_NOOP_CULL_DISABLE(1), 0x00000200, NULL);
+
+       r600_pipe_state_add_reg(&rctx->query_state_enabled, 
EVERGREEN_GROUP_CONTEXT, R_028004_DB_COUNT_CONTROL, 0, 0xFFFFFFFF, NULL);
+       r600_pipe_state_add_reg(&rctx->query_state_disabled, 
EVERGREEN_GROUP_CONTEXT, R_02800C_DB_RENDER_OVERRIDE, 0, 0x00000200, NULL);
+}
diff --git a/src/gallium/drivers/r600/evergreend.h 
b/src/gallium/drivers/r600/evergreend.h
index 0a0a91e..5b47ed4 100644
--- a/src/gallium/drivers/r600/evergreend.h
+++ b/src/gallium/drivers/r600/evergreend.h
@@ -1411,7 +1411,7 @@
 #define   S_028000_STENCIL_COMPRESS_DISABLE(x)         (((x) & 0x1) << 5)
 #define   S_028000_DEPTH_COMPRESS_DISABLE(x)           (((x) & 0x1) << 6)
 #define R_028004_DB_COUNT_CONTROL                    0x00028004
-#define   S_028004_ZPASS_INCREMENT_DISABLE        (((x) & 0x1) << 0)
+#define   S_028004_ZPASS_INCREMENT_DISABLE(x)        (((x) & 0x1) << 0)
 #define   S_028004_PERFECT_ZPASS_COUNTS(x)        (((x) & 0x1) << 1)
 #define R_028008_DB_DEPTH_VIEW                       0x00028008
 #define R_02800C_DB_RENDER_OVERRIDE                  0x0002800C
diff --git a/src/gallium/drivers/r600/r600_pipe.h 
b/src/gallium/drivers/r600/r600_pipe.h
index 19cfbcc..ee91469 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -43,6 +43,7 @@ enum r600_pipe_state_id {
        R600_PIPE_STATE_CONSTANT,
        R600_PIPE_STATE_SAMPLER,
        R600_PIPE_STATE_RESOURCE,
+       R600_PIPE_STATE_QUERY,
        R600_PIPE_NSTATES
 };
 
@@ -95,6 +96,9 @@ struct r600_pipe_context {
        struct pipe_vertex_buffer       vertex_buffer[PIPE_MAX_ATTRIBS];
        unsigned                        nvertex_buffer;
        unsigned                        cb_target_mask;
+       signed                          queries_running;
+       struct r600_pipe_state          query_state_enabled;
+       struct r600_pipe_state          query_state_disabled;
        /* for saving when using blitter */
        struct pipe_stencil_ref         stencil_ref;
        struct pipe_viewport_state      viewport;
diff --git a/src/gallium/drivers/r600/r600_state2.c 
b/src/gallium/drivers/r600/r600_state2.c
index 8501b3f..7bab6f3 100644
--- a/src/gallium/drivers/r600/r600_state2.c
+++ b/src/gallium/drivers/r600/r600_state2.c
@@ -967,7 +967,7 @@ static void *r600_create_dsa_state(struct pipe_context *ctx,
        db_render_override = S_028D10_FORCE_HIZ_ENABLE(V_028D10_FORCE_DISABLE) |
                S_028D10_FORCE_HIS_ENABLE0(V_028D10_FORCE_DISABLE) |
                S_028D10_FORCE_HIS_ENABLE1(V_028D10_FORCE_DISABLE);
-       /* TODO db_render_override depends on query */
+
        r600_pipe_state_add_reg(rstate, R600_GROUP_CONTEXT, 
R_028028_DB_STENCIL_CLEAR, 0x00000000, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, R600_GROUP_CONTEXT, 
R_02802C_DB_DEPTH_CLEAR, 0x3F800000, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, R600_GROUP_CONTEXT, 
R_028410_SX_ALPHA_TEST_CONTROL, alpha_test_control, 0xFFFFFFFF, NULL);
@@ -982,9 +982,14 @@ static void *r600_create_dsa_state(struct pipe_context 
*ctx,
        r600_pipe_state_add_reg(rstate, R600_GROUP_CONTEXT, 
R_0286E4_SPI_FOG_FUNC_BIAS, 0x00000000, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, R600_GROUP_CONTEXT, 
R_0286DC_SPI_FOG_CNTL, 0x00000000, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, R600_GROUP_CONTEXT, 
R_028800_DB_DEPTH_CONTROL, db_depth_control, 0xFFFFFFFF, NULL);
+
+       /* masked bits are set by the shader state */
        r600_pipe_state_add_reg(rstate, R600_GROUP_CONTEXT, 
R_02880C_DB_SHADER_CONTROL, db_shader_control, 0xFFFFFFBE, NULL);
-       r600_pipe_state_add_reg(rstate, R600_GROUP_CONTEXT, 
R_028D0C_DB_RENDER_CONTROL, db_render_control, 0xFFFFFFFF, NULL);
-       r600_pipe_state_add_reg(rstate, R600_GROUP_CONTEXT, 
R_028D10_DB_RENDER_OVERRIDE, db_render_override, 0xFFFFFFFF, NULL);
+
+       /* masked bits are set by the query state */
+       r600_pipe_state_add_reg(rstate, R600_GROUP_CONTEXT, 
R_028D0C_DB_RENDER_CONTROL, db_render_control, 0xFFFF7FFF, NULL);
+       r600_pipe_state_add_reg(rstate, R600_GROUP_CONTEXT, 
R_028D10_DB_RENDER_OVERRIDE, db_render_override, 0xFFFFFDFF, NULL);
+
        r600_pipe_state_add_reg(rstate, R600_GROUP_CONTEXT, 
R_028D2C_DB_SRESULTS_COMPARE_STATE1, 0x00000000, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, R600_GROUP_CONTEXT, 
R_028D30_DB_PRELOAD_CONTROL, 0x00000000, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, R600_GROUP_CONTEXT, 
R_028D44_DB_ALPHA_TO_MASK, 0x0000AA00, 0xFFFFFFFF, NULL);
@@ -2101,6 +2106,10 @@ static void r600_begin_query(struct pipe_context *ctx, 
struct pipe_query *query)
        rquery->result = 0;
        rquery->num_results = 0;
        r600_query_begin(&rctx->ctx, (struct r600_query *)query);
+       
+       if(rctx->queries_running == 0)
+               
r600_context_pipe_state_set(&rctx->ctx,&rctx->query_state_enabled);
+       rctx->queries_running++;
 }
 
 static void r600_end_query(struct pipe_context *ctx, struct pipe_query *query)
@@ -2108,6 +2117,11 @@ static void r600_end_query(struct pipe_context *ctx, 
struct pipe_query *query)
        struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
 
        r600_query_end(&rctx->ctx, (struct r600_query *)query);
+       
+       rctx->queries_running--;
+       assert(rctx->queries_running >=0);
+       if(rctx->queries_running == 0)
+               
r600_context_pipe_state_set(&rctx->ctx,&rctx->query_state_disabled);
 }
 
 static boolean r600_get_query_result(struct pipe_context *ctx,
@@ -2123,6 +2137,23 @@ static boolean r600_get_query_result(struct pipe_context 
*ctx,
        return r600_context_query_result(&rctx->ctx, (struct r600_query 
*)query, wait, vresult);
 }
 
+static void r600_init_query_states(struct r600_pipe_context *rctx)
+{
+       unsigned is_r700 = 0;
+
+       if(r600_get_family(rctx->radeon) >= CHIP_RV770)
+               is_r700 = 1;
+
+       
+       if(is_r700)
+               r600_pipe_state_add_reg(&rctx->query_state_enabled, 
R600_GROUP_CONTEXT, R_028D0C_DB_RENDER_CONTROL, 
S_028D0C_R700_PERFECT_ZPASS_COUNTS(1), 0x00008000, NULL);
+       r600_pipe_state_add_reg(&rctx->query_state_enabled, R600_GROUP_CONTEXT, 
R_028D10_DB_RENDER_OVERRIDE, S_028D10_NOOP_CULL_DISABLE(1), 0x00000200, NULL);
+
+       if(is_r700)
+               r600_pipe_state_add_reg(&rctx->query_state_disabled, 
R600_GROUP_CONTEXT, R_028D0C_DB_RENDER_CONTROL, 0, 0x00008000, NULL);
+       r600_pipe_state_add_reg(&rctx->query_state_disabled, 
R600_GROUP_CONTEXT, R_028D10_DB_RENDER_OVERRIDE, 0, 0x00000200, NULL);
+}
+
 static void r600_init_query_functions2(struct r600_pipe_context *rctx)
 {
        rctx->context.create_query = r600_create_query;
@@ -2174,6 +2205,7 @@ static struct pipe_context *r600_create_context2(struct 
pipe_screen *screen, voi
                        return NULL;
                }
                r600_init_config2(rctx);
+               r600_init_query_states(rctx);
                break;
        case CHIP_CEDAR:
        case CHIP_REDWOOD:
@@ -2187,6 +2219,7 @@ static struct pipe_context *r600_create_context2(struct 
pipe_screen *screen, voi
                        return NULL;
                }
                evergreen_init_config2(rctx);
+               evergreen_init_query_states(rctx);
                break;
        default:
                R600_ERR("unsupported family %d\n", 
r600_get_family(rctx->radeon));
-- 
1.7.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to