1fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt/*
2fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * Copyright 2011 Joakim Sindholt <opensource@zhasha.com>
3fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt *
4fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * Permission is hereby granted, free of charge, to any person obtaining a
5fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * copy of this software and associated documentation files (the "Software"),
6fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * to deal in the Software without restriction, including without limitation
7fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * on the rights to use, copy, modify, merge, publish, distribute, sub
8fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * license, and/or sell copies of the Software, and to permit persons to whom
9fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * the Software is furnished to do so, subject to the following conditions:
10fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt *
11fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * The above copyright notice and this permission notice (including the next
12fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * paragraph) shall be included in all copies or substantial portions of the
13fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * Software.
14fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt *
15fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt * USE OR OTHER DEALINGS IN THE SOFTWARE. */
22fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
23fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "nine_helpers.h"
24fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "nine_shader.h"
25fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
26fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "pixelshader9.h"
27fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
28fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "device9.h"
29fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "pipe/p_context.h"
30fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
31fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#define DBG_CHANNEL DBG_PIXELSHADER
32fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
33fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim SindholtHRESULT
34fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim SindholtNinePixelShader9_ctor( struct NinePixelShader9 *This,
35fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt                       struct NineUnknownParams *pParams,
36fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt                       const DWORD *pFunction, void *cso )
37fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{
38fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    struct NineDevice9 *device;
39fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    struct nine_shader_info info;
40f5f881fd3eac79fc2dad865bc1387bfcee40e352Axel Davy    struct pipe_context *pipe;
41fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    HRESULT hr;
42fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
437f74b9d47928979fdad445db1e0f249688c62991Stanislaw Halik    DBG("This=%p pParams=%p pFunction=%p cso=%p\n", This, pParams, pFunction, cso);
447f74b9d47928979fdad445db1e0f249688c62991Stanislaw Halik
45fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    hr = NineUnknown_ctor(&This->base, pParams);
46fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    if (FAILED(hr))
47fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        return hr;
48fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
49fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    if (cso) {
5069de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy        This->ff_cso = cso;
51fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        return D3D_OK;
52fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    }
53fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    device = This->base.device;
54fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
55fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    info.type = PIPE_SHADER_FRAGMENT;
56fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    info.byte_code = pFunction;
57fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    info.const_i_base = NINE_CONST_I_BASE(device->max_ps_const_f) / 16;
58fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    info.const_b_base = NINE_CONST_B_BASE(device->max_ps_const_f) / 16;
59fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    info.sampler_mask_shadow = 0x0;
60fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    info.sampler_ps1xtypes = 0x0;
618f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy    info.fog_enable = 0;
624a00e4cdc970582df338ebf880168a4ef4ec05d9Axel Davy    info.projected = 0;
63b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy    info.process_vertices = false;
64fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
6531262bbce085c69ef7a654528f509cb37415b41fAxel Davy    pipe = nine_context_get_pipe_acquire(device);
66f5f881fd3eac79fc2dad865bc1387bfcee40e352Axel Davy    hr = nine_translate_shader(device, &info, pipe);
6731262bbce085c69ef7a654528f509cb37415b41fAxel Davy    nine_context_get_pipe_release(device);
68fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    if (FAILED(hr))
69fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        return hr;
70fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    This->byte_code.version = info.version;
71fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
72fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    This->byte_code.tokens = mem_dup(pFunction, info.byte_size);
73fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    if (!This->byte_code.tokens)
74fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        return E_OUTOFMEMORY;
75fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    This->byte_code.size = info.byte_size;
76fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
77fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    This->variant.cso = info.cso;
7869de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy    This->last_cso = info.cso;
7969de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy    This->last_key = 0;
8069de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy
81fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    This->sampler_mask = info.sampler_mask;
82fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    This->rt_mask = info.rt_mask;
83fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    This->const_used_size = info.const_used_size;
84360ba5b74858b3854784e3d4678c242140088395Tiziano Bacocco    This->bumpenvmat_needed = info.bumpenvmat_needed;
854b7a9cfddb1b8b47aeb2b466f66973d962555542Axel Davy    /* no constant relative addressing for ps */
864b7a9cfddb1b8b47aeb2b466f66973d962555542Axel Davy    assert(info.lconstf.data == NULL);
874b7a9cfddb1b8b47aeb2b466f66973d962555542Axel Davy    assert(info.lconstf.ranges == NULL);
88fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
89fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    return D3D_OK;
90fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}
91fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
92fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtvoid
93fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim SindholtNinePixelShader9_dtor( struct NinePixelShader9 *This )
94fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{
9569de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy    DBG("This=%p\n", This);
96fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
97fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    if (This->base.device) {
98ac2927335bc7cd4994d2fc0906eb328773b1f923Patrick Rudolph        struct pipe_context *pipe = nine_context_get_pipe_multithread(This->base.device);
9989344a80fc4479fa3ac466cb17706cf12070afe1Axel Davy        struct nine_shader_variant *var = &This->variant;
10069de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy
101fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        do {
102fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt            if (var->cso) {
103fc49f7df8920df77dfbb0163a11486494f0c7883Axel Davy                if (This->base.device->context.cso_shader.ps == var->cso)
104fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt                    pipe->bind_fs_state(pipe, NULL);
105fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt                pipe->delete_fs_state(pipe, var->cso);
106fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt            }
107fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt            var = var->next;
108fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        } while (var);
10969de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy
11069de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy        if (This->ff_cso) {
111fc49f7df8920df77dfbb0163a11486494f0c7883Axel Davy            if (This->ff_cso == This->base.device->context.cso_shader.ps)
11269de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy                pipe->bind_fs_state(pipe, NULL);
11369de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy            pipe->delete_fs_state(pipe, This->ff_cso);
11469de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy        }
115fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    }
11689344a80fc4479fa3ac466cb17706cf12070afe1Axel Davy    nine_shader_variants_free(&This->variant);
117fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
1189019e5e19532fe214fc6e45b9ee1f60bbe332456Matt Turner    FREE((void *)This->byte_code.tokens); /* const_cast */
119fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
120fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    NineUnknown_dtor(&This->base);
121fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}
122fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
12377d6c11f8fa87ba1070028cb036807dc8a115633Axel DavyHRESULT NINE_WINAPI
124fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim SindholtNinePixelShader9_GetFunction( struct NinePixelShader9 *This,
125fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt                              void *pData,
126fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt                              UINT *pSizeOfData )
127fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{
1287f74b9d47928979fdad445db1e0f249688c62991Stanislaw Halik    DBG("This=%p pData=%p pSizeOfData=%p\n", This, pData, pSizeOfData);
1297f74b9d47928979fdad445db1e0f249688c62991Stanislaw Halik
130fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    user_assert(pSizeOfData, D3DERR_INVALIDCALL);
131fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
132fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    if (!pData) {
133fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        *pSizeOfData = This->byte_code.size;
134fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        return D3D_OK;
135fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    }
136fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    user_assert(*pSizeOfData >= This->byte_code.size, D3DERR_INVALIDCALL);
137fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
138fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    memcpy(pData, This->byte_code.tokens, This->byte_code.size);
139fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
140fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    return D3D_OK;
141fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}
142fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
143fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtvoid *
14469de5d626f2e67e74e4de94ce13f7ac50fa52161Axel DavyNinePixelShader9_GetVariant( struct NinePixelShader9 *This )
145fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{
146f5f881fd3eac79fc2dad865bc1387bfcee40e352Axel Davy    /* GetVariant is called from nine_context, thus we can
147f5f881fd3eac79fc2dad865bc1387bfcee40e352Axel Davy     * get pipe directly */
148f5f881fd3eac79fc2dad865bc1387bfcee40e352Axel Davy    struct pipe_context *pipe = This->base.device->context.pipe;
14969de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy    void *cso;
1508f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy    uint64_t key;
15169de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy
15269de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy    key = This->next_key;
15369de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy    if (key == This->last_key)
15469de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy        return This->last_cso;
15569de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy
15689344a80fc4479fa3ac466cb17706cf12070afe1Axel Davy    cso = nine_shader_variant_get(&This->variant, key);
157fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    if (!cso) {
158fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        struct NineDevice9 *device = This->base.device;
159fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        struct nine_shader_info info;
160fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        HRESULT hr;
161fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
162fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        info.type = PIPE_SHADER_FRAGMENT;
163fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        info.const_i_base = NINE_CONST_I_BASE(device->max_ps_const_f) / 16;
164fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        info.const_b_base = NINE_CONST_B_BASE(device->max_ps_const_f) / 16;
165fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        info.byte_code = This->byte_code.tokens;
166fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        info.sampler_mask_shadow = key & 0xffff;
167fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        info.sampler_ps1xtypes = key;
16864e232bd60336591e55e6c95112bac334cb38970Axel Davy        info.fog_enable = device->context.rs[D3DRS_FOGENABLE];
16964e232bd60336591e55e6c95112bac334cb38970Axel Davy        info.fog_mode = device->context.rs[D3DRS_FOGTABLEMODE];
17024ddadbba9ddfde579cc4cc65f58b063122b8d02Axel Davy        info.force_color_in_centroid = key >> 34 & 1;
1714a00e4cdc970582df338ebf880168a4ef4ec05d9Axel Davy        info.projected = (key >> 48) & 0xffff;
172b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy        info.process_vertices = false;
173fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
174f5f881fd3eac79fc2dad865bc1387bfcee40e352Axel Davy        hr = nine_translate_shader(This->base.device, &info, pipe);
175fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        if (FAILED(hr))
176fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt            return NULL;
17789344a80fc4479fa3ac466cb17706cf12070afe1Axel Davy        nine_shader_variant_add(&This->variant, key, info.cso);
178fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt        cso = info.cso;
179fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    }
18069de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy
18169de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy    This->last_key = key;
18269de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy    This->last_cso = cso;
18369de5d626f2e67e74e4de94ce13f7ac50fa52161Axel Davy
184fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    return cso;
185fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}
186fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
187fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim SindholtIDirect3DPixelShader9Vtbl NinePixelShader9_vtable = {
188fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    (void *)NineUnknown_QueryInterface,
189fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    (void *)NineUnknown_AddRef,
190fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    (void *)NineUnknown_Release,
191fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    (void *)NineUnknown_GetDevice,
192fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    (void *)NinePixelShader9_GetFunction
193fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt};
194fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
195fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtstatic const GUID *NinePixelShader9_IIDs[] = {
196fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    &IID_IDirect3DPixelShader9,
197fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    &IID_IUnknown,
198fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    NULL
199fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt};
200fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt
201fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim SindholtHRESULT
202fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim SindholtNinePixelShader9_new( struct NineDevice9 *pDevice,
203fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt                      struct NinePixelShader9 **ppOut,
204fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt                      const DWORD *pFunction, void *cso )
205fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{
206fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt    NINE_DEVICE_CHILD_NEW(PixelShader9, ppOut, pDevice, pFunction, cso);
207fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}
208