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