diff options
| -rw-r--r-- | src/gallium/drivers/r600/evergreen_state.c | 122 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/r600_pipe.c | 3 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/r600_pipe.h | 4 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/r600_state.c | 132 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/r600_state_common.c | 139 | 
5 files changed, 142 insertions, 258 deletions
| diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c index 7fb64d2b65..8bafb5a06f 100644 --- a/src/gallium/drivers/r600/evergreen_state.c +++ b/src/gallium/drivers/r600/evergreen_state.c @@ -1328,30 +1328,6 @@ void evergreen_polygon_offset_update(struct r600_pipe_context *rctx)  	}  } -static void evergreen_spi_update(struct r600_pipe_context *rctx) -{ -	struct r600_pipe_shader *shader = rctx->ps_shader; -	struct r600_pipe_state rstate; -	struct r600_shader *rshader = &shader->shader; -	unsigned i, tmp; - -	rstate.nregs = 0; -	for (i = 0; i < rshader->ninput; i++) { -		tmp = S_028644_SEMANTIC(r600_find_vs_semantic_index(&rctx->vs_shader->shader, rshader, i)); -		if (rshader->input[i].name == TGSI_SEMANTIC_COLOR || -				rshader->input[i].name == TGSI_SEMANTIC_BCOLOR || -				rshader->input[i].name == TGSI_SEMANTIC_POSITION) { -			tmp |= S_028644_FLAT_SHADE(rctx->flatshade); -		} -		if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC && -			rctx->sprite_coord_enable & (1 << rshader->input[i].sid)) { -			tmp |= S_028644_PT_SPRITE_TEX(1); -		} -		r600_pipe_state_add_reg(&rstate, R_028644_SPI_PS_INPUT_CNTL_0 + i * 4, tmp, 0xFFFFFFFF, NULL); -	} -	r600_context_pipe_state_set(&rctx->ctx, &rstate); -} -  void evergreen_vertex_buffer_update(struct r600_pipe_context *rctx)  {  	struct r600_pipe_state *rstate; @@ -1431,104 +1407,6 @@ void evergreen_vertex_buffer_update(struct r600_pipe_context *rctx)  	}  } -int r600_conv_pipe_prim(unsigned pprim, unsigned *prim); - -void evergreen_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info) -{ -	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; -	struct r600_resource *rbuffer; -	u32 vgt_dma_index_type, vgt_draw_initiator, mask; -	struct r600_draw rdraw; -	struct r600_pipe_state vgt; -	struct r600_drawl draw = {}; -	unsigned prim; - -	draw.info = *info; -	draw.ctx = ctx; -	if (info->indexed && rctx->index_buffer.buffer) { -		draw.info.start += rctx->index_buffer.offset / rctx->index_buffer.index_size; - -		r600_translate_index_buffer(rctx, &rctx->index_buffer.buffer, -					    &rctx->index_buffer.index_size, -					    &draw.info.start, -					    info->count); - -		draw.index_size = rctx->index_buffer.index_size; -		pipe_resource_reference(&draw.index_buffer, rctx->index_buffer.buffer); -		draw.index_buffer_offset = draw.info.start * draw.index_size; -		draw.info.start = 0; -		r600_upload_index_buffer(rctx, &draw); -	} else { -		draw.info.index_bias = info->start; -	} - -	switch (draw.index_size) { -	case 2: -		vgt_draw_initiator = 0; -		vgt_dma_index_type = 0; -		break; -	case 4: -		vgt_draw_initiator = 0; -		vgt_dma_index_type = 1; -		break; -	case 0: -		vgt_draw_initiator = 2; -		vgt_dma_index_type = 0; -		break; -	default: -		R600_ERR("unsupported index size %d\n", draw.index_size); -		return; -	} -	if (r600_conv_pipe_prim(draw.info.mode, &prim)) -		return; -	if (unlikely(rctx->ps_shader == NULL)) { -		R600_ERR("missing vertex shader\n"); -		return; -	} -	if (unlikely(rctx->vs_shader == NULL)) { -		R600_ERR("missing vertex shader\n"); -		return; -	} -	/* there should be enough input */ -	if (rctx->vertex_elements->count < rctx->vs_shader->shader.bc.nresource) { -		R600_ERR("%d resources provided, expecting %d\n", -			rctx->vertex_elements->count, rctx->vs_shader->shader.bc.nresource); -		return; -	} - -	evergreen_spi_update(rctx); - -	mask = 0; -	for (int i = 0; i < rctx->framebuffer.nr_cbufs; i++) { -		mask |= (0xF << (i * 4)); -	} - -	vgt.id = R600_PIPE_STATE_VGT; -	vgt.nregs = 0; -	r600_pipe_state_add_reg(&vgt, R_008958_VGT_PRIMITIVE_TYPE, prim, 0xFFFFFFFF, NULL); -	r600_pipe_state_add_reg(&vgt, R_028408_VGT_INDX_OFFSET, draw.info.index_bias, 0xFFFFFFFF, NULL); -	r600_pipe_state_add_reg(&vgt, R_028238_CB_TARGET_MASK, rctx->cb_target_mask & mask, 0xFFFFFFFF, NULL); -	r600_pipe_state_add_reg(&vgt, R_028400_VGT_MAX_VTX_INDX, draw.info.max_index, 0xFFFFFFFF, NULL); -	r600_pipe_state_add_reg(&vgt, R_028404_VGT_MIN_VTX_INDX, draw.info.min_index, 0xFFFFFFFF, NULL); -	r600_pipe_state_add_reg(&vgt, R_03CFF0_SQ_VTX_BASE_VTX_LOC, 0, 0xFFFFFFFF, NULL); -	r600_pipe_state_add_reg(&vgt, R_03CFF4_SQ_VTX_START_INST_LOC, 0, 0xFFFFFFFF, NULL); -	r600_context_pipe_state_set(&rctx->ctx, &vgt); - -	rdraw.vgt_num_indices = draw.info.count; -	rdraw.vgt_num_instances = 1; -	rdraw.vgt_index_type = vgt_dma_index_type; -	rdraw.vgt_draw_initiator = vgt_draw_initiator; -	rdraw.indices = NULL; -	if (draw.index_buffer) { -		rbuffer = (struct r600_resource*)draw.index_buffer; -		rdraw.indices = rbuffer->bo; -		rdraw.indices_bo_offset = draw.index_buffer_offset; -	} -	evergreen_context_draw(&rctx->ctx, &rdraw); - -	pipe_resource_reference(&draw.index_buffer, NULL); -} -  void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader)  {  	struct r600_pipe_state *rstate = &shader->rstate; diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index 71054fe4d5..45c093121d 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -123,6 +123,7 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void  	r600_init_query_functions(rctx);  	r600_init_context_resource_functions(rctx);  	r600_init_surface_functions(rctx); +	rctx->context.draw_vbo = r600_draw_vbo;  	switch (r600_get_family(rctx->radeon)) {  	case CHIP_R600: @@ -137,7 +138,6 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void  	case CHIP_RV730:  	case CHIP_RV710:  	case CHIP_RV740: -		rctx->context.draw_vbo = r600_draw_vbo;  		r600_init_state_functions(rctx);  		if (r600_context_init(&rctx->ctx, rctx->radeon)) {  			r600_destroy_context(&rctx->context); @@ -154,7 +154,6 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void  	case CHIP_BARTS:  	case CHIP_TURKS:  	case CHIP_CAICOS: -		rctx->context.draw_vbo = evergreen_draw_vbo;  		evergreen_init_state_functions(rctx);  		if (evergreen_context_init(&rctx->ctx, rctx->radeon)) {  			r600_destroy_context(&rctx->context); diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h index 94912680c2..cd3c965b83 100644 --- a/src/gallium/drivers/r600/r600_pipe.h +++ b/src/gallium/drivers/r600/r600_pipe.h @@ -181,7 +181,6 @@ struct r600_drawl {  /* evergreen_state.c */  void evergreen_init_state_functions(struct r600_pipe_context *rctx);  void evergreen_init_config(struct r600_pipe_context *rctx); -void evergreen_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info);  void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader);  void evergreen_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader);  void *evergreen_create_db_flush_dsa(struct r600_pipe_context *rctx); @@ -221,7 +220,7 @@ int r600_find_vs_semantic_index(struct r600_shader *vs,  /* r600_state.c */  void r600_init_state_functions(struct r600_pipe_context *rctx); -void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info); +void r600_spi_update(struct r600_pipe_context *rctx);  void r600_init_config(struct r600_pipe_context *rctx);  void *r600_create_db_flush_dsa(struct r600_pipe_context *rctx);  void r600_polygon_offset_update(struct r600_pipe_context *rctx); @@ -270,6 +269,7 @@ void r600_bind_ps_shader(struct pipe_context *ctx, void *state);  void r600_bind_vs_shader(struct pipe_context *ctx, void *state);  void r600_delete_ps_shader(struct pipe_context *ctx, void *state);  void r600_delete_vs_shader(struct pipe_context *ctx, void *state); +void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info);  /*   * common helpers diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c index 8501caf09e..5f7b09b577 100644 --- a/src/gallium/drivers/r600/r600_state.c +++ b/src/gallium/drivers/r600/r600_state.c @@ -94,36 +94,6 @@ void r600_polygon_offset_update(struct r600_pipe_context *rctx)  	}  } -/* FIXME optimize away spi update when it's not needed */ -static void r600_spi_update(struct r600_pipe_context *rctx) -{ -	struct r600_pipe_shader *shader = rctx->ps_shader; -	struct r600_pipe_state rstate; -	struct r600_shader *rshader = &shader->shader; -	unsigned i, tmp; - -	rstate.nregs = 0; -	for (i = 0; i < rshader->ninput; i++) { -		tmp = S_028644_SEMANTIC(r600_find_vs_semantic_index(&rctx->vs_shader->shader, rshader, i)); -		if (rshader->input[i].centroid) -			tmp |= S_028644_SEL_CENTROID(1); -		if (rshader->input[i].interpolate == TGSI_INTERPOLATE_LINEAR) -			tmp |= S_028644_SEL_LINEAR(1); - -		if (rshader->input[i].name == TGSI_SEMANTIC_COLOR || -		    rshader->input[i].name == TGSI_SEMANTIC_BCOLOR || -		    rshader->input[i].name == TGSI_SEMANTIC_POSITION) { -			tmp |= S_028644_FLAT_SHADE(rctx->flatshade); -		} -		if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC && -			rctx->sprite_coord_enable & (1 << rshader->input[i].sid)) { -			tmp |= S_028644_PT_SPRITE_TEX(1); -		} -		r600_pipe_state_add_reg(&rstate, R_028644_SPI_PS_INPUT_CNTL_0 + i * 4, tmp, 0xFFFFFFFF, NULL); -	} -	r600_context_pipe_state_set(&rctx->ctx, &rstate); -} -  void r600_vertex_buffer_update(struct r600_pipe_context *rctx)  {  	struct r600_pipe_state *rstate; @@ -197,108 +167,6 @@ void r600_vertex_buffer_update(struct r600_pipe_context *rctx)  	}  } -static void r600_draw_common(struct r600_drawl *draw) -{ -	struct r600_pipe_context *rctx = (struct r600_pipe_context *)draw->ctx; -	struct r600_resource *rbuffer; -	unsigned prim; -	u32 vgt_dma_index_type, vgt_draw_initiator, mask; -	struct r600_draw rdraw; -	struct r600_pipe_state vgt; - -	switch (draw->index_size) { -	case 2: -		vgt_draw_initiator = 0; -		vgt_dma_index_type = 0; -		break; -	case 4: -		vgt_draw_initiator = 0; -		vgt_dma_index_type = 1; -		break; -	case 0: -		vgt_draw_initiator = 2; -		vgt_dma_index_type = 0; -		break; -	default: -		R600_ERR("unsupported index size %d\n", draw->index_size); -		return; -	} -	if (r600_conv_pipe_prim(draw->info.mode, &prim)) -		return; -	if (unlikely(rctx->ps_shader == NULL)) { -		R600_ERR("missing vertex shader\n"); -		return; -	} -	if (unlikely(rctx->vs_shader == NULL)) { -		R600_ERR("missing vertex shader\n"); -		return; -	} -	/* there should be enough input */ -	if (rctx->vertex_elements->count < rctx->vs_shader->shader.bc.nresource) { -		R600_ERR("%d resources provided, expecting %d\n", -			rctx->vertex_elements->count, rctx->vs_shader->shader.bc.nresource); -		return; -	} - -	r600_spi_update(rctx); - -	mask = 0; -	for (int i = 0; i < rctx->framebuffer.nr_cbufs; i++) { -		mask |= (0xF << (i * 4)); -	} - -	vgt.id = R600_PIPE_STATE_VGT; -	vgt.nregs = 0; -	r600_pipe_state_add_reg(&vgt, R_008958_VGT_PRIMITIVE_TYPE, prim, 0xFFFFFFFF, NULL); -	r600_pipe_state_add_reg(&vgt, R_028408_VGT_INDX_OFFSET, draw->info.index_bias, 0xFFFFFFFF, NULL); -	r600_pipe_state_add_reg(&vgt, R_028400_VGT_MAX_VTX_INDX, draw->info.max_index, 0xFFFFFFFF, NULL); -	r600_pipe_state_add_reg(&vgt, R_028404_VGT_MIN_VTX_INDX, draw->info.min_index, 0xFFFFFFFF, NULL); -	r600_pipe_state_add_reg(&vgt, R_028238_CB_TARGET_MASK, rctx->cb_target_mask & mask, 0xFFFFFFFF, NULL); -	r600_pipe_state_add_reg(&vgt, R_03CFF0_SQ_VTX_BASE_VTX_LOC, 0, 0xFFFFFFFF, NULL); -	r600_pipe_state_add_reg(&vgt, R_03CFF4_SQ_VTX_START_INST_LOC, 0, 0xFFFFFFFF, NULL); -	r600_context_pipe_state_set(&rctx->ctx, &vgt); - -	rdraw.vgt_num_indices = draw->info.count; -	rdraw.vgt_num_instances = 1; -	rdraw.vgt_index_type = vgt_dma_index_type; -	rdraw.vgt_draw_initiator = vgt_draw_initiator; -	rdraw.indices = NULL; -	if (draw->index_buffer) { -		rbuffer = (struct r600_resource*)draw->index_buffer; -		rdraw.indices = rbuffer->bo; -		rdraw.indices_bo_offset = draw->index_buffer_offset; -	} -	r600_context_draw(&rctx->ctx, &rdraw); -} - -void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info) -{ -	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; -	struct r600_drawl draw = {}; - -	draw.info = *info; -	draw.ctx = ctx; -	if (info->indexed && rctx->index_buffer.buffer) { -		draw.info.start += rctx->index_buffer.offset / rctx->index_buffer.index_size; - -		r600_translate_index_buffer(rctx, &rctx->index_buffer.buffer, -					    &rctx->index_buffer.index_size, -					    &draw.info.start, -					    info->count); - -		draw.index_size = rctx->index_buffer.index_size; -		pipe_resource_reference(&draw.index_buffer, rctx->index_buffer.buffer); -		draw.index_buffer_offset = draw.info.start * draw.index_size; -		draw.info.start = 0; -		r600_upload_index_buffer(rctx, &draw); -	} else { -		draw.info.index_bias = info->start; -	} -	r600_draw_common(&draw); - -	pipe_resource_reference(&draw.index_buffer, NULL); -} -  static void r600_set_blend_color(struct pipe_context *ctx,  					const struct pipe_blend_color *state)  { diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index 9c4fd3b16d..050ed7e029 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -27,7 +27,9 @@  #include <util/u_memory.h>  #include <util/u_format.h>  #include <pipebuffer/pb_buffer.h> +#include "pipe/p_shader_tokens.h"  #include "r600_pipe.h" +#include "r600d.h"  /* common state between evergreen and r600 */  void r600_bind_blend_state(struct pipe_context *ctx, void *state) @@ -327,3 +329,140 @@ void r600_delete_vs_shader(struct pipe_context *ctx, void *state)  	r600_pipe_shader_destroy(ctx, shader);  	free(shader);  } + +/* FIXME optimize away spi update when it's not needed */ +void r600_spi_update(struct r600_pipe_context *rctx) +{ +	struct r600_pipe_shader *shader = rctx->ps_shader; +	struct r600_pipe_state rstate; +	struct r600_shader *rshader = &shader->shader; +	unsigned i, tmp; + +	rstate.nregs = 0; +	for (i = 0; i < rshader->ninput; i++) { +		tmp = S_028644_SEMANTIC(r600_find_vs_semantic_index(&rctx->vs_shader->shader, rshader, i)); + +		if (rshader->input[i].name == TGSI_SEMANTIC_COLOR || +		    rshader->input[i].name == TGSI_SEMANTIC_BCOLOR || +		    rshader->input[i].name == TGSI_SEMANTIC_POSITION) { +			tmp |= S_028644_FLAT_SHADE(rctx->flatshade); +		} + +		if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC && +		    rctx->sprite_coord_enable & (1 << rshader->input[i].sid)) { +			tmp |= S_028644_PT_SPRITE_TEX(1); +		} + +                if (rctx->family < CHIP_CEDAR) { +                    if (rshader->input[i].centroid) +                            tmp |= S_028644_SEL_CENTROID(1); + +                    if (rshader->input[i].interpolate == TGSI_INTERPOLATE_LINEAR) +                            tmp |= S_028644_SEL_LINEAR(1); +                } + +		r600_pipe_state_add_reg(&rstate, R_028644_SPI_PS_INPUT_CNTL_0 + i * 4, tmp, 0xFFFFFFFF, NULL); +	} +	r600_context_pipe_state_set(&rctx->ctx, &rstate); +} + +void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info) +{ +	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; +	struct r600_resource *rbuffer; +	u32 vgt_dma_index_type, vgt_draw_initiator, mask; +	struct r600_draw rdraw; +	struct r600_pipe_state vgt; +	struct r600_drawl draw = {}; +	unsigned prim; + +	draw.info = *info; +	draw.ctx = ctx; +	if (info->indexed && rctx->index_buffer.buffer) { +		draw.info.start += rctx->index_buffer.offset / rctx->index_buffer.index_size; + +		r600_translate_index_buffer(rctx, &rctx->index_buffer.buffer, +					    &rctx->index_buffer.index_size, +					    &draw.info.start, +					    info->count); + +		draw.index_size = rctx->index_buffer.index_size; +		pipe_resource_reference(&draw.index_buffer, rctx->index_buffer.buffer); +		draw.index_buffer_offset = draw.info.start * draw.index_size; +		draw.info.start = 0; +		r600_upload_index_buffer(rctx, &draw); +	} else { +		draw.info.index_bias = info->start; +	} + +	switch (draw.index_size) { +	case 2: +		vgt_draw_initiator = 0; +		vgt_dma_index_type = 0; +		break; +	case 4: +		vgt_draw_initiator = 0; +		vgt_dma_index_type = 1; +		break; +	case 0: +		vgt_draw_initiator = 2; +		vgt_dma_index_type = 0; +		break; +	default: +		R600_ERR("unsupported index size %d\n", draw.index_size); +		return; +	} +	if (r600_conv_pipe_prim(draw.info.mode, &prim)) +		return; +	if (unlikely(rctx->ps_shader == NULL)) { +		R600_ERR("missing vertex shader\n"); +		return; +	} +	if (unlikely(rctx->vs_shader == NULL)) { +		R600_ERR("missing vertex shader\n"); +		return; +	} +	/* there should be enough input */ +	if (rctx->vertex_elements->count < rctx->vs_shader->shader.bc.nresource) { +		R600_ERR("%d resources provided, expecting %d\n", +			rctx->vertex_elements->count, rctx->vs_shader->shader.bc.nresource); +		return; +	} + +	r600_spi_update(rctx); + +	mask = 0; +	for (int i = 0; i < rctx->framebuffer.nr_cbufs; i++) { +		mask |= (0xF << (i * 4)); +	} + +	vgt.id = R600_PIPE_STATE_VGT; +	vgt.nregs = 0; +	r600_pipe_state_add_reg(&vgt, R_008958_VGT_PRIMITIVE_TYPE, prim, 0xFFFFFFFF, NULL); +	r600_pipe_state_add_reg(&vgt, R_028408_VGT_INDX_OFFSET, draw.info.index_bias, 0xFFFFFFFF, NULL); +	r600_pipe_state_add_reg(&vgt, R_028400_VGT_MAX_VTX_INDX, draw.info.max_index, 0xFFFFFFFF, NULL); +	r600_pipe_state_add_reg(&vgt, R_028404_VGT_MIN_VTX_INDX, draw.info.min_index, 0xFFFFFFFF, NULL); +	r600_pipe_state_add_reg(&vgt, R_028238_CB_TARGET_MASK, rctx->cb_target_mask & mask, 0xFFFFFFFF, NULL); +	r600_pipe_state_add_reg(&vgt, R_03CFF0_SQ_VTX_BASE_VTX_LOC, 0, 0xFFFFFFFF, NULL); +	r600_pipe_state_add_reg(&vgt, R_03CFF4_SQ_VTX_START_INST_LOC, 0, 0xFFFFFFFF, NULL); +	r600_context_pipe_state_set(&rctx->ctx, &vgt); + +	rdraw.vgt_num_indices = draw.info.count; +	rdraw.vgt_num_instances = 1; +	rdraw.vgt_index_type = vgt_dma_index_type; +	rdraw.vgt_draw_initiator = vgt_draw_initiator; +	rdraw.indices = NULL; +	if (draw.index_buffer) { +		rbuffer = (struct r600_resource*)draw.index_buffer; +		rdraw.indices = rbuffer->bo; +		rdraw.indices_bo_offset = draw.index_buffer_offset; +	} + +	if (rctx->family >= CHIP_CEDAR) { +		evergreen_context_draw(&rctx->ctx, &rdraw); +	} else { +		r600_context_draw(&rctx->ctx, &rdraw); +	} + +	pipe_resource_reference(&draw.index_buffer, NULL); +} | 
