30#ifndef __ARM_2D_HELPER_PFB_H__
31#define __ARM_2D_HELPER_PFB_H__
36#include "./__arm_2d_helper_common.h"
45# pragma clang diagnostic push
46# pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
47# pragma clang diagnostic ignored "-Wmissing-declarations"
48# pragma clang diagnostic ignored "-Wpadded"
52#ifdef __ARM_2D_HELPER_PFB_IMPLEMENT__
53# define __ARM_2D_IMPL__
54# undef __ARM_2D_HELPER_PFB_IMPLEMENT__
55#elif defined(__ARM_2D_HELPER_PFB_INHERIT__)
56# undef __ARM_2D_HELPER_PFB_INHERIT__
57# define __ARM_2D_INHERIT__
59#include "arm_2d_utils.h"
68#define ARM_2D_FPS_MODE_RENDER_ONLY 0
69#define ARM_2D_FPS_MODE_REAL 1
122#define ARM_2D_HELPER_PFB_INIT( __CB_ADDR, \
133 ARM_SECTION(".bss.noinit.arm_2d_pfb_pool") \
137 __PIXEL_TYPE tBuffer[(__PFB_WIDTH) * (__PFB_HEIGHT)]; \
138 } s_tPFBs[__PFB_NUM]; \
140 arm_2d_helper_pfb_cfg_t tCFG = { \
141 .tDisplayArea.tSize = { \
142 .iWidth = (__SCREEN_WIDTH), \
143 .iHeight = (__SCREEN_HEIGHT), \
146 .FrameBuffer.ptPFBs = (arm_2d_pfb_t *)s_tPFBs, \
147 .FrameBuffer.tFrameSize = { \
148 .iWidth = (__PFB_WIDTH), \
149 .iHeight = (__PFB_HEIGHT), \
151 .FrameBuffer.u24BufferSize = sizeof(s_tPFBs[0].tBuffer), \
152 .FrameBuffer.u7ColourFormat = (__COLOUR_FORMAT), \
153 .FrameBuffer.u8PFBNum = dimof(s_tPFBs), \
158 arm_2d_helper_pfb_init((__CB_ADDR), &tCFG); \
169#define ARM_2D_HELPER_PFB_UPDATE_ON_DRAW_HANDLER( \
173 arm_2d_helper_pfb_update_dependency((__CB_ADDR), \
174 ARM_2D_PFB_DEPEND_ON_DRAWING, \
175 (arm_2d_helper_pfb_dependency_t []) {{ \
177 .fnHandler = (__HANDLER), \
178 .pTarget = (NULL,##__VA_ARGS__),\
183#define __IMPL_ARM_2D_REGION_LIST(__NAME, ...) \
185 __NAME##_offset = __COUNTER__, \
188 arm_2d_region_list_item_t __NAME[] = {
191#define IMPL_ARM_2D_REGION_LIST(__NAME, ...) \
192 __IMPL_ARM_2D_REGION_LIST(__NAME,##__VA_ARGS__)
195#define END_IMPL_ARM_2D_REGION_LIST(...) \
201 static const arm_2d_tile_t * const ptCurrentTile = NULL;
203#define __ADD_REGION_TO_LIST(__NAME, ...) \
205 .ptNext = (arm_2d_region_list_item_t *) \
206 &(__NAME[__COUNTER__ - __NAME##_offset]), \
212#define ADD_REGION_TO_LIST(__NAME, ...) \
213 __ADD_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
216#define __ADD_LAST_REGION_TO_LIST(__NAME, ...) \
224#define ADD_LAST_REGION_TO_LIST(__NAME, ...) \
225 __ADD_LAST_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
228#define IMPL_PFB_ON_DRAW(__NAME) IMPL_ON_DRAW_EVT(__NAME)
231#define IMPL_PFB_ON_LOW_LV_RENDERING(__NAME) \
232 void __NAME(void *pTarget, \
233 const arm_2d_pfb_t *ptPFB, \
237#define IMPL_PFB_ON_FRAME_SYNC_UP(__NAME) \
238 bool __NAME(void *pTarget)
240#define IMPL_PFB_BEFORE_FLUSHING(__NAME) \
241 bool __NAME(void *pTarget, \
242 arm_2d_pfb_t *ptOrigin, \
243 arm_2d_pfb_t *ptScratch)
295#define init_arm_2d_helper_pfb( __CB_ADDR, \
305 ARM_2D_HELPER_PFB_INIT( \
325#define update_arm_2d_helper_pfb_on_draw_handler( \
329 ARM_2D_HELPER_PFB_UPDATE_ON_DRAW_HANDLER( \
331 (__HANDLER),##__VA_ARGRS__)
344#define arm_2d_helper_pfb_report_rendering_complete(__PFB_HELPER_PTR,...) \
345 __arm_2d_helper_pfb_report_rendering_complete((__PFB_HELPER_PTR), \
346 (NULL,##__VA_ARGS__))
349#define __arm_2d_helper_dirty_region_update_dirty_regions0 \
350 __arm_2d_helper_dirty_region_update_dirty_regions
363#define __arm_2d_helper_dirty_region_update_dirty_regions3( __helper_ptr, \
365 __visible_area_ptr, \
368 __arm_2d_helper_dirty_region_update_dirty_regions2( \
371 (__visible_area_ptr), \
382#define __arm_2d_helper_dirty_region_update_dirty_regions1( __helper_ptr, \
385 __arm_2d_helper_dirty_region_update_dirty_regions2( \
403#define arm_2d_helper_dirty_region_update_dirty_regions( __helper_ptr, \
406 ARM_CONNECT2(__arm_2d_helper_dirty_region_update_dirty_regions, \
407 __ARM_VA_NUM_ARGS(__VA_ARGS__))((__helper_ptr), \
421#define __arm_2d_helper_dirty_region_update_item4( __item_ptr, \
423 __visible_region_ptr, \
425 __arm_2d_helper_dirty_region_item_update((__item_ptr), \
426 (__target_tile_ptr), \
427 (__visible_region_ptr), \
434#define __arm_2d_helper_dirty_region_update_item5( __dirty_region_helper_ptr, \
437 __visible_region_ptr, \
439 __arm_2d_helper_dirty_region_item_update((__item_ptr), \
440 (__target_tile_ptr), \
441 (__visible_region_ptr), \
444#define arm_2d_helper_dirty_region_update_item(...) \
445 ARM_CONNECT2( __arm_2d_helper_dirty_region_update_item, \
446 __ARM_VA_NUM_ARGS(__VA_ARGS__) \
450#define arm_2d_helper_pfb_is_region_active( __target_tile_ptr, \
451 __target_region_ptr, \
452 __consider_dry_run, \
454 ARM_CONNECT2( __arm_2d_helper_pfb_is_region_active, \
455 __ARM_VA_NUM_ARGS(__VA_ARGS__))( \
456 (__target_tile_ptr), \
457 (__target_region_ptr), \
458 (__consider_dry_run),##__VA_ARGS__)
460#define arm_2d_helper_dirty_region_transform_update_value( __HELPER_PTR, \
464 ARM_CONNECT2( __arm_2d_helper_dirty_region_transform_update_value,\
465 __ARM_VA_NUM_ARGS(__VA_ARGS__))((__HELPER_PTR), \
470#define impl_arm_2d_region_list(__NAME, ...) \
471 IMPL_ARM_2D_REGION_LIST(__NAME,##__VA_ARGS__)
472#define add_region_to_list(__NAME, ...) \
473 ADD_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
474#define add_last_region_to_list(__NAME, ...) \
475 ADD_LAST_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
476#define end_impl_arm_2d_region_list(...) \
477 END_IMPL_ARM_2D_REGION_LIST(__VA_ARGS__)
479#define impl_pfb_on_draw(__NAME) IMPL_PFB_ON_DRAW(__NAME)
480#define impl_pfb_on_low_lv_rendering(__NAME) \
481 IMPL_PFB_ON_LOW_LV_RENDERING(__NAME)
531 uint32_t wSourceStride,
533 uint32_t wTargetStride,
536 uint_fast8_t chBytePerPixel );
563 uint32_t nDataItemCount,
564 uint_fast8_t chDataItemSize);
583#define ARM_2D_3FB_INVALID_IDX 3
593 uint8_t u2Drawing : 2;
594 uint8_t u2Flushing : 2;
595 uint8_t u2ReadyToFlush : 2;
596 uint8_t u2ReadyToDraw : 2;
598 uintptr_t tSemaphore;
599 bool bFBCopyComplete;
613 uint32_t u24Size : 24;
630 uint8_t chUserRegionIndex;
632 uint8_t bUpdated : 1;
635 uint16_t bFromInternalPool : 1;
636 uint16_t bFromHeap : 1;
637 uint16_t u2UpdateState : 2;
638 uint16_t u12KEY : 12;
740 uint32_t u24BufferSize : 24;
741 uint32_t u7ColourFormat : 7 ;
743 uint32_t u8PFBNum : 8;
744 uint32_t bDoNOTUpdateDefaultFrameBuffer : 1;
745 uint32_t bDisableDynamicFPBSize : 1;
746 uint32_t bSwapRGB16 : 1;
747 uint32_t bDebugDirtyRegions : 1;
749 uint32_t u3PixelWidthAlign : 3;
750 uint32_t u3PixelHeightAlign : 3;
751 uint32_t u4PoolReserve : 4;
769 ARM_2D_PERFC_RENDER = 0,
772 __ARM_2D_PERFC_COUNT,
777 ARM_2D_PFB_SCAN_POLICY_HORIZONTAL_FIRST = (0 << 0),
778 ARM_2D_PFB_SCAN_POLICY_VERTICAL_FIRST = (1 << 0),
781 ARM_2D_PFB_SCAN_POLICY_NORMAL = 0,
783} arm_2d_pfb_scan_policy_t;
806 } OptimizedDirtyRegions;
810 uint32_t wPFBPixelCount;
813 uint8_t chFreePFBCount;
814 int16_t iDirtyRegionFreeCount;
817 uint32_t bIsDirtyRegionOptimizationEnabled : 1;
818 uint32_t bEnableDirtyRegionOptimizationRequest : 1;
819 uint32_t bDisableDirtyRegionOptimizationRequest : 1;
820 uint32_t bEncounterDynamicDirtyRegion : 1;
821 uint32_t bFailedToOptimizeDirtyRegion : 1;
822 uint32_t bIsUsingOptimizedDirtyRegionList : 1;
823 uint32_t bDirtyRegionDebugModeSkipFrame : 1;
824 uint32_t bIngoreLowLevelSyncUp : 1;
826 uint32_t bIsNewFrame : 1;
827 uint32_t bIgnoreCanvasColour : 1;
828 uint32_t bIgnoreLowLevelFlush : 1;
829 uint32_t bHideNavigationLayer : 1;
830 uint32_t bIsDryRun : 1;
831 uint32_t bNoAdditionalDirtyRegionList : 1;
832 uint32_t bFirstIteration : 1;
833 uint32_t bIsRegionChanged : 1;
835 uint32_t bPFBScanPolicyVerticalFirst : 1;
843 uintptr_t pFPBPoolAvailable;
858 int32_t nRenderingCycle;
885 uint8_t bForceToUseMinimalEnclosure : 1;
886 uint8_t bSuspendUpdate : 1;
888 uint8_t bOnlyUpdateMinimalEnclosure : 1;
890 uint8_t chUpdateLifeCycle;
908 uint8_t chUpdateLifeCycle;
1080 bool bConsiderDryRun);
1096 bool bConsiderDryRun,
1189 uint_fast8_t chMask,
1448 uint_fast8_t chCount);
1474 uint8_t chUserRegionIndex);
1528 uint8_t chNextUserIndex);
1541 uint8_t chNextUserIndex);
1569 uint_fast16_t hwCount);
1582 uint_fast16_t hwCount);
1965#if defined(__clang__)
1966# pragma clang diagnostic pop