st_cb_texture.c revision d78dab126724e6e9d475289a086fb6f85adc3985
124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/************************************************************************** 224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * All Rights Reserved. 524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Permission is hereby granted, free of charge, to any person obtaining a 724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * copy of this software and associated documentation files (the 824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * "Software"), to deal in the Software without restriction, including 924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * without limitation the rights to use, copy, modify, merge, publish, 1024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * distribute, sub license, and/or sell copies of the Software, and to 1124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * permit persons to whom the Software is furnished to do so, subject to 1224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * the following conditions: 1324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 1424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * The above copyright notice and this permission notice (including the 1524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * next paragraph) shall be included in all copies or substantial portions 1624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * of the Software. 1724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 1824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 2624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian **************************************************************************/ 2724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 2824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/imports.h" 2924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/convolve.h" 3024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/enums.h" 3124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/image.h" 3224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/macros.h" 3324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texcompress.h" 3424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texformat.h" 3524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/teximage.h" 3624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texobj.h" 3724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texstore.h" 3824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 3924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "state_tracker/st_context.h" 4024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "state_tracker/st_cb_texture.h" 4124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "state_tracker/st_mipmap_tree.h" 4224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 4324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "pipe/p_context.h" 4424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 4524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 4624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#define DBG if (0) printf 4724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 4824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 4924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstruct st_texture_object 5024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 5124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object base; /* The "parent" object */ 5224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 5324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* The mipmap tree must include at least these levels once 5424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * validated: 5524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 5624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint firstLevel; 5724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint lastLevel; 5824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 5924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Offset for firstLevel image: 6024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 6124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint textureOffset; 6224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 6324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* On validation any active images held in main memory or in other 6424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * regions will be copied to this region and the old storage freed. 6524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 6624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct pipe_mipmap_tree *mt; 6724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 6824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLboolean imageOverride; 6924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint depthOverride; 7024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint pitchOverride; 7124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian}; 7224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 7324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 7424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 7524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstruct st_texture_image 7624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 7724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image base; 7824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 7924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* These aren't stored in gl_texture_image 8024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 8124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint level; 8224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint face; 8324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 8424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* If stImage->mt != NULL, image data is stored here. 8524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Else if stImage->base.Data != NULL, image is stored there. 8624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Else there is no image data. 8724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 8824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct pipe_mipmap_tree *mt; 8924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian}; 9024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 9124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 9224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 9324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 9424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic INLINE struct st_texture_object * 9524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_texture_object(struct gl_texture_object *obj) 9624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 9724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return (struct st_texture_object *) obj; 9824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 9924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 10024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic INLINE struct st_texture_image * 10124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_texture_image(struct gl_texture_image *img) 10224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 10324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return (struct st_texture_image *) img; 10424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 10524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 10624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 107d78dab126724e6e9d475289a086fb6f85adc3985Brianstruct pipe_mipmap_tree * 108d78dab126724e6e9d475289a086fb6f85adc3985Brianst_get_texobj_mipmap_tree(struct gl_texture_object *texObj) 109d78dab126724e6e9d475289a086fb6f85adc3985Brian{ 110d78dab126724e6e9d475289a086fb6f85adc3985Brian struct st_texture_object *stObj = st_texture_object(texObj); 111d78dab126724e6e9d475289a086fb6f85adc3985Brian return stObj->mt; 112d78dab126724e6e9d475289a086fb6f85adc3985Brian} 113d78dab126724e6e9d475289a086fb6f85adc3985Brian 114d78dab126724e6e9d475289a086fb6f85adc3985Brian 11524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic int 11624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianintel_compressed_num_bytes(GLuint mesaFormat) 11724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 11824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian int bytes = 0; 11924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian switch(mesaFormat) { 12024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 12124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case MESA_FORMAT_RGB_FXT1: 12224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case MESA_FORMAT_RGBA_FXT1: 12324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case MESA_FORMAT_RGB_DXT1: 12424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case MESA_FORMAT_RGBA_DXT1: 12524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian bytes = 2; 12624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian break; 12724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 12824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case MESA_FORMAT_RGBA_DXT3: 12924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case MESA_FORMAT_RGBA_DXT5: 13024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian bytes = 4; 13124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian default: 13224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian break; 13324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 13424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 13524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return bytes; 13624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 13724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 13824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 13924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/* It works out that this function is fine for all the supported 14024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * hardware. However, there is still a need to map the formats onto 14124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * hardware descriptors. 14224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 14324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/* Note that the i915 can actually support many more formats than 14424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * these if we take the step of simply swizzling the colors 14524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * immediately after sampling... 14624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 14724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic const struct gl_texture_format * 14824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_ChooseTextureFormat(GLcontext * ctx, GLint internalFormat, 14924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type) 15024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 15124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 15224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct intel_context *intel = intel_context(ctx); 15324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const GLboolean do32bpt = (intel->intelScreen->front.cpp == 4); 15424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#else 15524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const GLboolean do32bpt = 1; 15624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 15724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 15824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian switch (internalFormat) { 15924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case 4: 16024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGBA: 16124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_COMPRESSED_RGBA: 16224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (format == GL_BGRA) { 16324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (type == GL_UNSIGNED_BYTE || type == GL_UNSIGNED_INT_8_8_8_8_REV) { 16424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_argb8888; 16524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 16624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) { 16724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_argb4444; 16824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 16924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) { 17024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_argb1555; 17124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 17224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 17324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return do32bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_argb4444; 17424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 17524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case 3: 17624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGB: 17724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_COMPRESSED_RGB: 17824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5) { 17924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_rgb565; 18024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 18124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return do32bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_rgb565; 18224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 18324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGBA8: 18424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGB10_A2: 18524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGBA12: 18624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGBA16: 18724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return do32bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_argb4444; 18824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 18924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGBA4: 19024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGBA2: 19124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_argb4444; 19224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 19324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGB5_A1: 19424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_argb1555; 19524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 19624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGB8: 19724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGB10: 19824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGB12: 19924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGB16: 20024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_argb8888; 20124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 20224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGB5: 20324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGB4: 20424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_R3_G3_B2: 20524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_rgb565; 20624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 20724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_ALPHA: 20824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_ALPHA4: 20924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_ALPHA8: 21024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_ALPHA12: 21124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_ALPHA16: 21224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_COMPRESSED_ALPHA: 21324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_a8; 21424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 21524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case 1: 21624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_LUMINANCE: 21724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_LUMINANCE4: 21824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_LUMINANCE8: 21924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_LUMINANCE12: 22024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_LUMINANCE16: 22124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_COMPRESSED_LUMINANCE: 22224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_l8; 22324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 22424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case 2: 22524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_LUMINANCE_ALPHA: 22624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_LUMINANCE4_ALPHA4: 22724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_LUMINANCE6_ALPHA2: 22824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_LUMINANCE8_ALPHA8: 22924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_LUMINANCE12_ALPHA4: 23024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_LUMINANCE12_ALPHA12: 23124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_LUMINANCE16_ALPHA16: 23224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_COMPRESSED_LUMINANCE_ALPHA: 23324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_al88; 23424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 23524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_INTENSITY: 23624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_INTENSITY4: 23724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_INTENSITY8: 23824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_INTENSITY12: 23924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_INTENSITY16: 24024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_COMPRESSED_INTENSITY: 24124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_i8; 24224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 24324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_YCBCR_MESA: 24424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (type == GL_UNSIGNED_SHORT_8_8_MESA || type == GL_UNSIGNED_BYTE) 24524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_ycbcr; 24624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else 24724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_ycbcr_rev; 24824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 24924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_COMPRESSED_RGB_FXT1_3DFX: 25024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_rgb_fxt1; 25124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_COMPRESSED_RGBA_FXT1_3DFX: 25224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_rgba_fxt1; 25324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 25424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGB_S3TC: 25524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGB4_S3TC: 25624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 25724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_rgb_dxt1; 25824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 25924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 26024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_rgba_dxt1; 26124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 26224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGBA_S3TC: 26324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGBA4_S3TC: 26424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 26524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_rgba_dxt3; 26624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 26724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 26824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_rgba_dxt5; 26924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 27024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_DEPTH_COMPONENT: 27124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_DEPTH_COMPONENT16: 27224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_DEPTH_COMPONENT24: 27324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_DEPTH_COMPONENT32: 27424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_z16; 27524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 27624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_DEPTH_STENCIL_EXT: 27724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_DEPTH24_STENCIL8_EXT: 27824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &_mesa_texformat_z24_s8; 27924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 28024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian default: 28124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian fprintf(stderr, "unexpected texture format %s in %s\n", 28224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_lookup_enum_by_nr(internalFormat), __FUNCTION__); 28324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return NULL; 28424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 28524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 28624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return NULL; /* never get here */ 28724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 28824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 28924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 29024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic GLboolean 29124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_IsTextureResident(GLcontext * ctx, struct gl_texture_object *texObj) 29224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 29324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 29424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct intel_context *intel = intel_context(ctx); 29524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_object *stObj = st_texture_object(texObj); 29624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 29724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return 29824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stObj->mt && 29924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stObj->mt->region && 30024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intel_is_region_resident(intel, stObj->mt->region); 30124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 30224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return 1; 30324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 30424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 30524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 30624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 30724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic struct gl_texture_image * 30824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_NewTextureImage(GLcontext * ctx) 30924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 31024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 31124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (void) ctx; 31224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return (struct gl_texture_image *) CALLOC_STRUCT(st_texture_image); 31324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 31424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 31524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 31624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic struct gl_texture_object * 31724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_NewTextureObject(GLcontext * ctx, GLuint name, GLenum target) 31824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 31924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_object *obj = CALLOC_STRUCT(st_texture_object); 32024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 32124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 32224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_initialize_texture_object(&obj->base, name, target); 32324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 32424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &obj->base; 32524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 32624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 32724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 32824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_DeleteTextureObject(GLcontext *ctx, 32924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj) 33024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 33124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct pipe_context *pipe = ctx->st->pipe; 33224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_object *stObj = st_texture_object(texObj); 33324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 33424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (stObj->mt) 33524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_release(pipe, &stObj->mt); 33624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 33724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_delete_texture_object(ctx, texObj); 33824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 33924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 34024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 34124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 34224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_FreeTextureImageData(GLcontext * ctx, struct gl_texture_image *texImage) 34324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 34424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct pipe_context *pipe = ctx->st->pipe; 34524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 34624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 34724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 34824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 34924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (stImage->mt) { 35024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_release(pipe, &stImage->mt); 35124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 35224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 35324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (texImage->Data) { 35424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian free(texImage->Data); 35524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 35624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 35724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 35824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 35924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 36024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 36124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 36224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/* ================================================================ 36324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * From linux kernel i386 header files, copes with odd sizes better 36424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * than COPY_DWORDS would: 36524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * XXX Put this in src/mesa/main/imports.h ??? 36624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 36724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if defined(i386) || defined(__i386__) 36824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic INLINE void * 36924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian__memcpy(void *to, const void *from, size_t n) 37024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 37124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian int d0, d1, d2; 37224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian __asm__ __volatile__("rep ; movsl\n\t" 37324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "testb $2,%b4\n\t" 37424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "je 1f\n\t" 37524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "movsw\n" 37624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "1:\ttestb $1,%b4\n\t" 37724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "je 2f\n\t" 37824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "movsb\n" "2:":"=&c"(d0), "=&D"(d1), "=&S"(d2) 37924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian :"0"(n / 4), "q"(n), "1"((long) to), "2"((long) from) 38024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian :"memory"); 38124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return (to); 38224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 38324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#else 38424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#define __memcpy(a,b,c) memcpy(a,b,c) 38524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 38624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 38724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 38824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/* The system memcpy (at least on ubuntu 5.10) has problems copying 38924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * to agp (writecombined) memory from a source which isn't 64-byte 39024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * aligned - there is a 4x performance falloff. 39124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 39224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * The x86 __memcpy is immune to this but is slightly slower 39324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * (10%-ish) than the system memcpy. 39424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 39524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * The sse_memcpy seems to have a slight cliff at 64/32 bytes, but 39624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * isn't much faster than x86_memcpy for agp copies. 39724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 39824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * TODO: switch dynamically. 39924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 40024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void * 40124df8f895fe8807aa2ba058e71bd40adfc01d21eBriando_memcpy(void *dest, const void *src, size_t n) 40224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 40324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if ((((unsigned) src) & 63) || (((unsigned) dest) & 63)) { 40424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return __memcpy(dest, src, n); 40524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 40624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else 40724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return memcpy(dest, src, n); 40824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 40924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 41024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 41124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/* Functions to store texture images. Where possible, mipmap_tree's 41224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * will be created or further instantiated with image data, otherwise 41324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * images will be stored in malloc'd memory. A validation step is 41424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * required to pull those images into a mipmap tree, or otherwise 41524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * decide a fallback is required. 41624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 41724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 41824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 41924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic int 42024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianlogbase2(int n) 42124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 42224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint i = 1; 42324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint log2 = 0; 42424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 42524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian while (n > i) { 42624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian i *= 2; 42724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian log2++; 42824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 42924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 43024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return log2; 43124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 43224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 43324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 43424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/* Otherwise, store it in memory if (Border != 0) or (any dimension == 43524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 1). 43624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 43724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Otherwise, if max_level >= level >= min_level, create tree with 43824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * space for textures from min_level down to max_level. 43924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 44024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Otherwise, create tree with space for textures from (level 44124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 0)..(1x1). Consider pruning this tree at a validation if the 44224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * saving is worth it. 44324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 44424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 44524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianguess_and_alloc_mipmap_tree(struct pipe_context *pipe, 44624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_object *intelObj, 44724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *intelImage) 44824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 44924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint firstLevel; 45024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint lastLevel; 45124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint width = intelImage->base.Width; 45224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint height = intelImage->base.Height; 45324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint depth = intelImage->base.Depth; 45424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint l2width, l2height, l2depth; 45524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint i, comp_byte = 0; 45624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 45724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 45824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 45924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelImage->base.Border) 46024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return; 46124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 46224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelImage->level > intelObj->base.BaseLevel && 46324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (intelImage->base.Width == 1 || 46424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (intelObj->base.Target != GL_TEXTURE_1D && 46524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->base.Height == 1) || 46624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (intelObj->base.Target == GL_TEXTURE_3D && 46724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->base.Depth == 1))) 46824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return; 46924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 47024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* If this image disrespects BaseLevel, allocate from level zero. 47124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Usually BaseLevel == 0, so it's unlikely to happen. 47224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 47324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelImage->level < intelObj->base.BaseLevel) 47424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstLevel = 0; 47524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else 47624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstLevel = intelObj->base.BaseLevel; 47724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 47824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 47924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Figure out image dimensions at start level. 48024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 48124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian for (i = intelImage->level; i > firstLevel; i--) { 48224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width <<= 1; 48324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (height != 1) 48424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian height <<= 1; 48524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (depth != 1) 48624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian depth <<= 1; 48724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 48824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 48924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Guess a reasonable value for lastLevel. This is probably going 49024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * to be wrong fairly often and might mean that we have to look at 49124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * resizable buffers, or require that buffers implement lazy 49224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * pagetable arrangements. 49324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 49424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if ((intelObj->base.MinFilter == GL_NEAREST || 49524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->base.MinFilter == GL_LINEAR) && 49624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->level == firstLevel) { 49724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian lastLevel = firstLevel; 49824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 49924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 50024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian l2width = logbase2(width); 50124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian l2height = logbase2(height); 50224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian l2depth = logbase2(depth); 50324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian lastLevel = firstLevel + MAX2(MAX2(l2width, l2height), l2depth); 50424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 50524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 50624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(!intelObj->mt); 50724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelImage->base.IsCompressed) 50824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian comp_byte = intel_compressed_num_bytes(intelImage->base.TexFormat->MesaFormat); 50924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt = st_miptree_create(pipe, 51024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->base.Target, 51124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->base.InternalFormat, 51224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstLevel, 51324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian lastLevel, 51424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, 51524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian height, 51624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian depth, 51724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->base.TexFormat->TexelBytes, 51824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian comp_byte); 51924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 52024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s - success\n", __FUNCTION__); 52124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 52224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 52324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 52424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 52524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 52624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic GLuint 52724df8f895fe8807aa2ba058e71bd40adfc01d21eBriantarget_to_face(GLenum target) 52824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 52924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian switch (target) { 53024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 53124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 53224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 53324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 53424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 53524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 53624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return ((GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X); 53724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian default: 53824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return 0; 53924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 54024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 54124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 54224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 54324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 54424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/* There are actually quite a few combinations this will work for, 54524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * more than what I've listed here. 54624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 54724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic GLboolean 54824df8f895fe8807aa2ba058e71bd40adfc01d21eBriancheck_pbo_format(GLint internalFormat, 54924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, 55024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_texture_format *mesa_format) 55124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 55224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian switch (internalFormat) { 55324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case 4: 55424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGBA: 55524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return (format == GL_BGRA && 55624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (type == GL_UNSIGNED_BYTE || 55724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian type == GL_UNSIGNED_INT_8_8_8_8_REV) && 55824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian mesa_format == &_mesa_texformat_argb8888); 55924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case 3: 56024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGB: 56124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return (format == GL_RGB && 56224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian type == GL_UNSIGNED_SHORT_5_6_5 && 56324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian mesa_format == &_mesa_texformat_rgb565); 56424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_YCBCR_MESA: 56524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return (type == GL_UNSIGNED_SHORT_8_8_MESA || type == GL_UNSIGNED_BYTE); 56624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian default: 56724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_FALSE; 56824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 56924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 57024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 57124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 57224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/* XXX: Do this for TexSubImage also: 57324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 57424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic GLboolean 57524df8f895fe8807aa2ba058e71bd40adfc01d21eBriantry_pbo_upload(GLcontext *ctx, 57624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *intelImage, 57724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_pixelstore_attrib *unpack, 57824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint internalFormat, 57924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint width, GLint height, 58024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, const void *pixels) 58124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 58224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_FALSE; /* XXX fix flushing/locking/blitting below */ 58324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 000 58424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct intel_context *intel = intel_context(ctx); 58524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct intel_buffer_object *pbo = intel_buffer_object(unpack->BufferObj); 58624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint src_offset, src_stride; 58724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint dst_offset, dst_stride; 58824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 58924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!pbo || 59024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ctx._ImageTransferState || 59124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian unpack->SkipPixels || unpack->SkipRows) { 59224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_printf("%s: failure 1\n", __FUNCTION__); 59324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_FALSE; 59424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 59524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 59624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian src_offset = (GLuint) pixels; 59724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 59824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (unpack->RowLength > 0) 59924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian src_stride = unpack->RowLength; 60024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else 60124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian src_stride = width; 60224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 60324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian dst_offset = st_miptree_image_offset(intelImage->mt, 60424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->face, 60524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->level); 60624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 60724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian dst_stride = intelImage->mt->pitch; 60824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 60924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelFlush(&intel->ctx); 61024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian LOCK_HARDWARE(intel); 61124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian { 61224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct _DriBufferObject *src_buffer = 61324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intel_bufferobj_buffer(intel, pbo, INTEL_READ); 61424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 61524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Temporary hack: cast to _DriBufferObject: 61624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 61724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct _DriBufferObject *dst_buffer = 61824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (struct _DriBufferObject *)intelImage->mt->region->buffer; 61924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 62024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 62124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelEmitCopyBlit(intel, 62224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->mt->cpp, 62324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian src_stride, src_buffer, src_offset, 62424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian dst_stride, dst_buffer, dst_offset, 62524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 0, 0, 0, 0, width, height, 62624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GL_COPY); 62724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 62824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intel_batchbuffer_flush(intel->batch); 62924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 63024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian UNLOCK_HARDWARE(intel); 63124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 63224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_TRUE; 63324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 63424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 63524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 63624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 63724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 63824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic GLboolean 63924df8f895fe8807aa2ba058e71bd40adfc01d21eBriantry_pbo_zcopy(GLcontext *ctx, 64024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *intelImage, 64124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_pixelstore_attrib *unpack, 64224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint internalFormat, 64324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint width, GLint height, 64424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, const void *pixels) 64524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 64624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_FALSE; 64724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 64824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 64924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 65024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 65124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 65224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 65324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 65424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 65524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage(GLcontext * ctx, 65624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint dims, 65724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum target, GLint level, 65824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint internalFormat, 65924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint width, GLint height, GLint depth, 66024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint border, 66124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, const void *pixels, 66224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_pixelstore_attrib *unpack, 66324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 66424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage, GLsizei imageSize, int compressed) 66524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 66624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct pipe_context *pipe = ctx->st->pipe; 66724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_object *intelObj = st_texture_object(texObj); 66824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *intelImage = st_texture_image(texImage); 66924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint postConvWidth = width; 67024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint postConvHeight = height; 67124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint texelBytes, sizeInBytes; 67224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint dstRowStride; 67324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 67424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 67524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s target %s level %d %dx%dx%d border %d\n", __FUNCTION__, 67624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_lookup_enum_by_nr(target), level, width, height, depth, border); 67724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 67824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 67924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelFlush(ctx); 68024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 68124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 68224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->face = target_to_face(target); 68324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->level = level; 68424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 68524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (ctx->_ImageTransferState & IMAGE_CONVOLUTION_BIT) { 68624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_adjust_image_for_convolution(ctx, dims, &postConvWidth, 68724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &postConvHeight); 68824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 68924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 69024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* choose the texture format */ 69124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->TexFormat = st_ChooseTextureFormat(ctx, internalFormat, 69224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type); 69324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 69424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_set_fetch_functions(texImage, dims); 69524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 69624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (texImage->TexFormat->TexelBytes == 0) { 69724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* must be a compressed format */ 69824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texelBytes = 0; 69924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->IsCompressed = GL_TRUE; 70024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->CompressedSize = 70124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ctx->Driver.CompressedTextureSize(ctx, texImage->Width, 70224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Height, texImage->Depth, 70324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->TexFormat->MesaFormat); 70424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } else { 70524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texelBytes = texImage->TexFormat->TexelBytes; 70624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 70724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Minimum pitch of 32 bytes */ 70824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (postConvWidth * texelBytes < 32) { 70924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian postConvWidth = 32 / texelBytes; 71024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->RowStride = postConvWidth; 71124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 71224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 71324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(texImage->RowStride == postConvWidth); 71424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 71524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 71624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Release the reference to a potentially orphaned buffer. 71724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Release any old malloced memory. 71824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 71924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelImage->mt) { 72024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_release(pipe, &intelImage->mt); 72124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(!texImage->Data); 72224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 72324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else if (texImage->Data) { 72424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_align_free(texImage->Data); 72524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 72624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 72724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* If this is the only texture image in the tree, could call 72824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * bmBufferData with NULL data to free the old block and avoid 72924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * waiting on any outstanding fences. 73024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 73124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelObj->mt && 73224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt->first_level == level && 73324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt->last_level == level && 73424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt->target != GL_TEXTURE_CUBE_MAP_ARB && 73524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian !st_miptree_match_image(intelObj->mt, &intelImage->base, 73624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->face, intelImage->level)) { 73724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 73824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("release it\n"); 73924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_release(pipe, &intelObj->mt); 74024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(!intelObj->mt); 74124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 74224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 74324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!intelObj->mt) { 74424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian guess_and_alloc_mipmap_tree(pipe, intelObj, intelImage); 74524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!intelObj->mt) { 74624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("guess_and_alloc_mipmap_tree: failed\n"); 74724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 74824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 74924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 75024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(!intelImage->mt); 75124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 75224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelObj->mt && 75324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_match_image(intelObj->mt, &intelImage->base, 75424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->face, intelImage->level)) { 75524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 75624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_reference(&intelImage->mt, intelObj->mt); 75724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(intelImage->mt); 75824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 75924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 76024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!intelImage->mt) 76124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("XXX: Image did not fit into tree - storing in local memory!\n"); 76224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 76324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 /* XXX FIX when st_buffer_objects are in place */ 76424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* PBO fastpaths: 76524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 76624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (dims <= 2 && 76724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->mt && 76824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intel_buffer_object(unpack->BufferObj) && 76924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian check_pbo_format(internalFormat, format, 77024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian type, intelImage->base.TexFormat)) { 77124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 77224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("trying pbo upload\n"); 77324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 77424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Attempt to texture directly from PBO data (zero copy upload). 77524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 77624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Currently disable as it can lead to worse as well as better 77724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * performance (in particular when pipe_region_cow() is 77824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * required). 77924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 78024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelObj->mt == intelImage->mt && 78124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt->first_level == level && 78224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt->last_level == level) { 78324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 78424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (try_pbo_zcopy(intel, intelImage, unpack, 78524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian internalFormat, 78624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, height, format, type, pixels)) { 78724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 78824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("pbo zcopy upload succeeded\n"); 78924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return; 79024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 79124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 79224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 79324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 79424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Otherwise, attempt to use the blitter for PBO image uploads. 79524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 79624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (try_pbo_upload(intel, intelImage, unpack, 79724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian internalFormat, 79824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, height, format, type, pixels)) { 79924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("pbo upload succeeded\n"); 80024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return; 80124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 80224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 80324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("pbo upload failed\n"); 80424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 80524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#else 80624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (void) try_pbo_upload; 80724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (void) check_pbo_format; 80824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (void) try_pbo_zcopy; 80924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 81024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 81124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 81224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* intelCopyTexImage calls this function with pixels == NULL, with 81324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * the expectation that the mipmap tree will be set up but nothing 81424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * more will be done. This is where those calls return: 81524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 81624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (compressed) { 81724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, pixels, 81824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian unpack, 81924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "glCompressedTexImage"); 82024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } else { 82124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, 1, 82224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type, 82324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels, unpack, "glTexImage"); 82424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 82524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!pixels) 82624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return; 82724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 82824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 82924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelImage->mt) 83024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pipe->region_idle(pipe, intelImage->mt->region); 83124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 83224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 83324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian LOCK_HARDWARE(intel); 83424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 83524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 83624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelImage->mt) { 83724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = st_miptree_image_map(pipe, 83824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->mt, 83924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->face, 84024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->level, 84124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &dstRowStride, 84224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelImage->base.ImageOffsets); 84324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 84424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 84524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Allocate regular memory and store the image there temporarily. */ 84624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (texImage->IsCompressed) { 84724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian sizeInBytes = texImage->CompressedSize; 84824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian dstRowStride = 84924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_compressed_row_stride(texImage->TexFormat->MesaFormat, width); 85024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(dims != 3); 85124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 85224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 85324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian dstRowStride = postConvWidth * texelBytes; 85424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian sizeInBytes = depth * dstRowStride * postConvHeight; 85524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 85624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 85724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = malloc(sizeInBytes); 85824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 85924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 86024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("Upload image %dx%dx%d row_len %x pitch %x\n", 86124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, height, depth, width * texelBytes, dstRowStride); 86224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 86324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Copy data. Would like to know when it's ok for us to eg. use 86424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * the blitter to copy. Or, use the hardware to do the format 86524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * conversion and copy: 86624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 86724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (compressed) { 86824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian memcpy(texImage->Data, pixels, imageSize); 86924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 87024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else if (!texImage->TexFormat->StoreImage(ctx, dims, 87124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->_BaseFormat, 87224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->TexFormat, 87324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data, 87424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 0, 0, 0, /* dstX/Y/Zoffset */ 87524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian dstRowStride, 87624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->ImageOffsets, 87724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, height, depth, 87824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type, pixels, unpack)) { 87924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 88024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 88124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 88224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_unmap_teximage_pbo(ctx, unpack); 88324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 88424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelImage->mt) { 88524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_image_unmap(pipe, intelImage->mt); 88624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 88724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 88824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 88924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 89024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian UNLOCK_HARDWARE(intel); 89124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 89224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 89324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 89424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* GL_SGIS_generate_mipmap -- this can be accelerated now. 89524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 89624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (level == texObj->BaseLevel && texObj->GenerateMipmap) { 89724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intel_generate_mipmap(ctx, target, 89824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit], 89924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texObj); 90024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 90124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 90224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 90324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 90424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 90524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 90624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage3D(GLcontext * ctx, 90724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum target, GLint level, 90824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint internalFormat, 90924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint width, GLint height, GLint depth, 91024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint border, 91124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, const void *pixels, 91224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_pixelstore_attrib *unpack, 91324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 91424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage) 91524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 91624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_TexImage(ctx, 3, target, level, 91724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian internalFormat, width, height, depth, border, 91824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type, pixels, unpack, texObj, texImage, 0, 0); 91924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 92024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 92124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 92224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 92324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage2D(GLcontext * ctx, 92424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum target, GLint level, 92524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint internalFormat, 92624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint width, GLint height, GLint border, 92724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, const void *pixels, 92824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_pixelstore_attrib *unpack, 92924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 93024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage) 93124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 93224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_TexImage(ctx, 2, target, level, 93324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian internalFormat, width, height, 1, border, 93424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type, pixels, unpack, texObj, texImage, 0, 0); 93524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 93624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 93724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 93824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 93924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage1D(GLcontext * ctx, 94024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum target, GLint level, 94124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint internalFormat, 94224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint width, GLint border, 94324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, const void *pixels, 94424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_pixelstore_attrib *unpack, 94524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 94624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage) 94724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 94824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_TexImage(ctx, 1, target, level, 94924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian internalFormat, width, 1, 1, border, 95024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type, pixels, unpack, texObj, texImage, 0, 0); 95124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 95224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 95324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 95424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 95524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CompressedTexImage2D( GLcontext *ctx, GLenum target, GLint level, 95624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint internalFormat, 95724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint width, GLint height, GLint border, 95824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLsizei imageSize, const GLvoid *data, 95924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 96024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage ) 96124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 96224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_TexImage(ctx, 2, target, level, 96324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian internalFormat, width, height, 1, border, 96424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 0, 0, data, &ctx->Unpack, texObj, texImage, imageSize, 1); 96524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 96624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 96724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 96824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 96924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Need to map texture image into memory before copying image data, 97024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * then unmap it. 97124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 97224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 97324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_get_tex_image(GLcontext * ctx, GLenum target, GLint level, 97424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, GLvoid * pixels, 97524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 97624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage, int compressed) 97724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 97824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* 97924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct intel_context *intel = intel_context(ctx); 98024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 98124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct pipe_context *pipe = ctx->st->pipe; 98224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 98324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 98424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Map */ 98524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (stImage->mt) { 98624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Image is stored in hardware format in a buffer managed by the 98724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * kernel. Need to explicitly map and unmap it. 98824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 98924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.Data = 99024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_image_map(pipe, 99124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->mt, 99224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->face, 99324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->level, 99424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &stImage->base.RowStride, 99524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.ImageOffsets); 99624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.RowStride /= stImage->mt->cpp; 99724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 99824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 99924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Otherwise, the image should actually be stored in 100024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * stImage->base.Data. This is pretty confusing for 100124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * everybody, I'd much prefer to separate the two functions of 100224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * texImage->Data - storage for texture images in main memory 100324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * and access (ie mappings) of images. In other words, we'd 100424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * create a new texImage->Map field and leave Data simply for 100524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * storage. 100624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 100724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(stImage->base.Data); 100824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 100924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 101024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 101124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (compressed) { 101224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_get_compressed_teximage(ctx, target, level, pixels, 101324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texObj, texImage); 101424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } else { 101524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_get_teximage(ctx, target, level, format, type, pixels, 101624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texObj, texImage); 101724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 101824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 101924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 102024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Unmap */ 102124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (stImage->mt) { 102224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_image_unmap(pipe, stImage->mt); 102324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.Data = NULL; 102424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 102524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 102624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 102724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 102824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 102924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_GetTexImage(GLcontext * ctx, GLenum target, GLint level, 103024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, GLvoid * pixels, 103124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 103224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage) 103324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 103424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_get_tex_image(ctx, target, level, format, type, pixels, 103524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texObj, texImage, 0); 103624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 103724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 103824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 103924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 104024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_GetCompressedTexImage(GLcontext *ctx, GLenum target, GLint level, 104124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLvoid *pixels, 104224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_texture_object *texObj, 104324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_texture_image *texImage) 104424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 104524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_get_tex_image(ctx, target, level, 0, 0, pixels, 104624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (struct gl_texture_object *) texObj, 104724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (struct gl_texture_image *) texImage, 1); 104824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 104924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 105024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 105124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 105224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 105324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexSubimage(GLcontext * ctx, 105424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint dims, 105524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum target, GLint level, 105624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint yoffset, GLint zoffset, 105724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint width, GLint height, GLint depth, 105824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, const void *pixels, 105924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_pixelstore_attrib *packing, 106024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 106124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage) 106224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 106324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct pipe_context *pipe = ctx->st->pipe; 106424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 106524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint dstRowStride; 106624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 106724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s target %s level %d offset %d,%d %dx%d\n", __FUNCTION__, 106824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_lookup_enum_by_nr(target), 106924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian level, xoffset, yoffset, width, height); 107024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 107124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 107224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelFlush(ctx); 107324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 107424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 107524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = 107624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, format, 107724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian type, pixels, packing, "glTexSubImage2D"); 107824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!pixels) 107924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return; 108024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 108124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (stImage->mt) 108224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pipe->region_idle(pipe, stImage->mt->region); 108324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 108424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 108524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian LOCK_HARDWARE(intel); 108624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 108724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 108824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Map buffer if necessary. Need to lock to prevent other contexts 108924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * from uploading the buffer under us. 109024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 109124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (stImage->mt) 109224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = st_miptree_image_map(pipe, 109324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->mt, 109424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->face, 109524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->level, 109624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &dstRowStride, 109724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->ImageOffsets); 109824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 109924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(dstRowStride); 110024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 110124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!texImage->TexFormat->StoreImage(ctx, dims, texImage->_BaseFormat, 110224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->TexFormat, 110324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data, 110424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian xoffset, yoffset, zoffset, 110524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian dstRowStride, 110624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->ImageOffsets, 110724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, height, depth, 110824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type, pixels, packing)) { 110924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_error(ctx, GL_OUT_OF_MEMORY, "intelTexSubImage"); 111024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 111124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 111224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 111324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* GL_SGIS_generate_mipmap */ 111424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (level == texObj->BaseLevel && texObj->GenerateMipmap) { 111524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_generate_mipmap(ctx, target, 111624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit], 111724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texObj); 111824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 111924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 112024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 112124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_unmap_teximage_pbo(ctx, packing); 112224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 112324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (stImage->mt) { 112424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_image_unmap(pipe, stImage->mt); 112524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 112624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 112724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 112824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 112924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian UNLOCK_HARDWARE(intel); 113024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 113124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 113224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 113324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 113424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 113524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 113624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexSubImage3D(GLcontext * ctx, 113724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum target, 113824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint level, 113924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint yoffset, GLint zoffset, 114024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLsizei width, GLsizei height, GLsizei depth, 114124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, 114224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const GLvoid * pixels, 114324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_pixelstore_attrib *packing, 114424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 114524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage) 114624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 114724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_TexSubimage(ctx, 3, 114824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian target, level, 114924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian xoffset, yoffset, zoffset, 115024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, height, depth, 115124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type, pixels, packing, texObj, texImage); 115224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 115324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 115424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 115524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 115624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 115724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexSubImage2D(GLcontext * ctx, 115824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum target, 115924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint level, 116024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint yoffset, 116124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLsizei width, GLsizei height, 116224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, 116324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const GLvoid * pixels, 116424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_pixelstore_attrib *packing, 116524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 116624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage) 116724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 116824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_TexSubimage(ctx, 2, 116924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian target, level, 117024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian xoffset, yoffset, 0, 117124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, height, 1, 117224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type, pixels, packing, texObj, texImage); 117324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 117424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 117524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 117624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 117724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexSubImage1D(GLcontext * ctx, 117824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum target, 117924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint level, 118024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, 118124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLsizei width, 118224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, 118324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const GLvoid * pixels, 118424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_pixelstore_attrib *packing, 118524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 118624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage) 118724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 118824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_TexSubimage(ctx, 1, 118924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian target, level, 119024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian xoffset, 0, 0, 119124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, 1, 1, 119224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type, pixels, packing, texObj, texImage); 119324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 119424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 119524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 119624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 119724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 119824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Get the pipe_region which is the source for any glCopyTex[Sub]Image call. 119924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 120024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Do the best we can using the blitter. A future project is to use 120124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * the texture engine and fragment programs for these copies. 120224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 120324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic const struct pipe_region * 120424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianget_teximage_source(GLcontext *ctx, GLenum internalFormat) 120524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 120624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 00 120724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct intel_renderbuffer *irb; 120824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 120924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s %s\n", __FUNCTION__, 121024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_lookup_enum_by_nr(internalFormat)); 121124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 121224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian switch (internalFormat) { 121324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_DEPTH_COMPONENT: 121424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_DEPTH_COMPONENT16_ARB: 121524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian irb = intel_get_renderbuffer(intel->ctx.ReadBuffer, BUFFER_DEPTH); 121624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (irb && irb->region && irb->region->cpp == 2) 121724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return irb->region; 121824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return NULL; 121924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_DEPTH24_STENCIL8_EXT: 122024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_DEPTH_STENCIL_EXT: 122124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian irb = intel_get_renderbuffer(intel->ctx.ReadBuffer, BUFFER_DEPTH); 122224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (irb && irb->region && irb->region->cpp == 4) 122324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return irb->region; 122424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return NULL; 122524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGBA: 122624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGBA8: 122724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return intel_readbuf_region(intel); 122824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_RGB: 122924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intel->intelScreen->front.cpp == 2) 123024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return intel_readbuf_region(intel); 123124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return NULL; 123224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian default: 123324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return NULL; 123424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 123524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#else 123624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return NULL; 123724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 123824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 123924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 124024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 124124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic GLboolean 124224df8f895fe8807aa2ba058e71bd40adfc01d21eBriando_copy_texsubimage(GLcontext *ctx, 124324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage, 124424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat, 124524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint dstx, GLint dsty, 124624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLsizei height) 124724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 124824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct pipe_region *src = 124924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian get_teximage_source(ctx, internalFormat); 125024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 125124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!stImage->mt || !src) { 12526da9234fd437f97267e7831f034c78b31156d939Brian DBG("%s fail %p %p\n", __FUNCTION__, (void *) stImage->mt, (void *) src); 125324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_FALSE; 125424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 125524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 125624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 00 /* XXX FIX flush/locking */ 125724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelFlush(ctx); 125824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* XXX still need the lock ? */ 125924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian LOCK_HARDWARE(intel); 126024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 126124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 126224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian { 126324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint image_offset = st_miptree_image_offset(stImage->mt, 126424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->face, 126524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->level); 126624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const GLint orig_x = x; 126724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const GLint orig_y = y; 126824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_framebuffer *fb = ctx->DrawBuffer; 126924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 127024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (_mesa_clip_to_region(fb->_Xmin, fb->_Ymin, fb->_Xmax, fb->_Ymax, 127124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &x, &y, &width, &height)) { 127224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Update dst for clipped src. Need to also clip the source rect. 127324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 127424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian dstx += x - orig_x; 127524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian dsty += y - orig_y; 127624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 127724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!(ctx->ReadBuffer->Name == 0)) { 127824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* XXX this looks bogus ? */ 127924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* FBO: invert Y */ 128024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian y = ctx->ReadBuffer->Height - y - 1; 128124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 128224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 128324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* A bit of fiddling to get the blitter to work with -ve 128424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * pitches. But we get a nice inverted blit this way, so it's 128524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * worth it: 128624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 128724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 128824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelEmitCopyBlit(intel, 128924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->mt->cpp, 129024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian -src->pitch, 129124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian src->buffer, 129224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian src->height * src->pitch * src->cpp, 129324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->mt->pitch, 129424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->mt->region->buffer, 129524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian image_offset, 129624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian x, y + height, dstx, dsty, width, height, 129724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GL_COPY); /* ? */ 129824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intel_batchbuffer_flush(intel->batch); 129924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#else 130024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* XXX use pipe->region_copy() ??? */ 130124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (void) image_offset; 130224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 130324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 130424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 130524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 130624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 130724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian UNLOCK_HARDWARE(intel); 130824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 130924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 131024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 131124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* GL_SGIS_generate_mipmap -- this can be accelerated now. 131224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * XXX Add a ctx->Driver.GenerateMipmaps() function? 131324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 131424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (level == texObj->BaseLevel && texObj->GenerateMipmap) { 131524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intel_generate_mipmap(ctx, target, 131624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit], 131724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texObj); 131824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 131924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 132024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 132124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_TRUE; 132224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 132324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 132424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 132524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 132624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexImage1D(GLcontext * ctx, GLenum target, GLint level, 132724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat, 132824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLint border) 132924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 133024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_unit *texUnit = 133124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 133224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj = 133324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_object(ctx, texUnit, target); 133424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage = 133524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_image(ctx, texObj, target, level); 133624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 133724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (border) 133824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian goto fail; 133924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 134024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Setup or redefine the texture object, mipmap tree and texture 134124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * image. Don't populate yet. 134224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 134324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ctx->Driver.TexImage1D(ctx, target, level, internalFormat, 134424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, border, 134524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GL_RGBA, CHAN_TYPE, NULL, 134624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->DefaultPacking, texObj, texImage); 134724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 134824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!do_copy_texsubimage(ctx, 134924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_texture_image(texImage), 135024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian internalFormat, 0, 0, x, y, width, 1)) 135124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian goto fail; 135224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 135324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return; 135424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 135524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian fail: 135624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 135724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _swrast_copy_teximage1d(ctx, target, level, internalFormat, x, y, 135824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, border); 135924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 136024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ; 136124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 136224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 136324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 136424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 136524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexImage2D(GLcontext * ctx, GLenum target, GLint level, 136624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat, 136724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLsizei height, 136824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint border) 136924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 137024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_unit *texUnit = 137124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 137224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj = 137324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_object(ctx, texUnit, target); 137424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage = 137524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_image(ctx, texObj, target, level); 137624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 137724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (border) 137824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian goto fail; 137924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 138024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Setup or redefine the texture object, mipmap tree and texture 138124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * image. Don't populate yet. 138224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 138324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ctx->Driver.TexImage2D(ctx, target, level, internalFormat, 138424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, height, border, 138524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GL_RGBA, CHAN_TYPE, NULL, 138624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->DefaultPacking, texObj, texImage); 138724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 138824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 138924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!do_copy_texsubimage(ctx, 139024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_texture_image(texImage), 139124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian internalFormat, 0, 0, x, y, width, height)) 139224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian goto fail; 139324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 139424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return; 139524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 139624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian fail: 139724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 139824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _swrast_copy_teximage2d(ctx, target, level, internalFormat, x, y, 139924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, height, border); 140024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 140124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(0); 140224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 140324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 140424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 140524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 140624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexSubImage1D(GLcontext * ctx, GLenum target, GLint level, 140724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint x, GLint y, GLsizei width) 140824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 140924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_unit *texUnit = 141024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 141124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj = 141224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_object(ctx, texUnit, target); 141324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage = 141424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_image(ctx, texObj, target, level); 141524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat = texImage->InternalFormat; 141624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 141724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* XXX need to check <border> as in above function? */ 141824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 141924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Need to check texture is compatible with source format. 142024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 142124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 142224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!do_copy_texsubimage(ctx, 142324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_texture_image(texImage), 142424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian internalFormat, xoffset, 0, x, y, width, 1)) { 142524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 142624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _swrast_copy_texsubimage1d(ctx, target, level, xoffset, x, y, width); 142724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 142824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(0); 142924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 143024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 143124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 143224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 143324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 143424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexSubImage2D(GLcontext * ctx, GLenum target, GLint level, 143524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint yoffset, 143624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLsizei height) 143724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 143824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_unit *texUnit = 143924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 144024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj = 144124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_object(ctx, texUnit, target); 144224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage = 144324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_image(ctx, texObj, target, level); 144424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat = texImage->InternalFormat; 144524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 144624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 144724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Need to check texture is compatible with source format. 144824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 144924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 145024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!do_copy_texsubimage(ctx, 145124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_texture_image(texImage), 145224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian internalFormat, 145324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian xoffset, yoffset, x, y, width, height)) { 145424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 145524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _swrast_copy_texsubimage2d(ctx, target, level, 145624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian xoffset, yoffset, x, y, width, height); 145724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 145824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(0); 145924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 146024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 146124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 146224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 146324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 146424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 146524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 146624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Compute which mipmap levels that really need to be sent to the hardware. 146724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * This depends on the base image size, GL_TEXTURE_MIN_LOD, 146824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * GL_TEXTURE_MAX_LOD, GL_TEXTURE_BASE_LEVEL, and GL_TEXTURE_MAX_LEVEL. 146924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 147024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 147124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianintel_calculate_first_last_level(struct st_texture_object *intelObj) 147224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 147324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *tObj = &intelObj->base; 147424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian const struct gl_texture_image *const baseImage = 147524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian tObj->Image[0][tObj->BaseLevel]; 147624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 147724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* These must be signed values. MinLod and MaxLod can be negative numbers, 147824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * and having firstLevel and lastLevel as signed prevents the need for 147924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * extra sign checks. 148024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 148124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian int firstLevel; 148224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian int lastLevel; 148324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 148424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Yes, this looks overly complicated, but it's all needed. 148524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 148624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian switch (tObj->Target) { 148724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_TEXTURE_1D: 148824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_TEXTURE_2D: 148924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_TEXTURE_3D: 149024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_TEXTURE_CUBE_MAP: 149124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (tObj->MinFilter == GL_NEAREST || tObj->MinFilter == GL_LINEAR) { 149224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* GL_NEAREST and GL_LINEAR only care about GL_TEXTURE_BASE_LEVEL. 149324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 149424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstLevel = lastLevel = tObj->BaseLevel; 149524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 149624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 149724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstLevel = tObj->BaseLevel + (GLint) (tObj->MinLod + 0.5); 149824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstLevel = MAX2(firstLevel, tObj->BaseLevel); 149924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian lastLevel = tObj->BaseLevel + (GLint) (tObj->MaxLod + 0.5); 150024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian lastLevel = MAX2(lastLevel, tObj->BaseLevel); 150124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian lastLevel = MIN2(lastLevel, tObj->BaseLevel + baseImage->MaxLog2); 150224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian lastLevel = MIN2(lastLevel, tObj->MaxLevel); 150324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian lastLevel = MAX2(firstLevel, lastLevel); /* need at least one level */ 150424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 150524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian break; 150624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_TEXTURE_RECTANGLE_NV: 150724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian case GL_TEXTURE_4D_SGIS: 150824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstLevel = lastLevel = 0; 150924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian break; 151024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian default: 151124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return; 151224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 151324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 151424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* save these values */ 151524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->firstLevel = firstLevel; 151624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->lastLevel = lastLevel; 151724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 151824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 151924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 152024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 152124df8f895fe8807aa2ba058e71bd40adfc01d21eBriancopy_image_data_to_tree(struct pipe_context *pipe, 152224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_object *intelObj, 152324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage) 152424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 152524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (stImage->mt) { 152624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Copy potentially with the blitter: 152724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 152824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_image_copy(pipe, 152924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt, 153024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->face, 153124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->level, stImage->mt); 153224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 153324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_release(pipe, &stImage->mt); 153424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 153524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 153624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(stImage->base.Data != NULL); 153724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 153824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* More straightforward upload. 153924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 154024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_image_data(pipe, 154124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt, 154224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->face, 154324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->level, 154424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.Data, 154524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.RowStride, 154624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.RowStride * 154724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.Height); 154824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_align_free(stImage->base.Data); 154924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.Data = NULL; 155024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 155124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 155224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_reference(&stImage->mt, intelObj->mt); 155324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 155424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 155524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 155624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/* 155724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 155824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianGLuint 155924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_finalize_mipmap_tree(GLcontext *ctx, 156024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct pipe_context *pipe, GLuint unit, 156124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLboolean *needFlush) 156224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 156324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current; 156424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_object *intelObj = st_texture_object(tObj); 156524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian int comp_byte = 0; 156624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian int cpp; 156724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 156824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint face, i; 156924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint nr_faces = 0; 157024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *firstImage; 157124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 157224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian *needFlush = GL_FALSE; 157324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 157424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* We know/require this is true by now: 157524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 157624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(intelObj->base._Complete); 157724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 157824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* What levels must the tree include at a minimum? 157924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 158024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intel_calculate_first_last_level(intelObj); 158124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstImage = 158224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_texture_image(intelObj->base.Image[0][intelObj->firstLevel]); 158324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 158424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Fallback case: 158524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 158624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (firstImage->base.Border) { 158724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelObj->mt) { 158824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_release(pipe, &intelObj->mt); 158924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 159024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_FALSE; 159124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 159224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 159324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 159424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* If both firstImage and intelObj have a tree which can contain 159524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * all active images, favour firstImage. Note that because of the 159624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * completeness requirement, we know that the image dimensions 159724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * will match. 159824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 159924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (firstImage->mt && 160024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstImage->mt != intelObj->mt && 160124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstImage->mt->first_level <= intelObj->firstLevel && 160224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstImage->mt->last_level >= intelObj->lastLevel) { 160324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 160424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelObj->mt) 160524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_release(pipe, &intelObj->mt); 160624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 160724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_reference(&intelObj->mt, firstImage->mt); 160824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 160924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 161024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (firstImage->base.IsCompressed) { 161124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian comp_byte = intel_compressed_num_bytes(firstImage->base.TexFormat->MesaFormat); 161224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian cpp = comp_byte; 161324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 161424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else cpp = firstImage->base.TexFormat->TexelBytes; 161524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 161624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Check tree can hold all active levels. Check tree matches 161724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * target, imageFormat, etc. 161824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 161924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * XXX: For some layouts (eg i945?), the test might have to be 162024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * first_level == firstLevel, as the tree isn't valid except at the 162124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * original start level. Hope to get around this by 162224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * programming minLod, maxLod, baseLevel into the hardware and 162324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * leaving the tree alone. 162424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 162524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelObj->mt && 162624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (intelObj->mt->target != intelObj->base.Target || 162724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt->internal_format != firstImage->base.InternalFormat || 162824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt->first_level != intelObj->firstLevel || 162924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt->last_level != intelObj->lastLevel || 163024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt->width0 != firstImage->base.Width || 163124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt->height0 != firstImage->base.Height || 163224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt->depth0 != firstImage->base.Depth || 163324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt->cpp != cpp || 163424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt->compressed != firstImage->base.IsCompressed)) { 163524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_release(pipe, &intelObj->mt); 163624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 163724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 163824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 163924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* May need to create a new tree: 164024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 164124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!intelObj->mt) { 164224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->mt = st_miptree_create(pipe, 164324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->base.Target, 164424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstImage->base.InternalFormat, 164524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->firstLevel, 164624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intelObj->lastLevel, 164724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstImage->base.Width, 164824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstImage->base.Height, 164924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian firstImage->base.Depth, 165024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian cpp, 165124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian comp_byte); 165224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 165324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 165424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Pull in any images not in the object's tree: 165524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 165624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian nr_faces = (intelObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 165724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian for (face = 0; face < nr_faces; face++) { 165824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian for (i = intelObj->firstLevel; i <= intelObj->lastLevel; i++) { 165924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = 166024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_texture_image(intelObj->base.Image[face][i]); 166124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 166224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Need to import images in main memory or held in other trees. 166324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 166424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (intelObj->mt != stImage->mt) { 166524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian copy_image_data_to_tree(pipe, intelObj, stImage); 166624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian *needFlush = GL_TRUE; 166724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 166824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 166924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 167024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 167124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /** 167224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (need_flush) 167324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian intel_batchbuffer_flush(intel->batch); 167424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian **/ 167524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 167624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_TRUE; 167724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 167824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 167924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 168024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#if 0 /* unused? */ 168124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianvoid 168224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_tex_map_images(struct pipe_context *pipe, 168324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_object *intelObj) 168424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 168524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint nr_faces = (intelObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 168624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint face, i; 168724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 168824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 168924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 169024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian for (face = 0; face < nr_faces; face++) { 169124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian for (i = intelObj->firstLevel; i <= intelObj->lastLevel; i++) { 169224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = 169324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_texture_image(intelObj->base.Image[face][i]); 169424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 169524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (stImage->mt) { 169624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.Data = 169724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_image_map(pipe, 169824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->mt, 169924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->face, 170024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->level, 170124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &stImage->base.RowStride, 170224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.ImageOffsets); 170324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* convert stride to texels, not bytes */ 170424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.RowStride /= stImage->mt->cpp; 170524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/* stImage->base.ImageStride /= stImage->mt->cpp; */ 170624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 170724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 170824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 170924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 171024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 171124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 171224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 171324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianvoid 171424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_tex_unmap_images(struct pipe_context *pipe, 171524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_object *intelObj) 171624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 171724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint nr_faces = (intelObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 171824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint face, i; 171924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 172024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian for (face = 0; face < nr_faces; face++) { 172124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian for (i = intelObj->firstLevel; i <= intelObj->lastLevel; i++) { 172224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = 172324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_texture_image(intelObj->base.Image[face][i]); 172424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 172524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (stImage->mt) { 172624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian st_miptree_image_unmap(pipe, stImage->mt); 172724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.Data = NULL; 172824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 172924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 173024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 173124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 173224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 173324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 173424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 173524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 173624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 17376da9234fd437f97267e7831f034c78b31156d939Brianvoid 17386da9234fd437f97267e7831f034c78b31156d939Brianst_init_texture_functions(struct dd_function_table *functions) 173924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 174024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->ChooseTextureFormat = st_ChooseTextureFormat; 174124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage1D = st_TexImage1D; 174224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage2D = st_TexImage2D; 174324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage3D = st_TexImage3D; 174424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage1D = st_TexSubImage1D; 174524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage2D = st_TexSubImage2D; 174624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage3D = st_TexSubImage3D; 174724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexImage1D = st_CopyTexImage1D; 174824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexImage2D = st_CopyTexImage2D; 174924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexSubImage1D = st_CopyTexSubImage1D; 175024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexSubImage2D = st_CopyTexSubImage2D; 175124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->GetTexImage = st_GetTexImage; 175224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 175324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* compressed texture functions */ 175424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CompressedTexImage2D = st_CompressedTexImage2D; 175524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->GetCompressedTexImage = st_GetCompressedTexImage; 175624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 175724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->NewTextureObject = st_NewTextureObject; 175824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->NewTextureImage = st_NewTextureImage; 175924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->DeleteTexture = st_DeleteTextureObject; 176024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->FreeTexImageData = st_FreeTextureImageData; 176124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->UpdateTexturePalette = 0; 176224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->IsTextureResident = st_IsTextureResident; 176324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 176424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TextureMemCpy = do_memcpy; 176524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 1766