1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #pragma once
6
7 #include <assert.h>
8 #include <ddk/protocol/intelgpucore.h>
9 #include <fbl/algorithm.h>
10 #include <inttypes.h>
11 #include <zircon/pixelformat.h>
12 #include <zircon/device/display-controller.h>
13
14 namespace i915 {
15
get_tile_byte_width(uint32_t tiling,zx_pixel_format_t format)16 static inline uint32_t get_tile_byte_width(uint32_t tiling, zx_pixel_format_t format) {
17 switch (tiling) {
18 case IMAGE_TYPE_SIMPLE: return 64;
19 case IMAGE_TYPE_X_TILED: return 512;
20 case IMAGE_TYPE_Y_LEGACY_TILED: return 128;
21 case IMAGE_TYPE_YF_TILED: return ZX_PIXEL_FORMAT_BYTES(format) == 1 ? 64 : 128;
22 default:
23 assert(false);
24 return 0;
25 }
26 }
27
get_tile_byte_size(uint32_t tiling)28 static inline uint32_t get_tile_byte_size(uint32_t tiling) {
29 return tiling == IMAGE_TYPE_SIMPLE ? 64 : 4096;
30 }
31
get_tile_px_height(uint32_t tiling,zx_pixel_format_t format)32 static inline uint32_t get_tile_px_height(uint32_t tiling, zx_pixel_format_t format) {
33 return get_tile_byte_size(tiling) / get_tile_byte_width(tiling, format);
34 }
35
width_in_tiles(uint32_t tiling,uint32_t width,zx_pixel_format_t format)36 static inline uint32_t width_in_tiles(uint32_t tiling, uint32_t width,
37 zx_pixel_format_t format) {
38 uint32_t tile_width = get_tile_byte_width(tiling, format);
39 return ((width * ZX_PIXEL_FORMAT_BYTES(format))+ tile_width - 1) / tile_width;
40 }
41
height_in_tiles(uint32_t tiling,uint32_t height,zx_pixel_format_t format)42 static inline uint32_t height_in_tiles(uint32_t tiling, uint32_t height,
43 zx_pixel_format_t format) {
44 uint32_t tile_height = get_tile_px_height(tiling, format);
45 return (height + tile_height - 1) / tile_height;
46 }
47
48 } // namespace i915
49