nv50,nvc0: enable/disable seamless cubemap texturing as requested
authorIlia Mirkin <imirkin@alum.mit.edu>
Sun, 14 Feb 2016 03:14:02 +0000 (22:14 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Tue, 16 Feb 2016 23:20:10 +0000 (18:20 -0500)
In a situation where the seamless setting isn't available on a
per-texture basis (G200+ Teslas, and all Fermis), assume that all
samplers will have it identically set, and enable accordingly.

This fixes arb_seamless_cubemap piglit test on Fermi and Tesla.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
12 files changed:
src/gallium/drivers/nouveau/nv50/nv50_context.h
src/gallium/drivers/nouveau/nv50/nv50_screen.c
src/gallium/drivers/nouveau/nv50/nv50_screen.h
src/gallium/drivers/nouveau/nv50/nv50_state.c
src/gallium/drivers/nouveau/nv50/nv50_stateobj_tex.h
src/gallium/drivers/nouveau/nv50/nv50_tex.c
src/gallium/drivers/nouveau/nv50/nv50_vbo.c
src/gallium/drivers/nouveau/nvc0/nvc0_context.h
src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
src/gallium/drivers/nouveau/nvc0/nvc0_screen.h
src/gallium/drivers/nouveau/nvc0/nvc0_tex.c
src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c

index 23d82103332513ed06f7014ba6dccd12387aa9e2..2620d03b99926171c3c7d314965d1feab3de07e7 100644 (file)
@@ -153,6 +153,7 @@ struct nv50_context {
    uint32_t textures_coherent[3];
    struct nv50_tsc_entry *samplers[3][PIPE_MAX_SAMPLERS];
    unsigned num_samplers[3];
+   bool seamless_cube_map;
 
    uint8_t num_so_targets;
    uint8_t so_targets_dirty;
index 345622f26217a9e1e18bf31867b132465fb8f0ab..06b7bf986adc6a6a1bc62eb26ad118ec212b4ea8 100644 (file)
@@ -565,7 +565,7 @@ nv50_screen_init_hwctx(struct nv50_screen *screen)
 
    if (screen->tesla->oclass >= NVA0_3D_CLASS) {
       BEGIN_NV04(push, SUBC_3D(NVA0_3D_TEX_MISC), 1);
-      PUSH_DATA (push, NVA0_3D_TEX_MISC_SEAMLESS_CUBE_MAP);
+      PUSH_DATA (push, 0);
    }
 
    BEGIN_NV04(push, NV50_3D(SCREEN_Y_CONTROL), 1);
index f8f5d1600abde9254f7ce22438a764cbc072deee..cce92f0dd5e0f49a2cf0a78153b526521bf49dca 100644 (file)
@@ -50,6 +50,7 @@ struct nv50_graph_state {
    uint8_t num_samplers[3];
    uint8_t prim_size;
    uint16_t scissor;
+   bool seamless_cube_map;
 };
 
 struct nv50_screen {
index c8eea994f5902937cc807168decfff3ee932f6bf..6a09808807a566d798f6c60cd5d13000475b1a63 100644 (file)
@@ -516,6 +516,8 @@ nv50_sampler_state_create(struct pipe_context *pipe,
          so->tsc[1] |= GK104_TSC_1_CUBEMAP_INTERFACE_FILTERING;
       if (!cso->normalized_coords)
          so->tsc[1] |= GK104_TSC_1_FLOAT_COORD_NORMALIZATION_FORCE_UNNORMALIZED_COORDS;
+   } else {
+      so->seamless_cube_map = cso->seamless_cube_map;
    }
 
    if (cso->max_anisotropy >= 16)
index e0793bb6ec4a57f3f2c3ca1572f02ad5c5d7658d..6bc451450b1f9a00b367f8561181357c373dde72 100644 (file)
@@ -7,6 +7,7 @@
 struct nv50_tsc_entry {
    int id;
    uint32_t tsc[8];
+   bool seamless_cube_map;
 };
 
 static inline struct nv50_tsc_entry *
index 475e27720ac1fec3402b49b27c9263c2c9b7e963..4b69c3bd5048d008dca743c356b8dc74ce6e080a 100644 (file)
@@ -361,6 +361,7 @@ nv50_validate_tsc(struct nv50_context *nv50, int s)
          PUSH_DATA (push, (i << 4) | 0);
          continue;
       }
+      nv50->seamless_cube_map = tsc->seamless_cube_map;
       if (tsc->id < 0) {
          tsc->id = nv50_screen_tsc_alloc(nv50->screen, tsc);
 
index 028f4c88e66cd433babf6b95a017b217fd133a3e..6f60445d8d26578ebbe79bdaf98fa0a8f865f596 100644 (file)
@@ -816,6 +816,13 @@ nv50_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
       PUSH_DATA (push, 0x20);
    }
 
+   if (nv50->screen->base.class_3d >= NVA0_3D_CLASS &&
+       nv50->seamless_cube_map != nv50->state.seamless_cube_map) {
+      nv50->state.seamless_cube_map = nv50->seamless_cube_map;
+      BEGIN_NV04(push, SUBC_3D(NVA0_3D_TEX_MISC), 1);
+      PUSH_DATA (push, nv50->seamless_cube_map ? NVA0_3D_TEX_MISC_SEAMLESS_CUBE_MAP : 0);
+   }
+
    if (nv50->vbo_fifo) {
       nv50_push_vbo(nv50, info);
       push->kick_notify = nv50_default_kick_notify;
index b3a55e8d8e1e425a9f686f49d855803fcef4087b..191aa3cfde01b12cd52e7c8eeaf7a5860b489f1d 100644 (file)
@@ -157,6 +157,7 @@ struct nvc0_context {
    struct nv50_tsc_entry *samplers[6][PIPE_MAX_SAMPLERS];
    unsigned num_samplers[6];
    uint16_t samplers_dirty[6];
+   bool seamless_cube_map;
 
    uint32_t tex_handles[6][PIPE_MAX_SAMPLERS]; /* for nve4 */
 
index e1fe02f539af8da912742fdc39f8f37b32122c97..82f7c8202a0a2c40e3d37a4337288a99b15fd7fc 100644 (file)
@@ -876,8 +876,7 @@ nvc0_screen_create(struct nouveau_device *dev)
    BEGIN_NVC0(push, NVC0_3D(SHADE_MODEL), 1);
    PUSH_DATA (push, NVC0_3D_SHADE_MODEL_SMOOTH);
    if (screen->eng3d->oclass < NVE4_3D_CLASS) {
-      BEGIN_NVC0(push, NVC0_3D(TEX_MISC), 1);
-      PUSH_DATA (push, NVC0_3D_TEX_MISC_SEAMLESS_CUBE_MAP);
+      IMMED_NVC0(push, NVC0_3D(TEX_MISC), 0);
    } else {
       BEGIN_NVC0(push, NVE4_3D(TEX_CB_INDEX), 1);
       PUSH_DATA (push, 15);
index f34fabd6bc98a15ded9988f2ffd1b355847927ea..e86fe432e3624ef622dcfd10e58b1fcdf57365c5 100644 (file)
@@ -53,6 +53,7 @@ struct nvc0_graph_state {
    uint32_t clip_mode;
    uint32_t uniform_buffer_bound[5];
    struct nvc0_transform_feedback_state *tfb;
+   bool seamless_cube_map;
 };
 
 struct nvc0_screen {
index 0f46732d11d01c222b851ba4253a04870a6d9a44..b1d18eb264f69c09054a3b435f9028e3873dea53 100644 (file)
@@ -595,6 +595,7 @@ nvc0_validate_tsc(struct nvc0_context *nvc0, int s)
          commands[n++] = (i << 4) | 0;
          continue;
       }
+      nvc0->seamless_cube_map = tsc->seamless_cube_map;
       if (tsc->id < 0) {
          tsc->id = nvc0_screen_tsc_alloc(nvc0->screen, tsc);
 
index 8239624563062296ed055534547b97affcec65af..8f8fa271a7f9448a43d97c466aa3529582b0cb39 100644 (file)
@@ -984,6 +984,14 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
       }
    }
 
+   if (nvc0->screen->base.class_3d < NVE4_3D_CLASS &&
+       nvc0->seamless_cube_map != nvc0->state.seamless_cube_map) {
+      nvc0->state.seamless_cube_map = nvc0->seamless_cube_map;
+      PUSH_SPACE(push, 1);
+      IMMED_NVC0(push, NVC0_3D(TEX_MISC),
+                 nvc0->seamless_cube_map ? NVC0_3D_TEX_MISC_SEAMLESS_CUBE_MAP : 0);
+   }
+
    push->kick_notify = nvc0_draw_vbo_kick_notify;
 
    for (s = 0; s < 5 && !nvc0->cb_dirty; ++s) {