sp_fs_exec.c revision 95f7ed4638d4e379783abdd5b250e203b6b1b435
1c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell/************************************************************************** 2c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * 3c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * All Rights Reserved. 5c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * 6c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 7c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * copy of this software and associated documentation files (the 8c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * "Software"), to deal in the Software without restriction, including 9c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 10c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 11c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * permit persons to whom the Software is furnished to do so, subject to 12c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * the following conditions: 13c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * 14c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * The above copyright notice and this permission notice (including the 15c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * next paragraph) shall be included in all copies or substantial portions 16c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * of the Software. 17c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * 18c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * 26c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell **************************************************************************/ 27c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 28bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paul/** 29bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paul * Execute fragment shader using the TGSI interpreter. 30bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paul */ 31c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 32c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell#include "sp_context.h" 33c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell#include "sp_state.h" 34c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell#include "sp_fs.h" 357925274da323d5a896b557181d4016e0391f026fBrian#include "sp_quad.h" 36c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 37c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell#include "pipe/p_state.h" 38c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell#include "pipe/p_defines.h" 394f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h" 40c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_exec.h" 41c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_parse.h" 42c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 43bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paul 44bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paul/** 45bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paul * Subclass of sp_fragment_shader 46bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paul */ 4705aeb92a092c26e7773beb95692fc72e70a40e56Brian Paulstruct sp_exec_fragment_shader 4805aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul{ 49c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell struct sp_fragment_shader base; 50bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paul /* No other members for now */ 51c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell}; 52c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 53c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 5405aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul/** cast wrapper */ 5505aeb92a092c26e7773beb95692fc72e70a40e56Brian Paulstatic INLINE struct sp_exec_fragment_shader * 565f88d871ea051e0c89bbbfc832a565fc8de70c6aJosé Fonsecasp_exec_fragment_shader(const struct sp_fragment_shader *base) 5705aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul{ 5805aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul return (struct sp_exec_fragment_shader *) base; 5905aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul} 6005aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul 61c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 6220fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell/** 6320fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell * Compute quad X,Y,Z,W for the four fragments in a quad. 6420fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell * 6520fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell * This should really be part of the compiled shader. 6620fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell */ 6720fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwellvoid 6820fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwellsp_setup_pos_vector(const struct tgsi_interp_coef *coef, 6920fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell float x, float y, 7020fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell struct tgsi_exec_vector *quadpos) 7120fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell{ 7220fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell uint chan; 7320fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell /* do X */ 7420fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell quadpos->xyzw[0].f[0] = x; 7520fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell quadpos->xyzw[0].f[1] = x + 1; 7620fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell quadpos->xyzw[0].f[2] = x; 7720fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell quadpos->xyzw[0].f[3] = x + 1; 7820fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell 7920fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell /* do Y */ 8020fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell quadpos->xyzw[1].f[0] = y; 8120fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell quadpos->xyzw[1].f[1] = y; 8220fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell quadpos->xyzw[1].f[2] = y + 1; 8320fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell quadpos->xyzw[1].f[3] = y + 1; 8420fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell 8520fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell /* do Z and W for all fragments in the quad */ 8620fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell for (chan = 2; chan < 4; chan++) { 8720fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell const float dadx = coef->dadx[chan]; 8820fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell const float dady = coef->dady[chan]; 8920fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell const float a0 = coef->a0[chan] + dadx * x + dady * y; 9020fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell quadpos->xyzw[chan].f[0] = a0; 9120fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell quadpos->xyzw[chan].f[1] = a0 + dadx; 9220fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell quadpos->xyzw[chan].f[2] = a0 + dady; 9320fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell quadpos->xyzw[chan].f[3] = a0 + dadx + dady; 9420fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell } 9520fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell} 9620fbcbf5801c28865c0bfab3cda45302c8474a66Keith Whitwell 97c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 98c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwellstatic void 99e8de5c70e3370e9112a5facc870075eea60c4c46José Fonsecaexec_prepare( const struct sp_fragment_shader *base, 100c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell struct tgsi_exec_machine *machine, 1010b9e96fae9493d5d58f046e01c983a3c4267090eBrian struct tgsi_sampler **samplers ) 102c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell{ 10305aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul /* 10405aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul * Bind tokens/shader to the interpreter's machine state. 10505aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul * Avoid redundant binding. 10605aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul */ 1075f76a77b319b4b66001dea4bcfccd0484aed82f5Brian Paul if (machine->Tokens != base->shader.tokens) { 10805aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul tgsi_exec_machine_bind_shader( machine, 10905aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul base->shader.tokens, 11005aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul PIPE_MAX_SAMPLERS, 11105aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul samplers ); 11205aeb92a092c26e7773beb95692fc72e70a40e56Brian Paul } 113c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell} 114c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 115c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 116c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell/* TODO: hide the machine struct in here somewhere, remove from this 117c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * interface: 118c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell */ 119c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwellstatic unsigned 120e8de5c70e3370e9112a5facc870075eea60c4c46José Fonsecaexec_run( const struct sp_fragment_shader *base, 121c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell struct tgsi_exec_machine *machine, 122c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell struct quad_header *quad ) 123c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell{ 124c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell /* Compute X, Y, Z, W vals for this quad */ 125c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell sp_setup_pos_vector(quad->posCoef, 12601f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol (float)quad->input.x0, (float)quad->input.y0, 127c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell &machine->QuadPos); 128c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 12995f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell quad->inout.mask &= tgsi_exec_machine_run( machine ); 13095f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell if (quad->inout.mask == 0) 13195f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell return FALSE; 13295f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell 13395f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell /* store outputs */ 13495f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell { 13595f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell const ubyte *sem_name = base->info.output_semantic_name; 13695f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell const ubyte *sem_index = base->info.output_semantic_index; 13795f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell const uint n = base->info.num_outputs; 13895f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell uint i; 13995f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell for (i = 0; i < n; i++) { 14095f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell switch (sem_name[i]) { 14195f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell case TGSI_SEMANTIC_COLOR: 14295f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell { 14395f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell uint cbuf = sem_index[i]; 14495f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell memcpy(quad->output.color[cbuf], 14595f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell &machine->Outputs[i].xyzw[0].f[0], 14695f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell sizeof(quad->output.color[0]) ); 14795f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell } 14895f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell break; 14995f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell case TGSI_SEMANTIC_POSITION: 15095f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell { 15195f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell uint j; 15295f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell for (j = 0; j < 4; j++) { 15395f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell quad->output.depth[j] = machine->Outputs[0].xyzw[2].f[j]; 15495f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell } 15595f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell } 15695f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell break; 15795f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell } 15895f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell } 15995f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell } 16095f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell 16195f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell return TRUE; 162c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell} 163c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 164c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 165c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwellstatic void 166c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwellexec_delete( struct sp_fragment_shader *base ) 167c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell{ 1689671f7ae476cadb46f9f8f9d0363f24aabaf9f87Brian Paul FREE((void *) base->shader.tokens); 169c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell FREE(base); 170c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell} 171c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 172c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 173c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwellstruct sp_fragment_shader * 174c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwellsoftpipe_create_fs_exec(struct softpipe_context *softpipe, 175c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell const struct pipe_shader_state *templ) 176c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell{ 177c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell struct sp_exec_fragment_shader *shader; 178c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 179c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell /* Decide whether we'll be codegenerating this shader and if so do 180c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell * that now. 181c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell */ 182c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 183c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell shader = CALLOC_STRUCT(sp_exec_fragment_shader); 184c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell if (!shader) 185c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell return NULL; 186c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 1879671f7ae476cadb46f9f8f9d0363f24aabaf9f87Brian Paul /* we need to keep a local copy of the tokens */ 1889671f7ae476cadb46f9f8f9d0363f24aabaf9f87Brian Paul shader->base.shader.tokens = tgsi_dup_tokens(templ->tokens); 189c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell shader->base.prepare = exec_prepare; 190c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell shader->base.run = exec_run; 191c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell shader->base.delete = exec_delete; 192c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 193c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell return &shader->base; 194c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell} 195