i965: Emit zero initialization for NV VP temporaries as required.
[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 GLsizei imageSize,
48 GLenum format, GLenum type, const void *pixels,
49 const struct gl_pixelstore_attrib *packing,
50 struct gl_texture_object *texObj,
51 struct gl_texture_image *texImage,
52 GLboolean compressed)
53 {
54 struct intel_context *intel = intel_context(ctx);
55 struct intel_texture_image *intelImage = intel_texture_image(texImage);
56 GLuint dstRowStride = 0;
57
58 DBG("%s target %s level %d offset %d,%d %dx%d\n", __FUNCTION__,
59 _mesa_lookup_enum_by_nr(target),
60 level, xoffset, yoffset, width, height);
61
62 intelFlush(ctx);
63
64 if (compressed)
65 pixels = _mesa_validate_pbo_compressed_teximage(ctx, imageSize,
66 pixels, packing,
67 "glCompressedTexImage");
68 else
69 pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, depth,
70 format, type, pixels, packing,
71 "glTexSubImage");
72 if (!pixels)
73 return;
74
75 LOCK_HARDWARE(intel);
76
77 /* Map buffer if necessary. Need to lock to prevent other contexts
78 * from uploading the buffer under us.
79 */
80 if (intelImage->mt)
81 texImage->Data = intel_miptree_image_map(intel,
82 intelImage->mt,
83 intelImage->face,
84 intelImage->level,
85 &dstRowStride,
86 texImage->ImageOffsets);
87 else {
88 if (texImage->IsCompressed) {
89 dstRowStride =
90 _mesa_compressed_row_stride(texImage->TexFormat->MesaFormat, width);
91 assert(dims != 3);
92 }
93 else {
94 dstRowStride = texImage->RowStride * texImage->TexFormat->TexelBytes;
95 }
96 }
97
98 assert(dstRowStride);
99
100 if (compressed) {
101 if (intelImage->mt) {
102 struct intel_region *dst = intelImage->mt->region;
103
104 _mesa_copy_rect(texImage->Data, dst->cpp, dst->pitch,
105 xoffset, yoffset / 4,
106 (width + 3) & ~3, (height + 3) / 4,
107 pixels, (width + 3) & ~3, 0, 0);
108 } else
109 memcpy(texImage->Data, pixels, imageSize);
110 }
111 else {
112 if (!texImage->TexFormat->StoreImage(ctx, dims, texImage->_BaseFormat,
113 texImage->TexFormat,
114 texImage->Data,
115 xoffset, yoffset, zoffset,
116 dstRowStride,
117 texImage->ImageOffsets,
118 width, height, depth,
119 format, type, pixels, packing)) {
120 _mesa_error(ctx, GL_OUT_OF_MEMORY, "intelTexSubImage");
121 }
122 }
123
124 _mesa_unmap_teximage_pbo(ctx, packing);
125
126 if (intelImage->mt) {
127 intel_miptree_image_unmap(intel, intelImage->mt);
128 texImage->Data = NULL;
129 }
130
131 UNLOCK_HARDWARE(intel);
132
133 /* GL_SGIS_generate_mipmap */
134 if (level == texObj->BaseLevel && texObj->GenerateMipmap) {
135 intel_generate_mipmap(ctx, target, texObj);
136 }
137 }
138
139
140 static void
141 intelTexSubImage3D(GLcontext * ctx,
142 GLenum target,
143 GLint level,
144 GLint xoffset, GLint yoffset, GLint zoffset,
145 GLsizei width, GLsizei height, GLsizei depth,
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, 3,
153 target, level,
154 xoffset, yoffset, zoffset,
155 width, height, depth, 0,
156 format, type, pixels, packing, texObj, texImage, GL_FALSE);
157 }
158
159
160 static void
161 intelTexSubImage2D(GLcontext * ctx,
162 GLenum target,
163 GLint level,
164 GLint xoffset, GLint yoffset,
165 GLsizei width, GLsizei height,
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, 2,
173 target, level,
174 xoffset, yoffset, 0,
175 width, height, 1, 0,
176 format, type, pixels, packing, texObj, texImage, GL_FALSE);
177 }
178
179
180 static void
181 intelTexSubImage1D(GLcontext * ctx,
182 GLenum target,
183 GLint level,
184 GLint xoffset,
185 GLsizei width,
186 GLenum format, GLenum type,
187 const GLvoid * pixels,
188 const struct gl_pixelstore_attrib *packing,
189 struct gl_texture_object *texObj,
190 struct gl_texture_image *texImage)
191 {
192 intelTexSubimage(ctx, 1,
193 target, level,
194 xoffset, 0, 0,
195 width, 1, 1, 0,
196 format, type, pixels, packing, texObj, texImage, GL_FALSE);
197 }
198
199 static void
200 intelCompressedTexSubImage2D(GLcontext * ctx,
201 GLenum target,
202 GLint level,
203 GLint xoffset, GLint yoffset,
204 GLsizei width, GLsizei height,
205 GLenum format, GLsizei imageSize,
206 const GLvoid * pixels,
207 struct gl_texture_object *texObj,
208 struct gl_texture_image *texImage)
209 {
210 intelTexSubimage(ctx, 2,
211 target, level,
212 xoffset, yoffset, 0,
213 width, height, 1, imageSize,
214 format, 0, pixels, &ctx->Unpack, texObj, texImage, GL_TRUE);
215 }
216
217
218
219 void
220 intelInitTextureSubImageFuncs(struct dd_function_table *functions)
221 {
222 functions->TexSubImage1D = intelTexSubImage1D;
223 functions->TexSubImage2D = intelTexSubImage2D;
224 functions->TexSubImage3D = intelTexSubImage3D;
225 functions->CompressedTexSubImage2D = intelCompressedTexSubImage2D;
226 }