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