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