sp_quad_fs.c revision 835bab0143e11ab98551a061043f944fd6eab456
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 */ 536175653d0bceedba1f599d27111bab14f312f134Keith Whitwell struct tgsi_exec_machine *machine; 54344356a0edee932604027386591c82f6666e607cBrian struct tgsi_exec_vector *inputs, *outputs; 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. 68344356a0edee932604027386591c82f6666e607cBrian */ 6995f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwellstatic INLINE boolean 70bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paulshade_quad(struct quad_stage *qs, struct quad_header *quad) 71344356a0edee932604027386591c82f6666e607cBrian{ 72344356a0edee932604027386591c82f6666e607cBrian struct quad_shade_stage *qss = quad_shade_stage( qs ); 73344356a0edee932604027386591c82f6666e607cBrian struct softpipe_context *softpipe = qs->softpipe; 746175653d0bceedba1f599d27111bab14f312f134Keith Whitwell struct tgsi_exec_machine *machine = qss->machine; 75344356a0edee932604027386591c82f6666e607cBrian 76344356a0edee932604027386591c82f6666e607cBrian /* run shader */ 7795f7ed4638d4e379783abdd5b250e203b6b1b435Keith Whitwell return softpipe->fs->run( softpipe->fs, machine, quad ); 78ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell} 79ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell 80bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 81bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 82bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwellstatic void 83bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwellcoverage_quad(struct quad_stage *qs, struct quad_header *quad) 84bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell{ 85bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell struct softpipe_context *softpipe = qs->softpipe; 86bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell uint cbuf; 87bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 88bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell /* loop over colorbuffer outputs */ 89bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell for (cbuf = 0; cbuf < softpipe->framebuffer.nr_cbufs; cbuf++) { 90bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell float (*quadColor)[4] = quad->output.color[cbuf]; 91bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell unsigned j; 92bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell for (j = 0; j < QUAD_SIZE; j++) { 93bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell assert(quad->input.coverage[j] >= 0.0); 94bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell assert(quad->input.coverage[j] <= 1.0); 95bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell quadColor[3][j] *= quad->input.coverage[j]; 96bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell } 97bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell } 98bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell} 99bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 100bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 101bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 102ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwellstatic void 103ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwellshade_quads(struct quad_stage *qs, 104ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell struct quad_header *quads[], 105ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell unsigned nr) 106ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell{ 107ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell struct quad_shade_stage *qss = quad_shade_stage( qs ); 108ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell struct softpipe_context *softpipe = qs->softpipe; 109ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell struct tgsi_exec_machine *machine = qss->machine; 110ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell unsigned i, pass = 0; 111835bab0143e11ab98551a061043f944fd6eab456Michal Krol 112835bab0143e11ab98551a061043f944fd6eab456Michal Krol for (i = 0; i < PIPE_MAX_CONSTANT; i++) { 113835bab0143e11ab98551a061043f944fd6eab456Michal Krol machine->Consts[i] = softpipe->mapped_constants[PIPE_SHADER_FRAGMENT][i]; 114835bab0143e11ab98551a061043f944fd6eab456Michal Krol } 115ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell machine->InterpCoefs = quads[0]->coef; 116ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell 117ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell for (i = 0; i < nr; i++) { 118bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell if (!shade_quad(qs, quads[i])) 119bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell continue; 120bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 121bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell if (/*do_coverage*/ 0) 122bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell coverage_quad( qs, quads[i] ); 123bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell 124bac8e34c9e4077d370923773d67fe565ce154849Keith Whitwell quads[pass++] = quads[i]; 125344356a0edee932604027386591c82f6666e607cBrian } 126ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell 127ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell if (pass) 128ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell qs->next->run(qs->next, quads, pass); 129344356a0edee932604027386591c82f6666e607cBrian} 130ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell 131ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell 132ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell 133344356a0edee932604027386591c82f6666e607cBrian 134bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paul 135344356a0edee932604027386591c82f6666e607cBrian/** 136344356a0edee932604027386591c82f6666e607cBrian * Per-primitive (or per-begin?) setup 137344356a0edee932604027386591c82f6666e607cBrian */ 138bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paulstatic void 139bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paulshade_begin(struct quad_stage *qs) 140344356a0edee932604027386591c82f6666e607cBrian{ 141344356a0edee932604027386591c82f6666e607cBrian struct quad_shade_stage *qss = quad_shade_stage(qs); 142344356a0edee932604027386591c82f6666e607cBrian struct softpipe_context *softpipe = qs->softpipe; 143344356a0edee932604027386591c82f6666e607cBrian 144344356a0edee932604027386591c82f6666e607cBrian softpipe->fs->prepare( softpipe->fs, 1456175653d0bceedba1f599d27111bab14f312f134Keith Whitwell qss->machine, 1463ffd529ff19bf8dd7b022a267bf2afe44c7f0f65Brian Paul (struct tgsi_sampler **) 1473ffd529ff19bf8dd7b022a267bf2afe44c7f0f65Brian Paul softpipe->tgsi.frag_samplers_list ); 148344356a0edee932604027386591c82f6666e607cBrian 149344356a0edee932604027386591c82f6666e607cBrian qs->next->begin(qs->next); 150344356a0edee932604027386591c82f6666e607cBrian} 151344356a0edee932604027386591c82f6666e607cBrian 152344356a0edee932604027386591c82f6666e607cBrian 153bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paulstatic void 154bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paulshade_destroy(struct quad_stage *qs) 155344356a0edee932604027386591c82f6666e607cBrian{ 156344356a0edee932604027386591c82f6666e607cBrian struct quad_shade_stage *qss = (struct quad_shade_stage *) qs; 157344356a0edee932604027386591c82f6666e607cBrian 1586175653d0bceedba1f599d27111bab14f312f134Keith Whitwell tgsi_exec_machine_destroy(qss->machine); 1596175653d0bceedba1f599d27111bab14f312f134Keith Whitwell 160344356a0edee932604027386591c82f6666e607cBrian FREE( qs ); 161344356a0edee932604027386591c82f6666e607cBrian} 162344356a0edee932604027386591c82f6666e607cBrian 163344356a0edee932604027386591c82f6666e607cBrian 164bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paulstruct quad_stage * 165bab6d6bfe928687717a5e5f274110fe1838f99baBrian Paulsp_quad_shade_stage( struct softpipe_context *softpipe ) 166344356a0edee932604027386591c82f6666e607cBrian{ 167344356a0edee932604027386591c82f6666e607cBrian struct quad_shade_stage *qss = CALLOC_STRUCT(quad_shade_stage); 1686175653d0bceedba1f599d27111bab14f312f134Keith Whitwell if (!qss) 1696175653d0bceedba1f599d27111bab14f312f134Keith Whitwell goto fail; 170344356a0edee932604027386591c82f6666e607cBrian 171344356a0edee932604027386591c82f6666e607cBrian qss->stage.softpipe = softpipe; 172344356a0edee932604027386591c82f6666e607cBrian qss->stage.begin = shade_begin; 173ab9fb5167023a26566b53e98f206dd73a18000f3Keith Whitwell qss->stage.run = shade_quads; 174344356a0edee932604027386591c82f6666e607cBrian qss->stage.destroy = shade_destroy; 175344356a0edee932604027386591c82f6666e607cBrian 1766175653d0bceedba1f599d27111bab14f312f134Keith Whitwell qss->machine = tgsi_exec_machine_create(); 1776175653d0bceedba1f599d27111bab14f312f134Keith Whitwell if (!qss->machine) 1786175653d0bceedba1f599d27111bab14f312f134Keith Whitwell goto fail; 179344356a0edee932604027386591c82f6666e607cBrian 180344356a0edee932604027386591c82f6666e607cBrian return &qss->stage; 1816175653d0bceedba1f599d27111bab14f312f134Keith Whitwell 1826175653d0bceedba1f599d27111bab14f312f134Keith Whitwellfail: 1836175653d0bceedba1f599d27111bab14f312f134Keith Whitwell if (qss && qss->machine) 1846175653d0bceedba1f599d27111bab14f312f134Keith Whitwell tgsi_exec_machine_destroy(qss->machine); 1856175653d0bceedba1f599d27111bab14f312f134Keith Whitwell 1866175653d0bceedba1f599d27111bab14f312f134Keith Whitwell FREE(qss); 1876175653d0bceedba1f599d27111bab14f312f134Keith Whitwell return NULL; 188344356a0edee932604027386591c82f6666e607cBrian} 189