On Mon, Apr 2, 2012 at 11:10 AM, Marek Olšák <mar...@gmail.com> wrote: > st/mesa doesn't allow src_offset to be greater than stride and the maximum > stride r600 supports is 2047.
For 5/6, IIRC, in the early days of r600g there were some issues with the ordering of the flushes since the ddx flushes after for dst caches. Other than that, Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> > --- > 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 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev