1344356a0edee932604027386591c82f6666e607cBrian/************************************************************************** 2344356a0edee932604027386591c82f6666e607cBrian * 3344356a0edee932604027386591c82f6666e607cBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4344356a0edee932604027386591c82f6666e607cBrian * All Rights Reserved. 53ffd529ff19bf8dd7b022a267bf2afe44c7f0f65Brian Paul * Copyright 2008 VMware, Inc. All rights reserved. 6344356a0edee932604027386591c82f6666e607cBrian * 7344356a0edee932604027386591c82f6666e607cBrian * Permission is hereby granted, free of charge, to any person obtaining a 8344356a0edee932604027386591c82f6666e607cBrian * copy of this software and associated documentation files (the 9344356a0edee932604027386591c82f6666e607cBrian * "Software"), to deal in the Software without restriction, including 10344356a0edee932604027386591c82f6666e607cBrian * without limitation the rights to use, copy, modify, merge, publish, 11344356a0edee932604027386591c82f6666e607cBrian * distribute, sub license, and/or sell copies of the Software, and to 12344356a0edee932604027386591c82f6666e607cBrian * permit persons to whom the Software is furnished to do so, subject to 13344356a0edee932604027386591c82f6666e607cBrian * the following conditions: 14344356a0edee932604027386591c82f6666e607cBrian * 15344356a0edee932604027386591c82f6666e607cBrian * The above copyright notice and this permission notice (including the 16344356a0edee932604027386591c82f6666e607cBrian * next paragraph) shall be included in all copies or substantial portions 17344356a0edee932604027386591c82f6666e607cBrian * of the Software. 18344356a0edee932604027386591c82f6666e607cBrian * 19344356a0edee932604027386591c82f6666e607cBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20344356a0edee932604027386591c82f6666e607cBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21344356a0edee932604027386591c82f6666e607cBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22344356a0edee932604027386591c82f6666e607cBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 23344356a0edee932604027386591c82f6666e607cBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24344356a0edee932604027386591c82f6666e607cBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25344356a0edee932604027386591c82f6666e607cBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26344356a0edee932604027386591c82f6666e607cBrian * 27344356a0edee932604027386591c82f6666e607cBrian **************************************************************************/ 28344356a0edee932604027386591c82f6666e607cBrian 29344356a0edee932604027386591c82f6666e607cBrian/* Vertices are just an array of floats, with all the attributes 30344356a0edee932604027386591c82f6666e607cBrian * packed. We currently assume a layout like: 31344356a0edee932604027386591c82f6666e607cBrian * 32344356a0edee932604027386591c82f6666e607cBrian * attr[0][0..3] - window position 33344356a0edee932604027386591c82f6666e607cBrian * attr[1..n][0..3] - remaining attributes. 34344356a0edee932604027386591c82f6666e607cBrian * 35344356a0edee932604027386591c82f6666e607cBrian * Attributes are assumed to be 4 floats wide but are packed so that 36344356a0edee932604027386591c82f6666e607cBrian * all the enabled attributes run contiguously. 37344356a0edee932604027386591c82f6666e607cBrian */ 38344356a0edee932604027386591c82f6666e607cBrian 394f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_math.h" 404f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h" 41344356a0edee932604027386591c82f6666e607cBrian#include "pipe/p_defines.h" 42344356a0edee932604027386591c82f6666e607cBrian#include "pipe/p_shader_tokens.h" 43344356a0edee932604027386591c82f6666e607cBrian 44344356a0edee932604027386591c82f6666e607cBrian#include "sp_context.h" 45344356a0edee932604027386591c82f6666e607cBrian#include "sp_state.h" 467925274da323d5a896b557181d4016e0391f026fBrian#include "sp_quad.h" 47ed6f41e2f467f5b9338320a96202c7dfd181422fBrian#include "sp_quad_pipe.h" 48344356a0edee932604027386591c82f6666e607cBrian 49344356a0edee932604027386591c82f6666e607cBrian 50344356a0edee932604027386591c82f6666e607cBrianstruct quad_shade_stage 51344356a0edee932604027386591c82f6666e607cBrian{ 520b9e96fae9493d5d58f046e01c983a3c4267090eBrian struct quad_stage stage; /**< base class */ 531fce9d58cc70deaff284e1d9d0ffcb15b61e7595Brian Paul 541fce9d58cc70deaff284e1d9d0ffcb15b61e7595Brian Paul /* no other fields at this time */ 55344356a0edee932604027386591c82f6666e607cBrian}; 56344356a0edee932604027386591c82f6666e607cBrian 57344356a0edee932604027386591c82f6666e607cBrian 58344356a0edee932604027386591c82f6666e607cBrian/** cast wrapper */ 59344356a0edee932604027386591c82f6666e607cBrianstatic INLINE struct quad_shade_stage * 60344356a0edee932604027386591c82f6666e607cBrianquad_shade_stage(struct quad_stage *qs) 61344356a0edee932604027386591c82f6666e607cBrian{ 62344356a0edee932604027386591c82f6666e607cBrian return (struct quad_shade_stage *) qs; 63344356a0edee932604027386591c82f6666e607cBrian} 64344356a0edee932604027386591c82f6666e607cBrian 65344356a0edee932604027386591c82f6666e607cBrian 66344356a0edee932604027386591c82f6666e607cBrian/** 67344356a0edee932604027386591c82f6666e607cBrian * Execute fragment shader for the four fragments in the quad. 6800d1d8aad3b97899e3fab1cc4e4296c3f6ee8513Brian Paul * \return TRUE if quad is alive, FALSE if all four pixels are killed 69344356a0edee932604027386591c82f6666e607cBrian */ 7095f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwellstatic INLINE boolean 71bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paulshade_quad(struct quad_stage *qs, struct quad_header *quad) 72344356a0edee932604027386591c82f6666e607cBrian{ 73344356a0edee932604027386591c82f6666e607cBrian struct softpipe_context *softpipe = qs->softpipe; 741fce9d58cc70deaff284e1d9d0ffcb15b61e7595Brian Paul struct tgsi_exec_machine *machine = softpipe->fs_machine; 75344356a0edee932604027386591c82f6666e607cBrian 76344356a0edee932604027386591c82f6666e607cBrian /* run shader */ 7767e3cbf1632e361220234013147331e4618b70cbDave Airlie machine->flatshade_color = softpipe->rasterizer->flatshade ? TRUE : FALSE; 78c534f11164bbecf25eb2b1e697f9511eceb0c86fBrian Paul return softpipe->fs_variant->run( softpipe->fs_variant, machine, quad ); 79ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell} 80ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell 81bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 82bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 83bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwellstatic void 84bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwellcoverage_quad(struct quad_stage *qs, struct quad_header *quad) 85bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell{ 86bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell struct softpipe_context *softpipe = qs->softpipe; 87bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell uint cbuf; 88bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 89bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell /* loop over colorbuffer outputs */ 90bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell for (cbuf = 0; cbuf < softpipe->framebuffer.nr_cbufs; cbuf++) { 91bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell float (*quadColor)[4] = quad->output.color[cbuf]; 92bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell unsigned j; 936b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard for (j = 0; j < TGSI_QUAD_SIZE; j++) { 94bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell assert(quad->input.coverage[j] >= 0.0); 95bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell assert(quad->input.coverage[j] <= 1.0); 96bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell quadColor[3][j] *= quad->input.coverage[j]; 97bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell } 98bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell } 99bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell} 100bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 101bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 10200d1d8aad3b97899e3fab1cc4e4296c3f6ee8513Brian Paul/** 10300d1d8aad3b97899e3fab1cc4e4296c3f6ee8513Brian Paul * Shade/write an array of quads 10400d1d8aad3b97899e3fab1cc4e4296c3f6ee8513Brian Paul * Called via quad_stage::run() 10500d1d8aad3b97899e3fab1cc4e4296c3f6ee8513Brian Paul */ 106ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwellstatic void 107ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwellshade_quads(struct quad_stage *qs, 10800d1d8aad3b97899e3fab1cc4e4296c3f6ee8513Brian Paul struct quad_header *quads[], 10900d1d8aad3b97899e3fab1cc4e4296c3f6ee8513Brian Paul unsigned nr) 110ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell{ 111ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell struct softpipe_context *softpipe = qs->softpipe; 1121fce9d58cc70deaff284e1d9d0ffcb15b61e7595Brian Paul struct tgsi_exec_machine *machine = softpipe->fs_machine; 113e099ed2c64edc4adc716dce5c54e4c97444504d8Brian Paul unsigned i, nr_quads = 0; 114835bab0143e11ab98551a061043f944fd6eab456Michal Krol 115ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul tgsi_exec_set_constant_buffers(machine, PIPE_MAX_CONSTANT_BUFFERS, 116ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul softpipe->mapped_constants[PIPE_SHADER_FRAGMENT], 117ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul softpipe->const_buffer_size[PIPE_SHADER_FRAGMENT]); 118ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul 119ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell machine->InterpCoefs = quads[0]->coef; 120ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell 121ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell for (i = 0; i < nr; i++) { 122a5f2010735b6af469f57c6c254af9603bb9db18dBrian Paul /* Only omit this quad from the output list if all the fragments 123a5f2010735b6af469f57c6c254af9603bb9db18dBrian Paul * are killed _AND_ it's not the first quad in the list. 124a5f2010735b6af469f57c6c254af9603bb9db18dBrian Paul * The first quad is special in the (optimized) depth-testing code: 125a5f2010735b6af469f57c6c254af9603bb9db18dBrian Paul * the quads' Z coordinates are step-wise interpolated with respect 126a5f2010735b6af469f57c6c254af9603bb9db18dBrian Paul * to the first quad in the list. 127a5f2010735b6af469f57c6c254af9603bb9db18dBrian Paul * For multi-pass algorithms we need to produce exactly the same 128a5f2010735b6af469f57c6c254af9603bb9db18dBrian Paul * Z values in each pass. If interpolation starts with different quads 129a5f2010735b6af469f57c6c254af9603bb9db18dBrian Paul * we can get different Z values for the same (x,y). 130a5f2010735b6af469f57c6c254af9603bb9db18dBrian Paul */ 131a5f2010735b6af469f57c6c254af9603bb9db18dBrian Paul if (!shade_quad(qs, quads[i]) && i > 0) 13200d1d8aad3b97899e3fab1cc4e4296c3f6ee8513Brian Paul continue; /* quad totally culled/killed */ 133bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 134bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell if (/*do_coverage*/ 0) 135bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell coverage_quad( qs, quads[i] ); 136bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 137e099ed2c64edc4adc716dce5c54e4c97444504d8Brian Paul quads[nr_quads++] = quads[i]; 138344356a0edee932604027386591c82f6666e607cBrian } 139ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell 140e099ed2c64edc4adc716dce5c54e4c97444504d8Brian Paul if (nr_quads) 141e099ed2c64edc4adc716dce5c54e4c97444504d8Brian Paul qs->next->run(qs->next, quads, nr_quads); 142344356a0edee932604027386591c82f6666e607cBrian} 143ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell 144ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell 145344356a0edee932604027386591c82f6666e607cBrian/** 146344356a0edee932604027386591c82f6666e607cBrian * Per-primitive (or per-begin?) setup 147344356a0edee932604027386591c82f6666e607cBrian */ 148bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paulstatic void 149bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paulshade_begin(struct quad_stage *qs) 150344356a0edee932604027386591c82f6666e607cBrian{ 151344356a0edee932604027386591c82f6666e607cBrian qs->next->begin(qs->next); 152344356a0edee932604027386591c82f6666e607cBrian} 153344356a0edee932604027386591c82f6666e607cBrian 154344356a0edee932604027386591c82f6666e607cBrian 155bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paulstatic void 156bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paulshade_destroy(struct quad_stage *qs) 157344356a0edee932604027386591c82f6666e607cBrian{ 158344356a0edee932604027386591c82f6666e607cBrian FREE( qs ); 159344356a0edee932604027386591c82f6666e607cBrian} 160344356a0edee932604027386591c82f6666e607cBrian 161344356a0edee932604027386591c82f6666e607cBrian 162bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paulstruct quad_stage * 163bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paulsp_quad_shade_stage( struct softpipe_context *softpipe ) 164344356a0edee932604027386591c82f6666e607cBrian{ 165344356a0edee932604027386591c82f6666e607cBrian struct quad_shade_stage *qss = CALLOC_STRUCT(quad_shade_stage); 1666175653d0bceedba1f599d27111bab14f312f134Keith Whitwell if (!qss) 1676175653d0bceedba1f599d27111bab14f312f134Keith Whitwell goto fail; 168344356a0edee932604027386591c82f6666e607cBrian 169344356a0edee932604027386591c82f6666e607cBrian qss->stage.softpipe = softpipe; 170344356a0edee932604027386591c82f6666e607cBrian qss->stage.begin = shade_begin; 171ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell qss->stage.run = shade_quads; 172344356a0edee932604027386591c82f6666e607cBrian qss->stage.destroy = shade_destroy; 173344356a0edee932604027386591c82f6666e607cBrian 174344356a0edee932604027386591c82f6666e607cBrian return &qss->stage; 1756175653d0bceedba1f599d27111bab14f312f134Keith Whitwell 1766175653d0bceedba1f599d27111bab14f312f134Keith Whitwellfail: 1776175653d0bceedba1f599d27111bab14f312f134Keith Whitwell FREE(qss); 1786175653d0bceedba1f599d27111bab14f312f134Keith Whitwell return NULL; 179344356a0edee932604027386591c82f6666e607cBrian} 180