X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_draw_feedback.c;h=eb05ac96696719feab60ad05da02a5ebaae864b5;hb=4a29ee186195ab38a81280cefb6a476e3763da11;hp=9d68777cfe72bf7f7f5f6afd956b7f97296f3833;hpb=070072ad43bb41624d271f10697ea21a776b1ec1;p=mesa.git diff --git a/src/mesa/state_tracker/st_draw_feedback.c b/src/mesa/state_tracker/st_draw_feedback.c index 9d68777cfe7..eb05ac96696 100644 --- a/src/mesa/state_tracker/st_draw_feedback.c +++ b/src/mesa/state_tracker/st_draw_feedback.c @@ -26,8 +26,10 @@ **************************************************************************/ #include "main/imports.h" +#include "main/arrayobj.h" #include "main/image.h" #include "main/macros.h" +#include "main/varray.h" #include "vbo/vbo.h" @@ -128,12 +130,9 @@ st_feedback_draw_vbo(struct gl_context *ctx, const struct pipe_shader_state *vs; struct pipe_vertex_buffer vbuffers[PIPE_MAX_SHADER_INPUTS]; struct pipe_vertex_element velements[PIPE_MAX_ATTRIBS]; - struct pipe_index_buffer ibuffer; struct pipe_transfer *vb_transfer[PIPE_MAX_ATTRIBS] = {NULL}; struct pipe_transfer *ib_transfer = NULL; - const struct gl_vertex_array **arrays = ctx->Array._DrawArrays; GLuint attr, i; - const GLubyte *low_addr = NULL; const void *mapped_indices = NULL; if (!draw) @@ -168,65 +167,52 @@ st_feedback_draw_vbo(struct gl_context *ctx, draw_bind_vertex_shader(draw, st->vp_variant->draw_shader); set_feedback_vertex_format(ctx); - /* Find the lowest address of the arrays we're drawing */ - if (vp->num_inputs) { - low_addr = arrays[vp->index_to_input[0]]->Ptr; - - for (attr = 1; attr < vp->num_inputs; attr++) { - const GLubyte *start = arrays[vp->index_to_input[attr]]->Ptr; - low_addr = MIN2(low_addr, start); - } - } - /* loop over TGSI shader inputs to determine vertex buffer * and attribute info */ for (attr = 0; attr < vp->num_inputs; attr++) { const GLuint mesaAttr = vp->index_to_input[attr]; - struct gl_buffer_object *bufobj = arrays[mesaAttr]->BufferObj; + const struct gl_vertex_buffer_binding *binding; + const struct gl_array_attributes *attrib; void *map; - if (bufobj && bufobj->Name) { - /* Attribute data is in a VBO. - * Recall that for VBOs, the gl_vertex_array->Ptr field is - * really an offset from the start of the VBO, not a pointer. - */ - struct st_buffer_object *stobj = st_buffer_object(bufobj); + _mesa_draw_attrib_and_binding(ctx, mesaAttr, &attrib, &binding); + + if (_mesa_is_bufferobj(binding->BufferObj)) { + /* Attribute data is in a VBO. */ + struct st_buffer_object *stobj = st_buffer_object(binding->BufferObj); assert(stobj->buffer); - vbuffers[attr].buffer = NULL; - vbuffers[attr].user_buffer = NULL; - pipe_resource_reference(&vbuffers[attr].buffer, stobj->buffer); - vbuffers[attr].buffer_offset = pointer_to_offset(low_addr); - velements[attr].src_offset = arrays[mesaAttr]->Ptr - low_addr; + vbuffers[attr].buffer.resource = NULL; + vbuffers[attr].is_user_buffer = false; + pipe_resource_reference(&vbuffers[attr].buffer.resource, stobj->buffer); + vbuffers[attr].buffer_offset = _mesa_draw_binding_offset(binding); + velements[attr].src_offset = + _mesa_draw_attributes_relative_offset(attrib); /* map the attrib buffer */ - map = pipe_buffer_map(pipe, vbuffers[attr].buffer, + map = pipe_buffer_map(pipe, vbuffers[attr].buffer.resource, PIPE_TRANSFER_READ, &vb_transfer[attr]); draw_set_mapped_vertex_buffer(draw, attr, map, - vbuffers[attr].buffer->width0); + vbuffers[attr].buffer.resource->width0); } else { - vbuffers[attr].buffer = NULL; - vbuffers[attr].user_buffer = arrays[mesaAttr]->Ptr; + /* Attribute data is in a user space array. */ + vbuffers[attr].buffer.user = attrib->Ptr; + vbuffers[attr].is_user_buffer = true; vbuffers[attr].buffer_offset = 0; velements[attr].src_offset = 0; - draw_set_mapped_vertex_buffer(draw, attr, vbuffers[attr].user_buffer, - ~0); + draw_set_mapped_vertex_buffer(draw, attr, + vbuffers[attr].buffer.user, ~0); } /* common-case setup */ - vbuffers[attr].stride = arrays[mesaAttr]->StrideB; /* in bytes */ + vbuffers[attr].stride = binding->Stride; /* in bytes */ velements[attr].instance_divisor = 0; velements[attr].vertex_buffer_index = attr; - velements[attr].src_format = - st_pipe_vertex_format(arrays[mesaAttr]->Type, - arrays[mesaAttr]->Size, - arrays[mesaAttr]->Format, - arrays[mesaAttr]->Normalized, - arrays[mesaAttr]->Integer); + velements[attr].src_format = st_pipe_vertex_format(attrib); assert(velements[attr].src_format); /* tell draw about this attribute */ @@ -238,31 +224,29 @@ st_feedback_draw_vbo(struct gl_context *ctx, draw_set_vertex_buffers(draw, 0, vp->num_inputs, vbuffers); draw_set_vertex_elements(draw, vp->num_inputs, velements); - memset(&ibuffer, 0, sizeof(ibuffer)); + unsigned start = 0; + if (ib) { struct gl_buffer_object *bufobj = ib->obj; + unsigned index_size = ib->index_size; - ibuffer.index_size = ib->index_size; - if (ibuffer.index_size == 0) + if (index_size == 0) goto out_unref_vertex; if (bufobj && bufobj->Name) { struct st_buffer_object *stobj = st_buffer_object(bufobj); - pipe_resource_reference(&ibuffer.buffer, stobj->buffer); - ibuffer.offset = pointer_to_offset(ib->ptr); - + start = pointer_to_offset(ib->ptr) / index_size; mapped_indices = pipe_buffer_map(pipe, stobj->buffer, PIPE_TRANSFER_READ, &ib_transfer); } else { - /* skip setting ibuffer.buffer as the draw module does not use it */ mapped_indices = ib->ptr; } draw_set_indexes(draw, - (ubyte *) mapped_indices + ibuffer.offset, - ibuffer.index_size, ~0); + (ubyte *) mapped_indices, + index_size, ~0); } /* set the constant buffer */ @@ -273,7 +257,7 @@ st_feedback_draw_vbo(struct gl_context *ctx, /* draw here */ for (i = 0; i < nr_prims; i++) { - draw_arrays(draw, prims[i].mode, prims[i].start, prims[i].count); + draw_arrays(draw, prims[i].mode, start + prims[i].start, prims[i].count); } @@ -284,7 +268,6 @@ st_feedback_draw_vbo(struct gl_context *ctx, draw_set_indexes(draw, NULL, 0, 0); if (ib_transfer) pipe_buffer_unmap(pipe, ib_transfer); - pipe_resource_reference(&ibuffer.buffer, NULL); } out_unref_vertex: @@ -292,7 +275,7 @@ st_feedback_draw_vbo(struct gl_context *ctx, if (vb_transfer[attr]) pipe_buffer_unmap(pipe, vb_transfer[attr]); draw_set_mapped_vertex_buffer(draw, attr, NULL, 0); - pipe_resource_reference(&vbuffers[attr].buffer, NULL); + pipe_vertex_buffer_unreference(&vbuffers[attr]); } draw_set_vertex_buffers(draw, 0, vp->num_inputs, NULL); }