panfrost: Emit the correct number of attributes
create_vertex_elements_state is sometimes called with a too large
num_elements argument, for example with util_blitter, which causes a
buffer overflow.
There is no documentation to forbid this practice, so don't rely on
so->num_elements being correct and instead use the vertex shader
attribute count, which matches the value used to allocate the
descriptors.
Use attributes_read_count rather than attribute_count because the
latter also includes images and PAN_VERTEX_ID/PAN_INSTANCE_ID.
Fixes: 76de3e691c
("panfrost: Merge attribute packing routines")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17447>
This commit is contained in:
parent
fe613a8de9
commit
379ae6d823
|
@ -2186,7 +2186,12 @@ panfrost_emit_vertex_data(struct panfrost_batch *batch,
|
|||
* addressing modes and now base is 64 aligned.
|
||||
*/
|
||||
|
||||
for (unsigned i = 0; i < so->num_elements; ++i) {
|
||||
/* While these are usually equal, they are not required to be. In some
|
||||
* cases, u_blitter passes too high a value for num_elements.
|
||||
*/
|
||||
assert(vs->info.attributes_read_count <= so->num_elements);
|
||||
|
||||
for (unsigned i = 0; i < vs->info.attributes_read_count; ++i) {
|
||||
unsigned vbi = so->pipe[i].vertex_buffer_index;
|
||||
struct pipe_vertex_buffer *buf = &ctx->vertex_buffers[vbi];
|
||||
|
||||
|
|
|
@ -215,8 +215,9 @@ GENX(pan_shader_compile)(nir_shader *s,
|
|||
|
||||
switch (info->stage) {
|
||||
case MESA_SHADER_VERTEX:
|
||||
info->attribute_count = util_bitcount64(s->info.inputs_read);
|
||||
info->attributes_read = s->info.inputs_read;
|
||||
info->attributes_read_count = util_bitcount64(info->attributes_read);
|
||||
info->attribute_count = info->attributes_read_count;
|
||||
|
||||
#if PAN_ARCH <= 5
|
||||
bool vertex_id = BITSET_TEST(s->info.system_values_read,
|
||||
|
|
|
@ -354,6 +354,7 @@ struct pan_shader_info {
|
|||
unsigned sampler_count;
|
||||
unsigned texture_count;
|
||||
unsigned ubo_count;
|
||||
unsigned attributes_read_count;
|
||||
unsigned attribute_count;
|
||||
unsigned attributes_read;
|
||||
|
||||
|
|
Loading…
Reference in New Issue