30#ifndef __ARM_2D_HELPER_PFB_H__
31#define __ARM_2D_HELPER_PFB_H__
36#include "./__arm_2d_helper_common.h"
44# pragma clang diagnostic push
45# pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
46# pragma clang diagnostic ignored "-Wpadded"
56#define ARM_2D_FPS_MODE_RENDER_ONLY 0
57#define ARM_2D_FPS_MODE_REAL 1
107#define ARM_2D_HELPER_PFB_INIT( __CB_ADDR, \
117 ARM_SECTION(".bss.noinit.arm_2d_pfb_pool") \
121 __PIXEL_TYPE tBuffer[(__PFB_WIDTH) * (__PFB_HEIGHT)]; \
122 } s_tPFBs[__PFB_NUM]; \
124 arm_2d_helper_pfb_cfg_t tCFG = { \
125 .tDisplayArea.tSize = { \
126 .iWidth = (__SCREEN_WIDTH), \
127 .iHeight = (__SCREEN_HEIGHT), \
130 .FrameBuffer.ptPFBs = (arm_2d_pfb_t *)s_tPFBs, \
131 .FrameBuffer.tFrameSize = { \
132 .iWidth = (__PFB_WIDTH), \
133 .iHeight = (__PFB_HEIGHT), \
135 .FrameBuffer.wBufferSize = sizeof(s_tPFBs[0].tBuffer), \
136 .FrameBuffer.hwPFBNum = dimof(s_tPFBs), \
141 arm_2d_helper_pfb_init((__CB_ADDR), &tCFG); \
152#define ARM_2D_HELPER_PFB_UPDATE_ON_DRAW_HANDLER( \
156 arm_2d_helper_pfb_update_dependency((__CB_ADDR), \
157 ARM_2D_PFB_DEPEND_ON_DRAWING, \
158 (arm_2d_helper_pfb_dependency_t []) {{ \
160 .fnHandler = (__HANDLER), \
161 .pTarget = (NULL,##__VA_ARGS__),\
166#define __IMPL_ARM_2D_REGION_LIST(__NAME, ...) \
168 __NAME##_offset = __COUNTER__, \
171 arm_2d_region_list_item_t __NAME[] = {
174#define IMPL_ARM_2D_REGION_LIST(__NAME, ...) \
175 __IMPL_ARM_2D_REGION_LIST(__NAME,##__VA_ARGS__)
178#define END_IMPL_ARM_2D_REGION_LIST(...) \
181#define __ADD_REGION_TO_LIST(__NAME, ...) \
183 .ptNext = (arm_2d_region_list_item_t *) \
184 &(__NAME[__COUNTER__ - __NAME##_offset]), \
190#define ADD_REGION_TO_LIST(__NAME, ...) \
191 __ADD_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
194#define __ADD_LAST_REGION_TO_LIST(__NAME, ...) \
202#define ADD_LAST_REGION_TO_LIST(__NAME, ...) \
203 __ADD_LAST_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
206#define IMPL_PFB_ON_DRAW(__NAME) IMPL_ON_DRAW_EVT(__NAME)
209#define IMPL_PFB_ON_LOW_LV_RENDERING(__NAME) \
210 void __NAME(void *pTarget, \
211 const arm_2d_pfb_t *ptPFB, \
215#define IMPL_PFB_ON_FRAME_SYNC_UP(__NAME) \
216 bool __NAME(void *pTarget)
265#define init_arm_2d_helper_pfb( __CB_ADDR, \
274 ARM_2D_HELPER_PFB_INIT( \
293#define update_arm_2d_helper_pfb_on_draw_handler( \
297 ARM_2D_HELPER_PFB_UPDATE_ON_DRAW_HANDLER( \
299 (__HANDLER),##__VA_ARGRS__)
312#define arm_2d_helper_pfb_report_rendering_complete(__PFB_HELPER_PTR,...) \
313 __arm_2d_helper_pfb_report_rendering_complete((__PFB_HELPER_PTR), \
314 (NULL,##__VA_ARGS__))
317#define impl_arm_2d_region_list(__NAME, ...) \
318 IMPL_ARM_2D_REGION_LIST(__NAME,##__VA_ARGS__)
319#define add_region_to_list(__NAME, ...) \
320 ADD_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
321#define add_last_region_to_list(__NAME, ...) \
322 ADD_LAST_REGION_TO_LIST(__NAME, ##__VA_ARGS__)
323#define end_impl_arm_2d_region_list(...) \
324 END_IMPL_ARM_2D_REGION_LIST(__VA_ARGS__)
326#define impl_pfb_on_draw(__NAME) IMPL_PFB_ON_DRAW(__NAME)
327#define impl_pfb_on_low_lv_rendering(__NAME) \
328 IMPL_PFB_ON_LOW_LV_RENDERING(__NAME)
378 uint32_t wSourceStride,
380 uint32_t wTargetStride,
383 uint_fast8_t chBytePerPixel );
410 uint32_t nDataItemCount,
411 uint_fast8_t chDataItemSize);
430#define ARM_2D_3FB_INVALID_IDX 3
440 uint8_t u2Drawing : 2;
441 uint8_t u2Flushing : 2;
442 uint8_t u2ReadyToFlush : 2;
443 uint8_t u2ReadyToDraw : 2;
445 uintptr_t tSemaphore;
446 bool bFBCopyComplete;
460 uint32_t u24Size : 24;
478 uint8_t bFromInternalPool : 1;
479 uint8_t bFromHeap : 1;
555 uint32_t wBufferSize;
557 uint16_t bDoNOTUpdateDefaultFrameBuffer : 1;
558 uint16_t bDisableDynamicFPBSize : 1;
559 uint16_t bSwapRGB16 : 1;
560 uint16_t bDebugDirtyRegions : 1;
562 uint16_t u3PixelWidthAlign : 3;
563 uint16_t u3PixelHeightAlign : 3;
564 uint16_t u4PoolReserve : 4;
582 ARM_2D_PERFC_RENDER = 0,
585 __ARM_2D_PERFC_COUNT,
610 } OptimizedDirtyRegions;
614 uint32_t wPFBPixelCount;
617 uint8_t chFreePFBCount;
619 uint16_t bIsDirtyRegionOptimizationEnabled : 1;
620 uint16_t bEnableDirtyRegionOptimizationRequest : 1;
621 uint16_t bDisableDirtyRegionOptimizationRequest : 1;
622 uint16_t bEncounterDynamicDirtyRegion : 1;
623 uint16_t bFailedToOptimizeDirtyRegion : 1;
624 uint16_t bIsUsingOptimizedDirtyRegionList : 1;
627 uint16_t bIsNewFrame : 1;
629 uint16_t bIgnoreLowLevelFlush : 1;
630 uint16_t bHideNavigationLayer : 1;
631 uint16_t bIsDryRun : 1;
632 uint16_t bNoAdditionalDirtyRegionList : 1;
633 uint16_t bFirstIteration : 1;
634 uint16_t bIsRegionChanged : 1;
638 uintptr_t pFPBPoolAvailable;
653 int32_t nRenderingCycle;
872 uint_fast8_t chCount);
999#if defined(__clang__)
1000# pragma clang diagnostic pop