st/nine: Rename pipe to pipe_data in nine_context
[mesa.git] / src / gallium / state_trackers / nine / vertexshader9.h
index 6cf7749e0acfb90c46c5f89d31cfe7551588d192..a912d4628b4fd316b52528d5a7a17973ad762d12 100644 (file)
 #ifndef _NINE_VERTEXSHADER9_H_
 #define _NINE_VERTEXSHADER9_H_
 
+#include "util/u_half.h"
+
 #include "iunknown.h"
+#include "device9.h"
+#include "nine_helpers.h"
 #include "nine_shader.h"
 #include "nine_state.h"
 
+struct NineVertexDeclaration9;
+
 struct NineVertexShader9
 {
     struct NineUnknown base;
@@ -47,20 +53,22 @@ struct NineVertexShader9
 
     boolean position_t; /* if true, disable vport transform */
     boolean point_size; /* if true, set rasterizer.point_size_per_vertex to 1 */
+    boolean swvp_only;
 
     unsigned const_used_size; /* in bytes */
 
     struct nine_lconstf lconstf;
 
-    const struct pipe_stream_output_info *so;
-
-    uint64_t ff_key[2];
+    uint64_t ff_key[3];
     void *ff_cso;
 
-    uint32_t last_key;
+    uint64_t last_key;
     void *last_cso;
 
-    uint32_t next_key;
+    uint64_t next_key;
+
+    /* so */
+    struct nine_shader_variant_so variant_so;
 };
 static inline struct NineVertexShader9 *
 NineVertexShader9( void *data )
@@ -70,16 +78,29 @@ NineVertexShader9( void *data )
 
 static inline BOOL
 NineVertexShader9_UpdateKey( struct NineVertexShader9 *vs,
-                             struct nine_state *state )
+                             struct NineDevice9 *device )
 {
+    struct nine_context *context = &(device->context);
     uint8_t samplers_shadow;
-    uint32_t key;
+    uint64_t key;
     BOOL res;
 
-    samplers_shadow = (uint8_t)((state->samplers_shadow & NINE_VS_SAMPLERS_MASK) >> NINE_SAMPLER_VS(0));
+    samplers_shadow = (uint8_t)((context->samplers_shadow & NINE_VS_SAMPLERS_MASK) >> NINE_SAMPLER_VS(0));
     samplers_shadow &= vs->sampler_mask;
     key = samplers_shadow;
 
+    if (vs->byte_code.version < 0x30)
+        key |= (uint32_t) ((!!context->rs[D3DRS_FOGENABLE]) << 8);
+    key |= (uint32_t) (device->swvp << 9);
+
+    /* We want to use a 64 bits key for performance.
+     * Use compressed float16 values for the pointsize min/max in the key.
+     * Shaders do not usually output psize.*/
+    if (vs->point_size) {
+        key |= ((uint64_t)util_float_to_half(asfloat(context->rs[D3DRS_POINTSIZE_MIN]))) << 32;
+        key |= ((uint64_t)util_float_to_half(asfloat(context->rs[D3DRS_POINTSIZE_MAX]))) << 48;
+    }
+
     res = vs->last_key != key;
     if (res)
         vs->next_key = key;
@@ -89,6 +110,11 @@ NineVertexShader9_UpdateKey( struct NineVertexShader9 *vs,
 void *
 NineVertexShader9_GetVariant( struct NineVertexShader9 *vs );
 
+void *
+NineVertexShader9_GetVariantProcessVertices( struct NineVertexShader9 *vs,
+                                             struct NineVertexDeclaration9 *vdecl_out,
+                                             struct pipe_stream_output_info *so );
+
 /*** public ***/
 
 HRESULT
@@ -104,7 +130,7 @@ NineVertexShader9_ctor( struct NineVertexShader9 *,
 void
 NineVertexShader9_dtor( struct NineVertexShader9 * );
 
-HRESULT WINAPI
+HRESULT NINE_WINAPI
 NineVertexShader9_GetFunction( struct NineVertexShader9 *This,
                                void *pData,
                                UINT *pSizeOfData );