blob: 405f0ef9094e58a0269f42e5e5164a9f0ce2b100 [file] [log] [blame]
// Copyright 2018 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.
#pragma once
#include <assert.h>
#include <ddk/protocol/intelgpucore.h>
#include <fbl/algorithm.h>
#include <inttypes.h>
#include <zircon/pixelformat.h>
#include <zircon/device/display-controller.h>
namespace i915 {
static inline uint32_t get_tile_byte_width(uint32_t tiling, zx_pixel_format_t format) {
switch (tiling) {
case IMAGE_TYPE_SIMPLE: return 64;
case IMAGE_TYPE_X_TILED: return 512;
case IMAGE_TYPE_Y_LEGACY_TILED: return 128;
case IMAGE_TYPE_YF_TILED: return ZX_PIXEL_FORMAT_BYTES(format) == 1 ? 64 : 128;
default:
assert(false);
return 0;
}
}
static inline uint32_t get_tile_byte_size(uint32_t tiling) {
return tiling == IMAGE_TYPE_SIMPLE ? 64 : 4096;
}
static inline uint32_t get_tile_px_height(uint32_t tiling, zx_pixel_format_t format) {
return get_tile_byte_size(tiling) / get_tile_byte_width(tiling, format);
}
static inline uint32_t width_in_tiles(uint32_t tiling, uint32_t width,
zx_pixel_format_t format) {
uint32_t tile_width = get_tile_byte_width(tiling, format);
return ((width * ZX_PIXEL_FORMAT_BYTES(format))+ tile_width - 1) / tile_width;
}
static inline uint32_t height_in_tiles(uint32_t tiling, uint32_t height,
zx_pixel_format_t format) {
uint32_t tile_height = get_tile_px_height(tiling, format);
return (height + tile_height - 1) / tile_height;
}
} // namespace i915