u_simple_shaders.c revision dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225
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"
4031970c4633c5000916b0a36022ff761038f5cf5aBrian#include "util/u_simple_shaders.h"
41002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell#include "tgsi/tgsi_ureg.h"
4231970c4633c5000916b0a36022ff761038f5cf5aBrian
4331970c4633c5000916b0a36022ff761038f5cf5aBrian
4431970c4633c5000916b0a36022ff761038f5cf5aBrian
4531970c4633c5000916b0a36022ff761038f5cf5aBrian/**
4631970c4633c5000916b0a36022ff761038f5cf5aBrian * Make simple vertex pass-through shader.
4731970c4633c5000916b0a36022ff761038f5cf5aBrian */
4831970c4633c5000916b0a36022ff761038f5cf5aBrianvoid *
4931970c4633c5000916b0a36022ff761038f5cf5aBrianutil_make_vertex_passthrough_shader(struct pipe_context *pipe,
5031970c4633c5000916b0a36022ff761038f5cf5aBrian                                    uint num_attribs,
5131970c4633c5000916b0a36022ff761038f5cf5aBrian                                    const uint *semantic_names,
52fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell                                    const uint *semantic_indexes)
53dccbfd8bf0624250a435948029916073d3390191Brian
5431970c4633c5000916b0a36022ff761038f5cf5aBrian{
55002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_program *ureg;
56002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   uint i;
5731970c4633c5000916b0a36022ff761038f5cf5aBrian
58a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   ureg = ureg_create( TGSI_PROCESSOR_VERTEX );
59002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   if (ureg == NULL)
60002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      return NULL;
6131970c4633c5000916b0a36022ff761038f5cf5aBrian
6231970c4633c5000916b0a36022ff761038f5cf5aBrian   for (i = 0; i < num_attribs; i++) {
63002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      struct ureg_src src;
64002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      struct ureg_dst dst;
65002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
666d8dbd3d1ec888300fb0e9ac3cf61808ba8ecc2bKeith Whitwell      src = ureg_DECL_vs_input( ureg, i );
67002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
68002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      dst = ureg_DECL_output( ureg,
69002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                              semantic_names[i],
70002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                              semantic_indexes[i]);
71002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
72002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      ureg_MOV( ureg, dst, src );
7331970c4633c5000916b0a36022ff761038f5cf5aBrian   }
7431970c4633c5000916b0a36022ff761038f5cf5aBrian
75002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   ureg_END( ureg );
76dccbfd8bf0624250a435948029916073d3390191Brian
77a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   return ureg_create_shader_and_destroy( ureg, pipe );
7831970c4633c5000916b0a36022ff761038f5cf5aBrian}
7931970c4633c5000916b0a36022ff761038f5cf5aBrian
8031970c4633c5000916b0a36022ff761038f5cf5aBrian
8131970c4633c5000916b0a36022ff761038f5cf5aBrian
8231970c4633c5000916b0a36022ff761038f5cf5aBrian
8331970c4633c5000916b0a36022ff761038f5cf5aBrian/**
8431970c4633c5000916b0a36022ff761038f5cf5aBrian * Make simple fragment texture shader:
85862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell *  IMM {0,0,0,1}                         // (if writemask != 0xf)
86862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell *  MOV OUT[0], IMM[0]                    // (if writemask != 0xf)
87862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell *  TEX OUT[0].writemask, IN[0], SAMP[0], 2D;
8831970c4633c5000916b0a36022ff761038f5cf5aBrian *  END;
8931970c4633c5000916b0a36022ff761038f5cf5aBrian */
9031970c4633c5000916b0a36022ff761038f5cf5aBrianvoid *
91862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwellutil_make_fragment_tex_shader_writemask(struct pipe_context *pipe,
92dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                                        unsigned tex_target,
93862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell                                        unsigned writemask )
9431970c4633c5000916b0a36022ff761038f5cf5aBrian{
95002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_program *ureg;
96002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_src sampler;
97002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_src tex;
98002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_dst out;
99002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
100a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
101002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   if (ureg == NULL)
102002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      return NULL;
103002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
104848ab8be8c34b00b2afe6120882f8c29f047ced5Keith Whitwell   sampler = ureg_DECL_sampler( ureg, 0 );
105002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
106002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   tex = ureg_DECL_fs_input( ureg,
107002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                             TGSI_SEMANTIC_GENERIC, 0,
108002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                             TGSI_INTERPOLATE_PERSPECTIVE );
109002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
110002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   out = ureg_DECL_output( ureg,
111002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                           TGSI_SEMANTIC_COLOR,
112002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                           0 );
113002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
1146a085184ebf251f145181796e317ffa179a38baeKeith Whitwell   if (writemask != TGSI_WRITEMASK_XYZW) {
1156a085184ebf251f145181796e317ffa179a38baeKeith Whitwell      struct ureg_src imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
1166a085184ebf251f145181796e317ffa179a38baeKeith Whitwell
1176a085184ebf251f145181796e317ffa179a38baeKeith Whitwell      ureg_MOV( ureg, out, imm );
1186a085184ebf251f145181796e317ffa179a38baeKeith Whitwell   }
1196a085184ebf251f145181796e317ffa179a38baeKeith Whitwell
1206a085184ebf251f145181796e317ffa179a38baeKeith Whitwell   ureg_TEX( ureg,
1216a085184ebf251f145181796e317ffa179a38baeKeith Whitwell             ureg_writemask(out, writemask),
122dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák             tex_target, tex, sampler );
123002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   ureg_END( ureg );
124002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
125a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   return ureg_create_shader_and_destroy( ureg, pipe );
12631970c4633c5000916b0a36022ff761038f5cf5aBrian}
12731970c4633c5000916b0a36022ff761038f5cf5aBrian
128862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwellvoid *
129dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšákutil_make_fragment_tex_shader(struct pipe_context *pipe, unsigned tex_target )
130862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell{
131862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell   return util_make_fragment_tex_shader_writemask( pipe,
132dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                                                   tex_target,
133862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell                                                   TGSI_WRITEMASK_XYZW );
134862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell}
135862724d3c2761fe148d985e9205ebb1cc36f3011Keith Whitwell
136dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák/**
137dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák * Make a simple fragment texture shader which reads an X component from
138dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák * a texture and writes it as depth.
139dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák */
140dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšákvoid *
141dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšákutil_make_fragment_tex_shader_writedepth(struct pipe_context *pipe,
142dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                                         unsigned tex_target)
143dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák{
144dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_program *ureg;
145dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_src sampler;
146dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_src tex;
147dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_dst out, depth;
148dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_src imm;
1496a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian
150dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
151dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   if (ureg == NULL)
152dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák      return NULL;
153dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
154dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   sampler = ureg_DECL_sampler( ureg, 0 );
155dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
156dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   tex = ureg_DECL_fs_input( ureg,
157dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                             TGSI_SEMANTIC_GENERIC, 0,
158dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                             TGSI_INTERPOLATE_PERSPECTIVE );
159dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
160dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   out = ureg_DECL_output( ureg,
161dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                           TGSI_SEMANTIC_COLOR,
162dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                           0 );
163dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
164dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   depth = ureg_DECL_output( ureg,
165dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                             TGSI_SEMANTIC_POSITION,
166dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák                             0 );
167dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
168dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
169dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
170dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   ureg_MOV( ureg, out, imm );
171dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
172dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   ureg_TEX( ureg,
173dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák             ureg_writemask(depth, TGSI_WRITEMASK_Z),
174dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák             tex_target, tex, sampler );
175dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   ureg_END( ureg );
176dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
177dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   return ureg_create_shader_and_destroy( ureg, pipe );
178dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák}
1796a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian
1806a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian/**
1816a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian * Make simple fragment color pass-through shader.
1826a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian */
1836a9a3afcf923ec5c67069cdb1656f52675cd8edeBrianvoid *
184fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwellutil_make_fragment_passthrough_shader(struct pipe_context *pipe)
1856a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian{
186dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   return util_make_fragment_clonecolor_shader(pipe, 1);
187dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák}
188dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
189dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšákvoid *
190dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšákutil_make_fragment_clonecolor_shader(struct pipe_context *pipe, int num_cbufs)
191dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák{
192002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_program *ureg;
193002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   struct ureg_src src;
194dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   struct ureg_dst dst[8];
195dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   int i;
196dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
197dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   assert(num_cbufs <= 8);
198002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
199a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
200002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   if (ureg == NULL)
201002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell      return NULL;
202002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
203002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   src = ureg_DECL_fs_input( ureg, TGSI_SEMANTIC_COLOR, 0,
204002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell                             TGSI_INTERPOLATE_PERSPECTIVE );
205002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
206dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   for (i = 0; i < num_cbufs; i++)
207dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák      dst[i] = ureg_DECL_output( ureg, TGSI_SEMANTIC_COLOR, i );
208dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák
209dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák   for (i = 0; i < num_cbufs; i++)
210dff4c9ed559ae025d1d8fe7b9d1cea5a973c2225Marek Olšák      ureg_MOV( ureg, dst[i], src );
211002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
212002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell   ureg_END( ureg );
213002c76cfefe8c1ab12fb7031a649a30fb349a3e3Keith Whitwell
214a88678d3eebf40107bb2ac46da30c4afe3d2531dCooper Yuan   return ureg_create_shader_and_destroy( ureg, pipe );
2156a9a3afcf923ec5c67069cdb1656f52675cd8edeBrian}
216