[Mesa-dev] [PATCH 09/14] r600g: sort variables in r600_context

Marek Olšák maraeo at gmail.com
Sun Oct 7 11:08:11 PDT 2012


Some variables have been removed from there too.
---
 src/gallium/drivers/r600/evergreen_state.c   |    5 +-
 src/gallium/drivers/r600/r600_pipe.h         |  144 ++++++++++++--------------
 src/gallium/drivers/r600/r600_state.c        |    5 +-
 src/gallium/drivers/r600/r600_state_common.c |   18 ++--
 4 files changed, 79 insertions(+), 93 deletions(-)

diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
index 872fedf..d6214fe 100644
--- a/src/gallium/drivers/r600/evergreen_state.c
+++ b/src/gallium/drivers/r600/evergreen_state.c
@@ -3148,6 +3148,7 @@ void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader
 	boolean have_linear = FALSE, have_centroid = FALSE, have_perspective = FALSE;
 	unsigned spi_baryc_cntl, sid, tmp, idx = 0;
 	unsigned z_export = 0, stencil_export = 0;
+	unsigned sprite_coord_enable = rctx->rasterizer ? rctx->rasterizer->sprite_coord_enable : 0;
 
 	rstate->nregs = 0;
 
@@ -3183,7 +3184,7 @@ void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader
 			}
 
 			if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC &&
-					(rctx->sprite_coord_enable & (1 << rshader->input[i].sid))) {
+			    (sprite_coord_enable & (1 << rshader->input[i].sid))) {
 				tmp |= S_028644_PT_SPRITE_TEX(1);
 			}
 
@@ -3281,7 +3282,7 @@ void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader
 	shader->db_shader_control = db_shader_control;
 	shader->ps_depth_export = z_export | stencil_export;
 
