2 * Copyright 2011 Joakim Sindholt <opensource@zhasha.com>
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * on the rights to use, copy, modify, merge, publish, distribute, sub
8 * license, and/or sell copies of the Software, and to permit persons to whom
9 * the Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21 * USE OR OTHER DEALINGS IN THE SOFTWARE. */
23 #ifndef _NINE_VERTEXSHADER9_H_
24 #define _NINE_VERTEXSHADER9_H_
26 #include "util/u_half.h"
30 #include "nine_helpers.h"
31 #include "nine_shader.h"
32 #include "nine_state.h"
34 struct NineVertexDeclaration9
;
36 struct NineVertexShader9
38 struct NineUnknown base
;
39 struct nine_shader_variant variant
;
42 uint16_t ndecl
; /* NINE_DECLUSAGE_x */
43 } input_map
[PIPE_MAX_ATTRIBS
];
49 uint8_t version
; /* (major << 4) | minor */
54 boolean position_t
; /* if true, disable vport transform */
55 boolean point_size
; /* if true, set rasterizer.point_size_per_vertex to 1 */
58 struct nine_lconstf lconstf
;
60 boolean int_slots_used
[NINE_MAX_CONST_I
];
61 boolean bool_slots_used
[NINE_MAX_CONST_B
];
63 unsigned const_int_slots
;
64 unsigned const_bool_slots
;
66 struct nine_shader_constant_combination
*c_combinations
;
73 unsigned *last_const_ranges
;
74 unsigned last_const_used_size
; /* in bytes */
79 struct nine_shader_variant_so variant_so
;
81 static inline struct NineVertexShader9
*
82 NineVertexShader9( void *data
)
84 return (struct NineVertexShader9
*)data
;
88 NineVertexShader9_UpdateKey( struct NineVertexShader9
*vs
,
89 struct NineDevice9
*device
)
91 struct nine_context
*context
= &(device
->context
);
92 uint8_t samplers_shadow
;
96 samplers_shadow
= (uint8_t)((context
->samplers_shadow
& NINE_VS_SAMPLERS_MASK
) >> NINE_SAMPLER_VS(0));
97 samplers_shadow
&= vs
->sampler_mask
;
98 key
= samplers_shadow
;
100 if (vs
->byte_code
.version
< 0x30)
101 key
|= (uint32_t) ((!!context
->rs
[D3DRS_FOGENABLE
]) << 8);
102 key
|= (uint32_t) (context
->swvp
<< 9);
104 if ((vs
->const_int_slots
> 0 || vs
->const_bool_slots
> 0) && context
->inline_constants
&& !context
->swvp
)
105 key
|= ((uint64_t)nine_shader_constant_combination_key(&vs
->c_combinations
,
109 context
->vs_const_b
)) << 16;
111 /* We want to use a 64 bits key for performance.
112 * Use compressed float16 values for the pointsize min/max in the key.
113 * Shaders do not usually output psize.*/
114 if (vs
->point_size
) {
115 key
|= ((uint64_t)util_float_to_half(asfloat(context
->rs
[D3DRS_POINTSIZE_MIN
]))) << 32;
116 key
|= ((uint64_t)util_float_to_half(asfloat(context
->rs
[D3DRS_POINTSIZE_MAX
]))) << 48;
119 res
= vs
->last_key
!= key
;
126 NineVertexShader9_GetVariant( struct NineVertexShader9
*vs
,
127 unsigned **const_ranges
,
128 unsigned *const_used_size
);
131 NineVertexShader9_GetVariantProcessVertices( struct NineVertexShader9
*vs
,
132 struct NineVertexDeclaration9
*vdecl_out
,
133 struct pipe_stream_output_info
*so
);
138 NineVertexShader9_new( struct NineDevice9
*pDevice
,
139 struct NineVertexShader9
**ppOut
,
140 const DWORD
*pFunction
, void *cso
);
143 NineVertexShader9_ctor( struct NineVertexShader9
*,
144 struct NineUnknownParams
*pParams
,
145 const DWORD
*pFunction
, void *cso
);
148 NineVertexShader9_dtor( struct NineVertexShader9
* );
151 NineVertexShader9_GetFunction( struct NineVertexShader9
*This
,
155 #endif /* _NINE_VERTEXSHADER9_H_ */