nvc0: always keep TSC slot 0 bound to fix TXF
authorIlia Mirkin <imirkin@alum.mit.edu>
Sun, 2 Dec 2018 18:19:01 +0000 (13:19 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 15 Dec 2018 01:01:31 +0000 (20:01 -0500)
Same as on nv50, the TXF op always uses the TSC bound to slot 0,
returning blank values if nothing is bound.

An earlier change arranges for the TSC entries list to always have valid
data at entry 0, so here we just make use of it.

Fixes arb_texture_buffer_object-subdata-sync among others.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/nvc0/nvc0_context.c
src/gallium/drivers/nouveau/nvc0/nvc0_tex.c

index 2d46a90ddb4c3d0a0b3efa85ae180277d5832141..08ca0a204d39def34a3aea5976275005eb9c23fa 100644 (file)
@@ -488,6 +488,14 @@ nvc0_create(struct pipe_screen *pscreen, void *priv, unsigned ctxflags)
    if (!screen->tsc.entries[0])
       nvc0_upload_tsc0(nvc0);
 
+   // On Fermi, mark samplers dirty so that the proper binding can happen
+   if (screen->base.class_3d < NVE4_3D_CLASS) {
+      for (int s = 0; s < 6; s++)
+         nvc0->samplers_dirty[s] = 1;
+      nvc0->dirty_3d |= NVC0_NEW_3D_SAMPLERS;
+      nvc0->dirty_cp |= NVC0_NEW_CP_SAMPLERS;
+   }
+
    return pipe;
 
 out_err:
index 1ec55f5b8ab3076d655ab32ba79b8a988de8df13..04f0a0d55da50ee8baa74325591634b007a6d7e6 100644 (file)
@@ -657,6 +657,19 @@ nvc0_validate_tsc(struct nvc0_context *nvc0, int s)
 
    nvc0->state.num_samplers[s] = nvc0->num_samplers[s];
 
+   // TXF, in unlinked tsc mode, will always use sampler 0. So we have to
+   // ensure that it remains bound. Its contents don't matter, all samplers we
+   // ever create have the SRGB_CONVERSION bit set, so as long as the first
+   // entry is initialized, we're good to go. This is the only bit that has
+   // any effect on what TXF does.
+   if ((nvc0->samplers_dirty[s] & 1) && !nvc0->samplers[s][0]) {
+      if (n == 0)
+         n = 1;
+      // We're guaranteed that the first command refers to the first slot, so
+      // we're not overwriting a valid entry.
+      commands[0] = (0 << 12) | (0 << 4) | 1;
+   }
+
    if (n) {
       if (unlikely(s == 5))
          BEGIN_NIC0(push, NVC0_CP(BIND_TSC), n);