sp_tex_sample.c revision 3b2a291888d8e62787de03f8529806fb562bd186
10dc4eea64f56cc93e5359372b08b99a2d600273cBrian/**************************************************************************
20dc4eea64f56cc93e5359372b08b99a2d600273cBrian *
30dc4eea64f56cc93e5359372b08b99a2d600273cBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
40dc4eea64f56cc93e5359372b08b99a2d600273cBrian * All Rights Reserved.
50dc4eea64f56cc93e5359372b08b99a2d600273cBrian *
60dc4eea64f56cc93e5359372b08b99a2d600273cBrian * Permission is hereby granted, free of charge, to any person obtaining a
70dc4eea64f56cc93e5359372b08b99a2d600273cBrian * copy of this software and associated documentation files (the
80dc4eea64f56cc93e5359372b08b99a2d600273cBrian * "Software"), to deal in the Software without restriction, including
90dc4eea64f56cc93e5359372b08b99a2d600273cBrian * without limitation the rights to use, copy, modify, merge, publish,
100dc4eea64f56cc93e5359372b08b99a2d600273cBrian * distribute, sub license, and/or sell copies of the Software, and to
110dc4eea64f56cc93e5359372b08b99a2d600273cBrian * permit persons to whom the Software is furnished to do so, subject to
120dc4eea64f56cc93e5359372b08b99a2d600273cBrian * the following conditions:
130dc4eea64f56cc93e5359372b08b99a2d600273cBrian *
140dc4eea64f56cc93e5359372b08b99a2d600273cBrian * The above copyright notice and this permission notice (including the
150dc4eea64f56cc93e5359372b08b99a2d600273cBrian * next paragraph) shall be included in all copies or substantial portions
160dc4eea64f56cc93e5359372b08b99a2d600273cBrian * of the Software.
170dc4eea64f56cc93e5359372b08b99a2d600273cBrian *
180dc4eea64f56cc93e5359372b08b99a2d600273cBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
190dc4eea64f56cc93e5359372b08b99a2d600273cBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
200dc4eea64f56cc93e5359372b08b99a2d600273cBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
210dc4eea64f56cc93e5359372b08b99a2d600273cBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
220dc4eea64f56cc93e5359372b08b99a2d600273cBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
230dc4eea64f56cc93e5359372b08b99a2d600273cBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
240dc4eea64f56cc93e5359372b08b99a2d600273cBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
250dc4eea64f56cc93e5359372b08b99a2d600273cBrian *
260dc4eea64f56cc93e5359372b08b99a2d600273cBrian **************************************************************************/
270dc4eea64f56cc93e5359372b08b99a2d600273cBrian
280dc4eea64f56cc93e5359372b08b99a2d600273cBrian/**
290dc4eea64f56cc93e5359372b08b99a2d600273cBrian * Texture sampling
300dc4eea64f56cc93e5359372b08b99a2d600273cBrian *
310dc4eea64f56cc93e5359372b08b99a2d600273cBrian * Authors:
320dc4eea64f56cc93e5359372b08b99a2d600273cBrian *   Brian Paul
330dc4eea64f56cc93e5359372b08b99a2d600273cBrian */
340dc4eea64f56cc93e5359372b08b99a2d600273cBrian
3508f33a025100dea2d951e6d628891fe294b18082Brian#include "sp_context.h"
36b91de8a6e7d74d38698b6dad9f34040e484e69afBrian#include "sp_headers.h"
370dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "sp_surface.h"
380dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "sp_tex_sample.h"
3970eb7996f265f3634dabda078f13d1be3533cc65Brian#include "sp_tile_cache.h"
400dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "pipe/p_context.h"
410dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "pipe/p_defines.h"
427de874ec2c7b9e3aff7f81b7e30045b45381fbadMichal Krol#include "pipe/p_util.h"
436acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "tgsi/exec/tgsi_exec.h"
440dc4eea64f56cc93e5359372b08b99a2d600273cBrian
450dc4eea64f56cc93e5359372b08b99a2d600273cBrian
4608f33a025100dea2d951e6d628891fe294b18082Brian/*
4708f33a025100dea2d951e6d628891fe294b18082Brian * Note, the FRAC macro has to work perfectly.  Otherwise you'll sometimes
4808f33a025100dea2d951e6d628891fe294b18082Brian * see 1-pixel bands of improperly weighted linear-filtered textures.
4908f33a025100dea2d951e6d628891fe294b18082Brian * The tests/texwrap.c demo is a good test.
5008f33a025100dea2d951e6d628891fe294b18082Brian * Also note, FRAC(x) doesn't truly return the fractional part of x for x < 0.
5108f33a025100dea2d951e6d628891fe294b18082Brian * Instead, if x < 0 then FRAC(x) = 1 - true_frac(x).
5208f33a025100dea2d951e6d628891fe294b18082Brian */
5370af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell#define FRAC(f)  ((f) - ifloor(f))
5408f33a025100dea2d951e6d628891fe294b18082Brian
5508f33a025100dea2d951e6d628891fe294b18082Brian
5608f33a025100dea2d951e6d628891fe294b18082Brian/**
5708f33a025100dea2d951e6d628891fe294b18082Brian * Linear interpolation macro
5808f33a025100dea2d951e6d628891fe294b18082Brian */
590dc4eea64f56cc93e5359372b08b99a2d600273cBrian#define LERP(T, A, B)  ( (A) + (T) * ((B) - (A)) )
600dc4eea64f56cc93e5359372b08b99a2d600273cBrian
610dc4eea64f56cc93e5359372b08b99a2d600273cBrian
620dc4eea64f56cc93e5359372b08b99a2d600273cBrian/**
630dc4eea64f56cc93e5359372b08b99a2d600273cBrian * Do 2D/biliner interpolation of float values.
640dc4eea64f56cc93e5359372b08b99a2d600273cBrian * v00, v10, v01 and v11 are typically four texture samples in a square/box.
650dc4eea64f56cc93e5359372b08b99a2d600273cBrian * a and b are the horizontal and vertical interpolants.
660dc4eea64f56cc93e5359372b08b99a2d600273cBrian * It's important that this function is inlined when compiled with
670dc4eea64f56cc93e5359372b08b99a2d600273cBrian * optimization!  If we find that's not true on some systems, convert
680dc4eea64f56cc93e5359372b08b99a2d600273cBrian * to a macro.
690dc4eea64f56cc93e5359372b08b99a2d600273cBrian */
70b4480285ed5098f1c862690ee105dd46f5e6cd1eBrianstatic INLINE float
71b4480285ed5098f1c862690ee105dd46f5e6cd1eBrianlerp_2d(float a, float b,
72b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian        float v00, float v10, float v01, float v11)
730dc4eea64f56cc93e5359372b08b99a2d600273cBrian{
74b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   const float temp0 = LERP(a, v00, v10);
75b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   const float temp1 = LERP(a, v01, v11);
760dc4eea64f56cc93e5359372b08b99a2d600273cBrian   return LERP(b, temp0, temp1);
770dc4eea64f56cc93e5359372b08b99a2d600273cBrian}
780dc4eea64f56cc93e5359372b08b99a2d600273cBrian
790dc4eea64f56cc93e5359372b08b99a2d600273cBrian
800dc4eea64f56cc93e5359372b08b99a2d600273cBrian/**
81906768316d9521a32d9a7eebc9edaf76c06a98a7Brian * If A is a signed integer, A % B doesn't give the right value for A < 0
82906768316d9521a32d9a7eebc9edaf76c06a98a7Brian * (in terms of texture repeat).  Just casting to unsigned fixes that.
830dc4eea64f56cc93e5359372b08b99a2d600273cBrian */
84906768316d9521a32d9a7eebc9edaf76c06a98a7Brian#define REMAINDER(A, B) ((unsigned) (A) % (unsigned) (B))
8508f33a025100dea2d951e6d628891fe294b18082Brian
8608f33a025100dea2d951e6d628891fe294b18082Brian
8708f33a025100dea2d951e6d628891fe294b18082Brian/**
8808f33a025100dea2d951e6d628891fe294b18082Brian * Apply texture coord wrapping mode and return integer texture index.
8908f33a025100dea2d951e6d628891fe294b18082Brian * \param wrapMode  PIPE_TEX_WRAP_x
9008f33a025100dea2d951e6d628891fe294b18082Brian * \param s  the texcoord
9108f33a025100dea2d951e6d628891fe294b18082Brian * \param size  the texture image size
9208f33a025100dea2d951e6d628891fe294b18082Brian * \return  integer texture index
9308f33a025100dea2d951e6d628891fe294b18082Brian */
9470af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwellstatic INLINE int
9570af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwellnearest_texcoord(unsigned wrapMode, float s, unsigned size)
960dc4eea64f56cc93e5359372b08b99a2d600273cBrian{
9770af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell   int i;
980dc4eea64f56cc93e5359372b08b99a2d600273cBrian   switch (wrapMode) {
990dc4eea64f56cc93e5359372b08b99a2d600273cBrian   case PIPE_TEX_WRAP_REPEAT:
10008f33a025100dea2d951e6d628891fe294b18082Brian      /* s limited to [0,1) */
10108f33a025100dea2d951e6d628891fe294b18082Brian      /* i limited to [0,size-1] */
10270af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell      i = ifloor(s * size);
103906768316d9521a32d9a7eebc9edaf76c06a98a7Brian      i = REMAINDER(i, size);
10408f33a025100dea2d951e6d628891fe294b18082Brian      return i;
1050dc4eea64f56cc93e5359372b08b99a2d600273cBrian   case PIPE_TEX_WRAP_CLAMP:
10608f33a025100dea2d951e6d628891fe294b18082Brian      /* s limited to [0,1] */
10708f33a025100dea2d951e6d628891fe294b18082Brian      /* i limited to [0,size-1] */
10808f33a025100dea2d951e6d628891fe294b18082Brian      if (s <= 0.0F)
10908f33a025100dea2d951e6d628891fe294b18082Brian         i = 0;
11008f33a025100dea2d951e6d628891fe294b18082Brian      else if (s >= 1.0F)
11108f33a025100dea2d951e6d628891fe294b18082Brian         i = size - 1;
11208f33a025100dea2d951e6d628891fe294b18082Brian      else
11370af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell         i = ifloor(s * size);
11408f33a025100dea2d951e6d628891fe294b18082Brian      return i;
11508f33a025100dea2d951e6d628891fe294b18082Brian   case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
11608f33a025100dea2d951e6d628891fe294b18082Brian      {
11708f33a025100dea2d951e6d628891fe294b18082Brian         /* s limited to [min,max] */
11808f33a025100dea2d951e6d628891fe294b18082Brian         /* i limited to [0, size-1] */
119b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float min = 1.0F / (2.0F * size);
120b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float max = 1.0F - min;
12108f33a025100dea2d951e6d628891fe294b18082Brian         if (s < min)
12208f33a025100dea2d951e6d628891fe294b18082Brian            i = 0;
12308f33a025100dea2d951e6d628891fe294b18082Brian         else if (s > max)
12408f33a025100dea2d951e6d628891fe294b18082Brian            i = size - 1;
12508f33a025100dea2d951e6d628891fe294b18082Brian         else
12670af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell            i = ifloor(s * size);
12708f33a025100dea2d951e6d628891fe294b18082Brian      }
12808f33a025100dea2d951e6d628891fe294b18082Brian      return i;
12908f33a025100dea2d951e6d628891fe294b18082Brian   case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
13008f33a025100dea2d951e6d628891fe294b18082Brian      {
13108f33a025100dea2d951e6d628891fe294b18082Brian         /* s limited to [min,max] */
13208f33a025100dea2d951e6d628891fe294b18082Brian         /* i limited to [-1, size] */
133b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float min = -1.0F / (2.0F * size);
134b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float max = 1.0F - min;
13508f33a025100dea2d951e6d628891fe294b18082Brian         if (s <= min)
13608f33a025100dea2d951e6d628891fe294b18082Brian            i = -1;
13708f33a025100dea2d951e6d628891fe294b18082Brian         else if (s >= max)
13808f33a025100dea2d951e6d628891fe294b18082Brian            i = size;
13908f33a025100dea2d951e6d628891fe294b18082Brian         else
14070af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell            i = ifloor(s * size);
14108f33a025100dea2d951e6d628891fe294b18082Brian      }
14208f33a025100dea2d951e6d628891fe294b18082Brian      return i;
14308f33a025100dea2d951e6d628891fe294b18082Brian   case PIPE_TEX_WRAP_MIRROR_REPEAT:
14408f33a025100dea2d951e6d628891fe294b18082Brian      {
145b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float min = 1.0F / (2.0F * size);
146b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float max = 1.0F - min;
14770af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell         const int flr = ifloor(s);
148b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         float u;
14908f33a025100dea2d951e6d628891fe294b18082Brian         if (flr & 1)
150b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian            u = 1.0F - (s - (float) flr);
15108f33a025100dea2d951e6d628891fe294b18082Brian         else
152b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian            u = s - (float) flr;
15308f33a025100dea2d951e6d628891fe294b18082Brian         if (u < min)
15408f33a025100dea2d951e6d628891fe294b18082Brian            i = 0;
15508f33a025100dea2d951e6d628891fe294b18082Brian         else if (u > max)
15608f33a025100dea2d951e6d628891fe294b18082Brian            i = size - 1;
15708f33a025100dea2d951e6d628891fe294b18082Brian         else
15870af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell            i = ifloor(u * size);
15908f33a025100dea2d951e6d628891fe294b18082Brian      }
16008f33a025100dea2d951e6d628891fe294b18082Brian      return i;
16108f33a025100dea2d951e6d628891fe294b18082Brian   case PIPE_TEX_WRAP_MIRROR_CLAMP:
16208f33a025100dea2d951e6d628891fe294b18082Brian      {
16308f33a025100dea2d951e6d628891fe294b18082Brian         /* s limited to [0,1] */
16408f33a025100dea2d951e6d628891fe294b18082Brian         /* i limited to [0,size-1] */
165b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float u = FABSF(s);
16608f33a025100dea2d951e6d628891fe294b18082Brian         if (u <= 0.0F)
16708f33a025100dea2d951e6d628891fe294b18082Brian            i = 0;
16808f33a025100dea2d951e6d628891fe294b18082Brian         else if (u >= 1.0F)
16908f33a025100dea2d951e6d628891fe294b18082Brian            i = size - 1;
17008f33a025100dea2d951e6d628891fe294b18082Brian         else
17170af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell            i = ifloor(u * size);
17208f33a025100dea2d951e6d628891fe294b18082Brian      }
17308f33a025100dea2d951e6d628891fe294b18082Brian      return i;
17408f33a025100dea2d951e6d628891fe294b18082Brian   case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
17508f33a025100dea2d951e6d628891fe294b18082Brian      {
17608f33a025100dea2d951e6d628891fe294b18082Brian         /* s limited to [min,max] */
17708f33a025100dea2d951e6d628891fe294b18082Brian         /* i limited to [0, size-1] */
178b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float min = 1.0F / (2.0F * size);
179b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float max = 1.0F - min;
180b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float u = FABSF(s);
18108f33a025100dea2d951e6d628891fe294b18082Brian         if (u < min)
18208f33a025100dea2d951e6d628891fe294b18082Brian            i = 0;
18308f33a025100dea2d951e6d628891fe294b18082Brian         else if (u > max)
18408f33a025100dea2d951e6d628891fe294b18082Brian            i = size - 1;
18508f33a025100dea2d951e6d628891fe294b18082Brian         else
18670af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell            i = ifloor(u * size);
18708f33a025100dea2d951e6d628891fe294b18082Brian      }
18808f33a025100dea2d951e6d628891fe294b18082Brian      return i;
18908f33a025100dea2d951e6d628891fe294b18082Brian   case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
19008f33a025100dea2d951e6d628891fe294b18082Brian      {
19108f33a025100dea2d951e6d628891fe294b18082Brian         /* s limited to [min,max] */
19208f33a025100dea2d951e6d628891fe294b18082Brian         /* i limited to [0, size-1] */
193b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float min = -1.0F / (2.0F * size);
194b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float max = 1.0F - min;
195b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float u = FABSF(s);
19608f33a025100dea2d951e6d628891fe294b18082Brian         if (u < min)
19708f33a025100dea2d951e6d628891fe294b18082Brian            i = -1;
19808f33a025100dea2d951e6d628891fe294b18082Brian         else if (u > max)
19908f33a025100dea2d951e6d628891fe294b18082Brian            i = size;
20008f33a025100dea2d951e6d628891fe294b18082Brian         else
20170af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell            i = ifloor(u * size);
20208f33a025100dea2d951e6d628891fe294b18082Brian      }
20308f33a025100dea2d951e6d628891fe294b18082Brian      return i;
2040dc4eea64f56cc93e5359372b08b99a2d600273cBrian   default:
2050dc4eea64f56cc93e5359372b08b99a2d600273cBrian      assert(0);
20608f33a025100dea2d951e6d628891fe294b18082Brian      return 0;
2070dc4eea64f56cc93e5359372b08b99a2d600273cBrian   }
2080dc4eea64f56cc93e5359372b08b99a2d600273cBrian}
2090dc4eea64f56cc93e5359372b08b99a2d600273cBrian
21008f33a025100dea2d951e6d628891fe294b18082Brian
21108f33a025100dea2d951e6d628891fe294b18082Brian/**
21208f33a025100dea2d951e6d628891fe294b18082Brian * Used to compute texel locations for linear sampling.
21308f33a025100dea2d951e6d628891fe294b18082Brian * \param wrapMode  PIPE_TEX_WRAP_x
21408f33a025100dea2d951e6d628891fe294b18082Brian * \param s  the texcoord
21508f33a025100dea2d951e6d628891fe294b18082Brian * \param size  the texture image size
21608f33a025100dea2d951e6d628891fe294b18082Brian * \param i0  returns first texture index
21708f33a025100dea2d951e6d628891fe294b18082Brian * \param i1  returns second texture index (usually *i0 + 1)
21808f33a025100dea2d951e6d628891fe294b18082Brian * \param a  returns blend factor/weight between texture indexes
21908f33a025100dea2d951e6d628891fe294b18082Brian */
2200dc4eea64f56cc93e5359372b08b99a2d600273cBrianstatic INLINE void
22170af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwelllinear_texcoord(unsigned wrapMode, float s, unsigned size,
22270af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell                int *i0, int *i1, float *a)
2230dc4eea64f56cc93e5359372b08b99a2d600273cBrian{
224b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   float u;
2250dc4eea64f56cc93e5359372b08b99a2d600273cBrian   switch (wrapMode) {
2260dc4eea64f56cc93e5359372b08b99a2d600273cBrian   case PIPE_TEX_WRAP_REPEAT:
22708f33a025100dea2d951e6d628891fe294b18082Brian      u = s * size - 0.5F;
228906768316d9521a32d9a7eebc9edaf76c06a98a7Brian      *i0 = REMAINDER(ifloor(u), size);
229906768316d9521a32d9a7eebc9edaf76c06a98a7Brian      *i1 = REMAINDER(*i0 + 1, size);
2300dc4eea64f56cc93e5359372b08b99a2d600273cBrian      break;
2310dc4eea64f56cc93e5359372b08b99a2d600273cBrian   case PIPE_TEX_WRAP_CLAMP:
23208f33a025100dea2d951e6d628891fe294b18082Brian      if (s <= 0.0F)
23308f33a025100dea2d951e6d628891fe294b18082Brian         u = 0.0F;
23408f33a025100dea2d951e6d628891fe294b18082Brian      else if (s >= 1.0F)
235b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         u = (float) size;
23608f33a025100dea2d951e6d628891fe294b18082Brian      else
23708f33a025100dea2d951e6d628891fe294b18082Brian         u = s * size;
23808f33a025100dea2d951e6d628891fe294b18082Brian      u -= 0.5F;
23970af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell      *i0 = ifloor(u);
24008f33a025100dea2d951e6d628891fe294b18082Brian      *i1 = *i0 + 1;
24108f33a025100dea2d951e6d628891fe294b18082Brian      break;
24208f33a025100dea2d951e6d628891fe294b18082Brian   case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
24308f33a025100dea2d951e6d628891fe294b18082Brian      if (s <= 0.0F)
24408f33a025100dea2d951e6d628891fe294b18082Brian         u = 0.0F;
24508f33a025100dea2d951e6d628891fe294b18082Brian      else if (s >= 1.0F)
246b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         u = (float) size;
24708f33a025100dea2d951e6d628891fe294b18082Brian      else
24808f33a025100dea2d951e6d628891fe294b18082Brian         u = s * size;
24908f33a025100dea2d951e6d628891fe294b18082Brian      u -= 0.5F;
25070af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell      *i0 = ifloor(u);
25108f33a025100dea2d951e6d628891fe294b18082Brian      *i1 = *i0 + 1;
25208f33a025100dea2d951e6d628891fe294b18082Brian      if (*i0 < 0)
25308f33a025100dea2d951e6d628891fe294b18082Brian         *i0 = 0;
25470af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell      if (*i1 >= (int) size)
25508f33a025100dea2d951e6d628891fe294b18082Brian         *i1 = size - 1;
25608f33a025100dea2d951e6d628891fe294b18082Brian      break;
25708f33a025100dea2d951e6d628891fe294b18082Brian   case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
25808f33a025100dea2d951e6d628891fe294b18082Brian      {
259b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float min = -1.0F / (2.0F * size);
260b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float max = 1.0F - min;
26108f33a025100dea2d951e6d628891fe294b18082Brian         if (s <= min)
26208f33a025100dea2d951e6d628891fe294b18082Brian            u = min * size;
26308f33a025100dea2d951e6d628891fe294b18082Brian         else if (s >= max)
26408f33a025100dea2d951e6d628891fe294b18082Brian            u = max * size;
26508f33a025100dea2d951e6d628891fe294b18082Brian         else
26608f33a025100dea2d951e6d628891fe294b18082Brian            u = s * size;
26708f33a025100dea2d951e6d628891fe294b18082Brian         u -= 0.5F;
26870af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell         *i0 = ifloor(u);
26908f33a025100dea2d951e6d628891fe294b18082Brian         *i1 = *i0 + 1;
27008f33a025100dea2d951e6d628891fe294b18082Brian      }
27108f33a025100dea2d951e6d628891fe294b18082Brian      break;
27208f33a025100dea2d951e6d628891fe294b18082Brian   case PIPE_TEX_WRAP_MIRROR_REPEAT:
27308f33a025100dea2d951e6d628891fe294b18082Brian      {
27470af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell         const int flr = ifloor(s);
27508f33a025100dea2d951e6d628891fe294b18082Brian         if (flr & 1)
276b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian            u = 1.0F - (s - (float) flr);
27708f33a025100dea2d951e6d628891fe294b18082Brian         else
278b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian            u = s - (float) flr;
27908f33a025100dea2d951e6d628891fe294b18082Brian         u = (u * size) - 0.5F;
28070af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell         *i0 = ifloor(u);
28108f33a025100dea2d951e6d628891fe294b18082Brian         *i1 = *i0 + 1;
28208f33a025100dea2d951e6d628891fe294b18082Brian         if (*i0 < 0)
28308f33a025100dea2d951e6d628891fe294b18082Brian            *i0 = 0;
28470af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell         if (*i1 >= (int) size)
28508f33a025100dea2d951e6d628891fe294b18082Brian            *i1 = size - 1;
28608f33a025100dea2d951e6d628891fe294b18082Brian      }
28708f33a025100dea2d951e6d628891fe294b18082Brian      break;
28808f33a025100dea2d951e6d628891fe294b18082Brian   case PIPE_TEX_WRAP_MIRROR_CLAMP:
28908f33a025100dea2d951e6d628891fe294b18082Brian      u = FABSF(s);
29008f33a025100dea2d951e6d628891fe294b18082Brian      if (u >= 1.0F)
291b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         u = (float) size;
29208f33a025100dea2d951e6d628891fe294b18082Brian      else
29308f33a025100dea2d951e6d628891fe294b18082Brian         u *= size;
29408f33a025100dea2d951e6d628891fe294b18082Brian      u -= 0.5F;
29570af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell      *i0 = ifloor(u);
29608f33a025100dea2d951e6d628891fe294b18082Brian      *i1 = *i0 + 1;
29708f33a025100dea2d951e6d628891fe294b18082Brian      break;
29808f33a025100dea2d951e6d628891fe294b18082Brian   case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
29908f33a025100dea2d951e6d628891fe294b18082Brian      u = FABSF(s);
30008f33a025100dea2d951e6d628891fe294b18082Brian      if (u >= 1.0F)
301b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         u = (float) size;
30208f33a025100dea2d951e6d628891fe294b18082Brian      else
30308f33a025100dea2d951e6d628891fe294b18082Brian         u *= size;
30408f33a025100dea2d951e6d628891fe294b18082Brian      u -= 0.5F;
30570af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell      *i0 = ifloor(u);
30608f33a025100dea2d951e6d628891fe294b18082Brian      *i1 = *i0 + 1;
30708f33a025100dea2d951e6d628891fe294b18082Brian      if (*i0 < 0)
30808f33a025100dea2d951e6d628891fe294b18082Brian         *i0 = 0;
30970af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell      if (*i1 >= (int) size)
31008f33a025100dea2d951e6d628891fe294b18082Brian         *i1 = size - 1;
31108f33a025100dea2d951e6d628891fe294b18082Brian      break;
31208f33a025100dea2d951e6d628891fe294b18082Brian   case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
31308f33a025100dea2d951e6d628891fe294b18082Brian      {
314b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float min = -1.0F / (2.0F * size);
315b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         const float max = 1.0F - min;
31608f33a025100dea2d951e6d628891fe294b18082Brian         u = FABSF(s);
31708f33a025100dea2d951e6d628891fe294b18082Brian         if (u <= min)
31808f33a025100dea2d951e6d628891fe294b18082Brian            u = min * size;
31908f33a025100dea2d951e6d628891fe294b18082Brian         else if (u >= max)
32008f33a025100dea2d951e6d628891fe294b18082Brian            u = max * size;
32108f33a025100dea2d951e6d628891fe294b18082Brian         else
32208f33a025100dea2d951e6d628891fe294b18082Brian            u *= size;
32308f33a025100dea2d951e6d628891fe294b18082Brian         u -= 0.5F;
32470af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell         *i0 = ifloor(u);
32508f33a025100dea2d951e6d628891fe294b18082Brian         *i1 = *i0 + 1;
32608f33a025100dea2d951e6d628891fe294b18082Brian      }
3270dc4eea64f56cc93e5359372b08b99a2d600273cBrian      break;
3280dc4eea64f56cc93e5359372b08b99a2d600273cBrian   default:
3290dc4eea64f56cc93e5359372b08b99a2d600273cBrian      assert(0);
3300dc4eea64f56cc93e5359372b08b99a2d600273cBrian   }
33108f33a025100dea2d951e6d628891fe294b18082Brian   *a = FRAC(u);
3320dc4eea64f56cc93e5359372b08b99a2d600273cBrian}
3330dc4eea64f56cc93e5359372b08b99a2d600273cBrian
3340dc4eea64f56cc93e5359372b08b99a2d600273cBrian
33570af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwellstatic unsigned
336a34b8594b7b2d00404bb639621ec1ce918ba0786Brianchoose_cube_face(float rx, float ry, float rz, float *newS, float *newT)
33734a48abd5ff82ce9748fc29191e35a0985d47c5fBrian{
33834a48abd5ff82ce9748fc29191e35a0985d47c5fBrian   /*
33934a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      major axis
34034a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      direction     target                             sc     tc    ma
34134a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      ----------    -------------------------------    ---    ---   ---
34234a48abd5ff82ce9748fc29191e35a0985d47c5fBrian       +rx          TEXTURE_CUBE_MAP_POSITIVE_X_EXT    -rz    -ry   rx
34334a48abd5ff82ce9748fc29191e35a0985d47c5fBrian       -rx          TEXTURE_CUBE_MAP_NEGATIVE_X_EXT    +rz    -ry   rx
34434a48abd5ff82ce9748fc29191e35a0985d47c5fBrian       +ry          TEXTURE_CUBE_MAP_POSITIVE_Y_EXT    +rx    +rz   ry
34534a48abd5ff82ce9748fc29191e35a0985d47c5fBrian       -ry          TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT    +rx    -rz   ry
34634a48abd5ff82ce9748fc29191e35a0985d47c5fBrian       +rz          TEXTURE_CUBE_MAP_POSITIVE_Z_EXT    +rx    -ry   rz
34734a48abd5ff82ce9748fc29191e35a0985d47c5fBrian       -rz          TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT    -rx    -ry   rz
34834a48abd5ff82ce9748fc29191e35a0985d47c5fBrian   */
349b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   const float arx = FABSF(rx), ary = FABSF(ry), arz = FABSF(rz);
35070af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell   unsigned face;
351b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   float sc, tc, ma;
35234a48abd5ff82ce9748fc29191e35a0985d47c5fBrian
35334a48abd5ff82ce9748fc29191e35a0985d47c5fBrian   if (arx > ary && arx > arz) {
35434a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      if (rx >= 0.0F) {
35534a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         face = PIPE_TEX_FACE_POS_X;
35634a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         sc = -rz;
35734a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         tc = -ry;
35834a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         ma = arx;
35934a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      }
36034a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      else {
36134a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         face = PIPE_TEX_FACE_NEG_X;
36234a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         sc = rz;
36334a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         tc = -ry;
36434a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         ma = arx;
36534a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      }
36634a48abd5ff82ce9748fc29191e35a0985d47c5fBrian   }
36734a48abd5ff82ce9748fc29191e35a0985d47c5fBrian   else if (ary > arx && ary > arz) {
36834a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      if (ry >= 0.0F) {
36934a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         face = PIPE_TEX_FACE_POS_Y;
37034a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         sc = rx;
37134a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         tc = rz;
37234a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         ma = ary;
37334a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      }
37434a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      else {
37534a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         face = PIPE_TEX_FACE_NEG_Y;
37634a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         sc = rx;
37734a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         tc = -rz;
37834a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         ma = ary;
37934a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      }
38034a48abd5ff82ce9748fc29191e35a0985d47c5fBrian   }
38134a48abd5ff82ce9748fc29191e35a0985d47c5fBrian   else {
38234a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      if (rz > 0.0F) {
38334a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         face = PIPE_TEX_FACE_POS_Z;
38434a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         sc = rx;
38534a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         tc = -ry;
38634a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         ma = arz;
38734a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      }
38834a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      else {
38934a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         face = PIPE_TEX_FACE_NEG_Z;
39034a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         sc = -rx;
39134a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         tc = -ry;
39234a48abd5ff82ce9748fc29191e35a0985d47c5fBrian         ma = arz;
39334a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      }
39434a48abd5ff82ce9748fc29191e35a0985d47c5fBrian   }
39534a48abd5ff82ce9748fc29191e35a0985d47c5fBrian
396a34b8594b7b2d00404bb639621ec1ce918ba0786Brian   *newS = ( sc / ma + 1.0F ) * 0.5F;
397a34b8594b7b2d00404bb639621ec1ce918ba0786Brian   *newT = ( tc / ma + 1.0F ) * 0.5F;
39834a48abd5ff82ce9748fc29191e35a0985d47c5fBrian
39934a48abd5ff82ce9748fc29191e35a0985d47c5fBrian   return face;
40034a48abd5ff82ce9748fc29191e35a0985d47c5fBrian}
40134a48abd5ff82ce9748fc29191e35a0985d47c5fBrian
40234a48abd5ff82ce9748fc29191e35a0985d47c5fBrian
403b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian/**
404b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian * Examine the quad's texture coordinates to compute the partial
405b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian * derivatives w.r.t X and Y, then compute lambda (level of detail).
406b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian *
407b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian * This is only done for fragment shaders, not vertex shaders.
408b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian */
409b4480285ed5098f1c862690ee105dd46f5e6cd1eBrianstatic float
410b4480285ed5098f1c862690ee105dd46f5e6cd1eBriancompute_lambda(struct tgsi_sampler *sampler,
411b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian               const float s[QUAD_SIZE],
412b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian               const float t[QUAD_SIZE],
413f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian               const float p[QUAD_SIZE],
414f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian               float lodbias)
415b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian{
416b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   float rho, lambda;
417b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian
418b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   assert(s);
419b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   {
420b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      float dsdx = s[QUAD_BOTTOM_RIGHT] - s[QUAD_BOTTOM_LEFT];
421b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      float dsdy = s[QUAD_TOP_LEFT]     - s[QUAD_BOTTOM_LEFT];
422b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      dsdx = FABSF(dsdx);
423b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      dsdy = FABSF(dsdy);
424369eefc34c8d7acdb881ea5b0516406d71344fc4Brian      rho = MAX2(dsdx, dsdy);
425369eefc34c8d7acdb881ea5b0516406d71344fc4Brian      if (sampler->state->normalized_coords)
426753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer         rho *= sampler->texture->width[0];
427b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   }
428b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   if (t) {
429b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      float dtdx = t[QUAD_BOTTOM_RIGHT] - t[QUAD_BOTTOM_LEFT];
430b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      float dtdy = t[QUAD_TOP_LEFT]     - t[QUAD_BOTTOM_LEFT];
431b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      float max;
432b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      dtdx = FABSF(dtdx);
433b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      dtdy = FABSF(dtdy);
434369eefc34c8d7acdb881ea5b0516406d71344fc4Brian      max = MAX2(dtdx, dtdy);
435369eefc34c8d7acdb881ea5b0516406d71344fc4Brian      if (sampler->state->normalized_coords)
436753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer         max *= sampler->texture->height[0];
437b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      rho = MAX2(rho, max);
438b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   }
439b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   if (p) {
440b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      float dpdx = p[QUAD_BOTTOM_RIGHT] - p[QUAD_BOTTOM_LEFT];
441b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      float dpdy = p[QUAD_TOP_LEFT]     - p[QUAD_BOTTOM_LEFT];
442b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      float max;
443b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      dpdx = FABSF(dpdx);
444b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      dpdy = FABSF(dpdy);
445369eefc34c8d7acdb881ea5b0516406d71344fc4Brian      max = MAX2(dpdx, dpdy);
446369eefc34c8d7acdb881ea5b0516406d71344fc4Brian      if (sampler->state->normalized_coords)
447753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer         max *= sampler->texture->depth[0];
448b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      rho = MAX2(rho, max);
449b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   }
450b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian
451b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   lambda = LOG2(rho);
452f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian   lambda += lodbias + sampler->state->lod_bias;
453b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   lambda = CLAMP(lambda, sampler->state->min_lod, sampler->state->max_lod);
454b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian
455b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   return lambda;
456b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian}
457b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian
458b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian
459f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian/**
460c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian * Do several things here:
461c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian * 1. Compute lambda from the texcoords, if needed
462c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian * 2. Determine if we're minifying or magnifying
463c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian * 3. If minifying, choose mipmap levels
464c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian * 4. Return image filter to use within mipmap images
465f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian */
466f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrianstatic void
467c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brianchoose_mipmap_levels(struct tgsi_sampler *sampler,
468c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian                     const float s[QUAD_SIZE],
469c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian                     const float t[QUAD_SIZE],
470c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian                     const float p[QUAD_SIZE],
471c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian                     float lodbias,
472c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian                     unsigned *level0, unsigned *level1, float *levelBlend,
473c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian                     unsigned *imgFilter)
47409a1b912605ff48c8782dcc5aae55ac77e27037bBrian{
475c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian   if (sampler->state->min_mip_filter == PIPE_TEX_MIPFILTER_NONE) {
476c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian      /* no mipmap selection needed */
4774da1cdf78fa3b954840650fa46cf72da5daf149fBrian      *level0 = *level1 = (int) sampler->state->min_lod;
47808c9534107fcaf06f9b801551524ed5dc724db13Brian
47908c9534107fcaf06f9b801551524ed5dc724db13Brian      if (sampler->state->min_img_filter != sampler->state->mag_img_filter) {
48008c9534107fcaf06f9b801551524ed5dc724db13Brian         /* non-mipmapped texture, but still need to determine if doing
48108c9534107fcaf06f9b801551524ed5dc724db13Brian          * minification or magnification.
48208c9534107fcaf06f9b801551524ed5dc724db13Brian          */
48308c9534107fcaf06f9b801551524ed5dc724db13Brian         float lambda = compute_lambda(sampler, s, t, p, lodbias);
4843b2a291888d8e62787de03f8529806fb562bd186Brian         if (lambda <= 0.0) {
48508c9534107fcaf06f9b801551524ed5dc724db13Brian            *imgFilter = sampler->state->mag_img_filter;
48608c9534107fcaf06f9b801551524ed5dc724db13Brian         }
48708c9534107fcaf06f9b801551524ed5dc724db13Brian         else {
48808c9534107fcaf06f9b801551524ed5dc724db13Brian            *imgFilter = sampler->state->min_img_filter;
48908c9534107fcaf06f9b801551524ed5dc724db13Brian         }
49008c9534107fcaf06f9b801551524ed5dc724db13Brian      }
4913b2a291888d8e62787de03f8529806fb562bd186Brian      else {
4923b2a291888d8e62787de03f8529806fb562bd186Brian         *imgFilter = sampler->state->mag_img_filter;
4933b2a291888d8e62787de03f8529806fb562bd186Brian      }
494c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian   }
495c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian   else {
496c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian      float lambda;
497c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian
498c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian      if (1)
499c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian         /* fragment shader */
500c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian         lambda = compute_lambda(sampler, s, t, p, lodbias);
501c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian      else
502c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian         /* vertex shader */
503c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian         lambda = lodbias; /* not really a bias, but absolute LOD */
504c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian
5053b2a291888d8e62787de03f8529806fb562bd186Brian      if (lambda <= 0.0) { /* XXX threshold depends on the filter */
506c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian         /* magnifying */
507c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian         *imgFilter = sampler->state->mag_img_filter;
5084da1cdf78fa3b954840650fa46cf72da5daf149fBrian         *level0 = *level1 = 0;
509f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian      }
510c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian      else {
511c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian         /* minifying */
512c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian         *imgFilter = sampler->state->min_img_filter;
513c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian
514c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian         /* choose mipmap level(s) and compute the blend factor between them */
515c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian         if (sampler->state->min_mip_filter == PIPE_TEX_MIPFILTER_NEAREST) {
516c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian            /* Nearest mipmap level */
517c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian            const int lvl = (int) (lambda + 0.5);
518c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian            *level0 =
5194da1cdf78fa3b954840650fa46cf72da5daf149fBrian            *level1 = CLAMP(lvl, 0, (int) sampler->texture->last_level);
520c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian         }
521c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian         else {
522c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian            /* Linear interpolation between mipmap levels */
523c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian            const int lvl = (int) lambda;
5244da1cdf78fa3b954840650fa46cf72da5daf149fBrian            *level0 = CLAMP(lvl,     0, (int) sampler->texture->last_level);
5254da1cdf78fa3b954840650fa46cf72da5daf149fBrian            *level1 = CLAMP(lvl + 1, 0, (int) sampler->texture->last_level);
526c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian            *levelBlend = FRAC(lambda);  /* blending weight between levels */
527c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian         }
528f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian      }
52909a1b912605ff48c8782dcc5aae55ac77e27037bBrian   }
53009a1b912605ff48c8782dcc5aae55ac77e27037bBrian}
53109a1b912605ff48c8782dcc5aae55ac77e27037bBrian
53208f33a025100dea2d951e6d628891fe294b18082Brian
533b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian/**
534a13de2464dd034ff117f9314df5757d068cae8e5Brian * Get a texel from a texture, using the texture tile cache.
535a13de2464dd034ff117f9314df5757d068cae8e5Brian *
536b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian * \param face  the cube face in 0..5
537b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian * \param level  the mipmap level
538b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian * \param x  the x coord of texel within 2D image
539b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian * \param y  the y coord of texel within 2D image
54070eb7996f265f3634dabda078f13d1be3533cc65Brian * \param z  which slice of a 3D texture
541b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian * \param rgba  the quad to put the texel/color into
542b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian * \param j  which element of the rgba quad to write to
54370eb7996f265f3634dabda078f13d1be3533cc65Brian *
54470eb7996f265f3634dabda078f13d1be3533cc65Brian * XXX maybe move this into sp_tile_cache.c and merge with the
54570eb7996f265f3634dabda078f13d1be3533cc65Brian * sp_get_cached_tile_tex() function.  Also, get 4 texels instead of 1...
546b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian */
547b4480285ed5098f1c862690ee105dd46f5e6cd1eBrianstatic void
548b4480285ed5098f1c862690ee105dd46f5e6cd1eBrianget_texel(struct tgsi_sampler *sampler,
54970eb7996f265f3634dabda078f13d1be3533cc65Brian          unsigned face, unsigned level, int x, int y, int z,
550a13de2464dd034ff117f9314df5757d068cae8e5Brian          float rgba[NUM_CHANNELS][QUAD_SIZE], unsigned j)
551b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian{
55270eb7996f265f3634dabda078f13d1be3533cc65Brian   const int tx = x % TILE_SIZE;
55370eb7996f265f3634dabda078f13d1be3533cc65Brian   const int ty = y % TILE_SIZE;
55470eb7996f265f3634dabda078f13d1be3533cc65Brian   const struct softpipe_cached_tile *tile
55570eb7996f265f3634dabda078f13d1be3533cc65Brian      = sp_get_cached_tile_tex(sampler->pipe, sampler->cache,
55670eb7996f265f3634dabda078f13d1be3533cc65Brian                               x, y, z, face, level);
55770eb7996f265f3634dabda078f13d1be3533cc65Brian   rgba[0][j] = tile->data.color[ty][tx][0];
55870eb7996f265f3634dabda078f13d1be3533cc65Brian   rgba[1][j] = tile->data.color[ty][tx][1];
55970eb7996f265f3634dabda078f13d1be3533cc65Brian   rgba[2][j] = tile->data.color[ty][tx][2];
56070eb7996f265f3634dabda078f13d1be3533cc65Brian   rgba[3][j] = tile->data.color[ty][tx][3];
561b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian}
562b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian
563b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian
5643d8c05f7320151898dd224c1daaf3118e1f7ea34Brian/**
5653d8c05f7320151898dd224c1daaf3118e1f7ea34Brian * Compare texcoord 'p' (aka R) against texture value 'rgba[0]'
5663d8c05f7320151898dd224c1daaf3118e1f7ea34Brian * When we sampled the depth texture, the depth value was put into all
5673d8c05f7320151898dd224c1daaf3118e1f7ea34Brian * RGBA channels.  We look at the red channel here.
5683d8c05f7320151898dd224c1daaf3118e1f7ea34Brian */
5693d8c05f7320151898dd224c1daaf3118e1f7ea34Brianstatic INLINE void
5703d8c05f7320151898dd224c1daaf3118e1f7ea34Brianshadow_compare(uint compare_func,
5713d8c05f7320151898dd224c1daaf3118e1f7ea34Brian               float rgba[NUM_CHANNELS][QUAD_SIZE],
5723d8c05f7320151898dd224c1daaf3118e1f7ea34Brian               const float p[QUAD_SIZE],
5733d8c05f7320151898dd224c1daaf3118e1f7ea34Brian               uint j)
5743d8c05f7320151898dd224c1daaf3118e1f7ea34Brian{
5753d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   int k;
5763d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   switch (compare_func) {
5773d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   case PIPE_FUNC_LESS:
5783d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      k = p[j] < rgba[0][j];
5793d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      break;
5803d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   case PIPE_FUNC_LEQUAL:
5813d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      k = p[j] <= rgba[0][j];
5823d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      break;
5833d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   case PIPE_FUNC_GREATER:
5843d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      k = p[j] > rgba[0][j];
5853d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      break;
5863d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   case PIPE_FUNC_GEQUAL:
5873d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      k = p[j] >= rgba[0][j];
5883d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      break;
5893d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   case PIPE_FUNC_EQUAL:
5903d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      k = p[j] == rgba[0][j];
5913d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      break;
5923d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   case PIPE_FUNC_NOTEQUAL:
5933d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      k = p[j] != rgba[0][j];
5943d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      break;
5953d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   case PIPE_FUNC_ALWAYS:
5963d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      k = 1;
5973d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      break;
5983d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   case PIPE_FUNC_NEVER:
5993d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      k = 0;
6003d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      break;
6013d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   default:
6023d8c05f7320151898dd224c1daaf3118e1f7ea34Brian      assert(0);
6033d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   }
6043d8c05f7320151898dd224c1daaf3118e1f7ea34Brian
6053d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   rgba[0][j] = rgba[1][j] = rgba[2][j] = (float) k;
6063d8c05f7320151898dd224c1daaf3118e1f7ea34Brian}
6073d8c05f7320151898dd224c1daaf3118e1f7ea34Brian
608b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian
609b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian/**
610a34b8594b7b2d00404bb639621ec1ce918ba0786Brian * Common code for sampling 1D/2D/cube textures.
611a34b8594b7b2d00404bb639621ec1ce918ba0786Brian * Could probably extend for 3D...
6120dc4eea64f56cc93e5359372b08b99a2d600273cBrian */
613e12810d92ffb3547680b227bf88937c03018112bBrianstatic void
614a34b8594b7b2d00404bb639621ec1ce918ba0786Briansp_get_samples_2d_common(struct tgsi_sampler *sampler,
615a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                         const float s[QUAD_SIZE],
616a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                         const float t[QUAD_SIZE],
617a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                         const float p[QUAD_SIZE],
618a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                         float lodbias,
619a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                         float rgba[NUM_CHANNELS][QUAD_SIZE],
620a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                         const unsigned faces[4])
6210dc4eea64f56cc93e5359372b08b99a2d600273cBrian{
6223d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   const uint compare_func = sampler->state->compare_func;
623f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian   unsigned level0, level1, j, imgFilter;
624f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian   int width, height;
625c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian   float levelBlend;
626a34b8594b7b2d00404bb639621ec1ce918ba0786Brian
627c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian   choose_mipmap_levels(sampler, s, t, p, lodbias,
628c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian                        &level0, &level1, &levelBlend, &imgFilter);
62909a1b912605ff48c8782dcc5aae55ac77e27037bBrian
630369eefc34c8d7acdb881ea5b0516406d71344fc4Brian   if (sampler->state->normalized_coords) {
631753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      width = sampler->texture->width[level0];
632753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      height = sampler->texture->height[level0];
633369eefc34c8d7acdb881ea5b0516406d71344fc4Brian   }
634369eefc34c8d7acdb881ea5b0516406d71344fc4Brian   else {
635ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol      width = height = 1;
636369eefc34c8d7acdb881ea5b0516406d71344fc4Brian   }
63709a1b912605ff48c8782dcc5aae55ac77e27037bBrian
638b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   assert(width > 0);
639612cfb749c3526eeb446bbc631bf24716522f373Brian
640b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   switch (imgFilter) {
6410dc4eea64f56cc93e5359372b08b99a2d600273cBrian   case PIPE_TEX_FILTER_NEAREST:
642b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      for (j = 0; j < QUAD_SIZE; j++) {
643b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         int x = nearest_texcoord(sampler->state->wrap_s, s[j], width);
644b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         int y = nearest_texcoord(sampler->state->wrap_t, t[j], height);
645df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         get_texel(sampler, faces[j], level0, x, y, 0, rgba, j);
6463d8c05f7320151898dd224c1daaf3118e1f7ea34Brian         if (sampler->state->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) {
6473d8c05f7320151898dd224c1daaf3118e1f7ea34Brian            shadow_compare(compare_func, rgba, p, j);
6483d8c05f7320151898dd224c1daaf3118e1f7ea34Brian         }
649f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian
650f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian         if (level0 != level1) {
651f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            /* get texels from second mipmap level and blend */
652f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            float rgba2[4][4];
653f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            unsigned c;
654f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            x = x / 2;
655f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            y = y / 2;
656df4410a59784482fcbd48f82788dd0a9f5a62c15Brian            get_texel(sampler, faces[j], level1, x, y, 0, rgba2, j);
6573d8c05f7320151898dd224c1daaf3118e1f7ea34Brian            if (sampler->state->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE){
6583d8c05f7320151898dd224c1daaf3118e1f7ea34Brian               shadow_compare(compare_func, rgba2, p, j);
6593d8c05f7320151898dd224c1daaf3118e1f7ea34Brian            }
6603d8c05f7320151898dd224c1daaf3118e1f7ea34Brian
661f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            for (c = 0; c < NUM_CHANNELS; c++) {
66217c2f56dc3f2f58ba89d8e305e7d9b423e3cae16Brian               rgba[c][j] = LERP(levelBlend, rgba[c][j], rgba2[c][j]);
663f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            }
664f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian         }
6650dc4eea64f56cc93e5359372b08b99a2d600273cBrian      }
6660dc4eea64f56cc93e5359372b08b99a2d600273cBrian      break;
6670dc4eea64f56cc93e5359372b08b99a2d600273cBrian   case PIPE_TEX_FILTER_LINEAR:
668b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian      for (j = 0; j < QUAD_SIZE; j++) {
669b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         float tx[4][4], a, b;
670b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         int x0, y0, x1, y1, c;
671b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         linear_texcoord(sampler->state->wrap_s, s[j], width,  &x0, &x1, &a);
672b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         linear_texcoord(sampler->state->wrap_t, t[j], height, &y0, &y1, &b);
673df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         get_texel(sampler, faces[j], level0, x0, y0, 0, tx, 0);
674df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         get_texel(sampler, faces[j], level0, x1, y0, 0, tx, 1);
675df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         get_texel(sampler, faces[j], level0, x0, y1, 0, tx, 2);
676df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         get_texel(sampler, faces[j], level0, x1, y1, 0, tx, 3);
6773d8c05f7320151898dd224c1daaf3118e1f7ea34Brian         if (sampler->state->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) {
6783d8c05f7320151898dd224c1daaf3118e1f7ea34Brian            shadow_compare(compare_func, tx, p, 0);
6793d8c05f7320151898dd224c1daaf3118e1f7ea34Brian            shadow_compare(compare_func, tx, p, 1);
6803d8c05f7320151898dd224c1daaf3118e1f7ea34Brian            shadow_compare(compare_func, tx, p, 2);
6813d8c05f7320151898dd224c1daaf3118e1f7ea34Brian            shadow_compare(compare_func, tx, p, 3);
6823d8c05f7320151898dd224c1daaf3118e1f7ea34Brian         }
6833d8c05f7320151898dd224c1daaf3118e1f7ea34Brian
684b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         for (c = 0; c < 4; c++) {
685b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian            rgba[c][j] = lerp_2d(a, b, tx[c][0], tx[c][1], tx[c][2], tx[c][3]);
686b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian         }
687f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian
688f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian         if (level0 != level1) {
689f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            /* get texels from second mipmap level and blend */
690f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            float rgba2[4][4];
691f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            x0 = x0 / 2;
692f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            y0 = y0 / 2;
693f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            x1 = x1 / 2;
694f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            y1 = y1 / 2;
695df4410a59784482fcbd48f82788dd0a9f5a62c15Brian            get_texel(sampler, faces[j], level1, x0, y0, 0, tx, 0);
696df4410a59784482fcbd48f82788dd0a9f5a62c15Brian            get_texel(sampler, faces[j], level1, x1, y0, 0, tx, 1);
697df4410a59784482fcbd48f82788dd0a9f5a62c15Brian            get_texel(sampler, faces[j], level1, x0, y1, 0, tx, 2);
698df4410a59784482fcbd48f82788dd0a9f5a62c15Brian            get_texel(sampler, faces[j], level1, x1, y1, 0, tx, 3);
6993d8c05f7320151898dd224c1daaf3118e1f7ea34Brian            if (sampler->state->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE){
7003d8c05f7320151898dd224c1daaf3118e1f7ea34Brian               shadow_compare(compare_func, tx, p, 0);
7013d8c05f7320151898dd224c1daaf3118e1f7ea34Brian               shadow_compare(compare_func, tx, p, 1);
7023d8c05f7320151898dd224c1daaf3118e1f7ea34Brian               shadow_compare(compare_func, tx, p, 2);
7033d8c05f7320151898dd224c1daaf3118e1f7ea34Brian               shadow_compare(compare_func, tx, p, 3);
7043d8c05f7320151898dd224c1daaf3118e1f7ea34Brian            }
7053d8c05f7320151898dd224c1daaf3118e1f7ea34Brian
706f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            for (c = 0; c < 4; c++) {
707f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian               rgba2[c][j] = lerp_2d(a, b,
708f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian                                     tx[c][0], tx[c][1], tx[c][2], tx[c][3]);
709f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            }
710f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian
711f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            for (c = 0; c < NUM_CHANNELS; c++) {
712c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian               rgba[c][j] = LERP(levelBlend, rgba[c][j], rgba2[c][j]);
713f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian            }
714f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian         }
71509a1b912605ff48c8782dcc5aae55ac77e27037bBrian      }
71609a1b912605ff48c8782dcc5aae55ac77e27037bBrian      break;
7170dc4eea64f56cc93e5359372b08b99a2d600273cBrian   default:
7180dc4eea64f56cc93e5359372b08b99a2d600273cBrian      assert(0);
7190dc4eea64f56cc93e5359372b08b99a2d600273cBrian   }
7200dc4eea64f56cc93e5359372b08b99a2d600273cBrian}
72134a48abd5ff82ce9748fc29191e35a0985d47c5fBrian
72234a48abd5ff82ce9748fc29191e35a0985d47c5fBrian
72334a48abd5ff82ce9748fc29191e35a0985d47c5fBrianstatic void
724a34b8594b7b2d00404bb639621ec1ce918ba0786Briansp_get_samples_1d(struct tgsi_sampler *sampler,
725a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                  const float s[QUAD_SIZE],
726a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                  const float t[QUAD_SIZE],
727a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                  const float p[QUAD_SIZE],
728a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                  float lodbias,
729a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                  float rgba[NUM_CHANNELS][QUAD_SIZE])
730a34b8594b7b2d00404bb639621ec1ce918ba0786Brian{
731a34b8594b7b2d00404bb639621ec1ce918ba0786Brian   static const unsigned faces[4] = {0, 0, 0, 0};
732d16b4bc32a731cb6ae320e8c187af3bc751d4138Brian   static const float tzero[4] = {0, 0, 0, 0};
733d16b4bc32a731cb6ae320e8c187af3bc751d4138Brian   sp_get_samples_2d_common(sampler, s, tzero, NULL, lodbias, rgba, faces);
734a34b8594b7b2d00404bb639621ec1ce918ba0786Brian}
735a34b8594b7b2d00404bb639621ec1ce918ba0786Brian
736a34b8594b7b2d00404bb639621ec1ce918ba0786Brian
737a34b8594b7b2d00404bb639621ec1ce918ba0786Brianstatic void
738a34b8594b7b2d00404bb639621ec1ce918ba0786Briansp_get_samples_2d(struct tgsi_sampler *sampler,
739a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                  const float s[QUAD_SIZE],
740a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                  const float t[QUAD_SIZE],
741a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                  const float p[QUAD_SIZE],
742a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                  float lodbias,
743a34b8594b7b2d00404bb639621ec1ce918ba0786Brian                  float rgba[NUM_CHANNELS][QUAD_SIZE])
744a34b8594b7b2d00404bb639621ec1ce918ba0786Brian{
745a34b8594b7b2d00404bb639621ec1ce918ba0786Brian   static const unsigned faces[4] = {0, 0, 0, 0};
7463d8c05f7320151898dd224c1daaf3118e1f7ea34Brian   sp_get_samples_2d_common(sampler, s, t, p, lodbias, rgba, faces);
747a34b8594b7b2d00404bb639621ec1ce918ba0786Brian}
748a34b8594b7b2d00404bb639621ec1ce918ba0786Brian
749a34b8594b7b2d00404bb639621ec1ce918ba0786Brian
750a34b8594b7b2d00404bb639621ec1ce918ba0786Brianstatic void
751b4480285ed5098f1c862690ee105dd46f5e6cd1eBriansp_get_samples_3d(struct tgsi_sampler *sampler,
752b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian                  const float s[QUAD_SIZE],
753b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian                  const float t[QUAD_SIZE],
754b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian                  const float p[QUAD_SIZE],
755f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian                  float lodbias,
756b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian                  float rgba[NUM_CHANNELS][QUAD_SIZE])
75734a48abd5ff82ce9748fc29191e35a0985d47c5fBrian{
75834a48abd5ff82ce9748fc29191e35a0985d47c5fBrian   /* get/map pipe_surfaces corresponding to 3D tex slices */
7593d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   unsigned level0, level1, j, imgFilter;
7603d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   int width, height, depth;
7613d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   float levelBlend;
7623d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   const uint face = 0;
7633d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian
7643d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   choose_mipmap_levels(sampler, s, t, p, lodbias,
7653d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian                        &level0, &level1, &levelBlend, &imgFilter);
7663d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian
7673d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   if (sampler->state->normalized_coords) {
768753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      width = sampler->texture->width[level0];
769753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      height = sampler->texture->height[level0];
770753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      depth = sampler->texture->depth[level0];
7713d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   }
7723d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   else {
773ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol      width = height = depth = 1;
7743d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   }
7753d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian
7763d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   assert(width > 0);
7773d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   assert(height > 0);
7783d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   assert(depth > 0);
7793d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian
7803d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   switch (imgFilter) {
7813d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   case PIPE_TEX_FILTER_NEAREST:
7823d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian      for (j = 0; j < QUAD_SIZE; j++) {
7833d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian         int x = nearest_texcoord(sampler->state->wrap_s, s[j], width);
7843d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian         int y = nearest_texcoord(sampler->state->wrap_t, t[j], height);
7853d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian         int z = nearest_texcoord(sampler->state->wrap_r, p[j], depth);
786df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         get_texel(sampler, face, level0, x, y, z, rgba, j);
7873d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian
7883d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian         if (level0 != level1) {
7893d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            /* get texels from second mipmap level and blend */
7903d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            float rgba2[4][4];
7913d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            unsigned c;
7923d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            x /= 2;
7933d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            y /= 2;
7943d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            z /= 2;
795df4410a59784482fcbd48f82788dd0a9f5a62c15Brian            get_texel(sampler, face, level1, x, y, z, rgba2, j);
7963d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            for (c = 0; c < NUM_CHANNELS; c++) {
7973d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian               rgba[c][j] = LERP(levelBlend, rgba2[c][j], rgba[c][j]);
7983d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            }
7993d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian         }
8003d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian      }
8013d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian      break;
8023d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   case PIPE_TEX_FILTER_LINEAR:
8033d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian      for (j = 0; j < QUAD_SIZE; j++) {
804df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         float texel0[4][4], texel1[4][4];
805df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         float xw, yw, zw; /* interpolation weights */
8063d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian         int x0, x1, y0, y1, z0, z1, c;
8073d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian         linear_texcoord(sampler->state->wrap_s, s[j], width,  &x0, &x1, &xw);
8083d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian         linear_texcoord(sampler->state->wrap_t, t[j], height, &y0, &y1, &yw);
8093d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian         linear_texcoord(sampler->state->wrap_r, p[j], depth,  &z0, &z1, &zw);
810df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         get_texel(sampler, face, level0, x0, y0, z0, texel0, 0);
811df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         get_texel(sampler, face, level0, x1, y0, z0, texel0, 1);
812df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         get_texel(sampler, face, level0, x0, y1, z0, texel0, 2);
813df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         get_texel(sampler, face, level0, x1, y1, z0, texel0, 3);
814df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         get_texel(sampler, face, level0, x0, y0, z1, texel1, 0);
815df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         get_texel(sampler, face, level0, x1, y0, z1, texel1, 1);
816df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         get_texel(sampler, face, level0, x0, y1, z1, texel1, 2);
817df4410a59784482fcbd48f82788dd0a9f5a62c15Brian         get_texel(sampler, face, level0, x1, y1, z1, texel1, 3);
8183d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian
8193d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian         /* 3D lerp */
8203d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian         for (c = 0; c < 4; c++) {
8213d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            float ctemp0[4][4], ctemp1[4][4];
8223d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            ctemp0[c][j] = lerp_2d(xw, yw,
8233d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian                                   texel0[c][0], texel0[c][1],
8243d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian                                   texel0[c][2], texel0[c][3]);
8253d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            ctemp1[c][j] = lerp_2d(xw, yw,
8263d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian                                   texel1[c][0], texel1[c][1],
8273d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian                                   texel1[c][2], texel1[c][3]);
8283d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            rgba[c][j] = LERP(zw, ctemp0[c][j], ctemp1[c][j]);
8293d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian         }
8303d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian
8313d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian         if (level0 != level1) {
8323d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            /* get texels from second mipmap level and blend */
8333d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            float rgba2[4][4];
8343d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            x0 /= 2;
8353d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            y0 /= 2;
8363d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            z0 /= 2;
8373d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            x1 /= 2;
8383d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            y1 /= 2;
8393d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            z1 /= 2;
840df4410a59784482fcbd48f82788dd0a9f5a62c15Brian            get_texel(sampler, face, level1, x0, y0, z0, texel0, 0);
841df4410a59784482fcbd48f82788dd0a9f5a62c15Brian            get_texel(sampler, face, level1, x1, y0, z0, texel0, 1);
842df4410a59784482fcbd48f82788dd0a9f5a62c15Brian            get_texel(sampler, face, level1, x0, y1, z0, texel0, 2);
843df4410a59784482fcbd48f82788dd0a9f5a62c15Brian            get_texel(sampler, face, level1, x1, y1, z0, texel0, 3);
844df4410a59784482fcbd48f82788dd0a9f5a62c15Brian            get_texel(sampler, face, level1, x0, y0, z1, texel1, 0);
845df4410a59784482fcbd48f82788dd0a9f5a62c15Brian            get_texel(sampler, face, level1, x1, y0, z1, texel1, 1);
846df4410a59784482fcbd48f82788dd0a9f5a62c15Brian            get_texel(sampler, face, level1, x0, y1, z1, texel1, 2);
847df4410a59784482fcbd48f82788dd0a9f5a62c15Brian            get_texel(sampler, face, level1, x1, y1, z1, texel1, 3);
8483d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian
8493d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            /* 3D lerp */
8503d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            for (c = 0; c < 4; c++) {
8513d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian               float ctemp0[4][4], ctemp1[4][4];
8523d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian               ctemp0[c][j] = lerp_2d(xw, yw,
8533d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian                                      texel0[c][0], texel0[c][1],
8543d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian                                      texel0[c][2], texel0[c][3]);
8553d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian               ctemp1[c][j] = lerp_2d(xw, yw,
8563d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian                                      texel1[c][0], texel1[c][1],
8573d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian                                      texel1[c][2], texel1[c][3]);
8583d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian               rgba2[c][j] = LERP(zw, ctemp0[c][j], ctemp1[c][j]);
8593d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            }
8603d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian
8613d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            /* blend mipmap levels */
8623d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            for (c = 0; c < NUM_CHANNELS; c++) {
8633d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian               rgba[c][j] = LERP(levelBlend, rgba[c][j], rgba2[c][j]);
8643d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian            }
8653d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian         }
8663d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian      }
8673d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian      break;
8683d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   default:
8693d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian      assert(0);
8703d6f9d904f07b7676cc971eb3faf9dd8e7c58e50Brian   }
87134a48abd5ff82ce9748fc29191e35a0985d47c5fBrian}
87234a48abd5ff82ce9748fc29191e35a0985d47c5fBrian
87334a48abd5ff82ce9748fc29191e35a0985d47c5fBrian
87434a48abd5ff82ce9748fc29191e35a0985d47c5fBrianstatic void
875b4480285ed5098f1c862690ee105dd46f5e6cd1eBriansp_get_samples_cube(struct tgsi_sampler *sampler,
876b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian                    const float s[QUAD_SIZE],
877b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian                    const float t[QUAD_SIZE],
878b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian                    const float p[QUAD_SIZE],
879f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian                    float lodbias,
880b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian                    float rgba[NUM_CHANNELS][QUAD_SIZE])
88134a48abd5ff82ce9748fc29191e35a0985d47c5fBrian{
882a34b8594b7b2d00404bb639621ec1ce918ba0786Brian   unsigned faces[QUAD_SIZE], j;
883a34b8594b7b2d00404bb639621ec1ce918ba0786Brian   float ssss[4], tttt[4];
884b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   for (j = 0; j < QUAD_SIZE; j++) {
885a34b8594b7b2d00404bb639621ec1ce918ba0786Brian      faces[j] = choose_cube_face(s[j], t[j], p[j], ssss + j, tttt + j);
886b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian   }
887a34b8594b7b2d00404bb639621ec1ce918ba0786Brian   sp_get_samples_2d_common(sampler, ssss, tttt, NULL, lodbias, rgba, faces);
88834a48abd5ff82ce9748fc29191e35a0985d47c5fBrian}
88934a48abd5ff82ce9748fc29191e35a0985d47c5fBrian
89034a48abd5ff82ce9748fc29191e35a0985d47c5fBrian
891a34b8594b7b2d00404bb639621ec1ce918ba0786Brian/**
892a34b8594b7b2d00404bb639621ec1ce918ba0786Brian * Called via tgsi_sampler::get_samples()
893a34b8594b7b2d00404bb639621ec1ce918ba0786Brian * Use the sampler's state setting to get a filtered RGBA value
894753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer * from the sampler's texture.
895a34b8594b7b2d00404bb639621ec1ce918ba0786Brian *
896a34b8594b7b2d00404bb639621ec1ce918ba0786Brian * XXX we can implement many versions of this function, each
897a34b8594b7b2d00404bb639621ec1ce918ba0786Brian * tightly coded for a specific combination of sampler state
898a34b8594b7b2d00404bb639621ec1ce918ba0786Brian * (nearest + repeat), (bilinear mipmap + clamp), etc.
899a34b8594b7b2d00404bb639621ec1ce918ba0786Brian *
900a34b8594b7b2d00404bb639621ec1ce918ba0786Brian * The update_samplers() function in st_atom_sampler.c could create
901a34b8594b7b2d00404bb639621ec1ce918ba0786Brian * a new tgsi_sampler object for each state combo it finds....
902a34b8594b7b2d00404bb639621ec1ce918ba0786Brian */
90334a48abd5ff82ce9748fc29191e35a0985d47c5fBrianvoid
904b4480285ed5098f1c862690ee105dd46f5e6cd1eBriansp_get_samples(struct tgsi_sampler *sampler,
905b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian               const float s[QUAD_SIZE],
906b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian               const float t[QUAD_SIZE],
907b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian               const float p[QUAD_SIZE],
908f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian               float lodbias,
909b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian               float rgba[NUM_CHANNELS][QUAD_SIZE])
91034a48abd5ff82ce9748fc29191e35a0985d47c5fBrian{
9114f23468bd0d14b8ed687a641003d587b91ad39a7Brian   if (!sampler->texture)
9124f23468bd0d14b8ed687a641003d587b91ad39a7Brian      return;
9134f23468bd0d14b8ed687a641003d587b91ad39a7Brian
91434a48abd5ff82ce9748fc29191e35a0985d47c5fBrian   switch (sampler->texture->target) {
91570af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell   case PIPE_TEXTURE_1D:
916f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian      sp_get_samples_1d(sampler, s, t, p, lodbias, rgba);
91734a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      break;
91870af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell   case PIPE_TEXTURE_2D:
919f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian      sp_get_samples_2d(sampler, s, t, p, lodbias, rgba);
92034a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      break;
92170af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell   case PIPE_TEXTURE_3D:
922f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian      sp_get_samples_3d(sampler, s, t, p, lodbias, rgba);
92334a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      break;
92470af238b494ed1b6da4841c2065c33ee0f0f37c9Keith Whitwell   case PIPE_TEXTURE_CUBE:
925f9e331a574cc4eba60e0de5a29a4aed4bb40520cBrian      sp_get_samples_cube(sampler, s, t, p, lodbias, rgba);
92634a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      break;
92734a48abd5ff82ce9748fc29191e35a0985d47c5fBrian   default:
92834a48abd5ff82ce9748fc29191e35a0985d47c5fBrian      assert(0);
92934a48abd5ff82ce9748fc29191e35a0985d47c5fBrian   }
93034a48abd5ff82ce9748fc29191e35a0985d47c5fBrian}
93134a48abd5ff82ce9748fc29191e35a0985d47c5fBrian
932