-	shader->sprite_coord_enable = rctx->sprite_coord_enable;
+	shader->sprite_coord_enable = sprite_coord_enable;
 	if (rctx->rasterizer)
 		shader->flatshade = rctx->rasterizer->flatshade;
 }
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index fc3591d..68e2f3b 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -370,44 +370,38 @@ struct r600_scissor_state
 
 struct r600_context {
 	struct pipe_context		context;
+	struct r600_screen		*screen;
+	struct radeon_winsys		*ws;
+	struct radeon_winsys_cs		*cs;
 	struct blitter_context		*blitter;
+	struct u_upload_mgr	        *uploader;
+	struct util_slab_mempool	pool_transfers;
+
+	/* Hardware info. */
 	enum radeon_family		family;
 	enum chip_class			chip_class;
 	boolean				has_vertex_cache;
 	boolean				keep_tiling_flags;
+	unsigned			default_ps_gprs, default_vs_gprs;
 	unsigned			r6xx_num_clause_temp_gprs;
+	unsigned			backend_mask;
+	unsigned			max_db; /* for OQ */
+
+	/* Miscellaneous state objects. */
 	void				*custom_dsa_flush;
 	void				*custom_blend_resolve;
 	void				*custom_blend_decompress;
+	/* With rasterizer discard, there doesn't have to be a pixel shader.
+	 * In that case, we bind this one: */
+	void				*dummy_pixel_shader;
+	/* These dummy CMASK and FMASK buffers are used to get around the R6xx hardware
+	 * bug where valid CMASK and FMASK are required to be present to avoid
+	 * a hardlock in certain operations but aren't actually used
+	 * for anything useful. */
+	struct r600_resource		*dummy_fmask;
+	struct r600_resource		*dummy_cmask;
 
-	struct r600_screen		*screen;
-	struct radeon_winsys		*ws;
-	struct r600_pipe_state		*states[R600_PIPE_NSTATES];
-	unsigned			compute_cb_target_mask;
-	unsigned			db_shader_control;
-	unsigned			pa_sc_line_stipple;
-	/* for saving when using blitter */
-	struct r600_pipe_shader_selector 	*ps_shader;
-	struct r600_pipe_shader_selector 	*vs_shader;
-	struct r600_pipe_rasterizer	*rasterizer;
-	struct r600_pipe_state          spi;
-	struct pipe_query		*current_render_cond;
-	unsigned			current_render_cond_mode;
-	/* shader information */
-	boolean				two_side;
-	boolean				spi_dirty;
-	unsigned			sprite_coord_enable;
-	boolean				flatshade;
-	bool				alpha_to_one;
-	bool				multisample_enable;
-
-	struct u_upload_mgr	        *uploader;
-	struct util_slab_mempool	pool_transfers;
-
-	unsigned default_ps_gprs, default_vs_gprs;
-
-	/******************************/
-	/* States based on r600_atom. */
+	/* State binding slots are here. */
 	struct r600_atom		*atoms[R600_NUM_ATOMS];
 	/* States for CS initialization. */
 	struct r600_command_buffer	start_cs_cmd; /* invariant state mostly */
@@ -440,69 +434,63 @@ struct r600_context {
 	struct r600_vertexbuf_state	vertex_buffer_state;
 	/** Vertex buffers for compute shaders */
 	struct r600_vertexbuf_state	cs_vertex_buffer_state;
-	/******************************/
 
-	bool			force_blend_disable;
+	/* Additional context states. */
+	unsigned			flags;
+	unsigned			compute_cb_target_mask;
+	unsigned			db_shader_control;
+	struct r600_pipe_shader_selector 	*ps_shader;
+	struct r600_pipe_shader_selector 	*vs_shader;
+	struct r600_pipe_rasterizer	*rasterizer;
+	bool				alpha_to_one;
+	bool				force_blend_disable;
+	boolean				dual_src_blend;
 
-	struct radeon_winsys_cs	*cs;
+	/* Index buffer. */
+	struct pipe_index_buffer	index_buffer;
 
-	struct r600_range	*range;
-	unsigned		nblocks;
-	struct r600_block	**blocks;
-	struct list_head	dirty;
-	struct list_head	enable_list;
-	unsigned		pm4_dirty_cdwords;
-	unsigned		ctx_pm4_ndwords;
+	/* Last draw state (-1 = unset). */
+	int				last_primitive_type; /* Last primitive type used in draw_vbo. */
+	int				last_start_instance;
 
+	/* Queries. */
 	/* The list of active queries. Only one query of each type can be active. */
-	int			num_occlusion_queries;
-
+	int				num_occlusion_queries;
 	/* Manage queries in two separate groups:
 	 * The timer ones and the others (streamout, occlusion).
 	 *
 	 * We do this because we should only suspend non-timer queries for u_blitter,
 	 * and later if the non-timer queries are suspended, the context flush should
 	 * only suspend and resume the timer queries. */
-	struct list_head	active_timer_queries;
-	unsigned		num_cs_dw_timer_queries_suspend;
-	struct list_head	active_nontimer_queries;
-	unsigned		num_cs_dw_nontimer_queries_suspend;
-
-	bool			timer_queries_suspended;
-	bool			nontimer_queries_suspended;
-	bool			streamout_suspended;
-
-	unsigned		num_cs_dw_streamout_end;
-
-	unsigned		backend_mask;
-	unsigned                max_db; /* for OQ */
-	unsigned		flags;
-	boolean                 predicate_drawing;
-
-	unsigned		num_so_targets;
-	struct r600_so_target	*so_targets[PIPE_MAX_SO_BUFFERS];
-	boolean			streamout_start;
-	unsigned		streamout_append_bitmask;
-
-	/* With rasterizer discard, there doesn't have to be a pixel shader.
-	 * In that case, we bind this one: */
-	void			*dummy_pixel_shader;
-
-	boolean			dual_src_blend;
-
-	/* Index buffer. */
-	struct pipe_index_buffer index_buffer;
+	struct list_head		active_timer_queries;
+	unsigned			num_cs_dw_timer_queries_suspend;
+	struct list_head		active_nontimer_queries;
+	unsigned			num_cs_dw_nontimer_queries_suspend;
+	/* Flags if queries have been suspended. */
+	bool				timer_queries_suspended;
+	bool				nontimer_queries_suspended;
+
+	/* Render condition. */
+	struct pipe_query		*current_render_cond;
+	unsigned			current_render_cond_mode;
+	boolean				predicate_drawing;
 
-	/* Dummy CMASK and FMASK buffers used to get around the R6xx hardware
-	 * bug where valid CMASK and FMASK are required to be present to avoid
-	 * a hardlock in certain operations but aren't actually used
-	 * for anything useful. */
-	struct r600_resource *dummy_fmask;
-	struct r600_resource *dummy_cmask;
+	/* Streamout state. */
+	unsigned			num_cs_dw_streamout_end;
+	unsigned			num_so_targets;
+	struct r600_so_target		*so_targets[PIPE_MAX_SO_BUFFERS];
+	boolean				streamout_start;
+	unsigned			streamout_append_bitmask;
+	bool				streamout_suspended;
 
-	/* Last draw state (-1 = unset). */
-	int			last_primitive_type; /* Last primitive type used in draw_vbo. */
-	int			last_start_instance;
+	/* Deprecated state management. */
+	struct r600_pipe_state		*states[R600_PIPE_NSTATES];
+	struct r600_range		*range;
+	unsigned			nblocks;
+	struct r600_block		**blocks;
+	struct list_head		dirty;
+	struct list_head		enable_list;
+	unsigned			pm4_dirty_cdwords;
 };
 
 static INLINE void r600_emit_command_buffer(struct radeon_winsys_cs *cs,
diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c
index 76af2a7..d7e0430 100644
--- a/src/gallium/drivers/r600/r600_state.c
+++ b/src/gallium/drivers/r600/r600_state.c
@@ -2613,6 +2613,7 @@ void r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shad
 	unsigned tmp, sid, ufi = 0;
 	int need_linear = 0;
 	unsigned z_export = 0, stencil_export = 0;
+	unsigned sprite_coord_enable = rctx->rasterizer ? rctx->rasterizer->sprite_coord_enable : 0;
 
 	rstate->nregs = 0;
 
@@ -2633,7 +2634,7 @@ void r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shad
 			tmp |= S_028644_FLAT_SHADE(1);
 
 		if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC &&
-				rctx->sprite_coord_enable & (1 << rshader->input[i].sid)) {
+		    sprite_coord_enable & (1 << rshader->input[i].sid)) {
 			tmp |= S_028644_PT_SPRITE_TEX(1);
 		}
 
@@ -2717,7 +2718,7 @@ void r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shad
 	shader->db_shader_control = db_shader_control;
 	shader->ps_depth_export = z_export | stencil_export;
 
-	shader->sprite_coord_enable = rctx->sprite_coord_enable;
+	shader->sprite_coord_enable = sprite_coord_enable;
 	if (rctx->rasterizer)
 		shader->flatshade = rctx->rasterizer->flatshade;
 }
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index 3bc6d81..2be3bf4 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -306,11 +306,6 @@ static void r600_bind_rs_state(struct pipe_context *ctx, void *state)
 	if (state == NULL)
 		return;
 
