u_simple_shaders.c revision bdaf0a085ba7b8af4cf858b31f701caf571b7c4f
131970c4633c5000916b0a36022ff761038f5cf5aBrian/**************************************************************************
231970c4633c5000916b0a36022ff761038f5cf5aBrian *
331970c4633c5000916b0a36022ff761038f5cf5aBrian * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
431970c4633c5000916b0a36022ff761038f5cf5aBrian * All Rights Reserved.
5dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák * Copyright 2009 Marek Olšák <maraeo@gmail.com>
631970c4633c5000916b0a36022ff761038f5cf5aBrian *
731970c4633c5000916b0a36022ff761038f5cf5aBrian * Permission is hereby granted, free of charge, to any person obtaining a
831970c4633c5000916b0a36022ff761038f5cf5aBrian * copy of this software and associated documentation files (the
931970c4633c5000916b0a36022ff761038f5cf5aBrian * "Software"), to deal in the Software without restriction, including
1031970c4633c5000916b0a36022ff761038f5cf5aBrian * without limitation the rights to use, copy, modify, merge, publish,
1131970c4633c5000916b0a36022ff761038f5cf5aBrian * distribute, sub license, and/or sell copies of the Software, and to
1231970c4633c5000916b0a36022ff761038f5cf5aBrian * permit persons to whom the Software is furnished to do so, subject to
1331970c4633c5000916b0a36022ff761038f5cf5aBrian * the following conditions:
1431970c4633c5000916b0a36022ff761038f5cf5aBrian *
1531970c4633c5000916b0a36022ff761038f5cf5aBrian * The above copyright notice and this permission notice (including the
1631970c4633c5000916b0a36022ff761038f5cf5aBrian * next paragraph) shall be included in all copies or substantial portions
1731970c4633c5000916b0a36022ff761038f5cf5aBrian * of the Software.
1831970c4633c5000916b0a36022ff761038f5cf5aBrian *
1931970c4633c5000916b0a36022ff761038f5cf5aBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
2031970c4633c5000916b0a36022ff761038f5cf5aBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2131970c4633c5000916b0a36022ff761038f5cf5aBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2231970c4633c5000916b0a36022ff761038f5cf5aBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2331970c4633c5000916b0a36022ff761038f5cf5aBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2431970c4633c5000916b0a36022ff761038f5cf5aBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2531970c4633c5000916b0a36022ff761038f5cf5aBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2631970c4633c5000916b0a36022ff761038f5cf5aBrian *
2731970c4633c5000916b0a36022ff761038f5cf5aBrian **************************************************************************/
2831970c4633c5000916b0a36022ff761038f5cf5aBrian
2931970c4633c5000916b0a36022ff761038f5cf5aBrian/**
3031970c4633c5000916b0a36022ff761038f5cf5aBrian * @file
3131970c4633c5000916b0a36022ff761038f5cf5aBrian * Simple vertex/fragment shader generators.
3231970c4633c5000916b0a36022ff761038f5cf5aBrian *
3331970c4633c5000916b0a36022ff761038f5cf5aBrian * @author Brian Paul
34dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák           Marek Olšák
3531970c4633c5000916b0a36022ff761038f5cf5aBrian */
3631970c4633c5000916b0a36022ff761038f5cf5aBrian
3731970c4633c5000916b0a36022ff761038f5cf5aBrian
3831970c4633c5000916b0a36022ff761038f5cf5aBrian#include "pipe/p_context.h"
3931970c4633c5000916b0a36022ff761038f5cf5aBrian#include "pipe/p_shader_tokens.h"
4057ce0de8cbdf09d7322e3930c25c0ba5e82ff2a9Vinson Lee#include "pipe/p_state.h"
4131970c4633c5000916b0a36022ff761038f5cf5aBrian#include "util/u_simple_shaders.h"
4238f6f23fcf37247fd709d1c612d08bfa9b124e69José Fonseca#include "util/u_debug.h"
43002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell#include "tgsi/tgsi_ureg.h"
4431970c4633c5000916b0a36022ff761038f5cf5aBrian
4531970c4633c5000916b0a36022ff761038f5cf5aBrian
4631970c4633c5000916b0a36022ff761038f5cf5aBrian
4731970c4633c5000916b0a36022ff761038f5cf5aBrian/**
4831970c4633c5000916b0a36022ff761038f5cf5aBrian * Make simple vertex pass-through shader.
492fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul * \param num_attribs  number of attributes to pass through
502fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul * \param semantic_names  array of semantic names for each attribute
512fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul * \param semantic_indexes  array of semantic indexes for each attribute
5231970c4633c5000916b0a36022ff761038f5cf5aBrian */
5331970c4633c5000916b0a36022ff761038f5cf5aBrianvoid *
5431970c4633c5000916b0a36022ff761038f5cf5aBrianutil_make_vertex_passthrough_shader(struct pipe_context *pipe,
5531970c4633c5000916b0a36022ff761038f5cf5aBrian                                    uint num_attribs,
5631970c4633c5000916b0a36022ff761038f5cf5aBrian                                    const uint *semantic_names,
57fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell                                    const uint *semantic_indexes)
5831970c4633c5000916b0a36022ff761038f5cf5aBrian{
598a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák   return util_make_vertex_passthrough_shader_with_so(pipe, num_attribs,
608a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák                                                      semantic_names,
618a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák                                                      semantic_indexes, NULL);
628a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák}
638a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák
648a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšákvoid *
658a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšákutil_make_vertex_passthrough_shader_with_so(struct pipe_context *pipe,
668a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák                                    uint num_attribs,
678a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák                                    const uint *semantic_names,
688a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák                                    const uint *semantic_indexes,
698a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák				    const struct pipe_stream_output_info *so)
708a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák{
71002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_program *ureg;
72002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   uint i;
7331970c4633c5000916b0a36022ff761038f5cf5aBrian
74a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   ureg = ureg_create( TGSI_PROCESSOR_VERTEX );
75002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   if (ureg == NULL)
76002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      return NULL;
7731970c4633c5000916b0a36022ff761038f5cf5aBrian
7831970c4633c5000916b0a36022ff761038f5cf5aBrian   for (i = 0; i < num_attribs; i++) {
79002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      struct ureg_src src;
80002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      struct ureg_dst dst;
81002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
826d8dbd3d1ec888300fb0e9ac3cf61808ba8ecc2bKeith Whitwell      src = ureg_DECL_vs_input( ureg, i );
83002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
84002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      dst = ureg_DECL_output( ureg,
85002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                              semantic_names[i],
86002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                              semantic_indexes[i]);
87002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
88002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      ureg_MOV( ureg, dst, src );
8931970c4633c5000916b0a36022ff761038f5cf5aBrian   }
9031970c4633c5000916b0a36022ff761038f5cf5aBrian
91002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   ureg_END( ureg );
92dccbfd8bf0624250a435948029916073d3390191Brian
938a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák   return ureg_create_shader_with_so_and_destroy( ureg, pipe, so );
9431970c4633c5000916b0a36022ff761038f5cf5aBrian}
9531970c4633c5000916b0a36022ff761038f5cf5aBrian
9631970c4633c5000916b0a36022ff761038f5cf5aBrian
9731970c4633c5000916b0a36022ff761038f5cf5aBrian/**
9831970c4633c5000916b0a36022ff761038f5cf5aBrian * Make simple fragment texture shader:
99862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell *  IMM {0,0,0,1}                         // (if writemask != 0xf)
100862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell *  MOV OUT[0], IMM[0]                    // (if writemask != 0xf)
101862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell *  TEX OUT[0].writemask, IN[0], SAMP[0], 2D;
10231970c4633c5000916b0a36022ff761038f5cf5aBrian *  END;
103d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul *
104d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul * \param tex_target  one of PIPE_TEXTURE_x
105d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul * \parma interp_mode  either TGSI_INTERPOLATE_LINEAR or PERSPECTIVE
106d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul * \param writemask  mask of TGSI_WRITEMASK_x
10731970c4633c5000916b0a36022ff761038f5cf5aBrian */
10831970c4633c5000916b0a36022ff761038f5cf5aBrianvoid *
109862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwellutil_make_fragment_tex_shader_writemask(struct pipe_context *pipe,
110dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                                        unsigned tex_target,
111d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                        unsigned interp_mode,
112862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell                                        unsigned writemask )
11331970c4633c5000916b0a36022ff761038f5cf5aBrian{
114002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_program *ureg;
115002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_src sampler;
116002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_src tex;
117002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_dst out;
118002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
119d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   assert(interp_mode == TGSI_INTERPOLATE_LINEAR ||
120d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul          interp_mode == TGSI_INTERPOLATE_PERSPECTIVE);
121d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
122a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
123002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   if (ureg == NULL)
124002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      return NULL;
125002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
126848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   sampler = ureg_DECL_sampler( ureg, 0 );
127002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
128002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   tex = ureg_DECL_fs_input( ureg,
129002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                             TGSI_SEMANTIC_GENERIC, 0,
130d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                             interp_mode );
131002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
132002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   out = ureg_DECL_output( ureg,
133002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                           TGSI_SEMANTIC_COLOR,
134002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                           0 );
135002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
1366a085184ebf251f145181796e317ffa179a38baeKeith Whitwell   if (writemask != TGSI_WRITEMASK_XYZW) {
1376a085184ebf251f145181796e317ffa179a38baeKeith Whitwell      struct ureg_src imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
1386a085184ebf251f145181796e317ffa179a38baeKeith Whitwell
1396a085184ebf251f145181796e317ffa179a38baeKeith Whitwell      ureg_MOV( ureg, out, imm );
1406a085184ebf251f145181796e317ffa179a38baeKeith Whitwell   }
1416a085184ebf251f145181796e317ffa179a38baeKeith Whitwell
1426a085184ebf251f145181796e317ffa179a38baeKeith Whitwell   ureg_TEX( ureg,
1436a085184ebf251f145181796e317ffa179a38baeKeith Whitwell             ureg_writemask(out, writemask),
144dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák             tex_target, tex, sampler );
145002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   ureg_END( ureg );
146002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
147a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   return ureg_create_shader_and_destroy( ureg, pipe );
14831970c4633c5000916b0a36022ff761038f5cf5aBrian}
14931970c4633c5000916b0a36022ff761038f5cf5aBrian
1502fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul
1512fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul/**
1522fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul * Make a simple fragment shader that sets the output color to a color
1532fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul * taken from a texture.
1542fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul * \param tex_target  one of PIPE_TEXTURE_x
1552fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul */
156862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwellvoid *
157d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulutil_make_fragment_tex_shader(struct pipe_context *pipe, unsigned tex_target,
158d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                              unsigned interp_mode)
159862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell{
160862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell   return util_make_fragment_tex_shader_writemask( pipe,
161dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                                                   tex_target,
162d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                                   interp_mode,
163862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell                                                   TGSI_WRITEMASK_XYZW );
164862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell}
165862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell
1662fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul
167dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák/**
168dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák * Make a simple fragment texture shader which reads an X component from
169dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák * a texture and writes it as depth.
170dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák */
171dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšákvoid *
172dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšákutil_make_fragment_tex_shader_writedepth(struct pipe_context *pipe,
173d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                         unsigned tex_target,
174d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                         unsigned interp_mode)
175dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák{
176dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_program *ureg;
177dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_src sampler;
178dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_src tex;
179dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_dst out, depth;
180dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_src imm;
1816a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian
182dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
183dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   if (ureg == NULL)
184dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák      return NULL;
185dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
186dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   sampler = ureg_DECL_sampler( ureg, 0 );
187dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
188dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   tex = ureg_DECL_fs_input( ureg,
189dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                             TGSI_SEMANTIC_GENERIC, 0,
190d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                             interp_mode );
191dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
192dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   out = ureg_DECL_output( ureg,
193dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                           TGSI_SEMANTIC_COLOR,
194dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                           0 );
195dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
196dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   depth = ureg_DECL_output( ureg,
197dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                             TGSI_SEMANTIC_POSITION,
198dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                             0 );
199dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
200dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
201dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
202dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   ureg_MOV( ureg, out, imm );
203dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
204dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   ureg_TEX( ureg,
205dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák             ureg_writemask(depth, TGSI_WRITEMASK_Z),
206dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák             tex_target, tex, sampler );
207dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   ureg_END( ureg );
208dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
209dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   return ureg_create_shader_and_destroy( ureg, pipe );
210dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák}
2116a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian
2122fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul
2136a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian/**
21412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák * Make a simple fragment texture shader which reads the texture unit 0 and 1
21512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák * and writes it as depth and stencil, respectively.
21612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák */
21712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšákvoid *
21812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšákutil_make_fragment_tex_shader_writedepthstencil(struct pipe_context *pipe,
21912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                                                unsigned tex_target,
22012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                                                unsigned interp_mode)
22112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák{
22212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   struct ureg_program *ureg;
22312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   struct ureg_src depth_sampler, stencil_sampler;
22412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   struct ureg_src tex;
22512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   struct ureg_dst out, depth, stencil;
22612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   struct ureg_src imm;
22712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
22812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
22912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   if (ureg == NULL)
23012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák      return NULL;
23112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
23212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   depth_sampler = ureg_DECL_sampler( ureg, 0 );
23312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   stencil_sampler = ureg_DECL_sampler( ureg, 1 );
23412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
23512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   tex = ureg_DECL_fs_input( ureg,
23612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                             TGSI_SEMANTIC_GENERIC, 0,
23712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                             interp_mode );
23812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
23912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   out = ureg_DECL_output( ureg,
24012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                           TGSI_SEMANTIC_COLOR,
24112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                           0 );
24212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
24312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   depth = ureg_DECL_output( ureg,
24412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                             TGSI_SEMANTIC_POSITION,
24512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                             0 );
24612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
24712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   stencil = ureg_DECL_output( ureg,
24812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                             TGSI_SEMANTIC_STENCIL,
24912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                             0 );
25012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
25112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
25212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
25312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   ureg_MOV( ureg, out, imm );
25412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
25512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   ureg_TEX( ureg,
25612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák             ureg_writemask(depth, TGSI_WRITEMASK_Z),
25712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák             tex_target, tex, depth_sampler );
25812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   ureg_TEX( ureg,
25912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák             ureg_writemask(stencil, TGSI_WRITEMASK_Y),
26012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák             tex_target, tex, stencil_sampler );
26112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   ureg_END( ureg );
26212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
26312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   return ureg_create_shader_and_destroy( ureg, pipe );
26412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák}
26512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
26612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
26712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák/**
268bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák * Make a simple fragment texture shader which reads a texture and writes it
269bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák * as stencil.
270bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák */
271bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšákvoid *
272bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšákutil_make_fragment_tex_shader_writestencil(struct pipe_context *pipe,
273bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                                           unsigned tex_target,
274bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                                           unsigned interp_mode)
275bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák{
276bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   struct ureg_program *ureg;
277bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   struct ureg_src stencil_sampler;
278bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   struct ureg_src tex;
279bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   struct ureg_dst out, stencil;
280bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   struct ureg_src imm;
281bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
282bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
283bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   if (ureg == NULL)
284bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák      return NULL;
285bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
286bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   stencil_sampler = ureg_DECL_sampler( ureg, 0 );
287bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
288bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   tex = ureg_DECL_fs_input( ureg,
289bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                             TGSI_SEMANTIC_GENERIC, 0,
290bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                             interp_mode );
291bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
292bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   out = ureg_DECL_output( ureg,
293bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                           TGSI_SEMANTIC_COLOR,
294bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                           0 );
295bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
296bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   stencil = ureg_DECL_output( ureg,
297bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                             TGSI_SEMANTIC_STENCIL,
298bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                             0 );
299bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
300bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
301bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
302bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   ureg_MOV( ureg, out, imm );
303bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
304bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   ureg_TEX( ureg,
305bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák             ureg_writemask(stencil, TGSI_WRITEMASK_Y),
306bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák             tex_target, tex, stencil_sampler );
307bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   ureg_END( ureg );
308bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
309bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   return ureg_create_shader_and_destroy( ureg, pipe );
310bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák}
311bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
312bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
313bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák/**
3146a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian * Make simple fragment color pass-through shader.
3156a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian */
3166a9a3afcf923ec5c67069cdb1656f52675cd8edeBrianvoid *
317fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwellutil_make_fragment_passthrough_shader(struct pipe_context *pipe)
3186a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian{
3195d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   return util_make_fragment_cloneinput_shader(pipe, 1, TGSI_SEMANTIC_COLOR,
3205d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                                               TGSI_INTERPOLATE_PERSPECTIVE);
321dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák}
322dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
3232fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul
3242fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul/**
3252fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul * Make a fragment shader that copies the input color to N output colors.
3262fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul */
327dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšákvoid *
3285d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšákutil_make_fragment_cloneinput_shader(struct pipe_context *pipe, int num_cbufs,
3295d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                                     int input_semantic,
3305d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                                     int input_interpolate)
331dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák{
332002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_program *ureg;
333002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_src src;
33488330c64388a3322a64a7afb75cd5a6a51581928Brian Paul   struct ureg_dst dst[PIPE_MAX_COLOR_BUFS];
335dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   int i;
336dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
33788330c64388a3322a64a7afb75cd5a6a51581928Brian Paul   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
338002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
339a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
340002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   if (ureg == NULL)
341002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      return NULL;
342002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
3435d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   src = ureg_DECL_fs_input( ureg, input_semantic, 0,
3445d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                             input_interpolate );
345002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
346dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   for (i = 0; i < num_cbufs; i++)
347dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák      dst[i] = ureg_DECL_output( ureg, TGSI_SEMANTIC_COLOR, i );
348dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
349dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   for (i = 0; i < num_cbufs; i++)
350dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák      ureg_MOV( ureg, dst[i], src );
351002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
352002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   ureg_END( ureg );
353002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
354a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   return ureg_create_shader_and_destroy( ureg, pipe );
3556a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian}
356