# 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_MEMORY_POOL_ZEPHYR_REGION
	bool "Place LVGL memory pool in a Zephyr memory-region"
	depends on LV_Z_MEM_POOL_SYS_HEAP
	depends on !LV_Z_MEMORY_POOL_CUSTOM_SECTION
	help
	  Place LVGL memory pool in a section, automatically
	  created from a 'zephyr,memory-region' compatible node,
	  whose name is specified in LV_Z_MEMORY_POOL_ZEPHYR_REGION_NAME.

config LV_Z_MEMORY_POOL_ZEPHYR_REGION_NAME
	string "Name of the zephyr memory-region for memory pool"
	depends on LV_Z_MEMORY_POOL_ZEPHYR_REGION
	help
	  Name of the Zephyr memory-region where LVGL memory pool is placed.

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_VDB_ZEPHYR_REGION
	bool "Place LVGL rendering buffers in a Zephyr memory-region"
	depends on LV_Z_BUFFER_ALLOC_STATIC
	depends on !LV_Z_VDB_CUSTOM_SECTION
	help
	  Place LVGL rendering buffers in a section, automatically
	  created from a 'zephyr,memory-region' compatible node,
	  whose name is specified in LV_Z_VDB_ZEPHYR_REGION_NAME.

config LV_Z_VDB_ZEPHYR_REGION_NAME
	string "Name of the Zephyr memory-region for rendering buffers"
	depends on LV_Z_VDB_ZEPHYR_REGION
	help
	  Name of the Zephyr memory-region where LVGL rendering buffers are placed.

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
