static int
nv50_screen_get_param(struct pipe_screen *pscreen, int param)
{
+ struct nv50_screen *screen = nv50_screen(pscreen);
+
switch (param) {
case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
return 32;
case PIPE_CAP_BLEND_EQUATION_SEPARATE:
return 1;
case NOUVEAU_CAP_HW_VTXBUF:
- return 1;
+ return screen->force_push ? 0 : 1;
case NOUVEAU_CAP_HW_IDXBUF:
- return 1;
+ return screen->force_push ? 0 : 1;
case PIPE_CAP_INDEP_BLEND_ENABLE:
return 1;
case PIPE_CAP_INDEP_BLEND_FUNC:
so_ref (NULL, &so);
nouveau_pushbuf_flush(chan, 0);
+ screen->force_push = debug_get_bool_option("NV50_ALWAYS_PUSH", FALSE);
return pscreen;
}
if (nv50->vtxbuf_nr == 0)
return NULL;
- if (NV50_USING_LOATHED_EDGEFLAG(nv50))
+ if (nv50->screen->force_push || NV50_USING_LOATHED_EDGEFLAG(nv50))
nv50->vbo_fifo = 0xffff;
- nv50->vbo_fifo = 0xffff;
+
+ for (i = 0; i < nv50->vtxbuf_nr; i++) {
+ if (nv50->vtxbuf[i].stride &&
+ !(nv50->vtxbuf[i].buffer->usage & PIPE_BUFFER_USAGE_VERTEX))
+ nv50->vbo_fifo = 0xffff;
+ }
n_ve = MAX2(nv50->vtxelt->num_elements, nv50->state.vtxelt_nr);