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