xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/nine/vertexshader9.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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 #include "nine_helpers.h"
7*61046927SAndroid Build Coastguard Worker #include "nine_shader.h"
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #include "vertexdeclaration9.h"
10*61046927SAndroid Build Coastguard Worker #include "vertexshader9.h"
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker #include "device9.h"
13*61046927SAndroid Build Coastguard Worker #include "pipe/p_context.h"
14*61046927SAndroid Build Coastguard Worker #include "cso_cache/cso_context.h"
15*61046927SAndroid Build Coastguard Worker 
16*61046927SAndroid Build Coastguard Worker #define DBG_CHANNEL DBG_VERTEXSHADER
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker HRESULT
NineVertexShader9_ctor(struct NineVertexShader9 * This,struct NineUnknownParams * pParams,const DWORD * pFunction,void * cso)19*61046927SAndroid Build Coastguard Worker NineVertexShader9_ctor( struct NineVertexShader9 *This,
20*61046927SAndroid Build Coastguard Worker                         struct NineUnknownParams *pParams,
21*61046927SAndroid Build Coastguard Worker                         const DWORD *pFunction, void *cso )
22*61046927SAndroid Build Coastguard Worker {
23*61046927SAndroid Build Coastguard Worker     struct NineDevice9 *device;
24*61046927SAndroid Build Coastguard Worker     struct nine_shader_info info;
25*61046927SAndroid Build Coastguard Worker     struct pipe_context *pipe;
26*61046927SAndroid Build Coastguard Worker     HRESULT hr;
27*61046927SAndroid Build Coastguard Worker     unsigned i;
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker     DBG("This=%p pParams=%p pFunction=%p cso=%p\n",
30*61046927SAndroid Build Coastguard Worker         This, pParams, pFunction, cso);
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker     hr = NineUnknown_ctor(&This->base, pParams);
33*61046927SAndroid Build Coastguard Worker     if (FAILED(hr))
34*61046927SAndroid Build Coastguard Worker         return hr;
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker     if (cso) {
37*61046927SAndroid Build Coastguard Worker         This->ff_cso = cso;
38*61046927SAndroid Build Coastguard Worker         return D3D_OK;
39*61046927SAndroid Build Coastguard Worker     }
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker     device = This->base.device;
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker     info.type = PIPE_SHADER_VERTEX;
44*61046927SAndroid Build Coastguard Worker     info.byte_code = pFunction;
45*61046927SAndroid Build Coastguard Worker     info.const_i_base = NINE_CONST_I_BASE(device->max_vs_const_f) / 16;
46*61046927SAndroid Build Coastguard Worker     info.const_b_base = NINE_CONST_B_BASE(device->max_vs_const_f) / 16;
47*61046927SAndroid Build Coastguard Worker     info.sampler_mask_shadow = 0x0;
48*61046927SAndroid Build Coastguard Worker     info.fetch4 = 0x0;
49*61046927SAndroid Build Coastguard Worker     info.sampler_ps1xtypes = 0x0;
50*61046927SAndroid Build Coastguard Worker     info.fog_enable = 0;
51*61046927SAndroid Build Coastguard Worker     info.point_size_min = 0;
52*61046927SAndroid Build Coastguard Worker     info.point_size_max = 0;
53*61046927SAndroid Build Coastguard Worker     info.clip_plane_emulation = 0;
54*61046927SAndroid Build Coastguard Worker     info.add_constants_defs.c_combination = NULL;
55*61046927SAndroid Build Coastguard Worker     info.add_constants_defs.int_const_added = NULL;
56*61046927SAndroid Build Coastguard Worker     info.add_constants_defs.bool_const_added = NULL;
57*61046927SAndroid Build Coastguard Worker     info.swvp_on = !!(device->params.BehaviorFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING);
58*61046927SAndroid Build Coastguard Worker     info.process_vertices = false;
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker     pipe = nine_context_get_pipe_acquire(device);
61*61046927SAndroid Build Coastguard Worker     hr = nine_translate_shader(device, &info, pipe);
62*61046927SAndroid Build Coastguard Worker     if (hr == D3DERR_INVALIDCALL &&
63*61046927SAndroid Build Coastguard Worker         (device->params.BehaviorFlags & D3DCREATE_MIXED_VERTEXPROCESSING)) {
64*61046927SAndroid Build Coastguard Worker         /* Retry with a swvp shader. It will require swvp to be on. */
65*61046927SAndroid Build Coastguard Worker         info.swvp_on = true;
66*61046927SAndroid Build Coastguard Worker         hr = nine_translate_shader(device, &info, pipe);
67*61046927SAndroid Build Coastguard Worker     }
68*61046927SAndroid Build Coastguard Worker     nine_context_get_pipe_release(device);
69*61046927SAndroid Build Coastguard Worker     if (hr == D3DERR_INVALIDCALL)
70*61046927SAndroid Build Coastguard Worker         ERR("Encountered buggy shader\n");
71*61046927SAndroid Build Coastguard Worker     if (FAILED(hr))
72*61046927SAndroid Build Coastguard Worker         return hr;
73*61046927SAndroid Build Coastguard Worker     This->byte_code.version = info.version;
74*61046927SAndroid Build Coastguard Worker     This->swvp_only = info.swvp_on;
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker     This->byte_code.tokens = mem_dup(pFunction, info.byte_size);
77*61046927SAndroid Build Coastguard Worker     if (!This->byte_code.tokens)
78*61046927SAndroid Build Coastguard Worker         return E_OUTOFMEMORY;
79*61046927SAndroid Build Coastguard Worker     This->byte_code.size = info.byte_size;
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker     This->variant.cso = info.cso;
82*61046927SAndroid Build Coastguard Worker     This->variant.const_ranges = info.const_ranges;
83*61046927SAndroid Build Coastguard Worker     This->variant.const_used_size = info.const_used_size;
84*61046927SAndroid Build Coastguard Worker     This->last_cso = info.cso;
85*61046927SAndroid Build Coastguard Worker     This->last_const_ranges = info.const_ranges;
86*61046927SAndroid Build Coastguard Worker     This->last_const_used_size = info.const_used_size;
87*61046927SAndroid Build Coastguard Worker     This->last_key = (uint32_t) (info.swvp_on << 9);
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker     This->lconstf = info.lconstf;
90*61046927SAndroid Build Coastguard Worker     This->sampler_mask = info.sampler_mask;
91*61046927SAndroid Build Coastguard Worker     This->position_t = info.position_t;
92*61046927SAndroid Build Coastguard Worker     This->point_size = info.point_size;
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker     memcpy(This->int_slots_used, info.int_slots_used, sizeof(This->int_slots_used));
95*61046927SAndroid Build Coastguard Worker     memcpy(This->bool_slots_used, info.bool_slots_used, sizeof(This->bool_slots_used));
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker     This->const_int_slots = info.const_int_slots;
98*61046927SAndroid Build Coastguard Worker     This->const_bool_slots = info.const_bool_slots;
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker     This->c_combinations = NULL;
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker     for (i = 0; i < info.num_inputs && i < ARRAY_SIZE(This->input_map); ++i)
103*61046927SAndroid Build Coastguard Worker         This->input_map[i].ndecl = info.input_map[i];
104*61046927SAndroid Build Coastguard Worker     This->num_inputs = i;
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker     return D3D_OK;
107*61046927SAndroid Build Coastguard Worker }
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker void
NineVertexShader9_dtor(struct NineVertexShader9 * This)110*61046927SAndroid Build Coastguard Worker NineVertexShader9_dtor( struct NineVertexShader9 *This )
111*61046927SAndroid Build Coastguard Worker {
112*61046927SAndroid Build Coastguard Worker     DBG("This=%p\n", This);
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker     if (This->base.device) {
115*61046927SAndroid Build Coastguard Worker         struct pipe_context *pipe = nine_context_get_pipe_multithread(This->base.device);
116*61046927SAndroid Build Coastguard Worker         struct nine_shader_variant *var = &This->variant;
117*61046927SAndroid Build Coastguard Worker         struct nine_shader_variant_so *var_so = &This->variant_so;
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker         do {
120*61046927SAndroid Build Coastguard Worker             if (var->cso) {
121*61046927SAndroid Build Coastguard Worker                 if (This->base.device->context.cso_shader.vs == var->cso) {
122*61046927SAndroid Build Coastguard Worker                     /* unbind because it is illegal to delete something bound */
123*61046927SAndroid Build Coastguard Worker                     pipe->bind_vs_state(pipe, NULL);
124*61046927SAndroid Build Coastguard Worker                     /* This will rebind cso_shader.vs in case somehow actually
125*61046927SAndroid Build Coastguard Worker                      * an identical shader with same cso is bound */
126*61046927SAndroid Build Coastguard Worker                     This->base.device->context.commit |= NINE_STATE_COMMIT_VS;
127*61046927SAndroid Build Coastguard Worker                 }
128*61046927SAndroid Build Coastguard Worker                 pipe->delete_vs_state(pipe, var->cso);
129*61046927SAndroid Build Coastguard Worker                 FREE(var->const_ranges);
130*61046927SAndroid Build Coastguard Worker             }
131*61046927SAndroid Build Coastguard Worker             var = var->next;
132*61046927SAndroid Build Coastguard Worker         } while (var);
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker         while (var_so && var_so->vdecl) {
135*61046927SAndroid Build Coastguard Worker             if (var_so->cso) {
136*61046927SAndroid Build Coastguard Worker                 This->base.device->pipe_sw->delete_vs_state(This->base.device->pipe_sw, var_so->cso);
137*61046927SAndroid Build Coastguard Worker             }
138*61046927SAndroid Build Coastguard Worker             var_so = var_so->next;
139*61046927SAndroid Build Coastguard Worker         }
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker         if (This->ff_cso) {
142*61046927SAndroid Build Coastguard Worker             if (This->ff_cso == This->base.device->context.cso_shader.vs) {
143*61046927SAndroid Build Coastguard Worker                 pipe->bind_vs_state(pipe, NULL);
144*61046927SAndroid Build Coastguard Worker                 This->base.device->context.commit |= NINE_STATE_COMMIT_VS;
145*61046927SAndroid Build Coastguard Worker             }
146*61046927SAndroid Build Coastguard Worker             pipe->delete_vs_state(pipe, This->ff_cso);
147*61046927SAndroid Build Coastguard Worker         }
148*61046927SAndroid Build Coastguard Worker     }
149*61046927SAndroid Build Coastguard Worker     nine_shader_variants_free(&This->variant);
150*61046927SAndroid Build Coastguard Worker     nine_shader_variants_so_free(&This->variant_so);
151*61046927SAndroid Build Coastguard Worker 
152*61046927SAndroid Build Coastguard Worker     nine_shader_constant_combination_free(This->c_combinations);
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker     FREE((void *)This->byte_code.tokens); /* const_cast */
155*61046927SAndroid Build Coastguard Worker 
156*61046927SAndroid Build Coastguard Worker     FREE(This->lconstf.data);
157*61046927SAndroid Build Coastguard Worker     FREE(This->lconstf.ranges);
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker     NineUnknown_dtor(&This->base);
160*61046927SAndroid Build Coastguard Worker }
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker HRESULT NINE_WINAPI
NineVertexShader9_GetFunction(struct NineVertexShader9 * This,void * pData,UINT * pSizeOfData)163*61046927SAndroid Build Coastguard Worker NineVertexShader9_GetFunction( struct NineVertexShader9 *This,
164*61046927SAndroid Build Coastguard Worker                                void *pData,
165*61046927SAndroid Build Coastguard Worker                                UINT *pSizeOfData )
166*61046927SAndroid Build Coastguard Worker {
167*61046927SAndroid Build Coastguard Worker     user_assert(pSizeOfData, D3DERR_INVALIDCALL);
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker     if (!pData) {
170*61046927SAndroid Build Coastguard Worker         *pSizeOfData = This->byte_code.size;
171*61046927SAndroid Build Coastguard Worker         return D3D_OK;
172*61046927SAndroid Build Coastguard Worker     }
173*61046927SAndroid Build Coastguard Worker     user_assert(*pSizeOfData >= This->byte_code.size, D3DERR_INVALIDCALL);
174*61046927SAndroid Build Coastguard Worker 
175*61046927SAndroid Build Coastguard Worker     memcpy(pData, This->byte_code.tokens, This->byte_code.size);
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker     return D3D_OK;
178*61046927SAndroid Build Coastguard Worker }
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker void *
NineVertexShader9_GetVariant(struct NineVertexShader9 * This,unsigned ** const_ranges,unsigned * const_used_size)181*61046927SAndroid Build Coastguard Worker NineVertexShader9_GetVariant( struct NineVertexShader9 *This,
182*61046927SAndroid Build Coastguard Worker                               unsigned **const_ranges,
183*61046927SAndroid Build Coastguard Worker                               unsigned *const_used_size )
184*61046927SAndroid Build Coastguard Worker {
185*61046927SAndroid Build Coastguard Worker     /* GetVariant is called from nine_context, thus we can
186*61046927SAndroid Build Coastguard Worker      * get pipe directly */
187*61046927SAndroid Build Coastguard Worker     struct pipe_context *pipe = This->base.device->context.pipe;
188*61046927SAndroid Build Coastguard Worker     void *cso;
189*61046927SAndroid Build Coastguard Worker     uint64_t key;
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker     key = This->next_key;
192*61046927SAndroid Build Coastguard Worker     if (key == This->last_key) {
193*61046927SAndroid Build Coastguard Worker         *const_ranges = This->last_const_ranges;
194*61046927SAndroid Build Coastguard Worker         *const_used_size = This->last_const_used_size;
195*61046927SAndroid Build Coastguard Worker         return This->last_cso;
196*61046927SAndroid Build Coastguard Worker     }
197*61046927SAndroid Build Coastguard Worker 
198*61046927SAndroid Build Coastguard Worker     cso = nine_shader_variant_get(&This->variant, const_ranges, const_used_size, key);
199*61046927SAndroid Build Coastguard Worker     if (!cso) {
200*61046927SAndroid Build Coastguard Worker         struct NineDevice9 *device = This->base.device;
201*61046927SAndroid Build Coastguard Worker         struct nine_shader_info info;
202*61046927SAndroid Build Coastguard Worker         HRESULT hr;
203*61046927SAndroid Build Coastguard Worker 
204*61046927SAndroid Build Coastguard Worker         info.type = PIPE_SHADER_VERTEX;
205*61046927SAndroid Build Coastguard Worker         info.const_i_base = NINE_CONST_I_BASE(device->max_vs_const_f) / 16;
206*61046927SAndroid Build Coastguard Worker         info.const_b_base = NINE_CONST_B_BASE(device->max_vs_const_f) / 16;
207*61046927SAndroid Build Coastguard Worker         info.byte_code = This->byte_code.tokens;
208*61046927SAndroid Build Coastguard Worker         info.sampler_mask_shadow = key & 0xf;
209*61046927SAndroid Build Coastguard Worker         info.fetch4 = 0x0;
210*61046927SAndroid Build Coastguard Worker         info.fog_enable = device->context.rs[D3DRS_FOGENABLE];
211*61046927SAndroid Build Coastguard Worker         info.point_size_min = asfloat(device->context.rs[D3DRS_POINTSIZE_MIN]);
212*61046927SAndroid Build Coastguard Worker         info.point_size_max = asfloat(device->context.rs[D3DRS_POINTSIZE_MAX]);
213*61046927SAndroid Build Coastguard Worker         info.clip_plane_emulation = (key >> 24) & 0xff;
214*61046927SAndroid Build Coastguard Worker         info.add_constants_defs.c_combination =
215*61046927SAndroid Build Coastguard Worker             nine_shader_constant_combination_get(This->c_combinations, (key >> 16) & 0xff);
216*61046927SAndroid Build Coastguard Worker         info.add_constants_defs.int_const_added = &This->int_slots_used;
217*61046927SAndroid Build Coastguard Worker         info.add_constants_defs.bool_const_added = &This->bool_slots_used;
218*61046927SAndroid Build Coastguard Worker         info.swvp_on = device->context.swvp;
219*61046927SAndroid Build Coastguard Worker         info.process_vertices = false;
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker         hr = nine_translate_shader(This->base.device, &info, pipe);
222*61046927SAndroid Build Coastguard Worker         if (FAILED(hr))
223*61046927SAndroid Build Coastguard Worker             return NULL;
224*61046927SAndroid Build Coastguard Worker         nine_shader_variant_add(&This->variant, key, info.cso,
225*61046927SAndroid Build Coastguard Worker                                 info.const_ranges, info.const_used_size);
226*61046927SAndroid Build Coastguard Worker         cso = info.cso;
227*61046927SAndroid Build Coastguard Worker         *const_ranges = info.const_ranges;
228*61046927SAndroid Build Coastguard Worker         *const_used_size = info.const_used_size;
229*61046927SAndroid Build Coastguard Worker     }
230*61046927SAndroid Build Coastguard Worker 
231*61046927SAndroid Build Coastguard Worker     This->last_key = key;
232*61046927SAndroid Build Coastguard Worker     This->last_cso = cso;
233*61046927SAndroid Build Coastguard Worker     This->last_const_ranges = *const_ranges;
234*61046927SAndroid Build Coastguard Worker     This->last_const_used_size = *const_used_size;
235*61046927SAndroid Build Coastguard Worker 
236*61046927SAndroid Build Coastguard Worker     return cso;
237*61046927SAndroid Build Coastguard Worker }
238*61046927SAndroid Build Coastguard Worker 
239*61046927SAndroid Build Coastguard Worker void *
NineVertexShader9_GetVariantProcessVertices(struct NineVertexShader9 * This,struct NineVertexDeclaration9 * vdecl_out,struct pipe_stream_output_info * so)240*61046927SAndroid Build Coastguard Worker NineVertexShader9_GetVariantProcessVertices( struct NineVertexShader9 *This,
241*61046927SAndroid Build Coastguard Worker                                              struct NineVertexDeclaration9 *vdecl_out,
242*61046927SAndroid Build Coastguard Worker                                              struct pipe_stream_output_info *so )
243*61046927SAndroid Build Coastguard Worker {
244*61046927SAndroid Build Coastguard Worker     struct nine_shader_info info;
245*61046927SAndroid Build Coastguard Worker     HRESULT hr;
246*61046927SAndroid Build Coastguard Worker     void *cso;
247*61046927SAndroid Build Coastguard Worker 
248*61046927SAndroid Build Coastguard Worker     cso = nine_shader_variant_so_get(&This->variant_so, vdecl_out, so);
249*61046927SAndroid Build Coastguard Worker     if (cso)
250*61046927SAndroid Build Coastguard Worker         return cso;
251*61046927SAndroid Build Coastguard Worker 
252*61046927SAndroid Build Coastguard Worker     info.type = PIPE_SHADER_VERTEX;
253*61046927SAndroid Build Coastguard Worker     info.const_i_base = 0;
254*61046927SAndroid Build Coastguard Worker     info.const_b_base = 0;
255*61046927SAndroid Build Coastguard Worker     info.byte_code = This->byte_code.tokens;
256*61046927SAndroid Build Coastguard Worker     info.sampler_mask_shadow = 0;
257*61046927SAndroid Build Coastguard Worker     info.fetch4 = 0x0;
258*61046927SAndroid Build Coastguard Worker     info.fog_enable = false;
259*61046927SAndroid Build Coastguard Worker     info.point_size_min = 0;
260*61046927SAndroid Build Coastguard Worker     info.point_size_max = 0;
261*61046927SAndroid Build Coastguard Worker     info.add_constants_defs.c_combination = NULL;
262*61046927SAndroid Build Coastguard Worker     info.add_constants_defs.int_const_added = NULL;
263*61046927SAndroid Build Coastguard Worker     info.add_constants_defs.bool_const_added = NULL;
264*61046927SAndroid Build Coastguard Worker     info.swvp_on = true;
265*61046927SAndroid Build Coastguard Worker     info.vdecl_out = vdecl_out;
266*61046927SAndroid Build Coastguard Worker     info.process_vertices = true;
267*61046927SAndroid Build Coastguard Worker     hr = nine_translate_shader(This->base.device, &info, This->base.device->pipe_sw);
268*61046927SAndroid Build Coastguard Worker     if (FAILED(hr))
269*61046927SAndroid Build Coastguard Worker         return NULL;
270*61046927SAndroid Build Coastguard Worker     *so = info.so;
271*61046927SAndroid Build Coastguard Worker     nine_shader_variant_so_add(&This->variant_so, vdecl_out, so, info.cso);
272*61046927SAndroid Build Coastguard Worker     return info.cso;
273*61046927SAndroid Build Coastguard Worker }
274*61046927SAndroid Build Coastguard Worker 
275*61046927SAndroid Build Coastguard Worker IDirect3DVertexShader9Vtbl NineVertexShader9_vtable = {
276*61046927SAndroid Build Coastguard Worker     (void *)NineUnknown_QueryInterface,
277*61046927SAndroid Build Coastguard Worker     (void *)NineUnknown_AddRef,
278*61046927SAndroid Build Coastguard Worker     (void *)NineUnknown_Release,
279*61046927SAndroid Build Coastguard Worker     (void *)NineUnknown_GetDevice,
280*61046927SAndroid Build Coastguard Worker     (void *)NineVertexShader9_GetFunction
281*61046927SAndroid Build Coastguard Worker };
282*61046927SAndroid Build Coastguard Worker 
283*61046927SAndroid Build Coastguard Worker static const GUID *NineVertexShader9_IIDs[] = {
284*61046927SAndroid Build Coastguard Worker     &IID_IDirect3DVertexShader9,
285*61046927SAndroid Build Coastguard Worker     &IID_IUnknown,
286*61046927SAndroid Build Coastguard Worker     NULL
287*61046927SAndroid Build Coastguard Worker };
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker HRESULT
NineVertexShader9_new(struct NineDevice9 * pDevice,struct NineVertexShader9 ** ppOut,const DWORD * pFunction,void * cso)290*61046927SAndroid Build Coastguard Worker NineVertexShader9_new( struct NineDevice9 *pDevice,
291*61046927SAndroid Build Coastguard Worker                        struct NineVertexShader9 **ppOut,
292*61046927SAndroid Build Coastguard Worker                        const DWORD *pFunction, void *cso )
293*61046927SAndroid Build Coastguard Worker {
294*61046927SAndroid Build Coastguard Worker     if (cso) {
295*61046927SAndroid Build Coastguard Worker         NINE_DEVICE_CHILD_BIND_NEW(VertexShader9, ppOut, pDevice, pFunction, cso);
296*61046927SAndroid Build Coastguard Worker     } else {
297*61046927SAndroid Build Coastguard Worker         NINE_DEVICE_CHILD_NEW(VertexShader9, ppOut, pDevice, pFunction, cso);
298*61046927SAndroid Build Coastguard Worker     }
299*61046927SAndroid Build Coastguard Worker }
300