st/nine: Rename pipe to pipe_data in nine_context
[mesa.git] / src / gallium / state_trackers / nine / pixelshader9.h
index fc0a9a296878e8e7e4f1446741a25ba7948e49a3..67a18f20c42eb0bcb03ff12455534a08e4b87a6e 100644 (file)
 
 #include "iunknown.h"
 #include "nine_shader.h"
+#include "nine_state.h"
+#include "basetexture9.h"
+#include "nine_ff.h"
+#include "surface9.h"
 
 struct nine_lconstf;
 
@@ -46,6 +50,12 @@ struct NinePixelShader9
     uint8_t rt_mask;
 
     uint64_t ff_key[6];
+    void *ff_cso;
+
+    uint64_t last_key;
+    void *last_cso;
+
+    uint64_t next_key;
 };
 static inline struct NinePixelShader9 *
 NinePixelShader9( void *data )
@@ -53,9 +63,53 @@ NinePixelShader9( void *data )
     return (struct NinePixelShader9 *)data;
 }
 
+static inline BOOL
+NinePixelShader9_UpdateKey( struct NinePixelShader9 *ps,
+                            struct nine_context *context )
+{
+    uint16_t samplers_shadow;
+    uint32_t samplers_ps1_types;
+    uint16_t projected;
+    uint64_t key;
+    BOOL res;
+
+    if (unlikely(ps->byte_code.version < 0x20)) {
+        /* no depth textures, but variable targets */
+        uint32_t m = ps->sampler_mask;
+        samplers_ps1_types = 0;
+        while (m) {
+            int s = ffs(m) - 1;
+            m &= ~(1 << s);
+            samplers_ps1_types |= (context->texture[s] ? context->texture[s]->pstype : 1) << (s * 2);
+        }
+        key = samplers_ps1_types;
+    } else {
+        samplers_shadow = (uint16_t)((context->samplers_shadow & NINE_PS_SAMPLERS_MASK) >> NINE_SAMPLER_PS(0));
+        key = samplers_shadow & ps->sampler_mask;
+    }
+
+    if (ps->byte_code.version < 0x30) {
+        key |= ((uint64_t)context->rs[D3DRS_FOGENABLE]) << 32;
+        key |= ((uint64_t)context->rs[D3DRS_FOGTABLEMODE]) << 33;
+    }
+
+    /* centroid interpolation automatically used for color ps inputs */
+    if (context->rt[0]->base.info.nr_samples)
+        key |= ((uint64_t)1) << 34;
+
+    if (unlikely(ps->byte_code.version < 0x14)) {
+        projected = nine_ff_get_projected_key(context);
+        key |= ((uint64_t) projected) << 48;
+    }
+
+    res = ps->last_key != key;
+    if (res)
+        ps->next_key = key;
+    return res;
+}
+
 void *
-NinePixelShader9_GetVariant( struct NinePixelShader9 *vs,
-                             uint32_t key );
+NinePixelShader9_GetVariant( struct NinePixelShader9 *ps );
 
 /*** public ***/
 
@@ -72,7 +126,7 @@ NinePixelShader9_ctor( struct NinePixelShader9 *,
 void
 NinePixelShader9_dtor( struct NinePixelShader9 * );
 
-HRESULT WINAPI
+HRESULT NINE_WINAPI
 NinePixelShader9_GetFunction( struct NinePixelShader9 *This,
                               void *pData,
                               UINT *pSizeOfData );