-	rctx->sprite_coord_enable = rs->sprite_coord_enable;
-	rctx->two_side = rs->two_side;
-	rctx->pa_sc_line_stipple = rs->pa_sc_line_stipple;
-	rctx->multisample_enable = rs->multisample_enable;
-
 	rctx->rasterizer = rs;
 
 	rctx->states[rs->rstate.id] = &rs->rstate;
@@ -691,9 +686,9 @@ static INLINE struct r600_shader_key r600_shader_selector_key(struct pipe_contex
 	memset(&key, 0, sizeof(key));
 
 	if (sel->type == PIPE_SHADER_FRAGMENT) {
-		key.color_two_side = rctx->two_side;
+		key.color_two_side = rctx->rasterizer && rctx->rasterizer->two_side;
 		key.alpha_to_one = rctx->alpha_to_one &&
-				   rctx->multisample_enable &&
+				   rctx->rasterizer && rctx->rasterizer->multisample_enable &&
 				   !rctx->framebuffer.cb0_is_integer;
 		key.nr_cbufs = rctx->framebuffer.state.nr_cbufs;
 		/* Dual-source blending only makes sense with nr_cbufs == 1. */
@@ -1064,9 +1059,9 @@ static void r600_update_derived_state(struct r600_context *rctx)
 
 	r600_shader_select(ctx, rctx->ps_shader, &ps_dirty);
 
-	if (rctx->ps_shader && ((rctx->sprite_coord_enable &&
-		(rctx->ps_shader->current->sprite_coord_enable != rctx->sprite_coord_enable)) ||
-		(rctx->rasterizer && rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade))) {
+	if (rctx->ps_shader && rctx->rasterizer &&
+	    ((rctx->rasterizer->sprite_coord_enable != rctx->ps_shader->current->sprite_coord_enable) ||
+	     (rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade))) {
 
 		if (rctx->chip_class >= EVERGREEN)
 			evergreen_pipe_shader_ps(ctx, rctx->ps_shader->current);
@@ -1225,7 +1220,8 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info
 			ls_mask = 2;
 
 		r600_write_context_reg(cs, R_028A0C_PA_SC_LINE_STIPPLE,
-				       S_028A0C_AUTO_RESET_CNTL(ls_mask) | rctx->pa_sc_line_stipple);
+				       S_028A0C_AUTO_RESET_CNTL(ls_mask) |
+				       (rctx->rasterizer ? rctx->rasterizer->pa_sc_line_stipple : 0));
 		r600_write_context_reg(cs, R_028A6C_VGT_GS_OUT_PRIM_TYPE,
 				       r600_conv_prim_to_gs_out(info.mode));
 		r600_write_config_reg(cs, R_008958_VGT_PRIMITIVE_TYPE,
-- 
1.7.9.5



More information about the mesa-dev mailing list