From 61e4c582e0fe246ac0d494a2391573f63e1ee0dc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 20 Jan 2020 22:14:11 -0500 Subject: [PATCH] st/mesa: always inline the code setting non-64bit vertex elements MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Mathias Fröhlich Part-of: --- src/mesa/state_tracker/st_atom_array.c | 109 ++++++++++++++----------- 1 file changed, 63 insertions(+), 46 deletions(-) diff --git a/src/mesa/state_tracker/st_atom_array.c b/src/mesa/state_tracker/st_atom_array.c index be1729311e2..bbbe0e236d3 100644 --- a/src/mesa/state_tracker/st_atom_array.c +++ b/src/mesa/state_tracker/st_atom_array.c @@ -50,7 +50,7 @@ #include "main/varray.h" #include "main/arrayobj.h" -static void init_velement(struct pipe_vertex_element *velement, +static void set_velement(struct pipe_vertex_element *velement, int src_offset, int format, int instance_divisor, int vbo_index) { @@ -61,50 +61,67 @@ static void init_velement(struct pipe_vertex_element *velement, assert(velement->src_format); } -static void init_velement_lowered(const struct st_vertex_program *vp, - struct pipe_vertex_element *velements, - const struct gl_vertex_format *vformat, - int src_offset, int instance_divisor, - int vbo_index, int idx) +static void init_velement_64bit(const struct st_vertex_program *vp, + struct pipe_vertex_element *velements, + const struct gl_vertex_format *vformat, + int src_offset, int instance_divisor, + int vbo_index, int idx) { const GLubyte nr_components = vformat->Size; - - if (vformat->Doubles) { - int lower_format; - - if (nr_components < 2) - lower_format = PIPE_FORMAT_R32G32_UINT; - else - lower_format = PIPE_FORMAT_R32G32B32A32_UINT; - - init_velement(&velements[idx], src_offset, - lower_format, instance_divisor, vbo_index); - idx++; - - if (idx < vp->num_inputs && - vp->index_to_input[idx] == ST_DOUBLE_ATTRIB_PLACEHOLDER) { - if (nr_components >= 3) { - if (nr_components == 3) - lower_format = PIPE_FORMAT_R32G32_UINT; - else - lower_format = PIPE_FORMAT_R32G32B32A32_UINT; - - init_velement(&velements[idx], src_offset + 4 * sizeof(float), - lower_format, instance_divisor, vbo_index); - } else { - /* The values here are undefined. Fill in some conservative - * dummy values. - */ - init_velement(&velements[idx], src_offset, PIPE_FORMAT_R32G32_UINT, - instance_divisor, vbo_index); - } + int lower_format; + + if (nr_components < 2) + lower_format = PIPE_FORMAT_R32G32_UINT; + else + lower_format = PIPE_FORMAT_R32G32B32A32_UINT; + + set_velement(&velements[idx], src_offset, + lower_format, instance_divisor, vbo_index); + idx++; + + if (idx < vp->num_inputs && + vp->index_to_input[idx] == ST_DOUBLE_ATTRIB_PLACEHOLDER) { + if (nr_components >= 3) { + if (nr_components == 3) + lower_format = PIPE_FORMAT_R32G32_UINT; + else + lower_format = PIPE_FORMAT_R32G32B32A32_UINT; + + set_velement(&velements[idx], src_offset + 4 * sizeof(float), + lower_format, instance_divisor, vbo_index); + } else { + /* The values here are undefined. Fill in some conservative + * dummy values. + */ + set_velement(&velements[idx], src_offset, PIPE_FORMAT_R32G32_UINT, + instance_divisor, vbo_index); } - } else { - init_velement(&velements[idx], src_offset, vformat->_PipeFormat, - instance_divisor, vbo_index); } } +/* Always inline the non-64bit element code, so that the compiler can see + * that velements is on the stack. + */ +static void ALWAYS_INLINE +init_velement(const struct st_vertex_program *vp, + struct pipe_vertex_element *velements, + const struct gl_vertex_format *vformat, + int src_offset, int instance_divisor, + int vbo_index, int idx) +{ + if (!vformat->Doubles) { + velements[idx].src_offset = src_offset; + velements[idx].src_format = vformat->_PipeFormat; + velements[idx].instance_divisor = instance_divisor; + velements[idx].vertex_buffer_index = vbo_index; + assert(velements[idx].src_format); + return; + } + + init_velement_64bit(vp, velements, vformat, src_offset, instance_divisor, + vbo_index, idx); +} + /* ALWAYS_INLINE helps the compiler realize that most of the parameters are * on the stack. */ @@ -163,9 +180,9 @@ 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_lowered(vp, velements, &attrib->Format, off, - binding->InstanceDivisor, bufidx, - input_to_index[attr]); + init_velement(vp, velements, &attrib->Format, off, + binding->InstanceDivisor, bufidx, + input_to_index[attr]); } } *has_user_vertex_buffers = uses_user_vertex_buffers; @@ -205,8 +222,8 @@ st_setup_current(struct st_context *st, if (alignment != size) memset(cursor + size, 0, alignment - size); - init_velement_lowered(vp, velements, &attrib->Format, cursor - data, 0, - bufidx, input_to_index[attr]); + init_velement(vp, velements, &attrib->Format, cursor - data, 0, + bufidx, input_to_index[attr]); cursor += alignment; } @@ -254,8 +271,8 @@ st_setup_current_user(struct st_context *st, = _mesa_draw_current_attrib(ctx, attr); const unsigned bufidx = (*num_vbuffers)++; - init_velement_lowered(vp, velements, &attrib->Format, 0, 0, - bufidx, input_to_index[attr]); + init_velement(vp, velements, &attrib->Format, 0, 0, + bufidx, input_to_index[attr]); vbuffer[bufidx].is_user_buffer = true; vbuffer[bufidx].buffer.user = attrib->Ptr; -- 2.30.2