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#ifndef _NINE_SHADER_H_ 24fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#define _NINE_SHADER_H_ 25fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 26fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "d3d9types.h" 27fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "d3d9caps.h" 28fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "nine_defines.h" 29b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy#include "nine_helpers.h" 30fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "pipe/p_state.h" /* PIPE_MAX_ATTRIBS */ 31fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#include "util/u_memory.h" 32fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 33fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtstruct NineDevice9; 34b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davystruct NineVertexDeclaration9; 35fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 36fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtstruct nine_lconstf /* NOTE: both pointers should be FREE'd by the user */ 37fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 38fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt struct nine_range *ranges; /* single MALLOC, but next-pointers valid */ 39fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt float *data; 40fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}; 41fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 42fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtstruct nine_shader_info 43fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 44fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt unsigned type; /* in, PIPE_SHADER_x */ 45fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 46fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt uint8_t version; /* (major << 4) | minor */ 47fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 48fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt const DWORD *byte_code; /* in, pointer to shader tokens */ 49fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt DWORD byte_size; /* out, size of data at byte_code */ 50fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 51fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt void *cso; /* out, pipe cso for bind_vs,fs_state */ 52fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 53712a4c5438d0ce257344b5196c20ad7929b54a0eAxel Davy uint16_t input_map[PIPE_MAX_ATTRIBS]; /* VS input -> NINE_DECLUSAGE_x */ 54fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt uint8_t num_inputs; /* there may be unused inputs (NINE_DECLUSAGE_NONE) */ 55fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 56fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt boolean position_t; /* out, true if VP writes pre-transformed position */ 57fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt boolean point_size; /* out, true if VP writes point size */ 5889344a80fc4479fa3ac466cb17706cf12070afe1Axel Davy float point_size_min; 5989344a80fc4479fa3ac466cb17706cf12070afe1Axel Davy float point_size_max; 60fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 61fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt uint32_t sampler_ps1xtypes; /* 2 bits per sampler */ 62fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt uint16_t sampler_mask; /* out, which samplers are being used */ 63fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt uint16_t sampler_mask_shadow; /* in, which samplers use depth compare */ 64fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt uint8_t rt_mask; /* out, which render targets are being written */ 65fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 668f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy uint8_t fog_enable; 678f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy uint8_t fog_mode; 6824ddadbba9ddfde579cc4cc65f58b063122b8d02Axel Davy uint8_t force_color_in_centroid; 694a00e4cdc970582df338ebf880168a4ef4ec05d9Axel Davy uint16_t projected; /* ps 1.1 to 1.3 */ 708f39ffc11e8b6fdf7c940f9c1853a362a886977aAxel Davy 71fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt unsigned const_i_base; /* in vec4 (16 byte) units */ 72fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt unsigned const_b_base; /* in vec4 (16 byte) units */ 73fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt unsigned const_used_size; 74fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 75a249c7a161cdbb995b17195f1af88ed14f69f8b6Axel Davy unsigned const_float_slots; 76a249c7a161cdbb995b17195f1af88ed14f69f8b6Axel Davy unsigned const_int_slots; 77a249c7a161cdbb995b17195f1af88ed14f69f8b6Axel Davy unsigned const_bool_slots; 78a249c7a161cdbb995b17195f1af88ed14f69f8b6Axel Davy 79fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt struct nine_lconstf lconstf; /* out, NOTE: members to be free'd by user */ 80360ba5b74858b3854784e3d4678c242140088395Tiziano Bacocco uint8_t bumpenvmat_needed; 811604efa6fda9b780e8537a131ad77f3e83e5a67aAxel Davy 821604efa6fda9b780e8537a131ad77f3e83e5a67aAxel Davy boolean swvp_on; 83b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 84b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy boolean process_vertices; 85b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct NineVertexDeclaration9 *vdecl_out; 86b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_stream_output_info so; 87b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy}; 88b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 89b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davystruct nine_vs_output_info 90b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy{ 91b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy BYTE output_semantic; 92b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy int output_semantic_index; 93b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy int mask; 94b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy int output_index; 95fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}; 96fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 97a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void 98fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtnine_info_mark_const_f_used(struct nine_shader_info *info, int idx) 99fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 100a249c7a161cdbb995b17195f1af88ed14f69f8b6Axel Davy if (info->const_float_slots < (idx + 1)) 101a249c7a161cdbb995b17195f1af88ed14f69f8b6Axel Davy info->const_float_slots = idx + 1; 102fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 103a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void 104fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtnine_info_mark_const_i_used(struct nine_shader_info *info, int idx) 105fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 106a249c7a161cdbb995b17195f1af88ed14f69f8b6Axel Davy if (info->const_int_slots < (idx + 1)) 107a249c7a161cdbb995b17195f1af88ed14f69f8b6Axel Davy info->const_int_slots = idx + 1; 108fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 109a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void 110fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtnine_info_mark_const_b_used(struct nine_shader_info *info, int idx) 111fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 112a249c7a161cdbb995b17195f1af88ed14f69f8b6Axel Davy if (info->const_bool_slots < (idx + 1)) 113a249c7a161cdbb995b17195f1af88ed14f69f8b6Axel Davy info->const_bool_slots = idx + 1; 114fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 115fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 116fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim SindholtHRESULT 117f5f881fd3eac79fc2dad865bc1387bfcee40e352Axel Davynine_translate_shader(struct NineDevice9 *device, 118f5f881fd3eac79fc2dad865bc1387bfcee40e352Axel Davy struct nine_shader_info *, 119f5f881fd3eac79fc2dad865bc1387bfcee40e352Axel Davy struct pipe_context *); 120fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 121fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 122fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtstruct nine_shader_variant 123fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 124fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt struct nine_shader_variant *next; 125fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt void *cso; 12689344a80fc4479fa3ac466cb17706cf12070afe1Axel Davy uint64_t key; 127fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt}; 128fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 129a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void * 13089344a80fc4479fa3ac466cb17706cf12070afe1Axel Davynine_shader_variant_get(struct nine_shader_variant *list, uint64_t key) 131fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 132fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt while (list->key != key && list->next) 133fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt list = list->next; 134fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt if (list->key == key) 135fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt return list->cso; 136fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt return NULL; 137fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 138fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 139a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline boolean 140fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtnine_shader_variant_add(struct nine_shader_variant *list, 14189344a80fc4479fa3ac466cb17706cf12070afe1Axel Davy uint64_t key, void *cso) 142fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 143fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt while (list->next) { 144fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt assert(list->key != key); 145fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt list = list->next; 146fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 147fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt list->next = MALLOC_STRUCT(nine_shader_variant); 148fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt if (!list->next) 149fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt return FALSE; 150fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt list->next->next = NULL; 151fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt list->next->key = key; 152fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt list->next->cso = cso; 153fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt return TRUE; 154fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 155fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 156a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void 157fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholtnine_shader_variants_free(struct nine_shader_variant *list) 158fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt{ 159fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt while (list->next) { 160fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt struct nine_shader_variant *ptr = list->next; 161fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt list->next = ptr->next; 162fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt FREE(ptr); 163fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt } 164fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt} 165fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt 166b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davystruct nine_shader_variant_so 167b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy{ 168b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct nine_shader_variant_so *next; 169b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct NineVertexDeclaration9 *vdecl; 170b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_stream_output_info so; 171b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy void *cso; 172b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy}; 173b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 174b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davystatic inline void * 175b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davynine_shader_variant_so_get(struct nine_shader_variant_so *list, 176b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct NineVertexDeclaration9 *vdecl, 177b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_stream_output_info *so) 178b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy{ 179b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy while (list->vdecl != vdecl && list->next) 180b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy list = list->next; 181b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (list->vdecl == vdecl) { 182b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy *so = list->so; 183b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy return list->cso; 184b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 185b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy return NULL; 186b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy} 187b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 188b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davystatic inline boolean 189b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davynine_shader_variant_so_add(struct nine_shader_variant_so *list, 190b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct NineVertexDeclaration9 *vdecl, 191b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct pipe_stream_output_info *so, void *cso) 192b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy{ 193b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (list->vdecl == NULL) { /* first shader */ 194b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy list->next = NULL; 195b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy nine_bind(&list->vdecl, vdecl); 196b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy list->so = *so; 197b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy list->cso = cso; 198b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy return TRUE; 199b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 200b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy while (list->next) { 201b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy assert(list->vdecl != vdecl); 202b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy list = list->next; 203b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 204b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy list->next = MALLOC_STRUCT(nine_shader_variant_so); 205b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (!list->next) 206b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy return FALSE; 207b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy list->next->next = NULL; 208b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy nine_bind(&list->vdecl, vdecl); 209b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy list->next->so = *so; 210b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy list->next->cso = cso; 211b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy return TRUE; 212b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy} 213b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 214b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davystatic inline void 215b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davynine_shader_variants_so_free(struct nine_shader_variant_so *list) 216b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy{ 217b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy while (list->next) { 218b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy struct nine_shader_variant_so *ptr = list->next; 219b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy list->next = ptr->next; 220b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy nine_bind(&ptr->vdecl, NULL); 221b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy FREE(ptr); 222b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy } 223b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy if (list->vdecl) 224b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy nine_bind(&list->vdecl, NULL); 225b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy} 226b9639c661fb6b52c8abb96c06263f85ca4bd78c1Axel Davy 227fdd96578ef2dfe9c4ad5aab5858036298d444a64Joakim Sindholt#endif /* _NINE_SHADER_H_ */ 228