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"
70#define arm_2d_helper_ignore_low_level_flush arm_2d_helper_pfb_ignore_low_level_flush
71#define arm_2d_helper_resume_low_level_flush arm_2d_helper_pfb_resume_low_level_flush
79#define ARM_2D_FPS_MODE_RENDER_ONLY 0
80#define ARM_2D_FPS_MODE_REAL 1
133#define ARM_2D_HELPER_PFB_INIT( __CB_ADDR, \
144 ARM_SECTION(".bss.noinit.arm_2d_pfb_pool") \
148 __PIXEL_TYPE tBuffer[(__PFB_WIDTH) * (__PFB_HEIGHT)]; \
149 } s_tPFBs[__PFB_NUM]; \
151 arm_2d_helper_pfb_cfg_t tCFG = { \
152 .tDisplayArea.tSize = { \
153 .iWidth = (__SCREEN_WIDTH), \
154 .iHeight = (__SCREEN_HEIGHT), \
157 .FrameBuffer.ptPFBs = (arm_2d_pfb_t *)s_tPFBs, \
158 .FrameBuffer.tFrameSize = { \
159 .iWidth = (__PFB_WIDTH), \
160 .iHeight = (__PFB_HEIGHT), \
162 .FrameBuffer.wBufferSize = sizeof(s_tPFBs[0].tBuffer), \
163 .FrameBuffer.u7ColourFormat = (__COLOUR_FORMAT), \
164 .FrameBuffer.u8PFBNum = dimof(s_tPFBs), \
169 arm_2d_helper_pfb_init((__CB_ADDR), &tCFG); \
180#define ARM_2D_HELPER_PFB_UPDATE_ON_DRAW_HANDLER( \
184 arm_2d_helper_pfb_update_dependency((__CB_ADDR), \
185 ARM_2D_PFB_DEPEND_ON_DRAWING, \
186 (arm_2d_helper_pfb_dependency_t []) {{ \
188 .fnHandler = (__HANDLER), \
189 .pTarget = (NULL,##__VA_ARGS__),\
194#define __IMPL_ARM_2D_REGION_LIST(__NAME, ...) \
196 __NAME##_offset = __COUNTER__, \
199 arm_2d_region_list_item_t __NAME[] = {
202#define IMPL_ARM_2D_REGION_LIST(__NAME, ...) \
203 __IMPL_ARM_2D_REGION_LIST(__NAME,##__VA_ARGS__)
206#define END_IMPL_ARM_2D_REGION_LIST(...) \
212 static const arm_2d_tile_t * const ptCurrentTile = NULL;
214#define __ADD_REGION_TO_LIST(__NAME, ...) \
216 .ptNext = (arm_2d_region_list_item_t *) \
217 &(__NAME[__COUNTER__ - __NAME##_offset]), \
223#define ADD_REGION_TO_LIST(__NAME, ...) \
224 __ADD_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
227#define __ADD_LAST_REGION_TO_LIST(__NAME, ...) \
235#define ADD_LAST_REGION_TO_LIST(__NAME, ...) \
236 __ADD_LAST_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
239#define IMPL_PFB_ON_DRAW(__NAME) IMPL_ON_DRAW_EVT(__NAME)
242#define IMPL_PFB_ON_LOW_LV_RENDERING(__NAME) \
243 void __NAME(void *pTarget, \
244 const arm_2d_pfb_t *ptPFB, \
248#define IMPL_PFB_ON_FRAME_SYNC_UP(__NAME) \
249 bool __NAME(void *pTarget)
251#define IMPL_PFB_BEFORE_FLUSHING(__NAME) \
252 bool __NAME(void *pTarget, \
253 arm_2d_pfb_t *ptOrigin, \
254 arm_2d_pfb_t *ptScratch)
306#define init_arm_2d_helper_pfb( __CB_ADDR, \
316 ARM_2D_HELPER_PFB_INIT( \
336#define update_arm_2d_helper_pfb_on_draw_handler( \
340 ARM_2D_HELPER_PFB_UPDATE_ON_DRAW_HANDLER( \
342 (__HANDLER),##__VA_ARGRS__)
355#define arm_2d_helper_pfb_report_rendering_complete(__PFB_HELPER_PTR,...) \
356 __arm_2d_helper_pfb_report_rendering_complete((__PFB_HELPER_PTR), \
357 (NULL,##__VA_ARGS__))
360#define __arm_2d_helper_dirty_region_update_dirty_regions0 \
361 __arm_2d_helper_dirty_region_update_dirty_regions
374#define __arm_2d_helper_dirty_region_update_dirty_regions3( __helper_ptr, \
376 __visible_area_ptr, \
379 __arm_2d_helper_dirty_region_update_dirty_regions2( \
382 (__visible_area_ptr), \
393#define __arm_2d_helper_dirty_region_update_dirty_regions1( __helper_ptr, \
396 __arm_2d_helper_dirty_region_update_dirty_regions2( \
414#define arm_2d_helper_dirty_region_update_dirty_regions( __helper_ptr, \
417 ARM_CONNECT2(__arm_2d_helper_dirty_region_update_dirty_regions, \
418 __ARM_VA_NUM_ARGS(__VA_ARGS__))((__helper_ptr), \
432#define __arm_2d_helper_dirty_region_update_item4( __item_ptr, \
434 __visible_region_ptr, \
436 __arm_2d_helper_dirty_region_item_update((__item_ptr), \
437 (__target_tile_ptr), \
438 (__visible_region_ptr), \
445#define __arm_2d_helper_dirty_region_update_item5( __dirty_region_helper_ptr, \
448 __visible_region_ptr, \
450 __arm_2d_helper_dirty_region_item_update((__item_ptr), \
451 (__target_tile_ptr), \
452 (__visible_region_ptr), \
455#define arm_2d_helper_dirty_region_update_item(...) \
456 ARM_CONNECT2( __arm_2d_helper_dirty_region_update_item, \
457 __ARM_VA_NUM_ARGS(__VA_ARGS__) \
461#define arm_2d_helper_pfb_is_region_active( __target_tile_ptr, \
462 __target_region_ptr, \
463 __consider_dry_run, \
465 ARM_CONNECT2( __arm_2d_helper_pfb_is_region_active, \
466 __ARM_VA_NUM_ARGS(__VA_ARGS__))( \
467 (__target_tile_ptr), \
468 (__target_region_ptr), \
469 (__consider_dry_run),##__VA_ARGS__)
471#define arm_2d_helper_dirty_region_transform_update_value( __HELPER_PTR, \
475 ARM_CONNECT2( __arm_2d_helper_dirty_region_transform_update_value,\
476 __ARM_VA_NUM_ARGS(__VA_ARGS__))((__HELPER_PTR), \
481#define impl_arm_2d_region_list(__NAME, ...) \
482 IMPL_ARM_2D_REGION_LIST(__NAME,##__VA_ARGS__)
483#define add_region_to_list(__NAME, ...) \
484 ADD_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
485#define add_last_region_to_list(__NAME, ...) \
486 ADD_LAST_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
487#define end_impl_arm_2d_region_list(...) \
488 END_IMPL_ARM_2D_REGION_LIST(__VA_ARGS__)
490#define impl_pfb_on_draw(__NAME) IMPL_PFB_ON_DRAW(__NAME)
491#define impl_pfb_on_low_lv_rendering(__NAME) \
492 IMPL_PFB_ON_LOW_LV_RENDERING(__NAME)
542 uint32_t wSourceStride,
544 uint32_t wTargetStride,
547 uint_fast8_t chBytePerPixel );
574 uint32_t nDataItemCount,
575 uint_fast8_t chDataItemSize);
594#define ARM_2D_3FB_INVALID_IDX 3
604 uint8_t u2Drawing : 2;
605 uint8_t u2Flushing : 2;
606 uint8_t u2ReadyToFlush : 2;
607 uint8_t u2ReadyToDraw : 2;
609 uintptr_t tSemaphore;
610 bool bFBCopyComplete;
624 uint32_t u24Size : 24;
641 uint8_t chUserRegionIndex;
643 uint8_t bUpdated : 1;
646 uint16_t bFromInternalPool : 1;
647 uint16_t bFromHeap : 1;
648 uint16_t u2UpdateState : 2;
649 uint16_t u12KEY : 12;
751 uint32_t wBufferSize;
753 uint32_t u7ColourFormat : 7 ;
755 uint32_t u8PFBNum : 8;
757 uint32_t bDoNOTUpdateDefaultFrameBuffer : 1;
758 uint32_t bDisableDynamicFPBSize : 1;
759 uint32_t bSwapRGB16 : 1;
760 uint32_t bDebugDirtyRegions : 1;
762 uint32_t u3PixelWidthAlign : 3;
763 uint32_t u3PixelHeightAlign : 3;
764 uint32_t u4PoolReserve : 4;
784 ARM_2D_PERFC_RENDER = 0,
787 __ARM_2D_PERFC_COUNT,
792 ARM_2D_PFB_SCAN_POLICY_HORIZONTAL_FIRST = (0 << 0),
793 ARM_2D_PFB_SCAN_POLICY_VERTICAL_FIRST = (1 << 0),
796 ARM_2D_PFB_SCAN_POLICY_NORMAL = 0,
798} arm_2d_pfb_scan_policy_t;
820 } OptimizedDirtyRegions;
824 uint32_t wPFBPixelCount;
827 uint8_t chFreePFBCount;
828 int16_t iDirtyRegionFreeCount;
831 uint32_t bIsNewFrame : 1;
832 uint32_t bIsDryRun : 1;
833 uint32_t bFirstIteration : 1;
834 uint32_t bIsRegionChanged : 1;
835 uint32_t bNoAdditionalDirtyRegionList : 1;
836 uint32_t bPFBScanPolicyVerticalFirst : 1;
837 uint32_t bSyncWithLowLevel : 1;
841 uint32_t bEnableDirtyRegionOptimizationRequest : 1;
842 uint32_t bDisableDirtyRegionOptimizationRequest : 1;
843 uint32_t bFullFrameRefreshModeRequest : 1;
844 uint32_t bAntiNoiseScanRequest : 1;
847 uint32_t bIsDirtyRegionOptimizationEnabled : 1;
848 uint32_t bEncounterDynamicDirtyRegion : 1;
849 uint32_t bFailedToOptimizeDirtyRegion : 1;
850 uint32_t bIsUsingOptimizedDirtyRegionList : 1;
851 uint32_t bDirtyRegionDebugModeSkipFrame : 1;
854 uint32_t bIgnoreLowLevelSyncUp : 1;
855 uint32_t bIgnoreCanvasColour : 1;
856 uint32_t bIgnoreLowLevelFlush : 1;
857 uint32_t bHideNavigationLayer : 1;
858 uint32_t bFullFrameRefreshModeEnabled : 1;
859 uint32_t bAntiNoiseScanEnabled : 1;
868 uintptr_t pFPBPoolAvailable;
883 int32_t nRenderingCycle;
910 uint8_t bForceToUseMinimalEnclosure : 1;
911 uint8_t bSuspendUpdate : 1;
913 uint8_t bOnlyUpdateMinimalEnclosure : 1;
915 uint8_t chUpdateLifeCycle;
933 uint8_t chUpdateLifeCycle;
1105 bool bConsiderDryRun);
1121 bool bConsiderDryRun,
1248 uint_fast8_t chMask,
1510 uint_fast8_t chCount);
1536 uint8_t chUserRegionIndex);
1590 uint8_t chNextUserIndex);
1603 uint8_t chNextUserIndex);
1631 uint_fast16_t hwCount);
1644 uint_fast16_t hwCount);
2027#if defined(__clang__)
2028# pragma clang diagnostic pop