# Copyright (c) 2018-2019 Jan Van Winkel <jan.van_winkel@dxplore.eu>
# Copyright (c) 2020 Teslabs Engineering S.L.
# SPDX-License-Identifier: Apache-2.0

menu "Memory manager settings"

config LV_Z_BITS_PER_PIXEL
	int "Bits per pixel"
	default 32
	range 1 32
	depends on LV_Z_BUFFER_ALLOC_STATIC
	help
	  Number of bits per pixel.

choice LV_Z_MEMORY_POOL
	prompt "Memory pool"
	default LV_Z_MEM_POOL_SYS_HEAP
	help
	  Memory pool to use for lvgl allocated objects

	config LV_Z_MEM_POOL_HEAP_LIB_C
	  bool "C library Heap"
	  depends on !MINIMAL_LIBC || (COMMON_LIBC_MALLOC_ARENA_SIZE != 0)
	  help
		Use C library malloc and free to allocate objects on the C library heap

	config LV_Z_MEM_POOL_SYS_HEAP
		bool "User space lvgl pool"
		select SYS_HEAP_INFO
		help
		  Use a dedicated memory pool from a private sys heap.

endchoice

config LV_Z_MEM_POOL_SIZE
	int "Memory pool size"
	default 2048
	depends on LV_Z_MEM_POOL_SYS_HEAP
	help
	  Size of the memory pool in bytes

config LV_Z_MEMORY_POOL_CUSTOM_SECTION
	bool "Link memory pool to custom section"
	depends on LV_Z_MEM_POOL_SYS_HEAP
	help
	  Place LVGL memory pool in custom section, with tag ".lvgl_heap".
	  This can be used by custom linker scripts to relocate the LVGL
	  memory pool to a custom location, such as tightly coupled or
	  external memory.

config LV_Z_VDB_SIZE
	int "Rendering buffer size"
	default 100 if LV_Z_FULL_REFRESH
	default 10
	range 1 100
	help
	  Size of the buffer used for rendering screen content as a percentage
	  of total display size.

config LV_Z_DOUBLE_VDB
	bool "Use two rendering buffers"
	help
	  Use two buffers to render and flush data in parallel

config LV_Z_FULL_REFRESH
	bool "Force full refresh mode"
	help
	  Force full refresh of display on update. When combined with
	  LV_Z_VDB_SIZE, this setting can improve performance for display
	  controllers that require a framebuffer to be present in system memory,
	  since the controller can render the LVGL framebuffer directly

config LV_Z_VDB_ALIGN
	int "Rending buffer alignment"
	default 4
	depends on LV_Z_BUFFER_ALLOC_STATIC
	help
	  Rendering buffer alignment. Depending on chosen color depth,
	  buffer may be accessed as a uint8_t *, uint16_t *, or uint32_t *,
	  so buffer must be aligned to prevent unaligned memory access

config LV_Z_VBD_CUSTOM_SECTION
	bool "Link rendering buffers to custom section"
	depends on LV_Z_BUFFER_ALLOC_STATIC
	help
	  Place LVGL rendering buffers in custom section, with tag ".lvgl_buf".
	  This can be used by custom linker scripts to relocate the LVGL
	  rendering buffers to a custom location, such as tightly coupled or
	  external memory.

choice LV_Z_RENDERING_BUFFER_ALLOCATION
	prompt "Rendering Buffer Allocation"
	default LV_Z_BUFFER_ALLOC_STATIC
	help
	  Type of allocation that should be used for allocating rendering buffers

config LV_Z_BUFFER_ALLOC_STATIC
	bool "Static"
	help
	  Rendering buffers are statically allocated based on the following
	  configuration parameters:
	  * Horizontal screen resolution
	  * Vertical screen resolution
	  * Rendering buffer size
	  * Bytes per pixel

config LV_Z_BUFFER_ALLOC_DYNAMIC
	bool "Dynamic"
	help
	  Rendering buffers are dynamically allocated based on the actual
	  display parameters

endchoice

endmenu
