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