Currently constant elements are specified only with stride = 0. However, drivers often need to know whether an element is constant or not when setting up the vertex element CSO instead of when setting the buffers.
Hence, in addition to stride = 0, also set instance_divisor = ~0 in the vertex element, in all places where Mesa sets up both at the same time. Drivers that ignore instancing will behave as before since stride = 0 is set too. Drivers that support instancing should continue to behave correctly, and if not can just ignore this divisor. Drivers that take advantage of this hint will however perform best. --- src/mesa/state_tracker/st_draw.c | 4 ++-- src/mesa/state_tracker/st_draw_feedback.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index 5b05489..ee69572 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -388,7 +388,7 @@ setup_interleaved_attribs(GLcontext *ctx, velements[attr].src_offset = (unsigned) (arrays[mesaAttr]->Ptr - offset0); - velements[attr].instance_divisor = 0; + velements[attr].instance_divisor = stride ? 0 : ~0; velements[attr].vertex_buffer_index = 0; velements[attr].src_format = st_pipe_vertex_format(arrays[mesaAttr]->Type, @@ -483,7 +483,7 @@ setup_non_interleaved_attribs(GLcontext *ctx, /* common-case setup */ vbuffer[attr].stride = stride; /* in bytes */ vbuffer[attr].max_index = max_index; - velements[attr].instance_divisor = 0; + velements[attr].instance_divisor = stride ? 0 : ~0; velements[attr].vertex_buffer_index = attr; velements[attr].src_format = st_pipe_vertex_format(arrays[mesaAttr]->Type, diff --git a/src/mesa/state_tracker/st_draw_feedback.c b/src/mesa/state_tracker/st_draw_feedback.c index 5cf2666..41c9ecc 100644 --- a/src/mesa/state_tracker/st_draw_feedback.c +++ b/src/mesa/state_tracker/st_draw_feedback.c @@ -180,7 +180,7 @@ st_feedback_draw_vbo(GLcontext *ctx, /* common-case setup */ vbuffers[attr].stride = arrays[mesaAttr]->StrideB; /* in bytes */ vbuffers[attr].max_index = max_index; - velements[attr].instance_divisor = 0; + velements[attr].instance_divisor = vbuffers[attr].stride ? 0 : ~0; velements[attr].vertex_buffer_index = attr; velements[attr].src_format = st_pipe_vertex_format(arrays[mesaAttr]->Type, -- 1.7.0.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev