st/nine: Compact pixel shader key
authorAxel Davy <davyaxel0@gmail.com>
Sun, 13 Jan 2019 21:25:46 +0000 (22:25 +0100)
committerAxel Davy <davyaxel0@gmail.com>
Tue, 30 Apr 2019 17:18:51 +0000 (19:18 +0200)
Compact the shader key to make room for new
elements.

Signed-off-by: Axel Davy <davyaxel0@gmail.com>
src/gallium/state_trackers/nine/pixelshader9.c
src/gallium/state_trackers/nine/pixelshader9.h

index 8db4b6e5c375e2a27ab77656d29d321cabfaacc8..127d56161bf347355dfbfba82f81a92dbe87fa9e 100644 (file)
@@ -178,13 +178,24 @@ NinePixelShader9_GetVariant( struct NinePixelShader9 *This )
         info.const_b_base = NINE_CONST_B_BASE(device->max_ps_const_f) / 16;
         info.byte_code = This->byte_code.tokens;
         info.sampler_mask_shadow = key & 0xffff;
-        info.sampler_ps1xtypes = (key >> 16) & 0xffff;
+        /* intended overlap with sampler_mask_shadow */
+        if (unlikely(This->byte_code.version < 0x20)) {
+            if (This->byte_code.version < 0x14) {
+                info.sampler_ps1xtypes = (key >> 4) & 0xff;
+                info.projected = (key >> 12) & 0xff;
+            } else {
+                info.sampler_ps1xtypes = (key >> 6) & 0xfff;
+                info.projected = 0;
+            }
+        } else {
+            info.sampler_ps1xtypes = 0;
+            info.projected = 0;
+        }
         info.fog_enable = device->context.rs[D3DRS_FOGENABLE];
         info.fog_mode = device->context.rs[D3DRS_FOGTABLEMODE];
-        info.force_color_in_centroid = key >> 34 & 1;
-        info.projected = (key >> 48) & 0xffff;
+        info.force_color_in_centroid = (key >> 22) & 1;
         info.add_constants_defs.c_combination =
-            nine_shader_constant_combination_get(This->c_combinations, (key >> 40) & 0xff);
+            nine_shader_constant_combination_get(This->c_combinations, (key >> 24) & 0xff);
         info.add_constants_defs.int_const_added = &This->int_slots_used;
         info.add_constants_defs.bool_const_added = &This->bool_slots_used;
         info.process_vertices = false;
index b4c990bab8904475ff39664ac5994b774f842567..d864eca15a473aeeac4edeed61d86797b3432ed5 100644 (file)
@@ -94,30 +94,35 @@ NinePixelShader9_UpdateKey( struct NinePixelShader9 *ps,
             samplers_ps1_types |= (context->texture[s].enabled ? context->texture[s].pstype : 1) << (s * 2);
         }
         /* Note: For ps 1.X, only samplers 0 1 2 and 3 are available (except 1.4 where 4 and 5 are available).
-         * Thus there is no overflow of samplers_ps1_types. */
-        key |= samplers_ps1_types << 16;
+         * ps < 1.4: samplers_shadow 4b, samplers_ps1_types 8b, projected 8b
+         * ps 1.4: samplers_shadow 6b, samplers_ps1_types 12b
+         * Tot ps X.X samplers_shadow + extra: 20b */
+        assert((ps->byte_code.version < 0x14 && !(ps->sampler_mask & 0xFFF0)) || !(ps->sampler_mask & 0xFFC0));
+
+        if (unlikely(ps->byte_code.version < 0x14)) {
+            key |= samplers_ps1_types << 4;
+            projected = nine_ff_get_projected_key_programmable(context);
+            key |= ((uint64_t) projected) << 12;
+        } else {
+            key |= samplers_ps1_types << 6;
+        }
     }
 
     if (ps->byte_code.version < 0x30) {
-        key |= ((uint64_t)context->rs[D3DRS_FOGENABLE]) << 32;
-        key |= ((uint64_t)context->rs[D3DRS_FOGTABLEMODE]) << 33;
+        key |= ((uint64_t)context->rs[D3DRS_FOGENABLE]) << 20;
+        key |= ((uint64_t)context->rs[D3DRS_FOGTABLEMODE]) << 21;
     }
 
     /* centroid interpolation automatically used for color ps inputs */
     if (context->rt[0]->base.info.nr_samples)
-        key |= ((uint64_t)1) << 34;
+        key |= ((uint64_t)1) << 22;
 
     if ((ps->const_int_slots > 0 || ps->const_bool_slots > 0) && context->inline_constants)
         key |= ((uint64_t)nine_shader_constant_combination_key(&ps->c_combinations,
                                                                ps->int_slots_used,
                                                                ps->bool_slots_used,
                                                                (void *)context->ps_const_i,
-                                                               context->ps_const_b)) << 40;
-
-    if (unlikely(ps->byte_code.version < 0x14)) {
-        projected = nine_ff_get_projected_key_programmable(context);
-        key |= ((uint64_t) projected) << 48;
-    }
+                                                               context->ps_const_b)) << 24;
 
     res = ps->last_key != key;
     if (res)