shaders_cache.c revision 301a9437cc5d89686391e5722b952f52df274ab3
1544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin/**************************************************************************
2544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
3544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * Copyright 2009 VMware, Inc.  All Rights Reserved.
4544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
5544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * Permission is hereby granted, free of charge, to any person obtaining a
6544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * copy of this software and associated documentation files (the
7544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * "Software"), to deal in the Software without restriction, including
8544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * without limitation the rights to use, copy, modify, merge, publish,
9544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * distribute, sub license, and/or sell copies of the Software, and to
10544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * permit persons to whom the Software is furnished to do so, subject to
11544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * the following conditions:
12544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
13544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * The above copyright notice and this permission notice (including the
14544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * next paragraph) shall be included in all copies or substantial portions
15544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * of the Software.
16544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
17544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
21544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
25544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin **************************************************************************/
26544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
27544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "shaders_cache.h"
28544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
29544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "vg_context.h"
30544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
31544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_context.h"
32544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_defines.h"
33544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_inlines.h"
34544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_screen.h"
35544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_shader_tokens.h"
36544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
37544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "tgsi/tgsi_build.h"
38544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "tgsi/tgsi_dump.h"
39544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "tgsi/tgsi_parse.h"
40544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "tgsi/tgsi_util.h"
41544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "tgsi/tgsi_text.h"
42544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
43544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_memory.h"
44544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_math.h"
45544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_debug.h"
46544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "cso_cache/cso_hash.h"
47544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "cso_cache/cso_context.h"
48544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
49544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "VG/openvg.h"
50544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
51544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "asm_fill.h"
52544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
53544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin/* Essentially we construct an ubber-shader based on the state
54544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * of the pipeline. The stages are:
55544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 1) Fill (mandatory, solid color/gradient/pattern/image draw)
56544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 2) Image composition (image mode multiply and stencil)
57544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 3) Mask
58544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 4) Extended blend (multiply/screen/darken/lighten)
59544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 5) Premultiply/Unpremultiply
60544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * 6) Color transform (to black and white)
61544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin */
62544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#define SHADER_STAGES 6
63544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
64544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct cached_shader {
65544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   void *driver_shader;
66544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_shader_state state;
67544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin};
68544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
69544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct shaders_cache {
70544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *pipe;
71544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
72544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct cso_hash *hash;
73544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin};
74544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
75544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
76544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic INLINE struct tgsi_token *tokens_from_assembly(const char *txt, int num_tokens)
77544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
78544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct tgsi_token *tokens;
79544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
80544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   tokens = (struct tgsi_token *) MALLOC(num_tokens * sizeof(tokens[0]));
81544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
82544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   tgsi_text_translate(txt, tokens, num_tokens);
83544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
84544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#if DEBUG_SHADERS
85544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   tgsi_dump(tokens, 0);
86544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif
87544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
88544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return tokens;
89544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
90544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
91544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#define ALL_FILLS (VEGA_SOLID_FILL_SHADER | \
92544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VEGA_LINEAR_GRADIENT_SHADER | \
93544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VEGA_RADIAL_GRADIENT_SHADER | \
94544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VEGA_PATTERN_SHADER         | \
95544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VEGA_IMAGE_NORMAL_SHADER)
96544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
97544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
98544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin/*
99544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic const char max_shader_preamble[] =
1005285de7c0fc067dc036a5b421140a696ce2cabbfMichal Krol   "FRAG\n"
101544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   "DCL IN[0], POSITION, LINEAR\n"
102544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   "DCL IN[1], GENERIC[0], PERSPECTIVE\n"
103544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   "DCL OUT[0], COLOR, CONSTANT\n"
104544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   "DCL CONST[0..9], CONSTANT\n"
105544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   "DCL TEMP[0..9], CONSTANT\n"
106544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   "DCL SAMP[0..9], CONSTANT\n";
107544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
108544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   max_shader_preamble strlen == 175
109544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin*/
110544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#define MAX_PREAMBLE 175
111544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
112544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic INLINE VGint range_min(VGint min, VGint current)
113544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
114544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (min < 0)
115544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      min = current;
116544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   else
117544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      min = MIN2(min, current);
118544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return min;
119544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
120544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
121544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic INLINE VGint range_max(VGint max, VGint current)
122544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
123544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return MAX2(max, current);
124544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
125544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
126301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveirastatic void *
127301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveiracombine_shaders(const struct shader_asm_info *shaders[SHADER_STAGES], int num_shaders,
128301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                struct pipe_context *pipe,
129301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                struct pipe_shader_state *shader)
130544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
131544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGboolean declare_input = VG_FALSE;
132544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint start_const   = -1, end_const   = 0;
133544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint start_temp    = -1, end_temp    = 0;
134544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint start_sampler = -1, end_sampler = 0;
135301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   VGint i, current_shader = 0;
136544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint num_consts, num_temps, num_samplers;
137301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   struct ureg_program *ureg;
138301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   struct ureg_src in[2];
139301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   struct ureg_src *sampler = NULL;
140301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   struct ureg_src *constant = NULL;
141301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   struct ureg_dst out, *temp = NULL;
142301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   void *p = NULL;
143544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
144544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   for (i = 0; i < num_shaders; ++i) {
145544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      if (shaders[i]->num_consts)
146544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         start_const = range_min(start_const, shaders[i]->start_const);
147544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      if (shaders[i]->num_temps)
148544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         start_temp = range_min(start_temp, shaders[i]->start_temp);
149544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      if (shaders[i]->num_samplers)
150544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         start_sampler = range_min(start_sampler, shaders[i]->start_sampler);
151544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
152544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      end_const = range_max(end_const, shaders[i]->start_const +
153544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                            shaders[i]->num_consts);
154544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      end_temp = range_max(end_temp, shaders[i]->start_temp +
155544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                            shaders[i]->num_temps);
156544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      end_sampler = range_max(end_sampler, shaders[i]->start_sampler +
157544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                            shaders[i]->num_samplers);
158544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      if (shaders[i]->needs_position)
159544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         declare_input = VG_TRUE;
160544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
161544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* if they're still unitialized, initialize them */
162544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (start_const < 0)
163544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      start_const = 0;
164544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (start_temp < 0)
165544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      start_temp = 0;
166544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (start_sampler < 0)
167301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira       start_sampler = 0;
168544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
169544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   num_consts   = end_const   - start_const;
170544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   num_temps    = end_temp    - start_temp;
171544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   num_samplers = end_sampler - start_sampler;
172544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
173301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
174301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   if (!ureg)
175301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira       return NULL;
176544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
177544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (declare_input) {
178301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      in[0] = ureg_DECL_fs_input(ureg,
179301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                 TGSI_SEMANTIC_POSITION,
180301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                 0,
181301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                 TGSI_INTERPOLATE_LINEAR);
182301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      in[1] = ureg_DECL_fs_input(ureg,
183301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                 TGSI_SEMANTIC_GENERIC,
184301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                 0,
185301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                 TGSI_INTERPOLATE_PERSPECTIVE);
186544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
187544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
188544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* we always have a color output */
189301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   out = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0);
190544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
191301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   if (num_consts >= 1) {
192301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      constant = (struct ureg_src *) malloc(sizeof(struct ureg_src) * end_const);
193301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      for (i = start_const; i < end_const; i++) {
194301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira         constant[i] = ureg_DECL_constant(ureg, i);
195301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      }
196544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
197544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
198544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
199301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   if (num_temps >= 1) {
200301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      temp = (struct ureg_dst *) malloc(sizeof(struct ureg_dst) * end_temp);
201301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      for (i = start_temp; i < end_temp; i++) {
202301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira         temp[i] = ureg_DECL_temporary(ureg);
203301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      }
204301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   }
205544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
206301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   if (num_samplers >= 1) {
207301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      sampler = (struct ureg_src *) malloc(sizeof(struct ureg_src) * end_sampler);
208301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      for (i = start_sampler; i < end_sampler; i++) {
209301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira         sampler[i] = ureg_DECL_sampler(ureg, i);
210301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      }
211301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   }
212544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
213544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   while (current_shader < num_shaders) {
214301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      if ((current_shader + 1) == num_shaders) {
215301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira         shaders[current_shader]->func(ureg,
216301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                       &out,
217301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                       in,
218301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                       sampler,
219301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                       temp,
220301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                       constant);
221301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      } else {
222301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira         shaders[current_shader]->func(ureg,
223301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                      &temp[0],
224301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                      in,
225301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                      sampler,
226301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                      temp,
227301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira                                      constant);
228301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      }
229301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      current_shader++;
230544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
231544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
232301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   ureg_END(ureg);
233544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
234301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   shader->tokens = ureg_finalize(ureg);
235301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   if(!shader->tokens)
236301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      return NULL;
237544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
238301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   p = pipe->create_fs_state(pipe, shader);
239301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   ureg_destroy(ureg);
240544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
241301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   if (num_temps >= 1) {
242301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      for (i = start_temp; i < end_temp; i++) {
243301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira         ureg_release_temporary(ureg, temp[i]);
244301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      }
245301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   }
246544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
247301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   if (temp)
248301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      free(temp);
249301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   if (constant)
250301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      free(constant);
251301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   if (sampler)
252301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira      free(sampler);
253544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
254301a9437cc5d89686391e5722b952f52df274ab3Igor Oliveira   return p;
255544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
256544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
257544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic void *
258544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusincreate_shader(struct pipe_context *pipe,
259544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin              int id,
260544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin              struct pipe_shader_state *shader)
261544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
262544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   int idx = 0;
263544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   const struct shader_asm_info * shaders[SHADER_STAGES];
264544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
265544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* the shader has to have a fill */
266544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   debug_assert(id & ALL_FILLS);
267544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
268544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* first stage */
269544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (id & VEGA_SOLID_FILL_SHADER) {
270544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(idx == 0);
271544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[0];
272544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[0].id == VEGA_SOLID_FILL_SHADER);
273544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
274544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
275544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if ((id & VEGA_LINEAR_GRADIENT_SHADER)) {
276544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(idx == 0);
277544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[1];
278544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[1].id == VEGA_LINEAR_GRADIENT_SHADER);
279544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
280544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
281544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if ((id & VEGA_RADIAL_GRADIENT_SHADER)) {
282544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(idx == 0);
283544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[2];
284544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[2].id == VEGA_RADIAL_GRADIENT_SHADER);
285544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
286544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
287544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if ((id & VEGA_PATTERN_SHADER)) {
288544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(idx == 0);
289544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[3].id == VEGA_PATTERN_SHADER);
290544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[3];
291544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
292544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
293544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if ((id & VEGA_IMAGE_NORMAL_SHADER)) {
294544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(idx == 0);
295544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[4].id == VEGA_IMAGE_NORMAL_SHADER);
296544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[4];
297544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
298544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
299544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
300544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* second stage */
301544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if ((id & VEGA_IMAGE_MULTIPLY_SHADER)) {
302544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[5].id == VEGA_IMAGE_MULTIPLY_SHADER);
303544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[5];
304544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
305544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   } else if ((id & VEGA_IMAGE_STENCIL_SHADER)) {
306544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[6].id == VEGA_IMAGE_STENCIL_SHADER);
307544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[6];
308544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
309544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
310544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
311544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* third stage */
312544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if ((id & VEGA_MASK_SHADER)) {
313544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(idx == 1);
314544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[7].id == VEGA_MASK_SHADER);
315544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[7];
316544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
317544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
318544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
319544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* fourth stage */
320544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if ((id & VEGA_BLEND_MULTIPLY_SHADER)) {
321544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[8].id == VEGA_BLEND_MULTIPLY_SHADER);
322544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[8];
323544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
324544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   } else if ((id & VEGA_BLEND_SCREEN_SHADER)) {
325544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[9].id == VEGA_BLEND_SCREEN_SHADER);
326544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[9];
327544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
328544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   } else if ((id & VEGA_BLEND_DARKEN_SHADER)) {
329544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[10].id == VEGA_BLEND_DARKEN_SHADER);
330544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[10];
331544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
332544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   } else if ((id & VEGA_BLEND_LIGHTEN_SHADER)) {
333544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[11].id == VEGA_BLEND_LIGHTEN_SHADER);
334544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[11];
335544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
336544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
337544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
338544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* fifth stage */
339544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if ((id & VEGA_PREMULTIPLY_SHADER)) {
340544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[12].id == VEGA_PREMULTIPLY_SHADER);
341544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[12];
342544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
343544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   } else if ((id & VEGA_UNPREMULTIPLY_SHADER)) {
344544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[13].id == VEGA_UNPREMULTIPLY_SHADER);
345544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[13];
346544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
347544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
348544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
349544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* sixth stage */
350544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if ((id & VEGA_BW_SHADER)) {
351544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(shaders_asm[14].id == VEGA_BW_SHADER);
352544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shaders[idx] = &shaders_asm[14];
353544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ++idx;
354544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
355544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
356544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return combine_shaders(shaders, idx, pipe, shader);
357544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
358544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
359544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin/*************************************************/
360544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
361544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct shaders_cache * shaders_cache_create(struct vg_context *vg)
362544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
363544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct shaders_cache *sc = CALLOC_STRUCT(shaders_cache);
364544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
365544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   sc->pipe = vg;
366544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   sc->hash = cso_hash_create();
367544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
368544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return sc;
369544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
370544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
371544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid shaders_cache_destroy(struct shaders_cache *sc)
372544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
373544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct cso_hash_iter iter = cso_hash_first_node(sc->hash);
374544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
375544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   while (!cso_hash_iter_is_null(iter)) {
376544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      struct cached_shader *cached =
377544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         (struct cached_shader *)cso_hash_iter_data(iter);
378544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      cso_delete_fragment_shader(sc->pipe->cso_context,
379544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                                 cached->driver_shader);
380544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      iter = cso_hash_erase(sc->hash, iter);
381544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
382544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
383544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   cso_hash_delete(sc->hash);
384544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   free(sc);
385544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
386544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
387544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid * shaders_cache_fill(struct shaders_cache *sc,
388544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                          int shader_key)
389544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
390544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint key = shader_key;
391544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct cached_shader *cached;
392544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct cso_hash_iter iter = cso_hash_find(sc->hash, key);
393544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
394544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (cso_hash_iter_is_null(iter)) {
395544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      cached = CALLOC_STRUCT(cached_shader);
396544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      cached->driver_shader = create_shader(sc->pipe->pipe, key, &cached->state);
397544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
398544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      cso_hash_insert(sc->hash, key, cached);
399544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
400544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return cached->driver_shader;
401544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
402544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
403544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   cached = (struct cached_shader *)cso_hash_iter_data(iter);
404544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
405544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   assert(cached->driver_shader);
406544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return cached->driver_shader;
407544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
408544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
409544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct vg_shader * shader_create_from_text(struct pipe_context *pipe,
410544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                                           const char *txt, int num_tokens,
411544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                                           int type)
412544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
413544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_shader *shader = (struct vg_shader *)malloc(
414544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      sizeof(struct vg_shader));
415544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct tgsi_token *tokens = tokens_from_assembly(txt, num_tokens);
416544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_shader_state state;
417544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
418544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   debug_assert(type == PIPE_SHADER_VERTEX ||
419544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                type == PIPE_SHADER_FRAGMENT);
420544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
421544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   state.tokens = tokens;
422544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   shader->type = type;
423544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   shader->tokens = tokens;
424544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
425544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (type == PIPE_SHADER_FRAGMENT)
426544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shader->driver = pipe->create_fs_state(pipe, &state);
427544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   else
428544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      shader->driver = pipe->create_vs_state(pipe, &state);
429544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return shader;
430544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
431544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
432544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vg_shader_destroy(struct vg_context *ctx, struct vg_shader *shader)
433544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
434544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (shader->type == PIPE_SHADER_FRAGMENT)
435544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      cso_delete_fragment_shader(ctx->cso_context, shader->driver);
436544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   else
437544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      cso_delete_vertex_shader(ctx->cso_context, shader->driver);
438544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   free(shader->tokens);
439544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   free(shader);
440544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
441