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