1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009 Maciej Cencora. 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2008 Nicolai Haehnle. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The Weather Channel (TM) funded Tungsten Graphics to develop the 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * initial release of the Radeon 8500 driver under the XFree86 license. 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This notice must be preserved. 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a copy of this software and associated documentation files (the 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sublicense, and/or sell copies of the Software, and to 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * portions of the Software. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/enums.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mfeatures.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mipmap.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/pbo.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/texcompress.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/texstore.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/teximage.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/texobj.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "drivers/common/meta.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xmlpool.h" /* for symbolic values of enum-type options */ 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_common.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_mipmap_tree.h" 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void teximage_assign_miptree(radeonContextPtr rmesa, 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj, 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage); 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic radeon_mipmap_tree *radeon_miptree_create_for_teximage(radeonContextPtr rmesa, 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj, 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage); 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid copy_rows(void* dst, GLuint dststride, const void* src, GLuint srcstride, 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint numrows, GLuint rowsize) 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(rowsize <= dststride); 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(rowsize <= srcstride); 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_print(RADEON_TEXTURE, RADEON_TRACE, 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%s dst %p, stride %u, src %p, stride %u, " 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "numrows %u, rowsize %u.\n", 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __func__, dst, dststride, 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src, srcstride, 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org numrows, rowsize); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rowsize == srcstride && rowsize == dststride) { 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dst, src, numrows*rowsize); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(i = 0; i < numrows; ++i) { 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dst, src, rowsize); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dststride; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcstride; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* textures */ 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Allocate an empty texture image object. 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_texture_image *radeonNewTextureImage(struct gl_context *ctx) 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CALLOC(sizeof(radeon_texture_image)); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Delete a texture image object. 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeonDeleteTextureImage(struct gl_context *ctx, struct gl_texture_image *img) 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* nothing special (yet) for radeon_texture_image */ 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_delete_texture_image(ctx, img); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeonAllocTextureImageBuffer(struct gl_context *ctx, 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *timage) 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_texture_image *image = get_radeon_texture_image(timage); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texobj = timage->TexObject; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int slices; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.FreeTextureImageBuffer(ctx, timage); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (texobj->Target) { 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_3D: 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org slices = timage->Depth; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org slices = 1; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!image->base.ImageOffsets); 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->base.ImageOffsets = malloc(slices * sizeof(GLuint)); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org teximage_assign_miptree(rmesa, texobj, timage); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free memory associated with this texture image. 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid radeonFreeTextureImageBuffer(struct gl_context *ctx, struct gl_texture_image *timage) 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_texture_image* image = get_radeon_texture_image(timage); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (image->mt) { 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_miptree_unreference(&image->mt); 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_free_texture_image_buffer(ctx, timage); 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (image->bo) { 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_bo_unref(image->bo); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->bo = NULL; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (image->base.Buffer) { 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_align_free(image->base.Buffer); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->base.Buffer = NULL; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (image->base.ImageOffsets) { 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(image->base.ImageOffsets); 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->base.ImageOffsets = NULL; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Set Data pointer and additional data for mapped texture image */ 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void teximage_set_map_data(radeon_texture_image *image) 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_mipmap_level *lvl; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!image->mt) { 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_warning("%s(%p) Trying to set map data without miptree.\n", 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __func__, image); 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lvl = &image->mt->levels[image->base.Base.Level]; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->base.Map = image->mt->bo->ptr + lvl->faces[image->base.Base.Face].offset; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->base.RowStride = lvl->rowstride / _mesa_get_format_bytes(image->base.Base.TexFormat); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Map a single texture image for glTexImage and friends. 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid radeon_teximage_map(radeon_texture_image *image, GLboolean write_enable) 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_print(RADEON_TEXTURE, RADEON_VERBOSE, 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%s(img %p), write_enable %s.\n", 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __func__, image, 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_enable ? "true": "false"); 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (image->mt) { 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!image->base.Map); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_bo_map(image->mt->bo, write_enable); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org teximage_set_map_data(image); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid radeon_teximage_unmap(radeon_texture_image *image) 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_print(RADEON_TEXTURE, RADEON_VERBOSE, 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%s(img %p)\n", 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __func__, image); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (image->mt) { 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(image->base.Map); 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->base.Map = 0; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_bo_unmap(image->mt->bo); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Map texture memory/buffer into user space. 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: the region of interest parameters are ignored here. 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param mapOut returns start of mapping of region of interest 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param rowStrideOut returns row stride in bytes 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeon_map_texture_image(struct gl_context *ctx, 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage, 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint slice, 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint x, GLuint y, GLuint w, GLuint h, 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield mode, 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte **map, 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *stride) 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_texture_image *image = get_radeon_texture_image(texImage); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_mipmap_tree *mt = image->mt; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint texel_size = _mesa_get_format_bytes(texImage->TexFormat); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint width = texImage->Width; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint height = texImage->Height; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct radeon_bo *bo = !image->mt ? image->bo : image->mt->bo; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int bw, bh; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean write = (mode & GL_MAP_WRITE_BIT) != 0; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_get_format_block_size(texImage->TexFormat, &bw, &bh); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(y % bh == 0); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y /= bh; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel_size /= bw; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bo && radeon_bo_is_referenced_by_cs(bo, rmesa->cmdbuf.cs)) { 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_print(RADEON_TEXTURE, RADEON_VERBOSE, 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%s for texture that is " 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "queued for GPU processing.\n", 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __func__); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_firevertices(rmesa); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (image->bo) { 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TFP case */ 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_bo_map(image->bo, write); 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *stride = get_texture_image_row_stride(rmesa, texImage->TexFormat, width, 0, texImage->TexObject->Target); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *map = bo->ptr; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (likely(mt)) { 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *base; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_mipmap_level *lvl = &image->mt->levels[texImage->Level]; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_bo_map(mt->bo, write); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base = mt->bo->ptr + lvl->faces[image->base.Base.Face].offset; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *stride = lvl->rowstride; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *map = base + (slice * height) * *stride; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* texture data is in malloc'd memory */ 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(map); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *stride = _mesa_format_row_stride(texImage->TexFormat, width); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *map = image->base.Buffer + (slice * height) * *stride; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *map += y * *stride + x * texel_size; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeon_unmap_texture_image(struct gl_context *ctx, 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage, GLuint slice) 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_texture_image *image = get_radeon_texture_image(texImage); 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (image->bo) 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_bo_unmap(image->bo); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (image->mt) 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_bo_unmap(image->mt->bo); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* try to find a format which will only need a memcopy */ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic gl_format radeonChoose8888TexFormat(radeonContextPtr rmesa, 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcFormat, 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcType, GLboolean fbo) 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(RADEON_R100) 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* r100 can only do this */ 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _radeon_texformat_argb8888; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(RADEON_R200) 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint ui = 1; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte littleEndian = *((const GLubyte *)&ui); 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fbo) 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _radeon_texformat_argb8888; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) || 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) || 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) || 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && littleEndian)) { 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA8888; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) || 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) || 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) || 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian)) { 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA8888_REV; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _radeon_texformat_argb8888; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format radeonChooseTextureFormat_mesa(struct gl_context * ctx, 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target, 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint internalFormat, 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum type) 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return radeonChooseTextureFormat(ctx, internalFormat, format, 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type, 0); 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format radeonChooseTextureFormat(struct gl_context * ctx, 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint internalFormat, 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum type, GLboolean fbo) 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean do32bpt = 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rmesa->texture_depth == DRI_CONF_TEXTURE_DEPTH_32); 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean force16bpt = 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (rmesa->texture_depth == DRI_CONF_TEXTURE_DEPTH_FORCE_16); 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void)format; 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_print(RADEON_TEXTURE, RADEON_TRACE, 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%s InternalFormat=%s(%d) type=%s format=%s\n", 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __func__, 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(internalFormat), internalFormat, 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(type), _mesa_lookup_enum_by_nr(format)); 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_print(RADEON_TEXTURE, RADEON_TRACE, 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%s do32bpt=%d force16bpt=%d\n", 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __func__, do32bpt, force16bpt); 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGBA: 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (type) { 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_10_10_10_2: 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_2_10_10_10_REV: 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do32bpt ? _radeon_texformat_argb8888 : 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_argb1555; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_4_4_4_4: 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_4_4_4_4_REV: 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _radeon_texformat_argb4444; 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_5_5_1: 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_1_5_5_5_REV: 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _radeon_texformat_argb1555; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do32bpt ? radeonChoose8888TexFormat(rmesa, format, type, fbo) : 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_argb4444; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGB: 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (type) { 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_4_4_4_4: 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_4_4_4_4_REV: 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _radeon_texformat_argb4444; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_5_5_1: 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_1_5_5_5_REV: 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _radeon_texformat_argb1555; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_6_5: 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT_5_6_5_REV: 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _radeon_texformat_rgb565; 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return do32bpt ? _radeon_texformat_argb8888 : 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_rgb565; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA8: 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB10_A2: 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA12: 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA16: 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return !force16bpt ? 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonChoose8888TexFormat(rmesa, format, type, fbo) : 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_argb4444; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA4: 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA2: 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _radeon_texformat_argb4444; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB5_A1: 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _radeon_texformat_argb1555; 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB8: 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB10: 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB12: 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB16: 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return !force16bpt ? _radeon_texformat_argb8888 : 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_rgb565; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB5: 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB4: 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R3_G3_B2: 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _radeon_texformat_rgb565; 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA4: 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA8: 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA12: 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA16: 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_ALPHA: 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(RADEON_R200) 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* r200: can't use a8 format since interpreting hw I8 as a8 would result 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org in wrong rgb values (same as alpha value instead of 0). */ 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _radeon_texformat_al88; 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_A8; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE4: 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE8: 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE12: 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16: 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_LUMINANCE: 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_L8; 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE4_ALPHA4: 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE6_ALPHA2: 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE8_ALPHA8: 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE12_ALPHA4: 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE12_ALPHA12: 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16_ALPHA16: 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_LUMINANCE_ALPHA: 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _radeon_texformat_al88; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY: 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY4: 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY8: 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY12: 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY16: 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_INTENSITY: 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_I8; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_YCBCR_MESA: 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (type == GL_UNSIGNED_SHORT_8_8_APPLE || 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type == GL_UNSIGNED_BYTE) 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_YCBCR; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_YCBCR_REV; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB_S3TC: 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB4_S3TC: 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGB_DXT1; 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_DXT1; 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA_S3TC: 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA4_S3TC: 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_DXT3; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_DXT5; 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA16F_ARB: 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_ALPHA_FLOAT16; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA32F_ARB: 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_ALPHA_FLOAT32; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16F_ARB: 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_FLOAT16; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE32F_ARB: 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_FLOAT32; 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA16F_ARB: 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA32F_ARB: 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32; 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY16F_ARB: 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_INTENSITY_FLOAT16; 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY32F_ARB: 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_INTENSITY_FLOAT32; 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB16F_ARB: 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_FLOAT16; 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB32F_ARB: 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_FLOAT32; 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA16F_ARB: 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_FLOAT16; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA32F_ARB: 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_FLOAT32; 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_COMPONENT: 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_COMPONENT16: 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_COMPONENT24: 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_COMPONENT32: 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_STENCIL_EXT: 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH24_STENCIL8_EXT: 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_S8_Z24; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* EXT_texture_sRGB */ 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SRGB: 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SRGB8: 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SRGB_ALPHA: 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SRGB8_ALPHA8: 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SRGB: 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SRGB_ALPHA: 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_SARGB8; 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SLUMINANCE: 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SLUMINANCE8: 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SLUMINANCE: 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_SL8; 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SLUMINANCE_ALPHA: 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SLUMINANCE8_ALPHA8: 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SLUMINANCE_ALPHA: 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_SLA8; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_SRGB_DXT1; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_SRGBA_DXT1; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_SRGBA_DXT3; 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_SRGBA_DXT5; 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "unexpected internalFormat 0x%x in %s", 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (int)internalFormat, __func__); 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_NONE; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_NONE; /* never get here */ 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Check if given image is valid within current texture object. 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void teximage_assign_miptree(radeonContextPtr rmesa, 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj, 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage) 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonTexObj *t = radeon_tex_obj(texObj); 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_texture_image* image = get_radeon_texture_image(texImage); 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Try using current miptree, or create new if there isn't any */ 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!t->mt || !radeon_miptree_matches_image(t->mt, texImage)) { 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_miptree_unreference(&t->mt); 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t->mt = radeon_miptree_create_for_teximage(rmesa, 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj, 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage); 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_print(RADEON_TEXTURE, RADEON_NORMAL, 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%s: texObj %p, texImage %p, " 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "texObj miptree doesn't match, allocated new miptree %p\n", 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __FUNCTION__, texObj, texImage, t->mt); 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Miptree alocation may have failed, 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * when there was no image for baselevel specified */ 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (t->mt) { 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_miptree_reference(t->mt, &image->mt); 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_print(RADEON_TEXTURE, RADEON_VERBOSE, 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%s Failed to allocate miptree.\n", __func__); 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned radeonIsFormatRenderable(gl_format mesa_format) 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mesa_format == _radeon_texformat_argb8888 || mesa_format == _radeon_texformat_rgb565 || 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mesa_format == _radeon_texformat_argb1555 || mesa_format == _radeon_texformat_argb4444) 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (mesa_format) 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_Z16: 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_S8_Z24: 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_OES_EGL_image 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid radeon_image_target_texture_2d(struct gl_context *ctx, GLenum target, 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj, 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage, 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLeglImageOES image_handle) 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonContextPtr radeon = RADEON_CONTEXT(ctx); 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonTexObj *t = radeon_tex_obj(texObj); 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_texture_image *radeonImage = get_radeon_texture_image(texImage); 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIscreen *screen; 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __DRIimage *image; 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen = radeon->dri.screen; 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image = screen->dri2.image->lookupEGLImage(screen, image_handle, 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->loaderPrivate); 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (image == NULL) 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonFreeTextureImageBuffer(ctx, texImage); 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->Width = image->width; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->Height = image->height; 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->Depth = 1; 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->_BaseFormat = GL_RGBA; 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->TexFormat = image->format; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonImage->base.RowStride = image->pitch; 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->InternalFormat = image->internal_format; 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(t->mt) 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_miptree_unreference(&t->mt); 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t->mt = NULL; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* NOTE: The following is *very* ugly and will probably break. But 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org I don't know how to deal with it, without creating a whole new 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org function like radeon_miptree_from_bo() so I'm going with the 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org easy but error-prone way. */ 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_try_alloc_miptree(radeon, t); 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_miptree_reference(t->mt, &radeonImage->mt); 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (t->mt == NULL) 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_print(RADEON_TEXTURE, RADEON_VERBOSE, 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%s Failed to allocate miptree.\n", __func__); 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Particularly ugly: this is guaranteed to break, if image->bo is 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org not of the required size for a miptree. */ 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_bo_unref(t->mt->bo); 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_bo_ref(image->bo); 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t->mt->bo = image->bo; 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!radeon_miptree_matches_image(t->mt, &radeonImage->base.Base)) 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "miptree doesn't match image\n"); 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format _radeon_texformat_rgba8888 = MESA_FORMAT_NONE; 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format _radeon_texformat_argb8888 = MESA_FORMAT_NONE; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format _radeon_texformat_rgb565 = MESA_FORMAT_NONE; 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format _radeon_texformat_argb4444 = MESA_FORMAT_NONE; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format _radeon_texformat_argb1555 = MESA_FORMAT_NONE; 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format _radeon_texformat_al88 = MESA_FORMAT_NONE; 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/ 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeonInitTextureFormats(void) 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_little_endian()) { 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_rgba8888 = MESA_FORMAT_RGBA8888; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_argb8888 = MESA_FORMAT_ARGB8888; 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_rgb565 = MESA_FORMAT_RGB565; 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_argb4444 = MESA_FORMAT_ARGB4444; 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_argb1555 = MESA_FORMAT_ARGB1555; 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_al88 = MESA_FORMAT_AL88; 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_rgba8888 = MESA_FORMAT_RGBA8888_REV; 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_argb8888 = MESA_FORMAT_ARGB8888_REV; 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_rgb565 = MESA_FORMAT_RGB565_REV; 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_argb4444 = MESA_FORMAT_ARGB4444_REV; 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_argb1555 = MESA_FORMAT_ARGB1555_REV; 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _radeon_texformat_al88 = MESA_FORMAT_AL88_REV; 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeon_init_common_texture_funcs(radeonContextPtr radeon, 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dd_function_table *functions) 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->NewTextureImage = radeonNewTextureImage; 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->DeleteTextureImage = radeonDeleteTextureImage; 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->AllocTextureImageBuffer = radeonAllocTextureImageBuffer; 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->FreeTextureImageBuffer = radeonFreeTextureImageBuffer; 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->MapTextureImage = radeon_map_texture_image; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->UnmapTextureImage = radeon_unmap_texture_image; 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->ChooseTextureFormat = radeonChooseTextureFormat_mesa; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->CopyTexSubImage = radeonCopyTexSubImage; 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->Bitmap = _mesa_meta_Bitmap; 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_OES_EGL_image 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->EGLImageTargetTexture2D = radeon_image_target_texture_2d; 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonInitTextureFormats(); 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeon_swrast_map_image(radeonContextPtr rmesa, 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_texture_image *image) 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint level, face; 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_mipmap_tree *mt; 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint texel_size; 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_mipmap_level *lvl; 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int rs; 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!image || !image->mt) 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel_size = _mesa_get_format_bytes(image->base.Base.TexFormat); 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org level = image->base.Base.Level; 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org face = image->base.Base.Face; 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mt = image->mt; 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lvl = &image->mt->levels[level]; 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs = lvl->rowstride / texel_size; 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_bo_map(mt->bo, 1); 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->base.Map = mt->bo->ptr + lvl->faces[face].offset; 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mt->target == GL_TEXTURE_3D) { 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < mt->levels[level].depth; i++) 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->base.ImageOffsets[i] = rs * lvl->height * i; 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->base.RowStride = rs; 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeon_swrast_unmap_image(radeonContextPtr rmesa, 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_texture_image *image) 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (image && image->mt) { 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org image->base.Map = NULL; 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_bo_unmap(image->mt->bo); 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeon_swrast_map_texture_images(struct gl_context *ctx, 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj) 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint nr_faces = _mesa_num_tex_faces(texObj->Target); 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, face; 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = texObj->BaseLevel; i <= texObj->_MaxLevel; i++) { 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (face = 0; face < nr_faces; face++) { 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_texture_image *image = get_radeon_texture_image(texObj->Image[face][i]); 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_swrast_map_image(rmesa, image); 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeon_swrast_unmap_texture_images(struct gl_context *ctx, 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj) 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint nr_faces = _mesa_num_tex_faces(texObj->Target); 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, face; 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = texObj->BaseLevel; i <= texObj->_MaxLevel; i++) { 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (face = 0; face < nr_faces; face++) { 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_texture_image *image = get_radeon_texture_image(texObj->Image[face][i]); 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeon_swrast_unmap_image(rmesa, image); 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic radeon_mipmap_tree *radeon_miptree_create_for_teximage(radeonContextPtr rmesa, 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj, 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage) 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org radeonTexObj *t = radeon_tex_obj(texObj); 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint firstLevel; 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint lastLevel; 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int width, height, depth; 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width = texImage->Width; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height = texImage->Height; 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = texImage->Depth; 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texImage->Level > texObj->BaseLevel && 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (width == 1 || 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (texObj->Target != GL_TEXTURE_1D && height == 1) || 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (texObj->Target == GL_TEXTURE_3D && depth == 1))) { 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* For this combination, we're at some lower mipmap level and 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * some important dimension is 1. We can't extrapolate up to a 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * likely base level width/height/depth for a full mipmap stack 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * from this info, so just allocate this one level. 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org firstLevel = texImage->Level; 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lastLevel = texImage->Level; 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texImage->Level < texObj->BaseLevel) 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org firstLevel = 0; 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org firstLevel = texObj->BaseLevel; 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = texImage->Level; i > firstLevel; i--) { 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width <<= 1; 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height != 1) 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height <<= 1; 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth != 1) 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth <<= 1; 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((texObj->Sampler.MinFilter == GL_NEAREST || 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj->Sampler.MinFilter == GL_LINEAR) && 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->Level == firstLevel) { 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lastLevel = firstLevel; 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lastLevel = firstLevel + _mesa_logbase2(MAX2(MAX2(width, height), depth)); 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return radeon_miptree_create(rmesa, texObj->Target, 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->TexFormat, firstLevel, lastLevel - firstLevel + 1, 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t->tile_bits); 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 834