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