static void layout_init_lods(struct ilo_layout *layout, struct ilo_layout_params *params) { const struct pipe_resource *templ = params->templ; unsigned cur_x, cur_y; unsigned lv; cur_x = 0; cur_y = 0; for (lv = 0; lv <= templ->last_level; lv++) { unsigned lod_w, lod_h; layout_get_slice_size(layout, params, lv, &lod_w, &lod_h); layout->lods[lv].x = cur_x; layout->lods[lv].y = cur_y; layout->lods[lv].slice_width = lod_w; layout->lods[lv].slice_height = lod_h; switch (layout->walk) { case ILO_LAYOUT_WALK_LOD: lod_h *= layout_get_num_layers(layout, params); if (lv == 1) cur_x += lod_w; else cur_y += lod_h; /* every LOD begins at tile boundaries */ if (templ->last_level > 0) { assert(layout->format == PIPE_FORMAT_S8_UINT); cur_x = align(cur_x, 64); cur_y = align(cur_y, 64); } break; case ILO_LAYOUT_WALK_LAYER: /* MIPLAYOUT_BELOW */ if (lv == 1) cur_x += lod_w; else cur_y += lod_h; break; case ILO_LAYOUT_WALK_3D: { const unsigned num_slices = u_minify(templ->depth0, lv); const unsigned num_slices_per_row = 1 << lv; const unsigned num_rows = (num_slices + num_slices_per_row - 1) / num_slices_per_row; lod_w *= num_slices_per_row; lod_h *= num_rows; cur_y += lod_h; } break; } if (params->max_x < layout->lods[lv].x + lod_w) params->max_x = layout->lods[lv].x + lod_w; if (params->max_y < layout->lods[lv].y + lod_h) params->max_y = layout->lods[lv].y + lod_h; } if (layout->walk == ILO_LAYOUT_WALK_LAYER) { params->h0 = layout->lods[0].slice_height; if (templ->last_level > 0) params->h1 = layout->lods[1].slice_height; else layout_get_slice_size(layout, params, 1, &cur_x, ¶ms->h1); } }
static void layout_init_lods(struct intel_layout *layout, struct intel_layout_params *params) { const VkImageCreateInfo *info = params->info; unsigned cur_x, cur_y; unsigned lv; cur_x = 0; cur_y = 0; for (lv = 0; lv < info->mipLevels; lv++) { unsigned lod_w, lod_h; layout_get_slice_size(layout, params, lv, &lod_w, &lod_h); layout->lods[lv].x = cur_x; layout->lods[lv].y = cur_y; layout->lods[lv].slice_width = lod_w; layout->lods[lv].slice_height = lod_h; switch (layout->walk) { case INTEL_LAYOUT_WALK_LOD: lod_h *= layout_get_num_layers(layout, params); if (lv == 1) cur_x += lod_w; else cur_y += lod_h; /* every LOD begins at tile boundaries */ if (info->mipLevels > 1) { assert(layout->format == VK_FORMAT_S8_UINT); cur_x = u_align(cur_x, 64); cur_y = u_align(cur_y, 64); } break; case INTEL_LAYOUT_WALK_LAYER: /* MIPLAYOUT_BELOW */ if (lv == 1) cur_x += lod_w; else cur_y += lod_h; break; case INTEL_LAYOUT_WALK_3D: { const unsigned num_slices = u_minify(info->extent.depth, lv); const unsigned num_slices_per_row = 1 << lv; const unsigned num_rows = (num_slices + num_slices_per_row - 1) / num_slices_per_row; lod_w *= num_slices_per_row; lod_h *= num_rows; cur_y += lod_h; } break; } if (params->max_x < layout->lods[lv].x + lod_w) params->max_x = layout->lods[lv].x + lod_w; if (params->max_y < layout->lods[lv].y + lod_h) params->max_y = layout->lods[lv].y + lod_h; } if (layout->walk == INTEL_LAYOUT_WALK_LAYER) { params->h0 = layout->lods[0].slice_height; if (info->mipLevels > 1) params->h1 = layout->lods[1].slice_height; else layout_get_slice_size(layout, params, 1, &cur_x, ¶ms->h1); } }