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