# 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
	default 32 if LV_COLOR_DEPTH_32
	default 24 if LV_COLOR_DEPTH_24
	default 16 if LV_COLOR_DEPTH_16
	default 8 if LV_COLOR_DEPTH_8
	default 1 if LV_COLOR_DEPTH_1
	range 1 32
	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_VDB_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.

config LV_Z_MONOCHROME_CONVERSION_BUFFER
	bool "Use intermediate conversion buffer for monochrome displays"
	default y
	help
	  When using a monochrome display an intermediate buffer with LV_Z_VDB_SIZE
	  is needed to perform the conversion.

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
