1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/enums.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/colormac.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/samplerobj.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_mipmap_tree.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_tex.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "i915_context.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "i915_reg.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtranslate_texture_format(gl_format mesa_format, GLenum DepthMode)
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mesa_format) {
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_L8:
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_8BIT | MT_8BIT_L8;
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_I8:
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_8BIT | MT_8BIT_I8;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_A8:
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_8BIT | MT_8BIT_A8;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_AL88:
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_16BIT | MT_16BIT_AY88;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGB565:
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_16BIT | MT_16BIT_RGB565;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_ARGB1555:
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_16BIT | MT_16BIT_ARGB1555;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_ARGB4444:
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_16BIT | MT_16BIT_ARGB4444;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_ARGB8888:
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_32BIT | MT_32BIT_ARGB8888;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_XRGB8888:
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_32BIT | MT_32BIT_XRGB8888;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGBA8888_REV:
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_32BIT | MT_32BIT_ABGR8888;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_YCBCR_REV:
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (MAPSURF_422 | MT_422_YCRCB_NORMAL);
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_YCBCR:
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (MAPSURF_422 | MT_422_YCRCB_SWAPY);
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGB_FXT1:
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGBA_FXT1:
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (MAPSURF_COMPRESSED | MT_COMPRESS_FXT1);
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_Z16:
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (DepthMode == GL_ALPHA)
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          return (MAPSURF_16BIT | MT_16BIT_A16);
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (DepthMode == GL_INTENSITY)
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          return (MAPSURF_16BIT | MT_16BIT_I16);
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          return (MAPSURF_16BIT | MT_16BIT_L16);
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGBA_DXT1:
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGB_DXT1:
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT1);
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGBA_DXT3:
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT2_3);
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGBA_DXT5:
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT4_5);
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_S8_Z24:
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_X8_Z24:
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (DepthMode == GL_ALPHA)
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return (MAPSURF_32BIT | MT_32BIT_x8A24);
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (DepthMode == GL_INTENSITY)
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return (MAPSURF_32BIT | MT_32BIT_x8I24);
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return (MAPSURF_32BIT | MT_32BIT_x8L24);
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s: bad image format %s\n", __FUNCTION__,
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      _mesa_get_format_name(mesa_format));
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      abort();
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* The i915 (and related graphics cores) do not support GL_CLAMP.  The
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Intel drivers for "other operating systems" implement GL_CLAMP as
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_CLAMP_TO_EDGE, so the same is done here.
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtranslate_wrap_mode(GLenum wrap)
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (wrap) {
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_REPEAT:
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TEXCOORDMODE_WRAP;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLAMP:
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TEXCOORDMODE_CLAMP_EDGE;   /* not quite correct */
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLAMP_TO_EDGE:
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TEXCOORDMODE_CLAMP_EDGE;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLAMP_TO_BORDER:
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TEXCOORDMODE_CLAMP_BORDER;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MIRRORED_REPEAT:
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TEXCOORDMODE_MIRROR;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TEXCOORDMODE_WRAP;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Recalculate all state from scratch.  Perhaps not the most
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * efficient, but this has gotten complex enough that we need
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * something which is understandable and reliable.
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3)
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &intel->ctx;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i915_context *i915 = i915_context(ctx);
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_unit *tUnit = &ctx->Texture.Unit[unit];
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *tObj = tUnit->_Current;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_texture_object *intelObj = intel_texture_object(tObj);
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_image *firstImage;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint *state = i915->state.Tex[unit], format, pitch;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint lodbias, aniso = 0;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte border[4];
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat maxlod;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(state, 0, sizeof(*state));
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*We need to refcount these. */
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i915->state.tex_buffer[unit] != NULL) {
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       drm_intel_bo_unreference(i915->state.tex_buffer[unit]);
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       i915->state.tex_buffer[unit] = NULL;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!intel_finalize_mipmap_tree(intel, unit))
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Get first image here, since intelObj->firstLevel will get set in
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * the intel_finalize_mipmap_tree() call above.
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   firstImage = tObj->Image[0][tObj->BaseLevel];
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo_reference(intelObj->mt->region->bo);
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   i915->state.tex_buffer[unit] = intelObj->mt->region->bo;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   i915->state.tex_offset[unit] = intelObj->mt->offset;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format = translate_texture_format(firstImage->TexFormat,
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     tObj->DepthMode);
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pitch = intelObj->mt->region->pitch * intelObj->mt->cpp;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   state[I915_TEXREG_MS3] =
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (((firstImage->Height - 1) << MS3_HEIGHT_SHIFT) |
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ((firstImage->Width - 1) << MS3_WIDTH_SHIFT) | format);
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intelObj->mt->region->tiling != I915_TILING_NONE) {
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      state[I915_TEXREG_MS3] |= MS3_TILED_SURFACE;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (intelObj->mt->region->tiling == I915_TILING_Y)
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 state[I915_TEXREG_MS3] |= MS3_TILE_WALK;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* We get one field with fraction bits for the maximum addressable
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * (lowest resolution) LOD.  Use it to cover both MAX_LEVEL and
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * MAX_LOD.
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   maxlod = MIN2(sampler->MaxLod, tObj->_MaxLevel - tObj->BaseLevel);
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   state[I915_TEXREG_MS4] =
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ((((pitch / 4) - 1) << MS4_PITCH_SHIFT) |
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       MS4_CUBE_FACE_ENA_MASK |
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (U_FIXED(CLAMP(maxlod, 0.0, 11.0), 2) << MS4_MAX_LOD_SHIFT) |
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ((firstImage->Depth - 1) << MS4_VOLUME_DEPTH_SHIFT));
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint minFilt, mipFilt, magFilt;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (sampler->MinFilter) {
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_NEAREST:
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_NEAREST;
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mipFilt = MIPFILTER_NONE;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINEAR:
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_LINEAR;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mipFilt = MIPFILTER_NONE;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_NEAREST_MIPMAP_NEAREST:
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_NEAREST;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mipFilt = MIPFILTER_NEAREST;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINEAR_MIPMAP_NEAREST:
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_LINEAR;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mipFilt = MIPFILTER_NEAREST;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_NEAREST_MIPMAP_LINEAR:
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_NEAREST;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mipFilt = MIPFILTER_LINEAR;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINEAR_MIPMAP_LINEAR:
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_LINEAR;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mipFilt = MIPFILTER_LINEAR;
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return false;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (sampler->MaxAnisotropy > 1.0) {
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_ANISOTROPIC;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         magFilt = FILTER_ANISOTROPIC;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (sampler->MaxAnisotropy > 2.0)
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            aniso = SS2_MAX_ANISO_4;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            aniso = SS2_MAX_ANISO_2;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (sampler->MagFilter) {
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_NEAREST:
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            magFilt = FILTER_NEAREST;
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LINEAR:
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            magFilt = FILTER_LINEAR;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return false;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      lodbias = (int) ((tUnit->LodBias + sampler->LodBias) * 16.0);
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (lodbias < -256)
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          lodbias = -256;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (lodbias > 255)
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          lodbias = 255;
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      state[I915_TEXREG_SS2] = ((lodbias << SS2_LOD_BIAS_SHIFT) &
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                SS2_LOD_BIAS_MASK);
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* YUV conversion:
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (firstImage->TexFormat == MESA_FORMAT_YCBCR ||
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          firstImage->TexFormat == MESA_FORMAT_YCBCR_REV)
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         state[I915_TEXREG_SS2] |= SS2_COLORSPACE_CONVERSION;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Shadow:
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (sampler->CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB &&
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          tObj->Target != GL_TEXTURE_3D) {
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (tObj->Target == GL_TEXTURE_1D)
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return false;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         state[I915_TEXREG_SS2] |=
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            (SS2_SHADOW_ENABLE |
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             intel_translate_shadow_compare_func(sampler->CompareFunc));
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_4X4_FLAT;
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         magFilt = FILTER_4X4_FLAT;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      state[I915_TEXREG_SS2] |= ((minFilt << SS2_MIN_FILTER_SHIFT) |
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 (mipFilt << SS2_MIP_FILTER_SHIFT) |
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 (magFilt << SS2_MAG_FILTER_SHIFT) |
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 aniso);
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLenum ws = sampler->WrapS;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLenum wt = sampler->WrapT;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLenum wr = sampler->WrapR;
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      float minlod;
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* We program 1D textures as 2D textures, so the 2D texcoord could
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * result in sampling border values if we don't set the T wrap to
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * repeat.
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (tObj->Target == GL_TEXTURE_1D)
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 wt = GL_REPEAT;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* 3D textures don't seem to respect the border color.
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Fallback if there's ever a danger that they might refer to
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * it.
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Effectively this means fallback on 3D clamp or
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * clamp_to_border.
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (tObj->Target == GL_TEXTURE_3D &&
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (sampler->MinFilter != GL_NEAREST ||
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           sampler->MagFilter != GL_NEAREST) &&
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (ws == GL_CLAMP ||
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           wt == GL_CLAMP ||
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           wr == GL_CLAMP ||
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           ws == GL_CLAMP_TO_BORDER ||
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           wt == GL_CLAMP_TO_BORDER || wr == GL_CLAMP_TO_BORDER))
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return false;
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Only support TEXCOORDMODE_CLAMP_EDGE and TEXCOORDMODE_CUBE (not
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * used) when using cube map texture coordinates
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (tObj->Target == GL_TEXTURE_CUBE_MAP_ARB &&
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (((ws != GL_CLAMP) && (ws != GL_CLAMP_TO_EDGE)) ||
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           ((wt != GL_CLAMP) && (wt != GL_CLAMP_TO_EDGE))))
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          return false;
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * According to 3DSTATE_MAP_STATE at page of 104 in Bspec
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Vol3d 3D Instructions:
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *   [DevGDG and DevAlv]: Must be a power of 2 for cube maps.
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *   [DevLPT, DevCST and DevBLB]: If not a power of 2, cube maps
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *      must have all faces enabled.
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * But, as I tested on pineview(DevBLB derived), the rendering is
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * bad(you will find the color isn't samplered right in some
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * fragments). After checking, it seems that the texture layout is
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * wrong: making the width and height align of 4(although this
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * doesn't make much sense) will fix this issue and also broke some
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * others. Well, Bspec mentioned nothing about the layout alignment
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * and layout for NPOT cube map.  I guess the Bspec just assume it's
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * a POT cube map.
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Thus, I guess we need do this for other platforms as well.
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (tObj->Target == GL_TEXTURE_CUBE_MAP_ARB &&
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          !is_power_of_two(firstImage->Height))
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return false;
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      state[I915_TEXREG_SS3] = ss3;     /* SS3_NORMALIZED_COORDS */
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      state[I915_TEXREG_SS3] |=
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ((translate_wrap_mode(ws) << SS3_TCX_ADDR_MODE_SHIFT) |
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (translate_wrap_mode(wt) << SS3_TCY_ADDR_MODE_SHIFT) |
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (translate_wrap_mode(wr) << SS3_TCZ_ADDR_MODE_SHIFT));
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      minlod = MIN2(sampler->MinLod, tObj->_MaxLevel - tObj->BaseLevel);
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      state[I915_TEXREG_SS3] |= (unit << SS3_TEXTUREMAP_INDEX_SHIFT);
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      state[I915_TEXREG_SS3] |= (U_FIXED(CLAMP(minlod, 0.0, 11.0), 4) <<
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 SS3_MIN_LOD_SHIFT);
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* convert border color from float to ubyte */
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(border[0], sampler->BorderColor.f[0]);
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(border[1], sampler->BorderColor.f[1]);
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(border[2], sampler->BorderColor.f[2]);
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(border[3], sampler->BorderColor.f[3]);
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (firstImage->_BaseFormat == GL_DEPTH_COMPONENT) {
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* GL specs that border color for depth textures is taken from the
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * R channel, while the hardware uses A.  Spam R into all the channels
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * for safety.
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      state[I915_TEXREG_SS4] = PACK_COLOR_8888(border[0],
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       border[0],
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       border[0],
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       border[0]);
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      state[I915_TEXREG_SS4] = PACK_COLOR_8888(border[3],
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       border[0],
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       border[1],
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       border[2]);
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   I915_ACTIVESTATE(i915, I915_UPLOAD_TEX(unit), true);
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* memcmp was already disabled, but definitely won't work as the
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * region might now change and that wouldn't be detected:
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   I915_STATECHANGE(i915, I915_UPLOAD_TEX(unit));
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG(TEXTURE, "state[I915_TEXREG_SS2] = 0x%x\n", state[I915_TEXREG_SS2]);
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG(TEXTURE, "state[I915_TEXREG_SS3] = 0x%x\n", state[I915_TEXREG_SS3]);
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG(TEXTURE, "state[I915_TEXREG_SS4] = 0x%x\n", state[I915_TEXREG_SS4]);
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG(TEXTURE, "state[I915_TEXREG_MS2] = 0x%x\n", state[I915_TEXREG_MS2]);
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG(TEXTURE, "state[I915_TEXREG_MS3] = 0x%x\n", state[I915_TEXREG_MS3]);
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG(TEXTURE, "state[I915_TEXREG_MS4] = 0x%x\n", state[I915_TEXREG_MS4]);
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915UpdateTextureState(struct intel_context *intel)
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool ok = true;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < I915_TEX_UNITS && ok; i++) {
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (intel->ctx.Texture.Unit[i]._ReallyEnabled) {
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TEXTURE_1D_BIT:
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TEXTURE_2D_BIT:
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TEXTURE_CUBE_BIT:
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TEXTURE_3D_BIT:
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ok = i915_update_tex_unit(intel, i, SS3_NORMALIZED_COORDS);
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TEXTURE_RECT_BIT:
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ok = i915_update_tex_unit(intel, i, 0);
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 0:{
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            struct i915_context *i915 = i915_context(&intel->ctx);
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (i915->state.active & I915_UPLOAD_TEX(i))
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               I915_ACTIVESTATE(i915, I915_UPLOAD_TEX(i), false);
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (i915->state.tex_buffer[i] != NULL) {
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       drm_intel_bo_unreference(i915->state.tex_buffer[i]);
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       i915->state.tex_buffer[i] = NULL;
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ok = false;
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FALLBACK(intel, I915_FALLBACK_TEXTURE, !ok);
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
440