1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright 2011 Joakim Sindholt <[email protected]>
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker #ifndef _NINE_VERTEXSHADER9_H_
7*61046927SAndroid Build Coastguard Worker #define _NINE_VERTEXSHADER9_H_
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard Worker #include "util/half_float.h"
10*61046927SAndroid Build Coastguard Worker
11*61046927SAndroid Build Coastguard Worker #include "iunknown.h"
12*61046927SAndroid Build Coastguard Worker #include "device9.h"
13*61046927SAndroid Build Coastguard Worker #include "nine_helpers.h"
14*61046927SAndroid Build Coastguard Worker #include "nine_shader.h"
15*61046927SAndroid Build Coastguard Worker #include "nine_state.h"
16*61046927SAndroid Build Coastguard Worker
17*61046927SAndroid Build Coastguard Worker struct NineVertexDeclaration9;
18*61046927SAndroid Build Coastguard Worker
19*61046927SAndroid Build Coastguard Worker struct NineVertexShader9
20*61046927SAndroid Build Coastguard Worker {
21*61046927SAndroid Build Coastguard Worker struct NineUnknown base;
22*61046927SAndroid Build Coastguard Worker struct nine_shader_variant variant;
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker struct {
25*61046927SAndroid Build Coastguard Worker uint16_t ndecl; /* NINE_DECLUSAGE_x */
26*61046927SAndroid Build Coastguard Worker } input_map[PIPE_MAX_ATTRIBS];
27*61046927SAndroid Build Coastguard Worker unsigned num_inputs;
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker struct {
30*61046927SAndroid Build Coastguard Worker const DWORD *tokens;
31*61046927SAndroid Build Coastguard Worker DWORD size;
32*61046927SAndroid Build Coastguard Worker uint8_t version; /* (major << 4) | minor */
33*61046927SAndroid Build Coastguard Worker } byte_code;
34*61046927SAndroid Build Coastguard Worker
35*61046927SAndroid Build Coastguard Worker uint8_t sampler_mask;
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker bool position_t; /* if true, disable vport transform */
38*61046927SAndroid Build Coastguard Worker bool point_size; /* if true, set rasterizer.point_size_per_vertex to 1 */
39*61046927SAndroid Build Coastguard Worker bool swvp_only;
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Worker struct nine_lconstf lconstf;
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker bool int_slots_used[NINE_MAX_CONST_I];
44*61046927SAndroid Build Coastguard Worker bool bool_slots_used[NINE_MAX_CONST_B];
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker unsigned const_int_slots;
47*61046927SAndroid Build Coastguard Worker unsigned const_bool_slots;
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Worker struct nine_shader_constant_combination *c_combinations;
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker uint64_t ff_key[3];
52*61046927SAndroid Build Coastguard Worker void *ff_cso;
53*61046927SAndroid Build Coastguard Worker
54*61046927SAndroid Build Coastguard Worker uint64_t last_key;
55*61046927SAndroid Build Coastguard Worker void *last_cso;
56*61046927SAndroid Build Coastguard Worker unsigned *last_const_ranges;
57*61046927SAndroid Build Coastguard Worker unsigned last_const_used_size; /* in bytes */
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker uint64_t next_key;
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker /* so */
62*61046927SAndroid Build Coastguard Worker struct nine_shader_variant_so variant_so;
63*61046927SAndroid Build Coastguard Worker };
64*61046927SAndroid Build Coastguard Worker static inline struct NineVertexShader9 *
NineVertexShader9(void * data)65*61046927SAndroid Build Coastguard Worker NineVertexShader9( void *data )
66*61046927SAndroid Build Coastguard Worker {
67*61046927SAndroid Build Coastguard Worker return (struct NineVertexShader9 *)data;
68*61046927SAndroid Build Coastguard Worker }
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard Worker static inline BOOL
NineVertexShader9_UpdateKey(struct NineVertexShader9 * vs,struct NineDevice9 * device)71*61046927SAndroid Build Coastguard Worker NineVertexShader9_UpdateKey( struct NineVertexShader9 *vs,
72*61046927SAndroid Build Coastguard Worker struct NineDevice9 *device )
73*61046927SAndroid Build Coastguard Worker {
74*61046927SAndroid Build Coastguard Worker struct nine_context *context = &(device->context);
75*61046927SAndroid Build Coastguard Worker uint8_t samplers_shadow;
76*61046927SAndroid Build Coastguard Worker uint64_t key;
77*61046927SAndroid Build Coastguard Worker BOOL res;
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard Worker samplers_shadow = (uint8_t)((context->samplers_shadow & NINE_VS_SAMPLERS_MASK) >> NINE_SAMPLER_VS(0));
80*61046927SAndroid Build Coastguard Worker samplers_shadow &= vs->sampler_mask;
81*61046927SAndroid Build Coastguard Worker key = samplers_shadow;
82*61046927SAndroid Build Coastguard Worker
83*61046927SAndroid Build Coastguard Worker if (vs->byte_code.version < 0x30)
84*61046927SAndroid Build Coastguard Worker key |= (uint32_t) ((!!context->rs[D3DRS_FOGENABLE]) << 8);
85*61046927SAndroid Build Coastguard Worker key |= (uint32_t) (context->swvp << 9);
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker if ((vs->const_int_slots > 0 || vs->const_bool_slots > 0) && context->inline_constants && !context->swvp)
88*61046927SAndroid Build Coastguard Worker key |= ((uint64_t)nine_shader_constant_combination_key(&vs->c_combinations,
89*61046927SAndroid Build Coastguard Worker vs->int_slots_used,
90*61046927SAndroid Build Coastguard Worker vs->bool_slots_used,
91*61046927SAndroid Build Coastguard Worker context->vs_const_i,
92*61046927SAndroid Build Coastguard Worker context->vs_const_b)) << 16;
93*61046927SAndroid Build Coastguard Worker
94*61046927SAndroid Build Coastguard Worker if (device->driver_caps.emulate_ucp)
95*61046927SAndroid Build Coastguard Worker key |= (context->rs[D3DRS_CLIPPLANEENABLE] & 0xff) << 24;
96*61046927SAndroid Build Coastguard Worker
97*61046927SAndroid Build Coastguard Worker /* We want to use a 64 bits key for performance.
98*61046927SAndroid Build Coastguard Worker * Use compressed float16 values for the pointsize min/max in the key.
99*61046927SAndroid Build Coastguard Worker * Shaders do not usually output psize.*/
100*61046927SAndroid Build Coastguard Worker if (vs->point_size) {
101*61046927SAndroid Build Coastguard Worker key |= ((uint64_t)_mesa_float_to_half(asfloat(context->rs[D3DRS_POINTSIZE_MIN]))) << 32;
102*61046927SAndroid Build Coastguard Worker key |= ((uint64_t)_mesa_float_to_half(asfloat(context->rs[D3DRS_POINTSIZE_MAX]))) << 48;
103*61046927SAndroid Build Coastguard Worker }
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker res = vs->last_key != key;
106*61046927SAndroid Build Coastguard Worker if (res)
107*61046927SAndroid Build Coastguard Worker vs->next_key = key;
108*61046927SAndroid Build Coastguard Worker return res;
109*61046927SAndroid Build Coastguard Worker }
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Worker void *
112*61046927SAndroid Build Coastguard Worker NineVertexShader9_GetVariant( struct NineVertexShader9 *vs,
113*61046927SAndroid Build Coastguard Worker unsigned **const_ranges,
114*61046927SAndroid Build Coastguard Worker unsigned *const_used_size );
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Worker void *
117*61046927SAndroid Build Coastguard Worker NineVertexShader9_GetVariantProcessVertices( struct NineVertexShader9 *vs,
118*61046927SAndroid Build Coastguard Worker struct NineVertexDeclaration9 *vdecl_out,
119*61046927SAndroid Build Coastguard Worker struct pipe_stream_output_info *so );
120*61046927SAndroid Build Coastguard Worker
121*61046927SAndroid Build Coastguard Worker /*** public ***/
122*61046927SAndroid Build Coastguard Worker
123*61046927SAndroid Build Coastguard Worker HRESULT
124*61046927SAndroid Build Coastguard Worker NineVertexShader9_new( struct NineDevice9 *pDevice,
125*61046927SAndroid Build Coastguard Worker struct NineVertexShader9 **ppOut,
126*61046927SAndroid Build Coastguard Worker const DWORD *pFunction, void *cso );
127*61046927SAndroid Build Coastguard Worker
128*61046927SAndroid Build Coastguard Worker HRESULT
129*61046927SAndroid Build Coastguard Worker NineVertexShader9_ctor( struct NineVertexShader9 *,
130*61046927SAndroid Build Coastguard Worker struct NineUnknownParams *pParams,
131*61046927SAndroid Build Coastguard Worker const DWORD *pFunction, void *cso );
132*61046927SAndroid Build Coastguard Worker
133*61046927SAndroid Build Coastguard Worker void
134*61046927SAndroid Build Coastguard Worker NineVertexShader9_dtor( struct NineVertexShader9 * );
135*61046927SAndroid Build Coastguard Worker
136*61046927SAndroid Build Coastguard Worker HRESULT NINE_WINAPI
137*61046927SAndroid Build Coastguard Worker NineVertexShader9_GetFunction( struct NineVertexShader9 *This,
138*61046927SAndroid Build Coastguard Worker void *pData,
139*61046927SAndroid Build Coastguard Worker UINT *pSizeOfData );
140*61046927SAndroid Build Coastguard Worker
141*61046927SAndroid Build Coastguard Worker #endif /* _NINE_VERTEXSHADER9_H_ */
142