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