[Mesa-dev] [PATCH 1/6] r600g: kill off the fallback for crazy src_offset values

Marek Olšák maraeo at gmail.com
Mon Apr 2 08:10:53 PDT 2012


st/mesa doesn't allow src_offset to be greater than stride and the maximum
stride r600 supports is 2047.
---
 src/gallium/drivers/r600/r600_asm.c          |   24 +++++----------
 src/gallium/drivers/r600/r600_pipe.h         |    5 ---
 src/gallium/drivers/r600/r600_state_common.c |   39 ++++++--------------------
 3 files changed, 17 insertions(+), 51 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_asm.c b/src/gallium/drivers/r600/r600_asm.c
index 00f1a8b..3298386 100644
--- a/src/gallium/drivers/r600/r600_asm.c
+++ b/src/gallium/drivers/r600/r600_asm.c
@@ -2712,18 +2712,6 @@ int r600_vertex_elements_build_fetch_shader(struct r600_context *rctx, struct r6
 	uint32_t *bytecode;
 	int i, r;
 
-	/* Vertex element offsets need special handling. If the offset is
-	 * bigger than what we can put in the fetch instruction we need to
-	 * alter the vertex resource offset. In order to simplify code we
-	 * will bind one resource per element in such cases. It's a worst
-	 * case scenario. */
-	for (i = 0; i < ve->count; i++) {
-		ve->vbuffer_offset[i] = C_SQ_VTX_WORD2_OFFSET & elements[i].src_offset;
-		if (ve->vbuffer_offset[i]) {
-			ve->vbuffer_need_offset = 1;
-		}
-	}
-
 	memset(&bc, 0, sizeof(bc));
 	r600_bytecode_init(&bc, rctx->chip_class, rctx->family);
 
@@ -2752,9 +2740,9 @@ int r600_vertex_elements_build_fetch_shader(struct r600_context *rctx, struct r6
 	}
 
 	for (i = 0; i < ve->count; i++) {
-		unsigned vbuffer_index;
 		r600_vertex_data_type(ve->elements[i].src_format,
 				      &format, &num_format, &format_comp, &endian);
+
 		desc = util_format_description(ve->elements[i].src_format);
 		if (desc == NULL) {
 			r600_bytecode_clear(&bc);
@@ -2762,10 +2750,14 @@ int r600_vertex_elements_build_fetch_shader(struct r600_context *rctx, struct r6
 			return -EINVAL;
 		}
 
-		/* see above for vbuffer_need_offset explanation */
-		vbuffer_index = elements[i].vertex_buffer_index;
+		if (elements[i].src_offset > 65535) {
+			r600_bytecode_clear(&bc);
+			R600_ERR("too big src_offset: %u\n", elements[i].src_offset);
+			return -EINVAL;
+		}
+
 		memset(&vtx, 0, sizeof(vtx));
-		vtx.buffer_id = (ve->vbuffer_need_offset ? i : vbuffer_index) + fetch_resource_start;
+		vtx.buffer_id = elements[i].vertex_buffer_index + fetch_resource_start;
 		vtx.fetch_type = elements[i].instance_divisor ? 1 : 0;
 		vtx.src_gpr = elements[i].instance_divisor > 1 ? i + 1 : 0;
 		vtx.src_sel_x = elements[i].instance_divisor ? 3 : 0;
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index ccbfaa7..96df79b 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -169,11 +169,6 @@ struct r600_vertex_element
 	struct r600_resource		*fetch_shader;
 	unsigned			fs_size;
 	struct r600_pipe_state		rstate;
-	/* if offset is to big for fetch instructio we need to alterate
-	 * offset of vertex buffer, record here the offset need to add
-	 */
-	unsigned			vbuffer_need_offset;
-	unsigned			vbuffer_offset[PIPE_MAX_ATTRIBS];
 };
 
 struct r600_pipe_shader {
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index f3b63cf..42b185c 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -682,40 +682,19 @@ void r600_set_so_targets(struct pipe_context *ctx,
 
 static void r600_vertex_buffer_update(struct r600_context *rctx)
 {
-	struct r600_pipe_resource_state *rstate;
-	struct r600_resource *rbuffer;
-	struct pipe_vertex_buffer *vertex_buffer;
-	unsigned i, count, offset;
+	unsigned i, count;
 
 	r600_inval_vertex_cache(rctx);
 
-	if (rctx->vertex_elements->vbuffer_need_offset) {
-		/* one resource per vertex elements */
-		count = rctx->vertex_elements->count;
-	} else {
-		/* bind vertex buffer once */
-		count = rctx->vbuf_mgr->nr_real_vertex_buffers;
-	}
+	count = rctx->vbuf_mgr->nr_real_vertex_buffers;
 
 	for (i = 0 ; i < count; i++) {
-		rstate = &rctx->fs_resource[i];
-
-		if (rctx->vertex_elements->vbuffer_need_offset) {
-			/* one resource per vertex elements */
-			unsigned vbuffer_index;
-			vbuffer_index = rctx->vertex_elements->elements[i].vertex_buffer_index;
-			vertex_buffer = &rctx->vbuf_mgr->real_vertex_buffer[vbuffer_index];
-			rbuffer = (struct r600_resource*)vertex_buffer->buffer;
-			offset = rctx->vertex_elements->vbuffer_offset[i];
-		} else {
-			/* bind vertex buffer once */
-			vertex_buffer = &rctx->vbuf_mgr->real_vertex_buffer[i];
-			rbuffer = (struct r600_resource*)vertex_buffer->buffer;
-			offset = 0;
-		}
-		if (vertex_buffer == NULL || rbuffer == NULL)
+		struct r600_pipe_resource_state *rstate = &rctx->fs_resource[i];
+		struct pipe_vertex_buffer *vb = &rctx->vbuf_mgr->real_vertex_buffer[i];
+
+		if (!vb->buffer) {
 			continue;
-		offset += vertex_buffer->buffer_offset;
+		}
 
 		if (!rstate->id) {
 			if (rctx->chip_class >= EVERGREEN) {
@@ -726,9 +705,9 @@ static void r600_vertex_buffer_update(struct r600_context *rctx)
 		}
 
 		if (rctx->chip_class >= EVERGREEN) {
-			evergreen_pipe_mod_buffer_resource(&rctx->context, rstate, rbuffer, offset, vertex_buffer->stride, RADEON_USAGE_READ);
+			evergreen_pipe_mod_buffer_resource(&rctx->context, rstate, (struct r600_resource*)vb->buffer, vb->buffer_offset, vb->stride, RADEON_USAGE_READ);
 		} else {
-			r600_pipe_mod_buffer_resource(rstate, rbuffer, offset, vertex_buffer->stride, RADEON_USAGE_READ);
+			r600_pipe_mod_buffer_resource(rstate, (struct r600_resource*)vb->buffer, vb->buffer_offset, vb->stride, RADEON_USAGE_READ);
 		}
 		r600_context_pipe_state_set_fs_resource(rctx, rstate, i);
 	}
-- 
1.7.5.4



More information about the mesa-dev mailing list