blob: 659a1150194b766acf3b35577fda16b55744c7d2 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_GRAPHICS_DISPLAY_DRIVERS_INTEL_DISPLAY_TILING_H_
#define SRC_GRAPHICS_DISPLAY_DRIVERS_INTEL_DISPLAY_TILING_H_
#include <fuchsia/hardware/intelgpucore/c/banjo.h>
#include <cinttypes>
#include <fbl/algorithm.h>
#include "src/graphics/display/lib/api-types/cpp/image-tiling-type.h"
namespace intel_display {
constexpr int get_tile_byte_width(display::ImageTilingType tiling) {
if (tiling == display::ImageTilingType::kLinear) {
return 64;
}
if (tiling == display::ImageTilingType(IMAGE_TILING_TYPE_X_TILED)) {
return 512;
}
if (tiling == display::ImageTilingType(IMAGE_TILING_TYPE_Y_LEGACY_TILED)) {
return 128;
}
if (tiling == display::ImageTilingType(IMAGE_TILING_TYPE_YF_TILED)) {
// TODO(https://fxbug.dev/42076787): For 1-byte-per-pixel formats (e.g. R8), the
// tile width is 64. We need to check the pixel format once we support
// importing such formats.
return 128;
}
ZX_ASSERT_MSG(false, "Unsupported tiling type: %" PRIu32, tiling.ValueForLogging());
return 0;
}
constexpr int get_tile_byte_size(display::ImageTilingType tiling) {
return tiling == display::ImageTilingType::kLinear ? 64 : 4096;
}
constexpr int get_tile_px_height(display::ImageTilingType tiling) {
return get_tile_byte_size(tiling) / get_tile_byte_width(tiling);
}
constexpr uint32_t width_in_tiles(display::ImageTilingType tiling, int width, int bytes_per_pixel) {
int tile_width = get_tile_byte_width(tiling);
return ((width * bytes_per_pixel) + tile_width - 1) / tile_width;
}
constexpr uint32_t height_in_tiles(display::ImageTilingType tiling, int height) {
int tile_height = get_tile_px_height(tiling);
return (height + tile_height - 1) / tile_height;
}
} // namespace intel_display
#endif // SRC_GRAPHICS_DISPLAY_DRIVERS_INTEL_DISPLAY_TILING_H_