1 #include "main/mtypes.h"
2 #include "main/macros.h"
3 #include "main/samplerobj.h"
4 #include "main/texobj.h"
6 #include "intel_context.h"
7 #include "intel_mipmap_tree.h"
8 #include "intel_blit.h"
10 #include "intel_tex_layout.h"
12 #define FILE_DEBUG_FLAG DEBUG_TEXTURE
15 * When validating, we only care about the texture images that could
16 * be seen, so for non-mipmapped modes we want to ignore everything
20 intel_update_max_level(struct intel_texture_object
*intelObj
,
21 struct gl_sampler_object
*sampler
)
23 struct gl_texture_object
*tObj
= &intelObj
->base
;
26 if (sampler
->MinFilter
== GL_NEAREST
||
27 sampler
->MinFilter
== GL_LINEAR
) {
28 maxlevel
= tObj
->BaseLevel
;
30 maxlevel
= tObj
->_MaxLevel
;
33 if (intelObj
->_MaxLevel
!= maxlevel
) {
34 intelObj
->_MaxLevel
= maxlevel
;
35 intelObj
->needs_validate
= true;
42 intel_finalize_mipmap_tree(struct intel_context
*intel
, GLuint unit
)
44 struct gl_context
*ctx
= &intel
->ctx
;
45 struct gl_texture_object
*tObj
= intel
->ctx
.Texture
.Unit
[unit
]._Current
;
46 struct intel_texture_object
*intelObj
= intel_texture_object(tObj
);
47 struct gl_sampler_object
*sampler
= _mesa_get_samplerobj(ctx
, unit
);
50 struct intel_texture_image
*firstImage
;
51 int width
, height
, depth
;
53 /* TBOs require no validation -- they always just point to their BO. */
54 if (tObj
->Target
== GL_TEXTURE_BUFFER
)
57 /* We know/require this is true by now:
59 assert(intelObj
->base
._BaseComplete
);
61 /* What levels must the tree include at a minimum?
63 intel_update_max_level(intelObj
, sampler
);
64 if (intelObj
->mt
&& intelObj
->mt
->first_level
!= tObj
->BaseLevel
)
65 intelObj
->needs_validate
= true;
67 if (!intelObj
->needs_validate
)
70 firstImage
= intel_texture_image(tObj
->Image
[0][tObj
->BaseLevel
]);
72 /* Check tree can hold all active levels. Check tree matches
73 * target, imageFormat, etc.
75 * For pre-gen4, we have to match first_level == tObj->BaseLevel,
76 * because we don't have the control that gen4 does to make min/mag
77 * determination happen at a nonzero (hardware) baselevel. Because
78 * of that, we just always relayout on baselevel change.
81 (!intel_miptree_match_image(intelObj
->mt
, &firstImage
->base
.Base
) ||
82 intelObj
->mt
->first_level
!= tObj
->BaseLevel
||
83 intelObj
->mt
->last_level
< intelObj
->_MaxLevel
)) {
84 intel_miptree_release(&intelObj
->mt
);
88 /* May need to create a new tree:
91 intel_miptree_get_dimensions_for_image(&firstImage
->base
.Base
,
92 &width
, &height
, &depth
);
94 perf_debug("Creating new %s %dx%dx%d %d..%d miptree to handle finalized "
96 _mesa_get_format_name(firstImage
->base
.Base
.TexFormat
),
97 width
, height
, depth
, tObj
->BaseLevel
, intelObj
->_MaxLevel
);
99 intelObj
->mt
= intel_miptree_create(intel
,
100 intelObj
->base
.Target
,
101 firstImage
->base
.Base
.TexFormat
,
109 false /* force_y_tiling */);
114 /* Pull in any images not in the object's tree:
116 nr_faces
= _mesa_num_tex_faces(intelObj
->base
.Target
);
117 for (face
= 0; face
< nr_faces
; face
++) {
118 for (i
= tObj
->BaseLevel
; i
<= intelObj
->_MaxLevel
; i
++) {
119 struct intel_texture_image
*intelImage
=
120 intel_texture_image(intelObj
->base
.Image
[face
][i
]);
121 /* skip too small size mipmap */
122 if (intelImage
== NULL
)
125 if (intelObj
->mt
!= intelImage
->mt
) {
126 intel_miptree_copy_teximage(intel
, intelImage
, intelObj
->mt
);
129 /* After we're done, we'd better agree that our layout is
130 * appropriate, or we'll end up hitting this function again on the
133 assert(intel_miptree_match_image(intelObj
->mt
, &intelImage
->base
.Base
));
137 intelObj
->needs_validate
= false;
143 * \param mode bitmask of GL_MAP_READ_BIT, GL_MAP_WRITE_BIT
146 intel_tex_map_image_for_swrast(struct intel_context
*intel
,
147 struct intel_texture_image
*intel_image
,
152 struct intel_mipmap_tree
*mt
;
155 if (!intel_image
|| !intel_image
->mt
)
158 level
= intel_image
->base
.Base
.Level
;
159 face
= intel_image
->base
.Base
.Face
;
160 mt
= intel_image
->mt
;
162 for (int i
= 0; i
< mt
->level
[level
].depth
; i
++)
163 intel_miptree_slice_resolve_depth(intel
, mt
, level
, i
);
165 if (mt
->target
== GL_TEXTURE_3D
||
166 mt
->target
== GL_TEXTURE_2D_ARRAY
||
167 mt
->target
== GL_TEXTURE_1D_ARRAY
) {
170 /* ImageOffsets[] is only used for swrast's fetch_texel_3d, so we can't
171 * share code with the normal path.
173 for (i
= 0; i
< mt
->level
[level
].depth
; i
++) {
174 intel_miptree_get_image_offset(mt
, level
, i
, &x
, &y
);
175 intel_image
->base
.ImageOffsets
[i
] = x
+ y
* (mt
->region
->pitch
/
179 DBG("%s \n", __FUNCTION__
);
181 intel_image
->base
.Map
= intel_miptree_map_raw(intel
, mt
);
183 assert(intel_image
->base
.Base
.Depth
== 1);
184 intel_miptree_get_image_offset(mt
, level
, face
, &x
, &y
);
186 DBG("%s: (%d,%d) -> (%d, %d)/%d\n",
187 __FUNCTION__
, face
, level
, x
, y
, mt
->region
->pitch
);
189 intel_image
->base
.Map
= intel_miptree_map_raw(intel
, mt
) +
190 x
* mt
->cpp
+ y
* mt
->region
->pitch
;
193 assert(mt
->region
->pitch
% mt
->region
->cpp
== 0);
194 intel_image
->base
.RowStride
= mt
->region
->pitch
/ mt
->region
->cpp
;
198 intel_tex_unmap_image_for_swrast(struct intel_context
*intel
,
199 struct intel_texture_image
*intel_image
)
201 if (intel_image
&& intel_image
->mt
) {
202 intel_miptree_unmap_raw(intel
, intel_image
->mt
);
203 intel_image
->base
.Map
= NULL
;
208 * \param mode bitmask of GL_MAP_READ_BIT, GL_MAP_WRITE_BIT
211 intel_tex_map_images(struct intel_context
*intel
,
212 struct intel_texture_object
*intelObj
,
215 GLuint nr_faces
= _mesa_num_tex_faces(intelObj
->base
.Target
);
218 DBG("%s\n", __FUNCTION__
);
220 for (i
= intelObj
->base
.BaseLevel
; i
<= intelObj
->_MaxLevel
; i
++) {
221 for (face
= 0; face
< nr_faces
; face
++) {
222 struct intel_texture_image
*intel_image
=
223 intel_texture_image(intelObj
->base
.Image
[face
][i
]);
225 intel_tex_map_image_for_swrast(intel
, intel_image
, mode
);
231 intel_tex_unmap_images(struct intel_context
*intel
,
232 struct intel_texture_object
*intelObj
)
234 GLuint nr_faces
= _mesa_num_tex_faces(intelObj
->base
.Target
);
237 for (i
= intelObj
->base
.BaseLevel
; i
<= intelObj
->_MaxLevel
; i
++) {
238 for (face
= 0; face
< nr_faces
; face
++) {
239 struct intel_texture_image
*intel_image
=
240 intel_texture_image(intelObj
->base
.Image
[face
][i
]);
242 intel_tex_unmap_image_for_swrast(intel
, intel_image
);