[Mesa-dev] [RFC] [PATCH 0/4] Add frequency declaration for vertex elements

Luca Barbieri luca at luca-barbieri.com
Mon Aug 16 04:30:04 PDT 2010


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(-)



More information about the mesa-dev mailing list