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"
43825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák#include "util/u_memory.h"
44825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák#include "tgsi/tgsi_dump.h"
45825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák#include "tgsi/tgsi_strings.h"
46002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell#include "tgsi/tgsi_ureg.h"
47825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák#include "tgsi/tgsi_text.h"
48825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák#include <stdio.h> /* include last */
4931970c4633c5000916b0a36022ff761038f5cf5aBrian
5031970c4633c5000916b0a36022ff761038f5cf5aBrian
5131970c4633c5000916b0a36022ff761038f5cf5aBrian
5231970c4633c5000916b0a36022ff761038f5cf5aBrian/**
5331970c4633c5000916b0a36022ff761038f5cf5aBrian * Make simple vertex pass-through shader.
542fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul * \param num_attribs  number of attributes to pass through
552fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul * \param semantic_names  array of semantic names for each attribute
562fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul * \param semantic_indexes  array of semantic indexes for each attribute
5731970c4633c5000916b0a36022ff761038f5cf5aBrian */
5831970c4633c5000916b0a36022ff761038f5cf5aBrianvoid *
5931970c4633c5000916b0a36022ff761038f5cf5aBrianutil_make_vertex_passthrough_shader(struct pipe_context *pipe,
6031970c4633c5000916b0a36022ff761038f5cf5aBrian                                    uint num_attribs,
6131970c4633c5000916b0a36022ff761038f5cf5aBrian                                    const uint *semantic_names,
62fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell                                    const uint *semantic_indexes)
6331970c4633c5000916b0a36022ff761038f5cf5aBrian{
648a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák   return util_make_vertex_passthrough_shader_with_so(pipe, num_attribs,
658a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák                                                      semantic_names,
668a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák                                                      semantic_indexes, NULL);
678a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák}
688a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák
698a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšákvoid *
708a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšákutil_make_vertex_passthrough_shader_with_so(struct pipe_context *pipe,
718a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák                                    uint num_attribs,
728a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák                                    const uint *semantic_names,
738a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák                                    const uint *semantic_indexes,
748a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák				    const struct pipe_stream_output_info *so)
758a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák{
76002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_program *ureg;
77002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   uint i;
7831970c4633c5000916b0a36022ff761038f5cf5aBrian
79a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   ureg = ureg_create( TGSI_PROCESSOR_VERTEX );
80002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   if (ureg == NULL)
81002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      return NULL;
8231970c4633c5000916b0a36022ff761038f5cf5aBrian
8331970c4633c5000916b0a36022ff761038f5cf5aBrian   for (i = 0; i < num_attribs; i++) {
84002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      struct ureg_src src;
85002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      struct ureg_dst dst;
86002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
876d8dbd3d1ec888300fb0e9ac3cf61808ba8ecc2bKeith Whitwell      src = ureg_DECL_vs_input( ureg, i );
88002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
89002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      dst = ureg_DECL_output( ureg,
90002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                              semantic_names[i],
91002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                              semantic_indexes[i]);
92002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
93002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      ureg_MOV( ureg, dst, src );
9431970c4633c5000916b0a36022ff761038f5cf5aBrian   }
9531970c4633c5000916b0a36022ff761038f5cf5aBrian
96002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   ureg_END( ureg );
97dccbfd8bf0624250a435948029916073d3390191Brian
988a9a37cebeff19b56afed43ae037d00950fa7594Marek Olšák   return ureg_create_shader_with_so_and_destroy( ureg, pipe, so );
9931970c4633c5000916b0a36022ff761038f5cf5aBrian}
10031970c4633c5000916b0a36022ff761038f5cf5aBrian
10131970c4633c5000916b0a36022ff761038f5cf5aBrian
10231970c4633c5000916b0a36022ff761038f5cf5aBrian/**
10331970c4633c5000916b0a36022ff761038f5cf5aBrian * Make simple fragment texture shader:
104862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell *  IMM {0,0,0,1}                         // (if writemask != 0xf)
105862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell *  MOV OUT[0], IMM[0]                    // (if writemask != 0xf)
106862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell *  TEX OUT[0].writemask, IN[0], SAMP[0], 2D;
10731970c4633c5000916b0a36022ff761038f5cf5aBrian *  END;
108d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul *
109d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul * \param tex_target  one of PIPE_TEXTURE_x
110d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul * \parma interp_mode  either TGSI_INTERPOLATE_LINEAR or PERSPECTIVE
111d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul * \param writemask  mask of TGSI_WRITEMASK_x
11231970c4633c5000916b0a36022ff761038f5cf5aBrian */
11331970c4633c5000916b0a36022ff761038f5cf5aBrianvoid *
114862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwellutil_make_fragment_tex_shader_writemask(struct pipe_context *pipe,
115dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                                        unsigned tex_target,
116d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                        unsigned interp_mode,
117862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell                                        unsigned writemask )
11831970c4633c5000916b0a36022ff761038f5cf5aBrian{
119002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_program *ureg;
120002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_src sampler;
121002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_src tex;
122002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_dst out;
123002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
124d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   assert(interp_mode == TGSI_INTERPOLATE_LINEAR ||
125d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul          interp_mode == TGSI_INTERPOLATE_PERSPECTIVE);
126d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul
127a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
128002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   if (ureg == NULL)
129002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      return NULL;
130002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
131848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   sampler = ureg_DECL_sampler( ureg, 0 );
132002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
133002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   tex = ureg_DECL_fs_input( ureg,
134002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                             TGSI_SEMANTIC_GENERIC, 0,
135d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                             interp_mode );
136002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
137002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   out = ureg_DECL_output( ureg,
138002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                           TGSI_SEMANTIC_COLOR,
139002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                           0 );
140002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
1416a085184ebf251f145181796e317ffa179a38baeKeith Whitwell   if (writemask != TGSI_WRITEMASK_XYZW) {
1426a085184ebf251f145181796e317ffa179a38baeKeith Whitwell      struct ureg_src imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
1436a085184ebf251f145181796e317ffa179a38baeKeith Whitwell
1446a085184ebf251f145181796e317ffa179a38baeKeith Whitwell      ureg_MOV( ureg, out, imm );
1456a085184ebf251f145181796e317ffa179a38baeKeith Whitwell   }
1466a085184ebf251f145181796e317ffa179a38baeKeith Whitwell
1476a085184ebf251f145181796e317ffa179a38baeKeith Whitwell   ureg_TEX( ureg,
1486a085184ebf251f145181796e317ffa179a38baeKeith Whitwell             ureg_writemask(out, writemask),
149dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák             tex_target, tex, sampler );
150002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   ureg_END( ureg );
151002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
152a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   return ureg_create_shader_and_destroy( ureg, pipe );
15331970c4633c5000916b0a36022ff761038f5cf5aBrian}
15431970c4633c5000916b0a36022ff761038f5cf5aBrian
1552fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul
1562fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul/**
1572fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul * Make a simple fragment shader that sets the output color to a color
1582fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul * taken from a texture.
1592fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul * \param tex_target  one of PIPE_TEXTURE_x
1602fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul */
161862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwellvoid *
162d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paulutil_make_fragment_tex_shader(struct pipe_context *pipe, unsigned tex_target,
163d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                              unsigned interp_mode)
164862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell{
165862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell   return util_make_fragment_tex_shader_writemask( pipe,
166dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                                                   tex_target,
167d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                                   interp_mode,
168862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell                                                   TGSI_WRITEMASK_XYZW );
169862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell}
170862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell
1712fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul
172dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák/**
173dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák * Make a simple fragment texture shader which reads an X component from
174dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák * a texture and writes it as depth.
175dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák */
176dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšákvoid *
177dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšákutil_make_fragment_tex_shader_writedepth(struct pipe_context *pipe,
178d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                         unsigned tex_target,
179d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                         unsigned interp_mode)
180dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák{
181dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_program *ureg;
182dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_src sampler;
183dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_src tex;
184dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_dst out, depth;
185dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_src imm;
1866a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian
187dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
188dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   if (ureg == NULL)
189dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák      return NULL;
190dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
191dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   sampler = ureg_DECL_sampler( ureg, 0 );
192dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
193dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   tex = ureg_DECL_fs_input( ureg,
194dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                             TGSI_SEMANTIC_GENERIC, 0,
195d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                             interp_mode );
196dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
197dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   out = ureg_DECL_output( ureg,
198dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                           TGSI_SEMANTIC_COLOR,
199dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                           0 );
200dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
201dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   depth = ureg_DECL_output( ureg,
202dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                             TGSI_SEMANTIC_POSITION,
203dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                             0 );
204dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
205dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
206dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
207dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   ureg_MOV( ureg, out, imm );
208dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
209dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   ureg_TEX( ureg,
210dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák             ureg_writemask(depth, TGSI_WRITEMASK_Z),
211dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák             tex_target, tex, sampler );
212dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   ureg_END( ureg );
213dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
214dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   return ureg_create_shader_and_destroy( ureg, pipe );
215dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák}
2166a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian
2172fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul
2186a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian/**
21912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák * Make a simple fragment texture shader which reads the texture unit 0 and 1
22012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák * and writes it as depth and stencil, respectively.
22112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák */
22212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšákvoid *
22312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšákutil_make_fragment_tex_shader_writedepthstencil(struct pipe_context *pipe,
22412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                                                unsigned tex_target,
22512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                                                unsigned interp_mode)
22612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák{
22712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   struct ureg_program *ureg;
22812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   struct ureg_src depth_sampler, stencil_sampler;
22912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   struct ureg_src tex;
23012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   struct ureg_dst out, depth, stencil;
23112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   struct ureg_src imm;
23212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
23312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
23412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   if (ureg == NULL)
23512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák      return NULL;
23612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
23712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   depth_sampler = ureg_DECL_sampler( ureg, 0 );
23812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   stencil_sampler = ureg_DECL_sampler( ureg, 1 );
23912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
24012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   tex = ureg_DECL_fs_input( ureg,
24112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                             TGSI_SEMANTIC_GENERIC, 0,
24212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                             interp_mode );
24312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
24412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   out = ureg_DECL_output( ureg,
24512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                           TGSI_SEMANTIC_COLOR,
24612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                           0 );
24712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
24812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   depth = ureg_DECL_output( ureg,
24912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                             TGSI_SEMANTIC_POSITION,
25012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                             0 );
25112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
25212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   stencil = ureg_DECL_output( ureg,
25312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                             TGSI_SEMANTIC_STENCIL,
25412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák                             0 );
25512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
25612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
25712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
25812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   ureg_MOV( ureg, out, imm );
25912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
26012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   ureg_TEX( ureg,
26112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák             ureg_writemask(depth, TGSI_WRITEMASK_Z),
26212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák             tex_target, tex, depth_sampler );
26312fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   ureg_TEX( ureg,
26412fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák             ureg_writemask(stencil, TGSI_WRITEMASK_Y),
26512fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák             tex_target, tex, stencil_sampler );
26612fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   ureg_END( ureg );
26712fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
26812fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák   return ureg_create_shader_and_destroy( ureg, pipe );
26912fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák}
27012fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
27112fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák
27212fd81f9e7265076a3723b09bbb49e5868bde27eMarek Olšák/**
273bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák * Make a simple fragment texture shader which reads a texture and writes it
274bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák * as stencil.
275bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák */
276bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšákvoid *
277bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšákutil_make_fragment_tex_shader_writestencil(struct pipe_context *pipe,
278bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                                           unsigned tex_target,
279bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                                           unsigned interp_mode)
280bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák{
281bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   struct ureg_program *ureg;
282bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   struct ureg_src stencil_sampler;
283bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   struct ureg_src tex;
284bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   struct ureg_dst out, stencil;
285bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   struct ureg_src imm;
286bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
287bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
288bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   if (ureg == NULL)
289bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák      return NULL;
290bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
291bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   stencil_sampler = ureg_DECL_sampler( ureg, 0 );
292bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
293bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   tex = ureg_DECL_fs_input( ureg,
294bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                             TGSI_SEMANTIC_GENERIC, 0,
295bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                             interp_mode );
296bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
297bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   out = ureg_DECL_output( ureg,
298bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                           TGSI_SEMANTIC_COLOR,
299bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                           0 );
300bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
301bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   stencil = ureg_DECL_output( ureg,
302bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                             TGSI_SEMANTIC_STENCIL,
303bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák                             0 );
304bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
305bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
306bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
307bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   ureg_MOV( ureg, out, imm );
308bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
309bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   ureg_TEX( ureg,
310bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák             ureg_writemask(stencil, TGSI_WRITEMASK_Y),
311bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák             tex_target, tex, stencil_sampler );
312bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   ureg_END( ureg );
313bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
314bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák   return ureg_create_shader_and_destroy( ureg, pipe );
315bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák}
316bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
317bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák
318bdaf0a085ba7b8af4cf858b31f701caf571b7c4fMarek Olšák/**
3196a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian * Make simple fragment color pass-through shader.
3206a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian */
3216a9a3afcf923ec5c67069cdb1656f52675cd8edeBrianvoid *
322fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwellutil_make_fragment_passthrough_shader(struct pipe_context *pipe)
3236a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian{
3245d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   return util_make_fragment_cloneinput_shader(pipe, 1, TGSI_SEMANTIC_COLOR,
3255d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                                               TGSI_INTERPOLATE_PERSPECTIVE);
326dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák}
327dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
3282fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul
3292fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul/**
3302fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul * Make a fragment shader that copies the input color to N output colors.
3312fbc3931fca427e9312f40d62f3fe3dde3f31e19Brian Paul */
332dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšákvoid *
3335d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšákutil_make_fragment_cloneinput_shader(struct pipe_context *pipe, int num_cbufs,
3345d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                                     int input_semantic,
3355d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                                     int input_interpolate)
336dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák{
337002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_program *ureg;
338002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_src src;
33988330c64388a3322a64a7afb75cd5a6a51581928Brian Paul   struct ureg_dst dst[PIPE_MAX_COLOR_BUFS];
340dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   int i;
341dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
34288330c64388a3322a64a7afb75cd5a6a51581928Brian Paul   assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
343002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
344a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
345002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   if (ureg == NULL)
346002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      return NULL;
347002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
3485d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák   src = ureg_DECL_fs_input( ureg, input_semantic, 0,
3495d4d8b6205af9a09e67f53631eefad77054aa8e9Marek Olšák                             input_interpolate );
350002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
351dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   for (i = 0; i < num_cbufs; i++)
352dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák      dst[i] = ureg_DECL_output( ureg, TGSI_SEMANTIC_COLOR, i );
353dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
354dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   for (i = 0; i < num_cbufs; i++)
355dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák      ureg_MOV( ureg, dst[i], src );
356002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
357002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   ureg_END( ureg );
358002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
359a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   return ureg_create_shader_and_destroy( ureg, pipe );
3606a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian}
361825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
362825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
363825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšákstatic void *
364825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšákutil_make_fs_blit_msaa_gen(struct pipe_context *pipe,
365825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák                           unsigned tgsi_tex,
366825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák                           const char *output_semantic,
367825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák                           const char *output_mask)
368825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák{
369825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   static const char shader_templ[] =
370825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "FRAG\n"
371825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "DCL IN[0], GENERIC[0], LINEAR\n"
372825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "DCL SAMP[0]\n"
373825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "DCL OUT[0], %s\n"
374825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "DCL TEMP[0]\n"
375825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
376825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "F2U TEMP[0], IN[0]\n"
377825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "TXF OUT[0]%s, TEMP[0].xyzz, SAMP[0], %s\n"
378825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "END\n";
379825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
380825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   const char *type = tgsi_texture_names[tgsi_tex];
381825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   char text[sizeof(shader_templ)+100];
382825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   struct tgsi_token tokens[1000];
383825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   struct pipe_shader_state state = {tokens};
384825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
385825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   assert(tgsi_tex == TGSI_TEXTURE_2D_MSAA ||
386825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák          tgsi_tex == TGSI_TEXTURE_2D_ARRAY_MSAA);
387825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
388825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   sprintf(text, shader_templ, output_semantic, output_mask, type);
389825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
390825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   if (!tgsi_text_translate(text, tokens, Elements(tokens))) {
391825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák      puts(text);
392825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák      assert(0);
393825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák      return NULL;
394825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   }
395825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák#if 0
396825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   tgsi_dump(state.tokens, 0);
397825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák#endif
398825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
399825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   return pipe->create_fs_state(pipe, &state);
400825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák}
401825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
402825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
403825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák/**
404825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * Make a fragment shader that sets the output color to a color
405825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * fetched from a multisample texture.
406825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * \param tex_target  one of PIPE_TEXTURE_x
407825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák */
408825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšákvoid *
409825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšákutil_make_fs_blit_msaa_color(struct pipe_context *pipe,
410825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák                             unsigned tgsi_tex)
411825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák{
412825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   return util_make_fs_blit_msaa_gen(pipe, tgsi_tex,
413825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák                                     "COLOR[0]", "");
414825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák}
415825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
416825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
417825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák/**
418825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * Make a fragment shader that sets the output depth to a depth value
419825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * fetched from a multisample texture.
420825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * \param tex_target  one of PIPE_TEXTURE_x
421825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák */
422825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšákvoid *
423825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšákutil_make_fs_blit_msaa_depth(struct pipe_context *pipe,
424825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák                             unsigned tgsi_tex)
425825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák{
426825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   return util_make_fs_blit_msaa_gen(pipe, tgsi_tex,
427825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák                                     "POSITION", ".z");
428825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák}
429825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
430825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
431825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák/**
432825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * Make a fragment shader that sets the output stencil to a stencil value
433825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * fetched from a multisample texture.
434825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * \param tex_target  one of PIPE_TEXTURE_x
435825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák */
436825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšákvoid *
437825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšákutil_make_fs_blit_msaa_stencil(struct pipe_context *pipe,
438825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák                               unsigned tgsi_tex)
439825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák{
440825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   return util_make_fs_blit_msaa_gen(pipe, tgsi_tex,
441825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák                                     "STENCIL", ".y");
442825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák}
443825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
444825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
445825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák/**
446825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * Make a fragment shader that sets the output depth and stencil to depth
447825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * and stencil values fetched from two multisample textures / samplers.
448825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * The sizes of both textures should match (it should be one depth-stencil
449825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * texture).
450825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák * \param tex_target  one of PIPE_TEXTURE_x
451825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák */
452825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšákvoid *
453825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšákutil_make_fs_blit_msaa_depthstencil(struct pipe_context *pipe,
454825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák                                    unsigned tgsi_tex)
455825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák{
456825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   static const char shader_templ[] =
457825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "FRAG\n"
458825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "DCL IN[0], GENERIC[0], LINEAR\n"
459825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "DCL SAMP[0..1]\n"
460825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "DCL OUT[0], POSITION\n"
461825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "DCL OUT[1], STENCIL\n"
462825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "DCL TEMP[0]\n"
463825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
464825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "F2U TEMP[0], IN[0]\n"
465825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "TXF OUT[0].z, TEMP[0], SAMP[0], %s\n"
466825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "TXF OUT[1].y, TEMP[0], SAMP[1], %s\n"
467825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák         "END\n";
468825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
469825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   const char *type = tgsi_texture_names[tgsi_tex];
470825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   char text[sizeof(shader_templ)+100];
471825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   struct tgsi_token tokens[1000];
472825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   struct pipe_shader_state state = {tokens};
473825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
474825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   assert(tgsi_tex == TGSI_TEXTURE_2D_MSAA ||
475825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák          tgsi_tex == TGSI_TEXTURE_2D_ARRAY_MSAA);
476825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
477825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   sprintf(text, shader_templ, type, type);
478825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
479825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   if (!tgsi_text_translate(text, tokens, Elements(tokens))) {
480825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák      assert(0);
481825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák      return NULL;
482825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   }
483825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák#if 0
484825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   tgsi_dump(state.tokens, 0);
485825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák#endif
486825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák
487825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák   return pipe->create_fs_state(pipe, &state);
488825b45366d5308fd3e8e71c0c1943cb6ca8f69eaMarek Olšák}
489