1 #include "xorg_exa_tgsi.h"
3 /*### stupidity defined in X11/extensions/XI.h */
6 #include "pipe/p_format.h"
7 #include "pipe/p_context.h"
8 #include "pipe/p_state.h"
9 #include "pipe/p_inlines.h"
10 #include "pipe/p_shader_tokens.h"
12 #include "util/u_memory.h"
13 #include "util/u_simple_shaders.h"
15 #include "tgsi/tgsi_ureg.h"
17 #include "cso_cache/cso_context.h"
18 #include "cso_cache/cso_hash.h"
24 * CONST[0] = (2/dst_width, 2/dst_height, 1, 1)
25 * CONST[1] = (-1, -1, 0, 0)
39 * CONST[0] = (0, 0, 0, 1)
45 struct exa_context *exa;
47 struct cso_hash *vs_hash;
48 struct cso_hash *fs_hash;
51 static const char over_op[] =
52 "SUB TEMP[3], CONST[0].wwww, TEMP[1].wwww\n"
53 "MUL TEMP[3], TEMP[0], TEMP[3]\n"
54 "ADD TEMP[0], TEMP[3], TEMP[0]\n";
58 create_preamble(struct ureg_program *ureg)
64 src_in_mask(struct ureg_program *ureg,
69 /* MUL dst, src, mask.wwww */
70 ureg_MUL(ureg, dst, src,
71 ureg_scalar(mask, TGSI_SWIZZLE_W));
74 static struct ureg_src
75 vs_normalize_coords(struct ureg_program *ureg, struct ureg_src coords,
76 struct ureg_src const0, struct ureg_src const1)
78 struct ureg_dst tmp = ureg_DECL_temporary(ureg);
80 ureg_MUL(ureg, tmp, coords, const0);
81 ureg_ADD(ureg, tmp, ureg_src(tmp), const1);
83 ureg_release_temporary(ureg, tmp);
88 create_vs(struct pipe_context *pipe,
91 struct ureg_program *ureg;
94 struct ureg_src const0, const1;
96 ureg = ureg_create(TGSI_PROCESSOR_VERTEX);
100 const0 = ureg_DECL_constant(ureg);
101 const1 = ureg_DECL_constant(ureg);
103 if ((vs_traits & VS_COMPOSITE)) {
104 src = ureg_DECL_vs_input(ureg,
105 TGSI_SEMANTIC_POSITION, 0);
106 dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0);
107 src = vs_normalize_coords(ureg, src,
109 ureg_MOV(ureg, dst, src);
111 if ((vs_traits & VS_MASK)) {
112 src = ureg_DECL_vs_input(ureg,
113 TGSI_SEMANTIC_POSITION, 1);
114 dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 1);
115 ureg_MOV(ureg, dst, src);
120 return ureg_create_shader_and_destroy(ureg, pipe);
124 create_fs(struct pipe_context *pipe,
127 struct ureg_program *ureg;
128 struct ureg_src dst_sampler, src_sampler, mask_sampler;
129 struct ureg_src dst_pos, src_pos, mask_pos;
130 struct ureg_src src, mask;
133 ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
137 out = ureg_DECL_output(ureg,
141 src_sampler = ureg_DECL_sampler(ureg);
142 src_pos = ureg_DECL_fs_input(ureg,
143 TGSI_SEMANTIC_POSITION,
145 TGSI_INTERPOLATE_PERSPECTIVE);
147 if ((fs_traits & FS_MASK)) {
148 mask_sampler = ureg_DECL_sampler(ureg);
149 mask_pos = ureg_DECL_fs_input(ureg,
150 TGSI_SEMANTIC_POSITION,
152 TGSI_INTERPOLATE_PERSPECTIVE);
155 #if 0 /* unused right now */
156 dst_sampler = ureg_DECL_sampler(ureg);
157 dst_pos = ureg_DECL_fs_input(ureg,
158 TGSI_SEMANTIC_POSITION,
160 TGSI_INTERPOLATE_PERSPECTIVE);
163 if ((fs_traits & FS_MASK)) {
164 ureg_TEX(ureg, ureg_dst(mask),
165 TGSI_TEXTURE_2D, mask_pos, mask_sampler);
167 src_in_mask(ureg, out, src, mask);
170 TGSI_TEXTURE_2D, src_pos, src_sampler);
175 return ureg_create_shader_and_destroy(ureg, pipe);
178 struct xorg_shaders * xorg_shaders_create(struct exa_context *exa)
180 struct xorg_shaders *sc = CALLOC_STRUCT(xorg_shaders);
183 sc->vs_hash = cso_hash_create();
184 sc->fs_hash = cso_hash_create();
190 cache_destroy(struct cso_context *cso,
191 struct cso_hash *hash,
194 struct cso_hash_iter iter = cso_hash_first_node(hash);
195 while (!cso_hash_iter_is_null(iter)) {
196 void *shader = (void *)cso_hash_iter_data(iter);
197 if (processor == PIPE_SHADER_FRAGMENT) {
198 cso_delete_fragment_shader(cso, shader);
199 } else if (processor == PIPE_SHADER_VERTEX) {
200 cso_delete_vertex_shader(cso, shader);
202 iter = cso_hash_erase(hash, iter);
204 cso_hash_delete(hash);
207 void xorg_shaders_destroy(struct xorg_shaders *sc)
209 cache_destroy(sc->exa->cso, sc->vs_hash,
211 cache_destroy(sc->exa->cso, sc->fs_hash,
212 PIPE_SHADER_FRAGMENT);
218 shader_from_cache(struct pipe_context *pipe,
220 struct cso_hash *hash,
225 struct cso_hash_iter iter = cso_hash_find(hash, key);
227 if (cso_hash_iter_is_null(iter)) {
228 if (type == PIPE_SHADER_VERTEX)
229 shader = create_vs(pipe, key);
231 shader = create_fs(pipe, key);
232 cso_hash_insert(hash, key, shader);
234 shader = (void *)cso_hash_iter_data(iter);
239 struct xorg_shader xorg_shaders_get(struct xorg_shaders *sc,
243 struct xorg_shader shader = {0};
246 vs = shader_from_cache(sc->exa->ctx, PIPE_SHADER_VERTEX,
247 sc->vs_hash, vs_traits);
248 fs = shader_from_cache(sc->exa->ctx, PIPE_SHADER_FRAGMENT,
249 sc->fs_hash, fs_traits);
251 debug_assert(vs && fs);