Luca, It seems like there is an alternate fix possible -- modify the mesa fixed-function vertex program generator to put these constant values in the constant buffer, rather than passing them as vertex data. That would remove the need for us to have this unique capability at the gallium level that none of the other graphics abstractions seem to consider necessary.
I think we're putting more effort into accommodating the behaviour of that code than really makes sense... Keith On Mon, 2010-08-16 at 04:30 -0700, Luca Barbieri wrote: > 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