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