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(...) \
198#define __ADD_REGION_TO_LIST(__NAME, ...) \
200 .ptNext = (arm_2d_region_list_item_t *) \
201 &(__NAME[__COUNTER__ - __NAME##_offset]), \
207#define ADD_REGION_TO_LIST(__NAME, ...) \
208 __ADD_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
211#define __ADD_LAST_REGION_TO_LIST(__NAME, ...) \
219#define ADD_LAST_REGION_TO_LIST(__NAME, ...) \
220 __ADD_LAST_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
223#define IMPL_PFB_ON_DRAW(__NAME) IMPL_ON_DRAW_EVT(__NAME)
226#define IMPL_PFB_ON_LOW_LV_RENDERING(__NAME) \
227 void __NAME(void *pTarget, \
228 const arm_2d_pfb_t *ptPFB, \
232#define IMPL_PFB_ON_FRAME_SYNC_UP(__NAME) \
233 bool __NAME(void *pTarget)
235#define IMPL_PFB_BEFORE_FLUSHING(__NAME) \
236 bool __NAME(void *pTarget, \
237 arm_2d_pfb_t *ptOrigin, \
238 arm_2d_pfb_t *ptScratch)
290#define init_arm_2d_helper_pfb( __CB_ADDR, \
300 ARM_2D_HELPER_PFB_INIT( \
320#define update_arm_2d_helper_pfb_on_draw_handler( \
324 ARM_2D_HELPER_PFB_UPDATE_ON_DRAW_HANDLER( \
326 (__HANDLER),##__VA_ARGRS__)
339#define arm_2d_helper_pfb_report_rendering_complete(__PFB_HELPER_PTR,...) \
340 __arm_2d_helper_pfb_report_rendering_complete((__PFB_HELPER_PTR), \
341 (NULL,##__VA_ARGS__))
344#define __arm_2d_helper_dirty_region_update_dirty_regions0 \
345 __arm_2d_helper_dirty_region_update_dirty_regions
358#define __arm_2d_helper_dirty_region_update_dirty_regions3( __helper_ptr, \
360 __visible_area_ptr, \
363 __arm_2d_helper_dirty_region_update_dirty_regions2( \
366 (__visible_area_ptr), \
377#define __arm_2d_helper_dirty_region_update_dirty_regions1( __helper_ptr, \
380 __arm_2d_helper_dirty_region_update_dirty_regions2( \
398#define arm_2d_helper_dirty_region_update_dirty_regions( __helper_ptr, \
401 ARM_CONNECT2(__arm_2d_helper_dirty_region_update_dirty_regions, \
402 __ARM_VA_NUM_ARGS(__VA_ARGS__))((__helper_ptr), \
416#define __arm_2d_helper_dirty_region_update_item4( __item_ptr, \
418 __visible_region_ptr, \
420 __arm_2d_helper_dirty_region_item_update((__item_ptr), \
421 (__target_tile_ptr), \
422 (__visible_region_ptr), \
429#define __arm_2d_helper_dirty_region_update_item5( __dirty_region_helper_ptr, \
432 __visible_region_ptr, \
434 __arm_2d_helper_dirty_region_item_update((__item_ptr), \
435 (__target_tile_ptr), \
436 (__visible_region_ptr), \
439#define arm_2d_helper_dirty_region_update_item(...) \
440 ARM_CONNECT2( __arm_2d_helper_dirty_region_update_item, \
441 __ARM_VA_NUM_ARGS(__VA_ARGS__) \
445#define impl_arm_2d_region_list(__NAME, ...) \
446 IMPL_ARM_2D_REGION_LIST(__NAME,##__VA_ARGS__)
447#define add_region_to_list(__NAME, ...) \
448 ADD_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
449#define add_last_region_to_list(__NAME, ...) \
450 ADD_LAST_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
451#define end_impl_arm_2d_region_list(...) \
452 END_IMPL_ARM_2D_REGION_LIST(__VA_ARGS__)
454#define impl_pfb_on_draw(__NAME) IMPL_PFB_ON_DRAW(__NAME)
455#define impl_pfb_on_low_lv_rendering(__NAME) \
456 IMPL_PFB_ON_LOW_LV_RENDERING(__NAME)
506 uint32_t wSourceStride,
508 uint32_t wTargetStride,
511 uint_fast8_t chBytePerPixel );
538 uint32_t nDataItemCount,
539 uint_fast8_t chDataItemSize);
558#define ARM_2D_3FB_INVALID_IDX 3
568 uint8_t u2Drawing : 2;
569 uint8_t u2Flushing : 2;
570 uint8_t u2ReadyToFlush : 2;
571 uint8_t u2ReadyToDraw : 2;
573 uintptr_t tSemaphore;
574 bool bFBCopyComplete;
588 uint32_t u24Size : 24;
605 uint8_t chUserRegionIndex;
607 uint8_t bUpdated : 1;
610 uint16_t bFromInternalPool : 1;
611 uint16_t bFromHeap : 1;
612 uint16_t u2UpdateState : 2;
613 uint16_t u12KEY : 12;
709 uint32_t u24BufferSize : 24;
710 uint32_t u7ColourFormat : 7 ;
712 uint32_t u8PFBNum : 8;
713 uint32_t bDoNOTUpdateDefaultFrameBuffer : 1;
714 uint32_t bDisableDynamicFPBSize : 1;
715 uint32_t bSwapRGB16 : 1;
716 uint32_t bDebugDirtyRegions : 1;
718 uint32_t u3PixelWidthAlign : 3;
719 uint32_t u3PixelHeightAlign : 3;
720 uint32_t u4PoolReserve : 4;
738 ARM_2D_PERFC_RENDER = 0,
741 __ARM_2D_PERFC_COUNT,
766 } OptimizedDirtyRegions;
770 uint32_t wPFBPixelCount;
773 uint8_t chFreePFBCount;
775 uint16_t bIsDirtyRegionOptimizationEnabled : 1;
776 uint16_t bEnableDirtyRegionOptimizationRequest : 1;
777 uint16_t bDisableDirtyRegionOptimizationRequest : 1;
778 uint16_t bEncounterDynamicDirtyRegion : 1;
779 uint16_t bFailedToOptimizeDirtyRegion : 1;
780 uint16_t bIsUsingOptimizedDirtyRegionList : 1;
781 uint16_t bDirtyRegionDebugModeSkipFrame : 1;
784 uint16_t bIsNewFrame : 1;
785 uint16_t bIgnoreCanvasColour : 1;
786 uint16_t bIgnoreLowLevelFlush : 1;
787 uint16_t bHideNavigationLayer : 1;
788 uint16_t bIsDryRun : 1;
789 uint16_t bNoAdditionalDirtyRegionList : 1;
790 uint16_t bFirstIteration : 1;
791 uint16_t bIsRegionChanged : 1;
796 uintptr_t pFPBPoolAvailable;
811 int32_t nRenderingCycle;
838 uint8_t bForceToUseMinimalEnclosure : 1;
839 uint8_t bSuspendUpdate : 1;
841 uint8_t bOnlyUpdateMinimalEnclosure : 1;
843 uint8_t chUpdateLifeCycle;
861 uint8_t chUpdateLifeCycle;
1013 bool bConsiderDryRun);
1106 uint_fast8_t chMask,
1365 uint_fast8_t chCount);
1390 uint8_t chUserRegionIndex);
1444 uint8_t chNextUserIndex);
1457 uint8_t chNextUserIndex);
1485 uint_fast16_t hwCount);
1498 uint_fast16_t hwCount);
1863#if defined(__clang__)
1864# pragma clang diagnostic pop