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