Ilia Mirkin
2015-Aug-24 15:51 UTC
[Nouveau] [PATCH] nv50: avoid using inline vertex data submit when gl_VertexID is used
The hardware only generates vertexid when vertices come from a VBO. This fixes: vertexid-drawelements vertexid-drawarrays Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> Cc: "11.0" <mesa-stable at lists.freedesktop.org> --- src/gallium/drivers/nouveau/nv50/nv50_program.c | 1 + src/gallium/drivers/nouveau/nv50/nv50_program.h | 1 + src/gallium/drivers/nouveau/nv50/nv50_state_validate.c | 3 ++- src/gallium/drivers/nouveau/nv50/nv50_vbo.c | 8 ++++++++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/nouveau/nv50/nv50_program.c b/src/gallium/drivers/nouveau/nv50/nv50_program.c index 02dc367..eff4477 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_program.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_program.c @@ -66,6 +66,7 @@ nv50_vertprog_assign_slots(struct nv50_ir_prog_info *info) case TGSI_SEMANTIC_VERTEXID: prog->vp.attrs[2] |= NV50_3D_VP_GP_BUILTIN_ATTR_EN_VERTEX_ID; prog->vp.attrs[2] |= NV50_3D_VP_GP_BUILTIN_ATTR_EN_VERTEX_ID_DRAW_ARRAYS_ADD_START; + prog->vp.vertexid = 1; continue; default: break; diff --git a/src/gallium/drivers/nouveau/nv50/nv50_program.h b/src/gallium/drivers/nouveau/nv50/nv50_program.h index 5d3ff56..f4e8e94 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_program.h +++ b/src/gallium/drivers/nouveau/nv50/nv50_program.h @@ -76,6 +76,7 @@ struct nv50_program { ubyte psiz; /* output slot of point size */ ubyte bfc[2]; /* indices into varying for FFC (FP) or BFC (VP) */ ubyte edgeflag; + ubyte vertexid; ubyte clpd[2]; /* output slot of clip distance[i]'s 1st component */ ubyte clpd_nr; } vp; diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c index b304a17..66dcf43 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c @@ -503,7 +503,8 @@ static struct state_validate { { nv50_validate_samplers, NV50_NEW_SAMPLERS }, { nv50_stream_output_validate, NV50_NEW_STRMOUT | NV50_NEW_VERTPROG | NV50_NEW_GMTYPROG }, - { nv50_vertex_arrays_validate, NV50_NEW_VERTEX | NV50_NEW_ARRAYS }, + { nv50_vertex_arrays_validate, NV50_NEW_VERTEX | NV50_NEW_ARRAYS | + NV50_NEW_VERTPROG }, { nv50_validate_min_samples, NV50_NEW_MIN_SAMPLES }, }; #define validate_list_len (sizeof(validate_list) / sizeof(validate_list[0])) diff --git a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c index 600b973..fb4305f 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c @@ -301,6 +301,14 @@ nv50_vertex_arrays_validate(struct nv50_context *nv50) unsigned i; const unsigned n = MAX2(vertex->num_elements, nv50->state.num_vtxelts); + /* A vertexid is not generated for inline data uploads. Have to use a + * VBO. This check must come after the vertprog has been validated, + * otherwise vertexid may be unset. + */ + assert(nv50->vertprog->translated); + if (nv50->vertprog->vp.vertexid) + nv50->vbo_push_hint = 0; + if (unlikely(vertex->need_conversion)) nv50->vbo_fifo = ~0; else -- 2.4.6
Tobias Klausmann
2015-Aug-24 15:57 UTC
[Nouveau] [PATCH] nv50: avoid using inline vertex data submit when gl_VertexID is used
On 24.08.2015 17:51, Ilia Mirkin wrote:> The hardware only generates vertexid when vertices come from a VBO. This > fixes: > > vertexid-drawelements > vertexid-drawarrays > > Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> > Cc: "11.0" <mesa-stable at lists.freedesktop.org> > --- > src/gallium/drivers/nouveau/nv50/nv50_program.c | 1 + > src/gallium/drivers/nouveau/nv50/nv50_program.h | 1 + > src/gallium/drivers/nouveau/nv50/nv50_state_validate.c | 3 ++- > src/gallium/drivers/nouveau/nv50/nv50_vbo.c | 8 ++++++++ > 4 files changed, 12 insertions(+), 1 deletion(-) > > diff --git a/src/gallium/drivers/nouveau/nv50/nv50_program.c b/src/gallium/drivers/nouveau/nv50/nv50_program.c > index 02dc367..eff4477 100644 > --- a/src/gallium/drivers/nouveau/nv50/nv50_program.c > +++ b/src/gallium/drivers/nouveau/nv50/nv50_program.c > @@ -66,6 +66,7 @@ nv50_vertprog_assign_slots(struct nv50_ir_prog_info *info) > case TGSI_SEMANTIC_VERTEXID: > prog->vp.attrs[2] |= NV50_3D_VP_GP_BUILTIN_ATTR_EN_VERTEX_ID; > prog->vp.attrs[2] |= NV50_3D_VP_GP_BUILTIN_ATTR_EN_VERTEX_ID_DRAW_ARRAYS_ADD_START; > + prog->vp.vertexid = 1; > continue; > default: > break; > diff --git a/src/gallium/drivers/nouveau/nv50/nv50_program.h b/src/gallium/drivers/nouveau/nv50/nv50_program.h > index 5d3ff56..f4e8e94 100644 > --- a/src/gallium/drivers/nouveau/nv50/nv50_program.h > +++ b/src/gallium/drivers/nouveau/nv50/nv50_program.h > @@ -76,6 +76,7 @@ struct nv50_program { > ubyte psiz; /* output slot of point size */ > ubyte bfc[2]; /* indices into varying for FFC (FP) or BFC (VP) */ > ubyte edgeflag; > + ubyte vertexid; > ubyte clpd[2]; /* output slot of clip distance[i]'s 1st component */ > ubyte clpd_nr; > } vp; > diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c > index b304a17..66dcf43 100644 > --- a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c > +++ b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c > @@ -503,7 +503,8 @@ static struct state_validate { > { nv50_validate_samplers, NV50_NEW_SAMPLERS }, > { nv50_stream_output_validate, NV50_NEW_STRMOUT | > NV50_NEW_VERTPROG | NV50_NEW_GMTYPROG }, > - { nv50_vertex_arrays_validate, NV50_NEW_VERTEX | NV50_NEW_ARRAYS }, > + { nv50_vertex_arrays_validate, NV50_NEW_VERTEX | NV50_NEW_ARRAYS | > + NV50_NEW_VERTPROG }, > { nv50_validate_min_samples, NV50_NEW_MIN_SAMPLES }, > }; > #define validate_list_len (sizeof(validate_list) / sizeof(validate_list[0])) > diff --git a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c > index 600b973..fb4305f 100644 > --- a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c > +++ b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c > @@ -301,6 +301,14 @@ nv50_vertex_arrays_validate(struct nv50_context *nv50) > unsigned i; > const unsigned n = MAX2(vertex->num_elements, nv50->state.num_vtxelts); > > + /* A vertexid is not generated for inline data uploads. Have to use a > + * VBO. This check must come after the vertprog has been validated, > + * otherwise vertexid may be unset. > + */ > + assert(nv50->vertprog->translated); > + if (nv50->vertprog->vp.vertexid) > + nv50->vbo_push_hint = 0; > + > if (unlikely(vertex->need_conversion)) > nv50->vbo_fifo = ~0; > elseLGTM!
Ilia Mirkin
2015-Aug-24 16:19 UTC
[Nouveau] [PATCH] nv50: avoid using inline vertex data submit when gl_VertexID is used
On Mon, Aug 24, 2015 at 11:57 AM, Tobias Klausmann <tobias.johannes.klausmann at mni.thm.de> wrote:> > > On 24.08.2015 17:51, Ilia Mirkin wrote: >> >> The hardware only generates vertexid when vertices come from a VBO. This >> fixes: >> >> vertexid-drawelements >> vertexid-drawarrays >> >> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> >> Cc: "11.0" <mesa-stable at lists.freedesktop.org> >> --- >> src/gallium/drivers/nouveau/nv50/nv50_program.c | 1 + >> src/gallium/drivers/nouveau/nv50/nv50_program.h | 1 + >> src/gallium/drivers/nouveau/nv50/nv50_state_validate.c | 3 ++- >> src/gallium/drivers/nouveau/nv50/nv50_vbo.c | 8 ++++++++ >> 4 files changed, 12 insertions(+), 1 deletion(-) >> >> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_program.c >> b/src/gallium/drivers/nouveau/nv50/nv50_program.c >> index 02dc367..eff4477 100644 >> --- a/src/gallium/drivers/nouveau/nv50/nv50_program.c >> +++ b/src/gallium/drivers/nouveau/nv50/nv50_program.c >> @@ -66,6 +66,7 @@ nv50_vertprog_assign_slots(struct nv50_ir_prog_info >> *info) >> case TGSI_SEMANTIC_VERTEXID: >> prog->vp.attrs[2] |= NV50_3D_VP_GP_BUILTIN_ATTR_EN_VERTEX_ID; >> prog->vp.attrs[2] |>> NV50_3D_VP_GP_BUILTIN_ATTR_EN_VERTEX_ID_DRAW_ARRAYS_ADD_START; >> + prog->vp.vertexid = 1; >> continue; >> default: >> break; >> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_program.h >> b/src/gallium/drivers/nouveau/nv50/nv50_program.h >> index 5d3ff56..f4e8e94 100644 >> --- a/src/gallium/drivers/nouveau/nv50/nv50_program.h >> +++ b/src/gallium/drivers/nouveau/nv50/nv50_program.h >> @@ -76,6 +76,7 @@ struct nv50_program { >> ubyte psiz; /* output slot of point size */ >> ubyte bfc[2]; /* indices into varying for FFC (FP) or BFC >> (VP) */ >> ubyte edgeflag; >> + ubyte vertexid; >> ubyte clpd[2]; /* output slot of clip distance[i]'s 1st >> component */ >> ubyte clpd_nr; >> } vp; >> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c >> b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c >> index b304a17..66dcf43 100644 >> --- a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c >> +++ b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c >> @@ -503,7 +503,8 @@ static struct state_validate { >> { nv50_validate_samplers, NV50_NEW_SAMPLERS }, >> { nv50_stream_output_validate, NV50_NEW_STRMOUT | >> NV50_NEW_VERTPROG | NV50_NEW_GMTYPROG >> }, >> - { nv50_vertex_arrays_validate, NV50_NEW_VERTEX | NV50_NEW_ARRAYS }, >> + { nv50_vertex_arrays_validate, NV50_NEW_VERTEX | NV50_NEW_ARRAYS | >> + NV50_NEW_VERTPROG }, >> { nv50_validate_min_samples, NV50_NEW_MIN_SAMPLES }, >> }; >> #define validate_list_len (sizeof(validate_list) / >> sizeof(validate_list[0])) >> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c >> b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c >> index 600b973..fb4305f 100644 >> --- a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c >> +++ b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c >> @@ -301,6 +301,14 @@ nv50_vertex_arrays_validate(struct nv50_context >> *nv50) >> unsigned i; >> const unsigned n = MAX2(vertex->num_elements, >> nv50->state.num_vtxelts); >> + /* A vertexid is not generated for inline data uploads. Have to use >> a >> + * VBO. This check must come after the vertprog has been validated, >> + * otherwise vertexid may be unset. >> + */ >> + assert(nv50->vertprog->translated); >> + if (nv50->vertprog->vp.vertexid) >> + nv50->vbo_push_hint = 0; >> + >> if (unlikely(vertex->need_conversion)) >> nv50->vbo_fifo = ~0; >> else > > LGTM!Thanks. I was a little torn on whether to do it this way (which penalizes someone switching vertex programs while keeping the vertex setup the same), as opposed to do it the other way, which would penalize every program that uses vertexid (by calling nv50_vertex_arrays_validate twice for those). Ideally I'd do it in a way that penalized neither, but that's just not going to happen :)
Ilia Mirkin
2015-Aug-24 20:02 UTC
[Nouveau] [Mesa-dev] [PATCH] nv50: avoid using inline vertex data submit when gl_VertexID is used
Edge flag stuff is annoying. Pretty sure only blender uses it. shade model = flat should get fixed on nv50 before edge flags, since blender uses that too, and it's produces much worse visual artifacts. I'm having second thoughts about this patch. I think I'm going to go back to my previous approach of just calling nv50_vertex_arrays_validate when vbo_fifo && vertexid. I suspect that vertexid usage with small draws from client buffers is next to inexistent, no need to re-emit this stuff so often. On Mon, Aug 24, 2015 at 4:07 PM, Samuel Pitoiset <samuel.pitoiset at gmail.com> wrote:> Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com> > > This fix is simpler than I was expected. What about the edge flag stuff now? > :) > > > On 08/24/2015 05:51 PM, Ilia Mirkin wrote: >> >> The hardware only generates vertexid when vertices come from a VBO. This >> fixes: >> >> vertexid-drawelements >> vertexid-drawarrays >> >> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> >> Cc: "11.0" <mesa-stable at lists.freedesktop.org> >> --- >> src/gallium/drivers/nouveau/nv50/nv50_program.c | 1 + >> src/gallium/drivers/nouveau/nv50/nv50_program.h | 1 + >> src/gallium/drivers/nouveau/nv50/nv50_state_validate.c | 3 ++- >> src/gallium/drivers/nouveau/nv50/nv50_vbo.c | 8 ++++++++ >> 4 files changed, 12 insertions(+), 1 deletion(-) >> >> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_program.c >> b/src/gallium/drivers/nouveau/nv50/nv50_program.c >> index 02dc367..eff4477 100644 >> --- a/src/gallium/drivers/nouveau/nv50/nv50_program.c >> +++ b/src/gallium/drivers/nouveau/nv50/nv50_program.c >> @@ -66,6 +66,7 @@ nv50_vertprog_assign_slots(struct nv50_ir_prog_info >> *info) >> case TGSI_SEMANTIC_VERTEXID: >> prog->vp.attrs[2] |= NV50_3D_VP_GP_BUILTIN_ATTR_EN_VERTEX_ID; >> prog->vp.attrs[2] |>> NV50_3D_VP_GP_BUILTIN_ATTR_EN_VERTEX_ID_DRAW_ARRAYS_ADD_START; >> + prog->vp.vertexid = 1; >> continue; >> default: >> break; >> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_program.h >> b/src/gallium/drivers/nouveau/nv50/nv50_program.h >> index 5d3ff56..f4e8e94 100644 >> --- a/src/gallium/drivers/nouveau/nv50/nv50_program.h >> +++ b/src/gallium/drivers/nouveau/nv50/nv50_program.h >> @@ -76,6 +76,7 @@ struct nv50_program { >> ubyte psiz; /* output slot of point size */ >> ubyte bfc[2]; /* indices into varying for FFC (FP) or BFC >> (VP) */ >> ubyte edgeflag; >> + ubyte vertexid; >> ubyte clpd[2]; /* output slot of clip distance[i]'s 1st >> component */ >> ubyte clpd_nr; >> } vp; >> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c >> b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c >> index b304a17..66dcf43 100644 >> --- a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c >> +++ b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c >> @@ -503,7 +503,8 @@ static struct state_validate { >> { nv50_validate_samplers, NV50_NEW_SAMPLERS }, >> { nv50_stream_output_validate, NV50_NEW_STRMOUT | >> NV50_NEW_VERTPROG | NV50_NEW_GMTYPROG >> }, >> - { nv50_vertex_arrays_validate, NV50_NEW_VERTEX | NV50_NEW_ARRAYS }, >> + { nv50_vertex_arrays_validate, NV50_NEW_VERTEX | NV50_NEW_ARRAYS | >> + NV50_NEW_VERTPROG }, >> { nv50_validate_min_samples, NV50_NEW_MIN_SAMPLES }, >> }; >> #define validate_list_len (sizeof(validate_list) / >> sizeof(validate_list[0])) >> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c >> b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c >> index 600b973..fb4305f 100644 >> --- a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c >> +++ b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c >> @@ -301,6 +301,14 @@ nv50_vertex_arrays_validate(struct nv50_context >> *nv50) >> unsigned i; >> const unsigned n = MAX2(vertex->num_elements, >> nv50->state.num_vtxelts); >> + /* A vertexid is not generated for inline data uploads. Have to use >> a >> + * VBO. This check must come after the vertprog has been validated, >> + * otherwise vertexid may be unset. >> + */ >> + assert(nv50->vertprog->translated); >> + if (nv50->vertprog->vp.vertexid) >> + nv50->vbo_push_hint = 0; >> + >> if (unlikely(vertex->need_conversion)) >> nv50->vbo_fifo = ~0; >> else > >
Samuel Pitoiset
2015-Aug-24 20:07 UTC
[Nouveau] [Mesa-dev] [PATCH] nv50: avoid using inline vertex data submit when gl_VertexID is used
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com> This fix is simpler than I was expected. What about the edge flag stuff now? :) On 08/24/2015 05:51 PM, Ilia Mirkin wrote:> The hardware only generates vertexid when vertices come from a VBO. This > fixes: > > vertexid-drawelements > vertexid-drawarrays > > Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> > Cc: "11.0" <mesa-stable at lists.freedesktop.org> > --- > src/gallium/drivers/nouveau/nv50/nv50_program.c | 1 + > src/gallium/drivers/nouveau/nv50/nv50_program.h | 1 + > src/gallium/drivers/nouveau/nv50/nv50_state_validate.c | 3 ++- > src/gallium/drivers/nouveau/nv50/nv50_vbo.c | 8 ++++++++ > 4 files changed, 12 insertions(+), 1 deletion(-) > > diff --git a/src/gallium/drivers/nouveau/nv50/nv50_program.c b/src/gallium/drivers/nouveau/nv50/nv50_program.c > index 02dc367..eff4477 100644 > --- a/src/gallium/drivers/nouveau/nv50/nv50_program.c > +++ b/src/gallium/drivers/nouveau/nv50/nv50_program.c > @@ -66,6 +66,7 @@ nv50_vertprog_assign_slots(struct nv50_ir_prog_info *info) > case TGSI_SEMANTIC_VERTEXID: > prog->vp.attrs[2] |= NV50_3D_VP_GP_BUILTIN_ATTR_EN_VERTEX_ID; > prog->vp.attrs[2] |= NV50_3D_VP_GP_BUILTIN_ATTR_EN_VERTEX_ID_DRAW_ARRAYS_ADD_START; > + prog->vp.vertexid = 1; > continue; > default: > break; > diff --git a/src/gallium/drivers/nouveau/nv50/nv50_program.h b/src/gallium/drivers/nouveau/nv50/nv50_program.h > index 5d3ff56..f4e8e94 100644 > --- a/src/gallium/drivers/nouveau/nv50/nv50_program.h > +++ b/src/gallium/drivers/nouveau/nv50/nv50_program.h > @@ -76,6 +76,7 @@ struct nv50_program { > ubyte psiz; /* output slot of point size */ > ubyte bfc[2]; /* indices into varying for FFC (FP) or BFC (VP) */ > ubyte edgeflag; > + ubyte vertexid; > ubyte clpd[2]; /* output slot of clip distance[i]'s 1st component */ > ubyte clpd_nr; > } vp; > diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c > index b304a17..66dcf43 100644 > --- a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c > +++ b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c > @@ -503,7 +503,8 @@ static struct state_validate { > { nv50_validate_samplers, NV50_NEW_SAMPLERS }, > { nv50_stream_output_validate, NV50_NEW_STRMOUT | > NV50_NEW_VERTPROG | NV50_NEW_GMTYPROG }, > - { nv50_vertex_arrays_validate, NV50_NEW_VERTEX | NV50_NEW_ARRAYS }, > + { nv50_vertex_arrays_validate, NV50_NEW_VERTEX | NV50_NEW_ARRAYS | > + NV50_NEW_VERTPROG }, > { nv50_validate_min_samples, NV50_NEW_MIN_SAMPLES }, > }; > #define validate_list_len (sizeof(validate_list) / sizeof(validate_list[0])) > diff --git a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c > index 600b973..fb4305f 100644 > --- a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c > +++ b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c > @@ -301,6 +301,14 @@ nv50_vertex_arrays_validate(struct nv50_context *nv50) > unsigned i; > const unsigned n = MAX2(vertex->num_elements, nv50->state.num_vtxelts); > > + /* A vertexid is not generated for inline data uploads. Have to use a > + * VBO. This check must come after the vertprog has been validated, > + * otherwise vertexid may be unset. > + */ > + assert(nv50->vertprog->translated); > + if (nv50->vertprog->vp.vertexid) > + nv50->vbo_push_hint = 0; > + > if (unlikely(vertex->need_conversion)) > nv50->vbo_fifo = ~0; > else
Possibly Parallel Threads
- [PATCH] nv50: remove vtxbuf stateobject after a referenced vtxbuf is mapped
- [PATCH 1/2] nv50: don't emit reloc markers after a referenced vtxbuf is mapped
- [PATCH 1/3] nv50: rework primid logic
- [PATCH try 2 1/2] gallium/nouveau: decouple nouveau_fence implementation from screen
- [PATCH 00/12] Cherry-pick nv50/nvc0 patches from gallium-nine