Merge branch 'mesa_7_5_branch'
[mesa.git] / src / mesa / drivers / dri / intel / intel_tex_subimage.c
1
2 /**************************************************************************
3 *
4 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
5 * All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the
9 * "Software"), to deal in the Software without restriction, including
10 * without limitation the rights to use, copy, modify, merge, publish,
11 * distribute, sub license, and/or sell copies of the Software, and to
12 * permit persons to whom the Software is furnished to do so, subject to
13 * the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the
16 * next paragraph) shall be included in all copies or substantial portions
17 * of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 *
27 **************************************************************************/
28
29 #include "main/mtypes.h"
30 #include "main/texobj.h"
31 #include "main/texstore.h"
32 #include "main/texcompress.h"
33 #include "main/enums.h"
34
35 #include "intel_context.h"
36 #include "intel_tex.h"
37 #include "intel_mipmap_tree.h"
38
39 #define FILE_DEBUG_FLAG DEBUG_TEXTURE
40
41 static void
42 intelTexSubimage(GLcontext * ctx,
43 GLint dims,
44 GLenum target, GLint level,
45 GLint xoffset, GLint yoffset, GLint zoffset,
46 GLint width, GLint height, GLint depth,
47 GLenum format, GLenum type, const void *pixels,
48 const struct gl_pixelstore_attrib *packing,
49 struct gl_texture_object *texObj,
50 struct gl_texture_image *texImage)
51 {
52 struct intel_context *intel = intel_context(ctx);
53 struct intel_texture_image *intelImage = intel_texture_image(texImage);
54 GLuint dstRowStride = 0;
55
56 DBG("%s target %s level %d offset %d,%d %dx%d\n", __FUNCTION__,
57 _mesa_lookup_enum_by_nr(target),
58 level, xoffset, yoffset, width, height);
59
60 intelFlush(ctx);
61
62 pixels =
63 _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, format,
64 type, pixels, packing, "glTexSubImage2D");
65 if (!pixels)
66 return;
67
68 LOCK_HARDWARE(intel);
69
70 /* Map buffer if necessary. Need to lock to prevent other contexts
71 * from uploading the buffer under us.
72 */
73 if (intelImage->mt)
74 texImage->Data = intel_miptree_image_map(intel,
75 intelImage->mt,
76 intelImage->face,
77 intelImage->level,
78 &dstRowStride,
79 texImage->ImageOffsets);
80 else {
81 if (texImage->IsCompressed) {
82 dstRowStride =
83 _mesa_compressed_row_stride(texImage->TexFormat->MesaFormat, width);
84 assert(dims != 3);
85 }
86 else {
87 dstRowStride = texImage->RowStride * texImage->TexFormat->TexelBytes;
88 }
89 }
90
91 assert(dstRowStride);
92
93 if (!texImage->TexFormat->StoreImage(ctx, dims, texImage->_BaseFormat,
94 texImage->TexFormat,
95 texImage->Data,
96 xoffset, yoffset, zoffset,
97 dstRowStride,
98 texImage->ImageOffsets,
99 width, height, depth,
100 format, type, pixels, packing)) {
101 _mesa_error(ctx, GL_OUT_OF_MEMORY, "intelTexSubImage");
102 }
103
104 _mesa_unmap_teximage_pbo(ctx, packing);
105
106 if (intelImage->mt) {
107 intel_miptree_image_unmap(intel, intelImage->mt);
108 texImage->Data = NULL;
109 }
110
111 UNLOCK_HARDWARE(intel);
112
113 /* GL_SGIS_generate_mipmap */
114 if (level == texObj->BaseLevel && texObj->GenerateMipmap) {
115 intel_generate_mipmap(ctx, target, texObj);
116 }
117 }
118
119
120 static void
121 intelTexSubImage3D(GLcontext * ctx,
122 GLenum target,
123 GLint level,
124 GLint xoffset, GLint yoffset, GLint zoffset,
125 GLsizei width, GLsizei height, GLsizei depth,
126 GLenum format, GLenum type,
127 const GLvoid * pixels,
128 const struct gl_pixelstore_attrib *packing,
129 struct gl_texture_object *texObj,
130 struct gl_texture_image *texImage)
131 {
132 intelTexSubimage(ctx, 3,
133 target, level,
134 xoffset, yoffset, zoffset,
135 width, height, depth,
136 format, type, pixels, packing, texObj, texImage);
137 }
138
139
140 static void
141 intelTexSubImage2D(GLcontext * ctx,
142 GLenum target,
143 GLint level,
144 GLint xoffset, GLint yoffset,
145 GLsizei width, GLsizei height,
146 GLenum format, GLenum type,
147 const GLvoid * pixels,
148 const struct gl_pixelstore_attrib *packing,
149 struct gl_texture_object *texObj,
150 struct gl_texture_image *texImage)
151 {
152 intelTexSubimage(ctx, 2,
153 target, level,
154 xoffset, yoffset, 0,
155 width, height, 1,
156 format, type, pixels, packing, texObj, texImage);
157 }
158
159
160 static void
161 intelTexSubImage1D(GLcontext * ctx,
162 GLenum target,
163 GLint level,
164 GLint xoffset,
165 GLsizei width,
166 GLenum format, GLenum type,
167 const GLvoid * pixels,
168 const struct gl_pixelstore_attrib *packing,
169 struct gl_texture_object *texObj,
170 struct gl_texture_image *texImage)
171 {
172 intelTexSubimage(ctx, 1,
173 target, level,
174 xoffset, 0, 0,
175 width, 1, 1,
176 format, type, pixels, packing, texObj, texImage);
177 }
178
179 static void
180 intelCompressedTexSubImage2D(GLcontext * ctx,
181 GLenum target,
182 GLint level,
183 GLint xoffset, GLint yoffset,
184 GLsizei width, GLsizei height,
185 GLenum format, GLsizei imageSize,
186 const GLvoid * pixels,
187 struct gl_texture_object *texObj,
188 struct gl_texture_image *texImage)
189 {
190 fprintf(stderr, "stubbed CompressedTexSubImage2D: %dx%d@%dx%d\n",
191 width, height, xoffset, yoffset);
192 }
193
194
195
196 void
197 intelInitTextureSubImageFuncs(struct dd_function_table *functions)
198 {
199 functions->TexSubImage1D = intelTexSubImage1D;
200 functions->TexSubImage2D = intelTexSubImage2D;
201 functions->TexSubImage3D = intelTexSubImage3D;
202 functions->CompressedTexSubImage2D = intelCompressedTexSubImage2D;
203 }