I recently posted a patch that would set instance_divisor to 0xffffffff for constant elements, so that the driver could take that knowledge into account when creating the vertex elements CSO.
However, in Direct3D 11, the instance id system value is specified as a 32-bit unsigned integers, which can wrap to 0 and thus assume the value 0xffffffff. Hence, such a divisor would have a different meaning in Direct3D 11, so my approach was the wrong one. Here is a new approach, which instead adds a new field to pipe_vertex_element called "frequency", which indicates whether the element is per-vertex, per-instance or constant. Direct3D 11 has a similar feature with the InputSlotClass field in D3D11_INPUT_ELEMENT_DESC, but lacks support for constant elements, since these are needed only to support "legacy OpenGL style" immediate attribute specification. Note that currently draw uses translate in a suboptimal way to duplicate constant and per-instance elements. While translate could be improved to not repeatedly fetch them, the real fix should be applied to draw (but this probably doesn't matter because draw_llvm doesn't seem to use translate). draw_llvm could also perhaps use fetching constant elements only once: this patchset only eliminates the stride multiplication and index bounds checking. We could theoretically add only a "constant vs non-constant field" instead, but this wouldn't reduce the lines of code changed, and deviates needlessly from Direct3D 11. Luca Barbieri (4): gallium: introduce explicit frequency declaration for vertex elements gallium: set frequency = PIPE_ELEMENT_FREQUENCY_PER_VERTEX explicitly mesa/st: specify constant frequency for elements draw: optimize for vertex element frequency (esp. draw_llvm) src/gallium/auxiliary/draw/draw_llvm.c | 54 ++++++++++++---------- src/gallium/auxiliary/draw/draw_pt.c | 15 ++++-- src/gallium/auxiliary/draw/draw_pt_vcache.c | 2 +- src/gallium/auxiliary/util/u_blit.c | 1 + src/gallium/auxiliary/util/u_blitter.c | 1 + src/gallium/auxiliary/util/u_gen_mipmap.c | 1 + src/gallium/docs/d3d11ddi.txt | 2 +- src/gallium/docs/source/context.rst | 23 ++++++++-- src/gallium/docs/source/cso/velems.rst | 11 +++- src/gallium/drivers/r300/r300_render_translate.c | 1 + src/gallium/include/pipe/p_defines.h | 7 +++ src/gallium/include/pipe/p_state.h | 14 ++++-- src/gallium/state_trackers/python/p_context.i | 1 + src/gallium/state_trackers/vega/polygon.c | 1 + src/gallium/state_trackers/vega/vg_context.c | 1 + src/gallium/state_trackers/xorg/xorg_renderer.c | 1 + src/gallium/tests/graw/tri-instanced.c | 3 + src/gallium/tests/trivial/quad-tex.c | 2 + src/gallium/tests/trivial/tri.c | 2 + src/mesa/state_tracker/st_cb_drawtex.c | 1 + src/mesa/state_tracker/st_context.c | 1 + src/mesa/state_tracker/st_draw.c | 4 ++ src/mesa/state_tracker/st_draw_feedback.c | 2 + 23 files changed, 108 insertions(+), 43 deletions(-) _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev