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/colormac.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.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 "i830_context.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "i830_reg.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_chipset.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtranslate_texture_format(GLuint mesa_format)
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mesa_format) {
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_L8:
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_8BIT | MT_8BIT_L8;
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_I8:
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_8BIT | MT_8BIT_I8;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_A8:
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_8BIT | MT_8BIT_I8; /* Kludge! */
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_AL88:
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_16BIT | MT_16BIT_AY88;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGB565:
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_16BIT | MT_16BIT_RGB565;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_ARGB1555:
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_16BIT | MT_16BIT_ARGB1555;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_ARGB4444:
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_16BIT | MT_16BIT_ARGB4444;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_ARGB8888:
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_32BIT | MT_32BIT_ARGB8888;
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_XRGB8888:
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return MAPSURF_32BIT | MT_32BIT_XRGB8888;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_YCBCR_REV:
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (MAPSURF_422 | MT_422_YCRCB_NORMAL);
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_YCBCR:
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (MAPSURF_422 | MT_422_YCRCB_SWAPY);
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGB_FXT1:
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGBA_FXT1:
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (MAPSURF_COMPRESSED | MT_COMPRESS_FXT1);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGBA_DXT1:
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGB_DXT1:
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT1);
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGBA_DXT3:
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT2_3);
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case MESA_FORMAT_RGBA_DXT5:
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT4_5);
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s: bad image format %s\n", __FUNCTION__,
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      _mesa_get_format_name(mesa_format));
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      abort();
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* The i915 (and related graphics cores) do not support GL_CLAMP.  The
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Intel drivers for "other operating systems" implement GL_CLAMP as
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_CLAMP_TO_EDGE, so the same is done here.
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtranslate_wrap_mode(GLenum wrap)
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (wrap) {
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_REPEAT:
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TEXCOORDMODE_WRAP;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLAMP:
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLAMP_TO_EDGE:
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TEXCOORDMODE_CLAMP;        /* not really correct */
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLAMP_TO_BORDER:
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TEXCOORDMODE_CLAMP_BORDER;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MIRRORED_REPEAT:
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TEXCOORDMODE_MIRROR;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TEXCOORDMODE_WRAP;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Recalculate all state from scratch.  Perhaps not the most
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * efficient, but this has gotten complex enough that we need
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * something which is understandable and reliable.
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi830_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3)
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = &intel->ctx;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i830_context *i830 = i830_context(ctx);
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_unit *tUnit = &ctx->Texture.Unit[unit];
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *tObj = tUnit->_Current;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_texture_object *intelObj = intel_texture_object(tObj);
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_image *firstImage;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint *state = i830->state.Tex[unit], format, pitch;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint lodbias;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte border[4];
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint dst_x, dst_y;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(state, 0, sizeof(*state));
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*We need to refcount these. */
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i830->state.tex_buffer[unit] != NULL) {
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       drm_intel_bo_unreference(i830->state.tex_buffer[unit]);
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       i830->state.tex_buffer[unit] = NULL;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!intel_finalize_mipmap_tree(intel, unit))
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Get first image here, since intelObj->firstLevel will get set in
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * the intel_finalize_mipmap_tree() call above.
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   firstImage = tObj->Image[0][tObj->BaseLevel];
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_get_image_offset(intelObj->mt, tObj->BaseLevel, 0, 0,
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  &dst_x, &dst_y);
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo_reference(intelObj->mt->region->bo);
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   i830->state.tex_buffer[unit] = intelObj->mt->region->bo;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pitch = intelObj->mt->region->pitch * intelObj->mt->cpp;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* XXX: This calculation is probably broken for tiled images with
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * a non-page-aligned offset.
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   i830->state.tex_offset[unit] = dst_x * intelObj->mt->cpp + dst_y * pitch;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format = translate_texture_format(firstImage->TexFormat);
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   state[I830_TEXREG_TM0LI] = (_3DSTATE_LOAD_STATE_IMMEDIATE_2 |
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               (LOAD_TEXTURE_MAP0 << unit) | 4);
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   state[I830_TEXREG_TM0S1] =
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (((firstImage->Height - 1) << TM0S1_HEIGHT_SHIFT) |
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ((firstImage->Width - 1) << TM0S1_WIDTH_SHIFT) | format);
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intelObj->mt->region->tiling != I915_TILING_NONE) {
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      state[I830_TEXREG_TM0S1] |= TM0S1_TILED_SURFACE;
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (intelObj->mt->region->tiling == I915_TILING_Y)
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 state[I830_TEXREG_TM0S1] |= TM0S1_TILE_WALK;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   state[I830_TEXREG_TM0S2] =
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ((((pitch / 4) - 1) << TM0S2_PITCH_SHIFT) | TM0S2_CUBE_FACE_ENA_MASK);
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (tObj->Target == GL_TEXTURE_CUBE_MAP)
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         state[I830_TEXREG_CUBE] = (_3DSTATE_MAP_CUBE | MAP_UNIT(unit) |
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    CUBE_NEGX_ENABLE |
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    CUBE_POSX_ENABLE |
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    CUBE_NEGY_ENABLE |
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    CUBE_POSY_ENABLE |
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    CUBE_NEGZ_ENABLE | CUBE_POSZ_ENABLE);
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         state[I830_TEXREG_CUBE] = (_3DSTATE_MAP_CUBE | MAP_UNIT(unit));
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint minFilt, mipFilt, magFilt;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      float maxlod;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t minlod_fixed, maxlod_fixed;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (sampler->MinFilter) {
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_NEAREST:
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_NEAREST;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mipFilt = MIPFILTER_NONE;
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINEAR:
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_LINEAR;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mipFilt = MIPFILTER_NONE;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_NEAREST_MIPMAP_NEAREST:
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_NEAREST;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mipFilt = MIPFILTER_NEAREST;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINEAR_MIPMAP_NEAREST:
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_LINEAR;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mipFilt = MIPFILTER_NEAREST;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_NEAREST_MIPMAP_LINEAR:
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_NEAREST;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mipFilt = MIPFILTER_LINEAR;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINEAR_MIPMAP_LINEAR:
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_LINEAR;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mipFilt = MIPFILTER_LINEAR;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return false;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (sampler->MaxAnisotropy > 1.0) {
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         minFilt = FILTER_ANISOTROPIC;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         magFilt = FILTER_ANISOTROPIC;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (sampler->MagFilter) {
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_NEAREST:
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            magFilt = FILTER_NEAREST;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GL_LINEAR:
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            magFilt = FILTER_LINEAR;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return false;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      lodbias = (int) ((tUnit->LodBias + sampler->LodBias) * 16.0);
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (lodbias < -64)
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          lodbias = -64;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (lodbias > 63)
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          lodbias = 63;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      state[I830_TEXREG_TM0S3] = ((lodbias << TM0S3_LOD_BIAS_SHIFT) &
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  TM0S3_LOD_BIAS_MASK);
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* YUV conversion:
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (firstImage->TexFormat->MesaFormat == MESA_FORMAT_YCBCR ||
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          firstImage->TexFormat->MesaFormat == MESA_FORMAT_YCBCR_REV)
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         state[I830_TEXREG_TM0S3] |= SS2_COLORSPACE_CONVERSION;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* We get one field with fraction bits for the maximum
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * addressable (smallest resolution) LOD.  Use it to cover both
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * MAX_LEVEL and MAX_LOD.
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      minlod_fixed = U_FIXED(CLAMP(sampler->MinLod, 0.0, 11), 4);
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      maxlod = MIN2(sampler->MaxLod, tObj->_MaxLevel - tObj->BaseLevel);
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (intel->intelScreen->deviceID == PCI_CHIP_I855_GM ||
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  intel->intelScreen->deviceID == PCI_CHIP_I865_G) {
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 maxlod_fixed = U_FIXED(CLAMP(maxlod, 0.0, 11.75), 2);
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 maxlod_fixed = MAX2(maxlod_fixed, (minlod_fixed + 3) >> 2);
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 state[I830_TEXREG_TM0S3] |= maxlod_fixed << TM0S3_MIN_MIP_SHIFT;
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 state[I830_TEXREG_TM0S2] |= TM0S2_LOD_PRECLAMP;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 maxlod_fixed = U_FIXED(CLAMP(maxlod, 0.0, 11), 0);
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 maxlod_fixed = MAX2(maxlod_fixed, (minlod_fixed + 15) >> 4);
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 state[I830_TEXREG_TM0S3] |= maxlod_fixed << TM0S3_MIN_MIP_SHIFT_830;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      state[I830_TEXREG_TM0S3] |= minlod_fixed << TM0S3_MAX_MIP_SHIFT;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      state[I830_TEXREG_TM0S3] |= ((minFilt << TM0S3_MIN_FILTER_SHIFT) |
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   (mipFilt << TM0S3_MIP_FILTER_SHIFT) |
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   (magFilt << TM0S3_MAG_FILTER_SHIFT));
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLenum ws = sampler->WrapS;
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLenum wt = sampler->WrapT;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* 3D textures not available on i830
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (tObj->Target == GL_TEXTURE_3D)
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return false;
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      state[I830_TEXREG_MCS] = (_3DSTATE_MAP_COORD_SET_CMD |
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                MAP_UNIT(unit) |
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                ENABLE_TEXCOORD_PARAMS |
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                ss3 |
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                ENABLE_ADDR_V_CNTL |
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                TEXCOORD_ADDR_V_MODE(translate_wrap_mode(wt))
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                | ENABLE_ADDR_U_CNTL |
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                TEXCOORD_ADDR_U_MODE(translate_wrap_mode
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     (ws)));
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* convert border color from float to ubyte */
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(border[0], sampler->BorderColor.f[0]);
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(border[1], sampler->BorderColor.f[1]);
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(border[2], sampler->BorderColor.f[2]);
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(border[3], sampler->BorderColor.f[3]);
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   state[I830_TEXREG_TM0S4] = PACK_COLOR_8888(border[3],
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					      border[0],
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					      border[1],
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					      border[2]);
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   I830_ACTIVESTATE(i830, I830_UPLOAD_TEX(unit), true);
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* memcmp was already disabled, but definitely won't work as the
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * region might now change and that wouldn't be detected:
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   I830_STATECHANGE(i830, I830_UPLOAD_TEX(unit));
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi830UpdateTextureState(struct intel_context *intel)
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct i830_context *i830 = i830_context(&intel->ctx);
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool ok = true;
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < I830_TEX_UNITS && ok; i++) {
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (intel->ctx.Texture.Unit[i]._ReallyEnabled) {
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TEXTURE_1D_BIT:
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TEXTURE_2D_BIT:
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TEXTURE_CUBE_BIT:
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ok = i830_update_tex_unit(intel, i, TEXCOORDS_ARE_NORMAL);
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TEXTURE_RECT_BIT:
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ok = i830_update_tex_unit(intel, i, TEXCOORDS_ARE_IN_TEXELUNITS);
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 0:{
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 struct i830_context *i830 = i830_context(&intel->ctx);
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (i830->state.active & I830_UPLOAD_TEX(i))
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            I830_ACTIVESTATE(i830, I830_UPLOAD_TEX(i), false);
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (i830->state.tex_buffer[i] != NULL) {
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    drm_intel_bo_unreference(i830->state.tex_buffer[i]);
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    i830->state.tex_buffer[i] = NULL;
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TEXTURE_3D_BIT:
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ok = false;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FALLBACK(intel, I830_FALLBACK_TEXTURE, !ok);
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ok)
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      i830EmitTextureBlend(i830);
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
366