brw_miptree_layout_texture_array(struct intel_context *intel,
struct intel_mipmap_tree *mt)
{
- GLuint align_w;
- GLuint align_h;
GLuint level;
GLuint qpitch = 0;
int h0, h1, q;
- intel_get_texture_alignment_unit(mt->format, &align_w, &align_h);
-
- h0 = ALIGN(mt->height0, align_h);
- h1 = ALIGN(minify(mt->height0), align_h);
- qpitch = (h0 + h1 + (intel->gen >= 7 ? 12 : 11) * align_h);
+ h0 = ALIGN(mt->height0, mt->align_h);
+ h1 = ALIGN(minify(mt->height0), mt->align_h);
+ qpitch = (h0 + h1 + (intel->gen >= 7 ? 12 : 11) * mt->align_h);
if (mt->compressed)
qpitch /= 4;
void
brw_miptree_layout(struct intel_context *intel, struct intel_mipmap_tree *mt)
{
- /* XXX: these vary depending on image format: */
- /* GLint align_w = 4; */
-
switch (mt->target) {
case GL_TEXTURE_CUBE_MAP:
if (intel->gen >= 5) {
GLuint pack_x_pitch, pack_x_nr;
GLuint pack_y_pitch;
GLuint level;
- GLuint align_h = 2;
- GLuint align_w = 4;
mt->total_height = 0;
- intel_get_texture_alignment_unit(mt->format, &align_w, &align_h);
if (mt->compressed) {
- mt->total_width = ALIGN(width, align_w);
+ mt->total_width = ALIGN(width, mt->align_w);
pack_y_pitch = (height + 3) / 4;
} else {
mt->total_width = mt->width0;
- pack_y_pitch = ALIGN(mt->height0, align_h);
+ pack_y_pitch = ALIGN(mt->height0, mt->align_h);
}
pack_x_pitch = width;
if (mt->compressed) {
pack_y_pitch = (height + 3) / 4;
- if (pack_x_pitch > ALIGN(width, align_w)) {
- pack_x_pitch = ALIGN(width, align_w);
+ if (pack_x_pitch > ALIGN(width, mt->align_w)) {
+ pack_x_pitch = ALIGN(width, mt->align_w);
pack_x_nr <<= 1;
}
} else {
if (pack_y_pitch > 2) {
pack_y_pitch >>= 1;
- pack_y_pitch = ALIGN(pack_y_pitch, align_h);
+ pack_y_pitch = ALIGN(pack_y_pitch, mt->align_h);
}
}
mt->compressed = compress_byte ? 1 : 0;
mt->refcount = 1;
+ intel_get_texture_alignment_unit(format, &mt->align_w, &mt->align_h);
+
if (target == GL_TEXTURE_CUBE_MAP) {
assert(depth0 == 1);
mt->depth0 = 6;
assert(depth < src_mt->level[level].depth);
if (dst_mt->compressed) {
- uint32_t align_w, align_h;
- intel_get_texture_alignment_unit(format,
- &align_w, &align_h);
- height = ALIGN(height, align_h) / align_h;
- width = ALIGN(width, align_w);
+ height = ALIGN(height, dst_mt->align_h) / dst_mt->align_h;
+ width = ALIGN(width, dst_mt->align_w);
}
uint32_t dst_x, dst_y, src_x, src_y;
GLenum target;
gl_format format;
+ /**
+ * The X offset of each image in the miptree must be aligned to this. See
+ * the "Alignment Unit Size" section of the BSpec.
+ */
+ unsigned int align_w;
+ unsigned int align_h; /**< \see align_w */
+
GLuint first_level;
GLuint last_level;
void i945_miptree_layout_2d(struct intel_mipmap_tree *mt)
{
- GLuint align_h, align_w;
GLuint level;
GLuint x = 0;
GLuint y = 0;
GLuint depth = mt->depth0; /* number of array layers. */
mt->total_width = mt->width0;
- intel_get_texture_alignment_unit(mt->format, &align_w, &align_h);
if (mt->compressed) {
- mt->total_width = ALIGN(mt->width0, align_w);
+ mt->total_width = ALIGN(mt->width0, mt->align_w);
}
/* May need to adjust width to accomodate the placement of
GLuint mip1_width;
if (mt->compressed) {
- mip1_width = ALIGN(minify(mt->width0), align_w)
- + ALIGN(minify(minify(mt->width0)), align_w);
+ mip1_width = ALIGN(minify(mt->width0), mt->align_w)
+ + ALIGN(minify(minify(mt->width0)), mt->align_w);
} else {
- mip1_width = ALIGN(minify(mt->width0), align_w)
+ mip1_width = ALIGN(minify(mt->width0), mt->align_w)
+ minify(minify(mt->width0));
}
intel_miptree_set_level_info(mt, level, x, y, width,
height, depth);
- img_height = ALIGN(height, align_h);
+ img_height = ALIGN(height, mt->align_h);
if (mt->compressed)
- img_height /= align_h;
+ img_height /= mt->align_h;
/* Because the images are packed better, the final offset
* might not be the maximal one:
/* Layout_below: step right after second mipmap.
*/
if (level == mt->first_level + 1) {
- x += ALIGN(width, align_w);
+ x += ALIGN(width, mt->align_w);
}
else {
y += img_height;