X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmesa%2Fstate_tracker%2Fst_atom_array.c;h=0b5909ba11aab484ae33e1ecbcdca155743c998a;hb=9d9a2819ee0e862f60abf50ba239a341b664845a;hp=8075ecbd9a39991d97d4e8bed7bd8a13921b92fa;hpb=e3617fd00b311bd4f32886974c574ae55ba416fd;p=mesa.git diff --git a/src/mesa/state_tracker/st_atom_array.c b/src/mesa/state_tracker/st_atom_array.c index 8075ecbd9a3..0b5909ba11a 100644 --- a/src/mesa/state_tracker/st_atom_array.c +++ b/src/mesa/state_tracker/st_atom_array.c @@ -125,11 +125,14 @@ init_velement(const struct st_vertex_program *vp, /* ALWAYS_INLINE helps the compiler realize that most of the parameters are * on the stack. */ -void ALWAYS_INLINE +void +#ifndef _MSC_VER /* MSVC doesn't like inlining public functions */ +ALWAYS_INLINE +#endif st_setup_arrays(struct st_context *st, const struct st_vertex_program *vp, const struct st_common_variant *vp_variant, - struct pipe_vertex_element *velements, + struct cso_velems_state *velements, struct pipe_vertex_buffer *vbuffer, unsigned *num_vbuffers, bool *has_user_vertex_buffers) { @@ -153,7 +156,7 @@ st_setup_arrays(struct st_context *st, = _mesa_draw_buffer_binding(vao, i); const unsigned bufidx = (*num_vbuffers)++; - if (_mesa_is_bufferobj(binding->BufferObj)) { + if (binding->BufferObj) { /* Set the binding */ struct st_buffer_object *stobj = st_buffer_object(binding->BufferObj); @@ -181,7 +184,7 @@ st_setup_arrays(struct st_context *st, const struct gl_array_attributes *const attrib = _mesa_draw_array_attrib(vao, attr); const GLuint off = _mesa_draw_attributes_relative_offset(attrib); - init_velement(vp, velements, &attrib->Format, off, + init_velement(vp, velements->velems, &attrib->Format, off, binding->InstanceDivisor, bufidx, input_to_index[attr]); } while (attrmask); @@ -190,12 +193,15 @@ st_setup_arrays(struct st_context *st, /* ALWAYS_INLINE helps the compiler realize that most of the parameters are * on the stack. + * + * Return the index of the vertex buffer where current attribs have been + * uploaded. */ -void ALWAYS_INLINE +static int ALWAYS_INLINE st_setup_current(struct st_context *st, const struct st_vertex_program *vp, const struct st_common_variant *vp_variant, - struct pipe_vertex_element *velements, + struct cso_velems_state *velements, struct pipe_vertex_buffer *vbuffer, unsigned *num_vbuffers) { struct gl_context *ctx = st->ctx; @@ -222,8 +228,8 @@ st_setup_current(struct st_context *st, if (alignment != size) memset(cursor + size, 0, alignment - size); - init_velement(vp, velements, &attrib->Format, cursor - data, 0, - bufidx, input_to_index[attr]); + init_velement(vp, velements->velems, &attrib->Format, cursor - data, + 0, bufidx, input_to_index[attr]); cursor += alignment; } while (curmask); @@ -248,14 +254,16 @@ st_setup_current(struct st_context *st, &vbuffer[bufidx].buffer.resource); /* Always unmap. The uploader might use explicit flushes. */ u_upload_unmap(uploader); + return bufidx; } + return -1; } void st_setup_current_user(struct st_context *st, const struct st_vertex_program *vp, const struct st_common_variant *vp_variant, - struct pipe_vertex_element *velements, + struct cso_velems_state *velements, struct pipe_vertex_buffer *vbuffer, unsigned *num_vbuffers) { struct gl_context *ctx = st->ctx; @@ -271,7 +279,7 @@ st_setup_current_user(struct st_context *st, = _mesa_draw_current_attrib(ctx, attr); const unsigned bufidx = (*num_vbuffers)++; - init_velement(vp, velements, &attrib->Format, 0, 0, + init_velement(vp, velements->velems, &attrib->Format, 0, 0, bufidx, input_to_index[attr]); vbuffer[bufidx].is_user_buffer = true; @@ -290,37 +298,34 @@ st_update_array(struct st_context *st) const struct st_common_variant *vp_variant = st->vp_variant; struct pipe_vertex_buffer vbuffer[PIPE_MAX_ATTRIBS]; - unsigned num_vbuffers = 0, first_upload_vbuffer; - struct pipe_vertex_element velements[PIPE_MAX_ATTRIBS]; - unsigned num_velements; + unsigned num_vbuffers = 0; + struct cso_velems_state velements; bool uses_user_vertex_buffers; /* ST_NEW_VERTEX_ARRAYS alias ctx->DriverFlags.NewArray */ /* Setup arrays */ - st_setup_arrays(st, vp, vp_variant, velements, vbuffer, &num_vbuffers, + st_setup_arrays(st, vp, vp_variant, &velements, vbuffer, &num_vbuffers, &uses_user_vertex_buffers); /* _NEW_CURRENT_ATTRIB */ - /* Setup current uploads */ - first_upload_vbuffer = num_vbuffers; - st_setup_current(st, vp, vp_variant, velements, vbuffer, &num_vbuffers); + /* Setup zero-stride attribs. */ + int current_attrib_buffer = + st_setup_current(st, vp, vp_variant, &velements, vbuffer, &num_vbuffers); - /* Set the array into cso */ - num_velements = vp->num_inputs + vp_variant->key.passthrough_edgeflags; + velements.count = vp->num_inputs + vp_variant->key.passthrough_edgeflags; /* Set vertex buffers and elements. */ struct cso_context *cso = st->cso_context; unsigned unbind_trailing_vbuffers = st->last_num_vbuffers > num_vbuffers ? st->last_num_vbuffers - num_vbuffers : 0; - cso_set_vertex_buffers_and_elements(cso, num_velements, velements, + cso_set_vertex_buffers_and_elements(cso, &velements, num_vbuffers, unbind_trailing_vbuffers, vbuffer, uses_user_vertex_buffers); st->last_num_vbuffers = num_vbuffers; - /* Unreference uploaded buffer resources. */ - for (unsigned i = first_upload_vbuffer; i < num_vbuffers; ++i) { - pipe_resource_reference(&vbuffer[i].buffer.resource, NULL); - } + /* Unreference uploaded current attrib buffer. */ + if (current_attrib_buffer >= 0) + pipe_resource_reference(&vbuffer[current_attrib_buffer].buffer.resource, NULL); }