Signed-off-by: Patrice Mandin <patmandin at gmail.com> --- src/gallium/drivers/nvfx/nv30-40_3d.xml.h | 3 ++- src/gallium/drivers/nvfx/nvfx_push.c | 18 ++++++------------ src/gallium/drivers/nvfx/nvfx_screen.c | 2 +- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/gallium/drivers/nvfx/nv30-40_3d.xml.h b/src/gallium/drivers/nvfx/nv30-40_3d.xml.h index a705a6b..3ed3e53 100644 --- a/src/gallium/drivers/nvfx/nv30-40_3d.xml.h +++ b/src/gallium/drivers/nvfx/nv30-40_3d.xml.h @@ -1942,7 +1942,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define NV30_3D_CLEAR_BUFFERS_COLOR_B 0x00000040 #define NV30_3D_CLEAR_BUFFERS_COLOR_A 0x00000080 -#define NV30_3D_DO_VERTICES 0x00001dac +#define NV30_3D_PRIMITIVE_RESTART_ENABLE 0x00001dac +#define NV30_3D_PRIMITIVE_RESTART_INDEX 0x00001db0 #define NV30_3D_LINE_STIPPLE_ENABLE 0x00001db4 diff --git a/src/gallium/drivers/nvfx/nvfx_push.c b/src/gallium/drivers/nvfx/nvfx_push.c index ebf47e6..eeba225 100644 --- a/src/gallium/drivers/nvfx/nvfx_push.c +++ b/src/gallium/drivers/nvfx/nvfx_push.c @@ -337,6 +337,12 @@ nvfx_push_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) nvfx_emit_vtx_attr(chan, nvfx->vtxelt->per_instance[i].base.idx, v, nvfx->vtxelt->per_instance[i].base.ncomp); } + /* Primitive restart */ + WAIT_RING(chan, 2); + OUT_RING(chan, RING_3D(NV30_3D_PRIMITIVE_RESTART_ENABLE, 2)); + OUT_RING(chan, info->primitive_restart ? 1 : 0); + OUT_RING(chan, info->restart_index); + /* per-instance loop */ while (instances_left--) { int max_verts; @@ -367,18 +373,6 @@ nvfx_push_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) if(max_verts >= 16) { - /* XXX: any command a lot of times seems to (mostly) fix corruption that would otherwise happen */ - /* this seems to cause issues on nv3x, and also be unneeded there */ - if(nvfx->is_nv4x) - { - int i; - for(i = 0; i < 32; ++i) - { - OUT_RING(chan, RING_3D(0x1dac, 1)); - OUT_RING(chan, 0); - } - } - OUT_RING(chan, RING_3D(NV30_3D_VERTEX_BEGIN_END, 1)); OUT_RING(chan, hw_mode); done = util_split_prim_next(&s, max_verts); diff --git a/src/gallium/drivers/nvfx/nvfx_screen.c b/src/gallium/drivers/nvfx/nvfx_screen.c index 8bf0907..8981377 100644 --- a/src/gallium/drivers/nvfx/nvfx_screen.c +++ b/src/gallium/drivers/nvfx/nvfx_screen.c @@ -78,7 +78,7 @@ nvfx_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_DEPTH_CLAMP: return 0; // TODO: implement depth clamp case PIPE_CAP_PRIMITIVE_RESTART: - return 0; // TODO: implement primitive restart + return 1; case PIPE_CAP_SHADER_STENCIL_EXPORT: return 0; default: -- 1.7.2.3 --Multipart=_Sat__13_Nov_2010_11_20_06_+0100_ROVB9yMfI0OhlApy--