32
* Copies the image's contents at its level into the object's miptree,
33
* and updates the image to point at the object's miptree.
36
copy_image_data_to_tree(struct intel_context *intel,
37
struct intel_texture_object *intelObj,
38
struct intel_texture_image *intelImage)
41
/* Copy potentially with the blitter:
43
intel_miptree_image_copy(intel,
46
intelImage->level, intelImage->mt);
48
intel_miptree_release(intel, &intelImage->mt);
51
assert(intelImage->base.Data != NULL);
53
/* More straightforward upload.
55
intel_miptree_image_data(intel,
59
intelImage->base.Data,
60
intelImage->base.RowStride,
61
intelImage->base.RowStride *
62
intelImage->base.Height);
63
_mesa_align_free(intelImage->base.Data);
64
intelImage->base.Data = NULL;
67
intel_miptree_reference(&intelImage->mt, intelObj->mt);
108
61
* of that, we just always relayout on baselevel change.
110
63
if (intelObj->mt &&
111
(intelObj->mt->target != intelObj->base.Target ||
112
intelObj->mt->format != firstImage->base.TexFormat ||
64
(!intel_miptree_match_image(intelObj->mt, &firstImage->base.Base) ||
113
65
intelObj->mt->first_level != tObj->BaseLevel ||
114
intelObj->mt->last_level < intelObj->_MaxLevel ||
115
intelObj->mt->width0 != firstImage->base.Width ||
116
intelObj->mt->height0 != firstImage->base.Height ||
117
intelObj->mt->depth0 != firstImage->base.Depth)) {
118
intel_miptree_release(intel, &intelObj->mt);
66
intelObj->mt->last_level < intelObj->_MaxLevel)) {
67
intel_miptree_release(&intelObj->mt);
122
71
/* May need to create a new tree:
124
73
if (!intelObj->mt) {
74
intel_miptree_get_dimensions_for_image(&firstImage->base.Base,
75
&width, &height, &depth);
125
77
intelObj->mt = intel_miptree_create(intel,
126
78
intelObj->base.Target,
127
firstImage->base.TexFormat,
79
firstImage->base.Base.TexFormat,
129
81
intelObj->_MaxLevel,
130
firstImage->base.Width,
131
firstImage->base.Height,
132
firstImage->base.Depth,
134
86
if (!intelObj->mt)
138
90
/* Pull in any images not in the object's tree:
154
106
if (intelObj->mt != intelImage->mt &&
155
107
!intelImage->used_as_render_target) {
156
copy_image_data_to_tree(intel, intelObj, intelImage);
108
intel_miptree_copy_teximage(intel, intelImage, intelObj->mt);
165
intel_tex_map_level_images(struct intel_context *intel,
166
struct intel_texture_object *intelObj,
169
GLuint nr_faces = (intelObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1;
172
for (face = 0; face < nr_faces; face++) {
173
struct intel_texture_image *intelImage =
174
intel_texture_image(intelObj->base.Image[face][level]);
176
if (intelImage && intelImage->mt) {
177
intelImage->base.Data =
178
intel_miptree_image_map(intel,
182
&intelImage->base.RowStride,
183
intelImage->base.ImageOffsets);
184
/* convert stride to texels, not bytes */
185
intelImage->base.RowStride /= intelImage->mt->cpp;
186
/* intelImage->base.ImageStride /= intelImage->mt->cpp; */
192
intel_tex_unmap_level_images(struct intel_context *intel,
193
struct intel_texture_object *intelObj,
196
GLuint nr_faces = (intelObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1;
199
for (face = 0; face < nr_faces; face++) {
200
struct intel_texture_image *intelImage =
201
intel_texture_image(intelObj->base.Image[face][level]);
203
if (intelImage && intelImage->mt) {
204
intel_miptree_image_unmap(intel, intelImage->mt);
205
intelImage->base.Data = NULL;
117
* \param mode bitmask of GL_MAP_READ_BIT, GL_MAP_WRITE_BIT
120
intel_tex_map_image_for_swrast(struct intel_context *intel,
121
struct intel_texture_image *intel_image,
126
struct intel_mipmap_tree *mt;
129
if (!intel_image || !intel_image->mt)
132
level = intel_image->base.Base.Level;
133
face = intel_image->base.Base.Face;
134
mt = intel_image->mt;
136
if (mt->target == GL_TEXTURE_3D ||
137
mt->target == GL_TEXTURE_2D_ARRAY ||
138
mt->target == GL_TEXTURE_1D_ARRAY) {
141
/* ImageOffsets[] is only used for swrast's fetch_texel_3d, so we can't
142
* share code with the normal path.
144
for (i = 0; i < mt->level[level].depth; i++) {
145
intel_miptree_get_image_offset(mt, level, face, i, &x, &y);
146
intel_image->base.ImageOffsets[i] = x + y * mt->region->pitch;
149
DBG("%s \n", __FUNCTION__);
151
intel_image->base.Map = intel_region_map(intel, mt->region, mode);
153
assert(intel_image->base.Base.Depth == 1);
154
intel_miptree_get_image_offset(mt, level, face, 0, &x, &y);
156
DBG("%s: (%d,%d) -> (%d, %d)/%d\n",
157
__FUNCTION__, face, level, x, y, mt->region->pitch * mt->cpp);
159
intel_image->base.Map = intel_region_map(intel, mt->region, mode) +
160
(x + y * mt->region->pitch) * mt->cpp;
163
intel_image->base.RowStride = mt->region->pitch;
167
intel_tex_unmap_image_for_swrast(struct intel_context *intel,
168
struct intel_texture_image *intel_image)
170
if (intel_image && intel_image->mt) {
171
intel_region_unmap(intel, intel_image->mt->region);
172
intel_image->base.Map = NULL;
177
* \param mode bitmask of GL_MAP_READ_BIT, GL_MAP_WRITE_BIT
211
180
intel_tex_map_images(struct intel_context *intel,
212
struct intel_texture_object *intelObj)
181
struct intel_texture_object *intelObj,
184
GLuint nr_faces = (intelObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1;
216
187
DBG("%s\n", __FUNCTION__);
218
for (i = intelObj->base.BaseLevel; i <= intelObj->_MaxLevel; i++)
219
intel_tex_map_level_images(intel, intelObj, i);
189
for (i = intelObj->base.BaseLevel; i <= intelObj->_MaxLevel; i++) {
190
for (face = 0; face < nr_faces; face++) {
191
struct intel_texture_image *intel_image =
192
intel_texture_image(intelObj->base.Image[face][i]);
194
intel_tex_map_image_for_swrast(intel, intel_image, mode);
223
200
intel_tex_unmap_images(struct intel_context *intel,
224
struct intel_texture_object *intelObj)
201
struct intel_texture_object *intelObj)
228
for (i = intelObj->base.BaseLevel; i <= intelObj->_MaxLevel; i++)
229
intel_tex_unmap_level_images(intel, intelObj, i);
203
GLuint nr_faces = (intelObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1;
206
for (i = intelObj->base.BaseLevel; i <= intelObj->_MaxLevel; i++) {
207
for (face = 0; face < nr_faces; face++) {
208
struct intel_texture_image *intel_image =
209
intel_texture_image(intelObj->base.Image[face][i]);
211
intel_tex_unmap_image_for_swrast(intel, intel_image);