sp_quad_fs.c revision 01f9e5120395f88bba8321e8639cac0bb9c85296
1344356a0edee932604027386591c82f6666e607cBrian/**************************************************************************
2344356a0edee932604027386591c82f6666e607cBrian *
3344356a0edee932604027386591c82f6666e607cBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4344356a0edee932604027386591c82f6666e607cBrian * All Rights Reserved.
5344356a0edee932604027386591c82f6666e607cBrian *
6344356a0edee932604027386591c82f6666e607cBrian * Permission is hereby granted, free of charge, to any person obtaining a
7344356a0edee932604027386591c82f6666e607cBrian * copy of this software and associated documentation files (the
8344356a0edee932604027386591c82f6666e607cBrian * "Software"), to deal in the Software without restriction, including
9344356a0edee932604027386591c82f6666e607cBrian * without limitation the rights to use, copy, modify, merge, publish,
10344356a0edee932604027386591c82f6666e607cBrian * distribute, sub license, and/or sell copies of the Software, and to
11344356a0edee932604027386591c82f6666e607cBrian * permit persons to whom the Software is furnished to do so, subject to
12344356a0edee932604027386591c82f6666e607cBrian * the following conditions:
13344356a0edee932604027386591c82f6666e607cBrian *
14344356a0edee932604027386591c82f6666e607cBrian * The above copyright notice and this permission notice (including the
15344356a0edee932604027386591c82f6666e607cBrian * next paragraph) shall be included in all copies or substantial portions
16344356a0edee932604027386591c82f6666e607cBrian * of the Software.
17344356a0edee932604027386591c82f6666e607cBrian *
18344356a0edee932604027386591c82f6666e607cBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19344356a0edee932604027386591c82f6666e607cBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20344356a0edee932604027386591c82f6666e607cBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21344356a0edee932604027386591c82f6666e607cBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22344356a0edee932604027386591c82f6666e607cBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23344356a0edee932604027386591c82f6666e607cBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24344356a0edee932604027386591c82f6666e607cBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25344356a0edee932604027386591c82f6666e607cBrian *
26344356a0edee932604027386591c82f6666e607cBrian **************************************************************************/
27344356a0edee932604027386591c82f6666e607cBrian
28344356a0edee932604027386591c82f6666e607cBrian/* Vertices are just an array of floats, with all the attributes
29344356a0edee932604027386591c82f6666e607cBrian * packed.  We currently assume a layout like:
30344356a0edee932604027386591c82f6666e607cBrian *
31344356a0edee932604027386591c82f6666e607cBrian * attr[0][0..3] - window position
32344356a0edee932604027386591c82f6666e607cBrian * attr[1..n][0..3] - remaining attributes.
33344356a0edee932604027386591c82f6666e607cBrian *
34344356a0edee932604027386591c82f6666e607cBrian * Attributes are assumed to be 4 floats wide but are packed so that
35344356a0edee932604027386591c82f6666e607cBrian * all the enabled attributes run contiguously.
36344356a0edee932604027386591c82f6666e607cBrian */
37344356a0edee932604027386591c82f6666e607cBrian
384f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_math.h"
394f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
40344356a0edee932604027386591c82f6666e607cBrian#include "pipe/p_defines.h"
41344356a0edee932604027386591c82f6666e607cBrian#include "pipe/p_shader_tokens.h"
42344356a0edee932604027386591c82f6666e607cBrian
43344356a0edee932604027386591c82f6666e607cBrian#include "sp_context.h"
44344356a0edee932604027386591c82f6666e607cBrian#include "sp_state.h"
45344356a0edee932604027386591c82f6666e607cBrian#include "sp_headers.h"
46344356a0edee932604027386591c82f6666e607cBrian#include "sp_quad.h"
47344356a0edee932604027386591c82f6666e607cBrian#include "sp_texture.h"
48344356a0edee932604027386591c82f6666e607cBrian#include "sp_tex_sample.h"
49344356a0edee932604027386591c82f6666e607cBrian
50344356a0edee932604027386591c82f6666e607cBrian
51344356a0edee932604027386591c82f6666e607cBrianstruct quad_shade_stage
52344356a0edee932604027386591c82f6666e607cBrian{
53344356a0edee932604027386591c82f6666e607cBrian   struct quad_stage stage;
54344356a0edee932604027386591c82f6666e607cBrian   struct tgsi_sampler samplers[PIPE_MAX_SAMPLERS];
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   unsigned i;
151344356a0edee932604027386591c82f6666e607cBrian   unsigned num = MAX2(softpipe->num_textures, softpipe->num_samplers);
152344356a0edee932604027386591c82f6666e607cBrian
153344356a0edee932604027386591c82f6666e607cBrian   /* set TGSI sampler state that varies */
154344356a0edee932604027386591c82f6666e607cBrian   for (i = 0; i < num; i++) {
155344356a0edee932604027386591c82f6666e607cBrian      qss->samplers[i].state = softpipe->sampler[i];
156344356a0edee932604027386591c82f6666e607cBrian      qss->samplers[i].texture = softpipe->texture[i];
157344356a0edee932604027386591c82f6666e607cBrian   }
158344356a0edee932604027386591c82f6666e607cBrian
159344356a0edee932604027386591c82f6666e607cBrian   softpipe->fs->prepare( softpipe->fs,
160344356a0edee932604027386591c82f6666e607cBrian			  &qss->machine,
161344356a0edee932604027386591c82f6666e607cBrian			  qss->samplers );
162344356a0edee932604027386591c82f6666e607cBrian
163344356a0edee932604027386591c82f6666e607cBrian   qs->next->begin(qs->next);
164344356a0edee932604027386591c82f6666e607cBrian}
165344356a0edee932604027386591c82f6666e607cBrian
166344356a0edee932604027386591c82f6666e607cBrian
167344356a0edee932604027386591c82f6666e607cBrianstatic void shade_destroy(struct quad_stage *qs)
168344356a0edee932604027386591c82f6666e607cBrian{
169344356a0edee932604027386591c82f6666e607cBrian   struct quad_shade_stage *qss = (struct quad_shade_stage *) qs;
170344356a0edee932604027386591c82f6666e607cBrian
171344356a0edee932604027386591c82f6666e607cBrian   tgsi_exec_machine_free_data(&qss->machine);
172344356a0edee932604027386591c82f6666e607cBrian   FREE( qss->inputs );
173344356a0edee932604027386591c82f6666e607cBrian   FREE( qss->outputs );
174344356a0edee932604027386591c82f6666e607cBrian   FREE( qs );
175344356a0edee932604027386591c82f6666e607cBrian}
176344356a0edee932604027386591c82f6666e607cBrian
177344356a0edee932604027386591c82f6666e607cBrian
178344356a0edee932604027386591c82f6666e607cBrianstruct quad_stage *sp_quad_shade_stage( struct softpipe_context *softpipe )
179344356a0edee932604027386591c82f6666e607cBrian{
180344356a0edee932604027386591c82f6666e607cBrian   struct quad_shade_stage *qss = CALLOC_STRUCT(quad_shade_stage);
181344356a0edee932604027386591c82f6666e607cBrian   uint i;
182344356a0edee932604027386591c82f6666e607cBrian
183344356a0edee932604027386591c82f6666e607cBrian   /* allocate storage for program inputs/outputs, aligned to 16 bytes */
18439038c11699bbc9baab744542e96d54e91cb452aBrian   qss->inputs = MALLOC(PIPE_MAX_ATTRIBS * sizeof(*qss->inputs) + 16);
18539038c11699bbc9baab744542e96d54e91cb452aBrian   qss->outputs = MALLOC(PIPE_MAX_ATTRIBS * sizeof(*qss->outputs) + 16);
186344356a0edee932604027386591c82f6666e607cBrian   qss->machine.Inputs = align16(qss->inputs);
187344356a0edee932604027386591c82f6666e607cBrian   qss->machine.Outputs = align16(qss->outputs);
188344356a0edee932604027386591c82f6666e607cBrian
189344356a0edee932604027386591c82f6666e607cBrian   qss->stage.softpipe = softpipe;
190344356a0edee932604027386591c82f6666e607cBrian   qss->stage.begin = shade_begin;
191344356a0edee932604027386591c82f6666e607cBrian   qss->stage.run = shade_quad;
192344356a0edee932604027386591c82f6666e607cBrian   qss->stage.destroy = shade_destroy;
193344356a0edee932604027386591c82f6666e607cBrian
194344356a0edee932604027386591c82f6666e607cBrian   /* set TGSI sampler state that's constant */
195344356a0edee932604027386591c82f6666e607cBrian   for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
196344356a0edee932604027386591c82f6666e607cBrian      assert(softpipe->tex_cache[i]);
197344356a0edee932604027386591c82f6666e607cBrian      qss->samplers[i].get_samples = sp_get_samples;
198344356a0edee932604027386591c82f6666e607cBrian      qss->samplers[i].pipe = &softpipe->pipe;
199344356a0edee932604027386591c82f6666e607cBrian      qss->samplers[i].cache = softpipe->tex_cache[i];
200344356a0edee932604027386591c82f6666e607cBrian   }
201344356a0edee932604027386591c82f6666e607cBrian
202344356a0edee932604027386591c82f6666e607cBrian   tgsi_exec_machine_init( &qss->machine );
203344356a0edee932604027386591c82f6666e607cBrian
204344356a0edee932604027386591c82f6666e607cBrian   return &qss->stage;
205344356a0edee932604027386591c82f6666e607cBrian}
206