sp_quad_fs.c revision ed6f41e2f467f5b9338320a96202c7dfd181422f
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" 46344356a0edee932604027386591c82f6666e607cBrian#include "sp_headers.h" 47ed6f41e2f467f5b9338320a96202c7dfd181422fBrian#include "sp_quad_pipe.h" 48344356a0edee932604027386591c82f6666e607cBrian#include "sp_texture.h" 49344356a0edee932604027386591c82f6666e607cBrian#include "sp_tex_sample.h" 50344356a0edee932604027386591c82f6666e607cBrian 51344356a0edee932604027386591c82f6666e607cBrian 52344356a0edee932604027386591c82f6666e607cBrianstruct quad_shade_stage 53344356a0edee932604027386591c82f6666e607cBrian{ 540b9e96fae9493d5d58f046e01c983a3c4267090eBrian struct quad_stage stage; /**< base class */ 55344356a0edee932604027386591c82f6666e607cBrian struct tgsi_exec_machine machine; 56344356a0edee932604027386591c82f6666e607cBrian struct tgsi_exec_vector *inputs, *outputs; 57344356a0edee932604027386591c82f6666e607cBrian}; 58344356a0edee932604027386591c82f6666e607cBrian 59344356a0edee932604027386591c82f6666e607cBrian 60344356a0edee932604027386591c82f6666e607cBrian/** cast wrapper */ 61344356a0edee932604027386591c82f6666e607cBrianstatic INLINE struct quad_shade_stage * 62344356a0edee932604027386591c82f6666e607cBrianquad_shade_stage(struct quad_stage *qs) 63344356a0edee932604027386591c82f6666e607cBrian{ 64344356a0edee932604027386591c82f6666e607cBrian return (struct quad_shade_stage *) qs; 65344356a0edee932604027386591c82f6666e607cBrian} 66344356a0edee932604027386591c82f6666e607cBrian 67344356a0edee932604027386591c82f6666e607cBrian 68344356a0edee932604027386591c82f6666e607cBrian 69344356a0edee932604027386591c82f6666e607cBrian/** 70344356a0edee932604027386591c82f6666e607cBrian * Execute fragment shader for the four fragments in the quad. 71344356a0edee932604027386591c82f6666e607cBrian */ 72344356a0edee932604027386591c82f6666e607cBrianstatic void 73344356a0edee932604027386591c82f6666e607cBrianshade_quad( 74344356a0edee932604027386591c82f6666e607cBrian struct quad_stage *qs, 75344356a0edee932604027386591c82f6666e607cBrian struct quad_header *quad ) 76344356a0edee932604027386591c82f6666e607cBrian{ 77344356a0edee932604027386591c82f6666e607cBrian struct quad_shade_stage *qss = quad_shade_stage( qs ); 78344356a0edee932604027386591c82f6666e607cBrian struct softpipe_context *softpipe = qs->softpipe; 79344356a0edee932604027386591c82f6666e607cBrian struct tgsi_exec_machine *machine = &qss->machine; 8050bbbbe581edd6b8d4fe9f8ba7f134e17dc80a0bJosé Fonseca boolean z_written; 8150bbbbe581edd6b8d4fe9f8ba7f134e17dc80a0bJosé Fonseca 82344356a0edee932604027386591c82f6666e607cBrian /* Consts do not require 16 byte alignment. */ 83344356a0edee932604027386591c82f6666e607cBrian machine->Consts = softpipe->mapped_constants[PIPE_SHADER_FRAGMENT]; 84344356a0edee932604027386591c82f6666e607cBrian 85344356a0edee932604027386591c82f6666e607cBrian machine->InterpCoefs = quad->coef; 86344356a0edee932604027386591c82f6666e607cBrian 87344356a0edee932604027386591c82f6666e607cBrian /* run shader */ 8801f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol quad->inout.mask &= softpipe->fs->run( softpipe->fs, 89344356a0edee932604027386591c82f6666e607cBrian &qss->machine, 90344356a0edee932604027386591c82f6666e607cBrian quad ); 91344356a0edee932604027386591c82f6666e607cBrian 92c7daa68ca312cc98abe351be2fef8d8246929627Brian /* store outputs */ 9350bbbbe581edd6b8d4fe9f8ba7f134e17dc80a0bJosé Fonseca z_written = FALSE; 94c7daa68ca312cc98abe351be2fef8d8246929627Brian { 95c7daa68ca312cc98abe351be2fef8d8246929627Brian const ubyte *sem_name = softpipe->fs->info.output_semantic_name; 96c7daa68ca312cc98abe351be2fef8d8246929627Brian const ubyte *sem_index = softpipe->fs->info.output_semantic_index; 97c7daa68ca312cc98abe351be2fef8d8246929627Brian const uint n = qss->stage.softpipe->fs->info.num_outputs; 98c7daa68ca312cc98abe351be2fef8d8246929627Brian uint i; 99c7daa68ca312cc98abe351be2fef8d8246929627Brian for (i = 0; i < n; i++) { 100c7daa68ca312cc98abe351be2fef8d8246929627Brian switch (sem_name[i]) { 101c7daa68ca312cc98abe351be2fef8d8246929627Brian case TGSI_SEMANTIC_COLOR: 102c7daa68ca312cc98abe351be2fef8d8246929627Brian { 103c7daa68ca312cc98abe351be2fef8d8246929627Brian uint cbuf = sem_index[i]; 10401f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol memcpy(quad->output.color[cbuf], 105c7daa68ca312cc98abe351be2fef8d8246929627Brian &machine->Outputs[i].xyzw[0].f[0], 10601f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol sizeof(quad->output.color[0]) ); 107c7daa68ca312cc98abe351be2fef8d8246929627Brian } 108c7daa68ca312cc98abe351be2fef8d8246929627Brian break; 109c7daa68ca312cc98abe351be2fef8d8246929627Brian case TGSI_SEMANTIC_POSITION: 110c7daa68ca312cc98abe351be2fef8d8246929627Brian { 111c7daa68ca312cc98abe351be2fef8d8246929627Brian uint j; 112c7daa68ca312cc98abe351be2fef8d8246929627Brian for (j = 0; j < 4; j++) { 11301f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol quad->output.depth[j] = machine->Outputs[0].xyzw[2].f[j]; 114c7daa68ca312cc98abe351be2fef8d8246929627Brian } 115c7daa68ca312cc98abe351be2fef8d8246929627Brian z_written = TRUE; 116c7daa68ca312cc98abe351be2fef8d8246929627Brian } 117c7daa68ca312cc98abe351be2fef8d8246929627Brian break; 118c7daa68ca312cc98abe351be2fef8d8246929627Brian } 119c7daa68ca312cc98abe351be2fef8d8246929627Brian } 120c7daa68ca312cc98abe351be2fef8d8246929627Brian } 121c7daa68ca312cc98abe351be2fef8d8246929627Brian 122c7daa68ca312cc98abe351be2fef8d8246929627Brian if (!z_written) { 123c7daa68ca312cc98abe351be2fef8d8246929627Brian /* compute Z values now, as in the quad earlyz stage */ 124c7daa68ca312cc98abe351be2fef8d8246929627Brian /* XXX we should really only do this if the earlyz stage is not used */ 12501f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol const float fx = (float) quad->input.x0; 12601f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol const float fy = (float) quad->input.y0; 127c7daa68ca312cc98abe351be2fef8d8246929627Brian const float dzdx = quad->posCoef->dadx[2]; 128c7daa68ca312cc98abe351be2fef8d8246929627Brian const float dzdy = quad->posCoef->dady[2]; 129c7daa68ca312cc98abe351be2fef8d8246929627Brian const float z0 = quad->posCoef->a0[2] + dzdx * fx + dzdy * fy; 130c7daa68ca312cc98abe351be2fef8d8246929627Brian 13101f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol quad->output.depth[0] = z0; 13201f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol quad->output.depth[1] = z0 + dzdx; 13301f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol quad->output.depth[2] = z0 + dzdy; 13401f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol quad->output.depth[3] = z0 + dzdx + dzdy; 135c7daa68ca312cc98abe351be2fef8d8246929627Brian } 136344356a0edee932604027386591c82f6666e607cBrian 137344356a0edee932604027386591c82f6666e607cBrian /* shader may cull fragments */ 13801f9e5120395f88bba8321e8639cac0bb9c85296Michal Krol if( quad->inout.mask ) { 139344356a0edee932604027386591c82f6666e607cBrian qs->next->run( qs->next, quad ); 140344356a0edee932604027386591c82f6666e607cBrian } 141344356a0edee932604027386591c82f6666e607cBrian} 142344356a0edee932604027386591c82f6666e607cBrian 143344356a0edee932604027386591c82f6666e607cBrian/** 144344356a0edee932604027386591c82f6666e607cBrian * Per-primitive (or per-begin?) setup 145344356a0edee932604027386591c82f6666e607cBrian */ 146344356a0edee932604027386591c82f6666e607cBrianstatic void shade_begin(struct quad_stage *qs) 147344356a0edee932604027386591c82f6666e607cBrian{ 148344356a0edee932604027386591c82f6666e607cBrian struct quad_shade_stage *qss = quad_shade_stage(qs); 149344356a0edee932604027386591c82f6666e607cBrian struct softpipe_context *softpipe = qs->softpipe; 150344356a0edee932604027386591c82f6666e607cBrian 151344356a0edee932604027386591c82f6666e607cBrian softpipe->fs->prepare( softpipe->fs, 152344356a0edee932604027386591c82f6666e607cBrian &qss->machine, 1533ffd529ff19bf8dd7b022a267bf2afe44c7f0f65Brian Paul (struct tgsi_sampler **) 1543ffd529ff19bf8dd7b022a267bf2afe44c7f0f65Brian Paul softpipe->tgsi.frag_samplers_list ); 155344356a0edee932604027386591c82f6666e607cBrian 156344356a0edee932604027386591c82f6666e607cBrian qs->next->begin(qs->next); 157344356a0edee932604027386591c82f6666e607cBrian} 158344356a0edee932604027386591c82f6666e607cBrian 159344356a0edee932604027386591c82f6666e607cBrian 160344356a0edee932604027386591c82f6666e607cBrianstatic void shade_destroy(struct quad_stage *qs) 161344356a0edee932604027386591c82f6666e607cBrian{ 162344356a0edee932604027386591c82f6666e607cBrian struct quad_shade_stage *qss = (struct quad_shade_stage *) qs; 163344356a0edee932604027386591c82f6666e607cBrian 164344356a0edee932604027386591c82f6666e607cBrian tgsi_exec_machine_free_data(&qss->machine); 165344356a0edee932604027386591c82f6666e607cBrian FREE( qss->inputs ); 166344356a0edee932604027386591c82f6666e607cBrian FREE( qss->outputs ); 167344356a0edee932604027386591c82f6666e607cBrian FREE( qs ); 168344356a0edee932604027386591c82f6666e607cBrian} 169344356a0edee932604027386591c82f6666e607cBrian 170344356a0edee932604027386591c82f6666e607cBrian 171344356a0edee932604027386591c82f6666e607cBrianstruct quad_stage *sp_quad_shade_stage( struct softpipe_context *softpipe ) 172344356a0edee932604027386591c82f6666e607cBrian{ 173344356a0edee932604027386591c82f6666e607cBrian struct quad_shade_stage *qss = CALLOC_STRUCT(quad_shade_stage); 174344356a0edee932604027386591c82f6666e607cBrian 175344356a0edee932604027386591c82f6666e607cBrian /* allocate storage for program inputs/outputs, aligned to 16 bytes */ 17639038c11699bbc9baab744542e96d54e91cb452aBrian qss->inputs = MALLOC(PIPE_MAX_ATTRIBS * sizeof(*qss->inputs) + 16); 17739038c11699bbc9baab744542e96d54e91cb452aBrian qss->outputs = MALLOC(PIPE_MAX_ATTRIBS * sizeof(*qss->outputs) + 16); 178344356a0edee932604027386591c82f6666e607cBrian qss->machine.Inputs = align16(qss->inputs); 179344356a0edee932604027386591c82f6666e607cBrian qss->machine.Outputs = align16(qss->outputs); 180344356a0edee932604027386591c82f6666e607cBrian 181344356a0edee932604027386591c82f6666e607cBrian qss->stage.softpipe = softpipe; 182344356a0edee932604027386591c82f6666e607cBrian qss->stage.begin = shade_begin; 183344356a0edee932604027386591c82f6666e607cBrian qss->stage.run = shade_quad; 184344356a0edee932604027386591c82f6666e607cBrian qss->stage.destroy = shade_destroy; 185344356a0edee932604027386591c82f6666e607cBrian 186344356a0edee932604027386591c82f6666e607cBrian tgsi_exec_machine_init( &qss->machine ); 187344356a0edee932604027386591c82f6666e607cBrian 188344356a0edee932604027386591c82f6666e607cBrian return &qss->stage; 189344356a0edee932604027386591c82f6666e607cBrian} 190