Mesa (main): st/mesa: remove lowering of 64-bit vertex attribs to 32 bits
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Aug 2 20:35:19 UTC 2021
Module: Mesa
Branch: main
Commit: 77c2b022a0c52d84b289bc836f30ce186a374d0d
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=77c2b022a0c52d84b289bc836f30ce186a374d0d
Author: Marek Olšák <marek.olsak at amd.com>
Date: Wed May 26 23:59:24 2021 -0400
st/mesa: remove lowering of 64-bit vertex attribs to 32 bits
pipe_context::create_vertex_elements_state lowers them now.
This removes a bunch of code that is no longer needed.
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11370>
---
src/mesa/main/varray.c | 4 +-
src/mesa/state_tracker/st_atom_array.c | 92 ++++++++--------------------------
src/mesa/state_tracker/st_program.c | 8 ---
src/mesa/state_tracker/st_program.h | 6 +--
4 files changed, 24 insertions(+), 86 deletions(-)
diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
index 50bae007d8e..4fc805ff9f9 100644
--- a/src/mesa/main/varray.c
+++ b/src/mesa/main/varray.c
@@ -467,9 +467,9 @@ vertex_format_to_pipe_format(GLubyte size, GLenum16 type, GLenum16 format,
assert(size >= 1 && size <= 4);
assert(format == GL_RGBA || format == GL_BGRA);
- /* 64-bit attributes are translated by drivers. */
+ /* Raw doubles use 64_UINT. */
if (doubles)
- return PIPE_FORMAT_NONE;
+ return PIPE_FORMAT_R64_UINT + size - 1;
switch (type) {
case GL_HALF_FLOAT_OES:
diff --git a/src/mesa/state_tracker/st_atom_array.c b/src/mesa/state_tracker/st_atom_array.c
index 53a45bcd08c..1b1d463a5c7 100644
--- a/src/mesa/state_tracker/st_atom_array.c
+++ b/src/mesa/state_tracker/st_atom_array.c
@@ -50,78 +50,21 @@
#include "main/varray.h"
#include "main/arrayobj.h"
-static void set_velement(struct pipe_vertex_element *velement,
- int src_offset, int format,
- int instance_divisor, int vbo_index)
-{
- velement->src_offset = src_offset;
- velement->src_format = format;
- velement->instance_divisor = instance_divisor;
- velement->vertex_buffer_index = vbo_index;
- velement->dual_slot = false;
- assert(velement->src_format);
-}
-
-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;
- 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);
- }
- }
-}
-
/* 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,
+init_velement(struct pipe_vertex_element *velements,
const struct gl_vertex_format *vformat,
int src_offset, int instance_divisor,
- int vbo_index, int idx)
+ int vbo_index, bool dual_slot, 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;
- velements[idx].dual_slot = false;
- assert(velements[idx].src_format);
- return;
- }
-
- init_velement_64bit(vp, velements, vformat, src_offset, instance_divisor,
- vbo_index, idx);
+ 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;
+ velements[idx].dual_slot = dual_slot;
+ assert(velements[idx].src_format);
}
/* ALWAYS_INLINE helps the compiler realize that most of the parameters are
@@ -138,6 +81,7 @@ setup_arrays(struct st_context *st,
struct gl_context *ctx = st->ctx;
const struct gl_vertex_array_object *vao = ctx->Array._DrawVAO;
const GLbitfield inputs_read = vp_variant->vert_attrib_mask;
+ const GLbitfield dual_slot_inputs = vp->Base.Base.DualSlotInputs;
const ubyte *input_to_index = vp->input_to_index;
/* Process attribute array data. */
@@ -172,8 +116,9 @@ setup_arrays(struct st_context *st,
vbuffer[bufidx].stride = binding->Stride; /* in bytes */
/* Set the vertex element. */
- init_velement(vp, velements->velems, &attrib->Format, 0,
+ init_velement(velements->velems, &attrib->Format, 0,
binding->InstanceDivisor, bufidx,
+ dual_slot_inputs & BITFIELD_BIT(attr),
input_to_index[attr]);
}
return;
@@ -213,8 +158,9 @@ 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->velems, &attrib->Format, off,
+ init_velement(velements->velems, &attrib->Format, off,
binding->InstanceDivisor, bufidx,
+ dual_slot_inputs & BITFIELD_BIT(attr),
input_to_index[attr]);
} while (attrmask);
}
@@ -247,6 +193,7 @@ st_setup_current(struct st_context *st,
{
struct gl_context *ctx = st->ctx;
const GLbitfield inputs_read = vp_variant->vert_attrib_mask;
+ const GLbitfield dual_slot_inputs = vp->Base.Base.DualSlotInputs;
/* Process values that should have better been uniforms in the application */
GLbitfield curmask = inputs_read & _mesa_draw_current_bits(ctx);
@@ -269,8 +216,9 @@ st_setup_current(struct st_context *st,
if (alignment != size)
memset(cursor + size, 0, alignment - size);
- init_velement(vp, velements->velems, &attrib->Format, cursor - data,
- 0, bufidx, input_to_index[attr]);
+ init_velement(velements->velems, &attrib->Format, cursor - data,
+ 0, bufidx, dual_slot_inputs & BITFIELD_BIT(attr),
+ input_to_index[attr]);
cursor += alignment;
} while (curmask);
@@ -307,6 +255,7 @@ st_setup_current_user(struct st_context *st,
{
struct gl_context *ctx = st->ctx;
const GLbitfield inputs_read = vp_variant->vert_attrib_mask;
+ const GLbitfield dual_slot_inputs = vp->Base.Base.DualSlotInputs;
const ubyte *input_to_index = vp->input_to_index;
/* Process values that should have better been uniforms in the application */
@@ -318,8 +267,9 @@ st_setup_current_user(struct st_context *st,
= _mesa_draw_current_attrib(ctx, attr);
const unsigned bufidx = (*num_vbuffers)++;
- init_velement(vp, velements->velems, &attrib->Format, 0, 0,
- bufidx, input_to_index[attr]);
+ init_velement(velements->velems, &attrib->Format, 0, 0,
+ bufidx, dual_slot_inputs & BITFIELD_BIT(attr),
+ input_to_index[attr]);
vbuffer[bufidx].is_user_buffer = true;
vbuffer[bufidx].buffer.user = attrib->Ptr;
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 40c8a2f98e5..81c6622ef79 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -431,12 +431,6 @@ st_prepare_vertex_program(struct st_program *stp)
stvp->input_to_index[attr] = stvp->num_inputs;
stvp->index_to_input[stvp->num_inputs] = attr;
stvp->num_inputs++;
-
- if ((stp->Base.DualSlotInputs & BITFIELD64_BIT(attr)) != 0) {
- /* add placeholder for second part of a double attribute */
- stvp->index_to_input[stvp->num_inputs] = ST_DOUBLE_ATTRIB_PLACEHOLDER;
- stvp->num_inputs++;
- }
}
}
/* pre-setup potentially unused edgeflag input */
@@ -984,8 +978,6 @@ st_get_common_variant(struct st_context *st,
unsigned num_inputs = stvp->num_inputs + key->passthrough_edgeflags;
for (unsigned index = 0; index < num_inputs; ++index) {
unsigned attr = stvp->index_to_input[index];
- if (attr == ST_DOUBLE_ATTRIB_PLACEHOLDER)
- continue;
v->vert_attrib_mask |= 1u << attr;
}
}
diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h
index 1a76260a286..ad8ffd0681c 100644
--- a/src/mesa/state_tracker/st_program.h
+++ b/src/mesa/state_tracker/st_program.h
@@ -47,8 +47,6 @@
extern "C" {
#endif
-#define ST_DOUBLE_ATTRIB_PLACEHOLDER 0xff
-
struct st_external_sampler_key
{
GLuint lower_nv12; /**< bitmask of 2 plane YUV samplers */
@@ -253,9 +251,7 @@ struct st_common_variant
/* Parameters which generated this variant. */
struct st_common_variant_key key;
- /* Bitfield of VERT_BIT_* bits matching vertex shader inputs,
- * but not include the high part of doubles.
- */
+ /* Bitfield of VERT_BIT_* bits matching vertex shader inputs. */
GLbitfield vert_attrib_mask;
};
More information about the mesa-commit
mailing list