nv50: use hw idx buffers where we can

This commit is contained in:
Ben Skeggs 2010-02-16 15:43:51 +10:00
parent c6e63f3cc2
commit 828f545274
2 changed files with 27 additions and 8 deletions

View file

@ -134,7 +134,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, int param)
case NOUVEAU_CAP_HW_VTXBUF: case NOUVEAU_CAP_HW_VTXBUF:
return 1; return 1;
case NOUVEAU_CAP_HW_IDXBUF: case NOUVEAU_CAP_HW_IDXBUF:
return 0; return 1;
case PIPE_CAP_INDEP_BLEND_ENABLE: case PIPE_CAP_INDEP_BLEND_ENABLE:
return 1; return 1;
case PIPE_CAP_INDEP_BLEND_FUNC: case PIPE_CAP_INDEP_BLEND_FUNC:

View file

@ -673,8 +673,6 @@ nv50_draw_elements(struct pipe_context *pipe,
struct pipe_screen *pscreen = pipe->screen; struct pipe_screen *pscreen = pipe->screen;
void *map; void *map;
map = pipe_buffer_map(pscreen, indexBuffer, PIPE_BUFFER_USAGE_CPU_READ);
nv50_state_validate(nv50); nv50_state_validate(nv50);
BEGIN_RING(chan, tesla, 0x142c, 1); BEGIN_RING(chan, tesla, 0x142c, 1);
@ -685,14 +683,35 @@ nv50_draw_elements(struct pipe_context *pipe,
BEGIN_RING(chan, tesla, NV50TCL_VERTEX_BEGIN, 1); BEGIN_RING(chan, tesla, NV50TCL_VERTEX_BEGIN, 1);
OUT_RING (chan, nv50_prim(mode)); OUT_RING (chan, nv50_prim(mode));
nv50_draw_elements_inline(nv50, map, indexSize, start, count); if (!nv50->vbo_fifo && indexSize == 4) {
BEGIN_RING(chan, tesla, NV50TCL_VB_ELEMENT_U32 | 0x30000, 0);
OUT_RING (chan, count);
nouveau_pushbuf_submit(chan, nouveau_bo(indexBuffer),
start << 2, count << 2);
} else
if (!nv50->vbo_fifo && indexSize == 2) {
unsigned vb_start = (start & ~1);
unsigned vb_end = (start + count + 1) & ~1;
unsigned dwords = (vb_end - vb_start) >> 1;
BEGIN_RING(chan, tesla, NV50TCL_VB_ELEMENT_U16_SETUP, 1);
OUT_RING (chan, ((start & 1) << 31) | count);
BEGIN_RING(chan, tesla, NV50TCL_VB_ELEMENT_U16 | 0x30000, 0);
OUT_RING (chan, dwords);
nouveau_pushbuf_submit(chan, nouveau_bo(indexBuffer),
vb_start << 1, dwords << 2);
BEGIN_RING(chan, tesla, NV50TCL_VB_ELEMENT_U16_SETUP, 1);
OUT_RING (chan, 0);
} else {
map = pipe_buffer_map(pscreen, indexBuffer,
PIPE_BUFFER_USAGE_CPU_READ);
nv50_draw_elements_inline(nv50, map, indexSize, start, count);
nv50_unmap_vbufs(nv50);
pipe_buffer_unmap(pscreen, indexBuffer);
}
BEGIN_RING(chan, tesla, NV50TCL_VERTEX_END, 1); BEGIN_RING(chan, tesla, NV50TCL_VERTEX_END, 1);
OUT_RING (chan, 0); OUT_RING (chan, 0);
nv50_unmap_vbufs(nv50);
pipe_buffer_unmap(pscreen, indexBuffer);
} }
static INLINE boolean static INLINE boolean