1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 // Software and any modification/derivatives thereof.
18 // No right, ownership, or interest to MStar Software and any
19 // modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 // supplied together with third party`s software and the use of MStar
23 // Software may require additional licenses from third parties.
24 // Therefore, you hereby agree it is your sole responsibility to separately
25 // obtain any and all third party right and license necessary for your use of
26 // such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 // MStar`s confidential information and you agree to keep MStar`s
30 // confidential information in strictest confidence and not disclose to any
31 // third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 // kind. Any warranties are hereby expressly disclaimed by MStar, including
35 // without limitation, any warranties of merchantability, non-infringement of
36 // intellectual property rights, fitness for a particular purpose, error free
37 // and in conformity with any international standard. You agree to waive any
38 // claim against MStar for any loss, damage, cost or expense that you may
39 // incur related to your use of MStar Software.
40 // In no event shall MStar be liable for any direct, indirect, incidental or
41 // consequential damages, including without limitation, lost of profit or
42 // revenues, lost or damage of data, and unauthorized system use.
43 // You agree that this Section 4 shall still apply without being affected
44 // even if MStar Software has been modified by MStar in accordance with your
45 // request or instruction for your use, except otherwise agreed by both
46 // parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 // services in relation with MStar Software to you for your use of
50 // MStar Software in conjunction with your or your customer`s product
51 // ("Services").
52 // You understand and agree that, except otherwise agreed by both parties in
53 // writing, Services are provided on an "AS IS" basis and the warranty
54 // disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 // or otherwise:
58 // (a) conferring any license or right to use MStar name, trademark, service
59 // mark, symbol or any other identification;
60 // (b) obligating MStar or any of its affiliates to furnish any person,
61 // including without limitation, you and your customers, any assistance
62 // of any kind whatsoever, or any information; or
63 // (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 // of Taiwan, R.O.C., excluding its conflict of law rules.
67 // Any and all dispute arising out hereof or related hereto shall be finally
68 // settled by arbitration referred to the Chinese Arbitration Association,
69 // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 // Rules of the Association by three (3) arbitrators appointed in accordance
71 // with the said Rules.
72 // The place of arbitration shall be in Taipei, Taiwan and the language shall
73 // be English.
74 // The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2008-2010 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94
95 ///////////////////////////////////////////////////////////////////////////////////////////////////
96 /// file Mdrv_sc_3d.c
97 /// @brief Driver Interface
98 /// @author MStar Semiconductor Inc.
99 ///////////////////////////////////////////////////////////////////////////////////////////////////
100 #define DRV_SC_3D_C
101
102 #ifdef MSOS_TYPE_LINUX_KERNEL
103 #include <linux/string.h>
104 #include <linux/slab.h>
105 #else
106 #include <string.h>
107 #endif
108 #include "UFO.h"
109 // Common Definition
110 #include "MsCommon.h"
111 #include "MsOS.h"
112 #include "mhal_xc_chip_config.h"
113 #include "utopia.h"
114 #include "utopia_dapi.h"
115 #include "drvXC_IOPort.h"
116 #include "apiXC.h"
117 #include "apiXC_Adc.h"
118 #include "apiXC_Auto.h"
119 #include "drv_sc_display.h"
120 #include "drv_sc_isr.h"
121 #include "apiXC_PCMonitor.h"
122 #include "apiXC_ModeParse.h"
123 #include "drvXC_HDMI_if.h"
124 #include "mvideo_context.h"
125 #include "drv_sc_ip.h"
126 #if (LD_ENABLE==1)
127 #include "mdrv_ld.h"
128 #include "mdrv_ldalgo.h"
129 #endif
130 #include "mdrv_sc_3d.h"
131 #include "drv_sc_menuload.h"
132 #include "drvXC_ADC_Internal.h"
133 #include "mhal_sc.h"
134 #if FRC_INSIDE
135 #include "mdrv_frc.h"
136 #include "mhal_frc.h"
137 #endif
138 #include "XC_private.h"
139 #include "apiXC_v2.h"
140 #include "drv_sc_ip.h"
141
142 #include "mhal_pip.h"
143 #include "mhal_mux.h"
144 #include "mhal_ip.h"
145
146 #include "halCHIP.h"
147 #include "drv_sc_scaling.h"
148 #include "xc_hwreg_utility2.h"
149 #include "mhal_hdmi.h"
150 #include "mdrv_sc_dynamicscaling.h"
151 #include "mhal_dynamicscaling.h"
152 #include "mhal_menuload.h"
153
154 #ifndef UNUSED
155 #define UNUSED(x) ((x)=(x))
156 #endif
157
158 #ifndef DISABLE_3D_FUNCTION
159 //----------------------------------------
160 //--------3D macro define-----------------
161 //----------------------------------------
162
163 #define MS_IPM_BASE0(pInstance, eWin) (MDrv_XC_GetIPMBase(pInstance, 0, eWin))
164 #define MS_IPM_BASE1(pInstance, eWin) (MDrv_XC_GetIPMBase(pInstance, 1, eWin))
165
166 #ifndef MAX
167 #define MAX(x, y) (((x) > (y)) ? (x) : (y))
168 #endif
169
170 #ifndef MIN
171 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
172 #endif
173
174 #ifndef MED
175 #define MED(a,b,c) (a+b+c-MAX3(a,b,c)-MIN3(a,b,c))
176 #endif
177 #define ABS(x) (((x) > 0) ? (x) : (-(x)))
178
179 #ifdef MSOS_TYPE_LINUX
180 #include <assert.h>
181 #else
182 #define assert(b) \
183 do { \
184 if (!(b)){ \
185 printf("assert at [%s][%d] \n", __FUNCTION__, __LINE__); \
186 *((int*)0) = 0; \
187 } \
188 } while(0)
189 #endif
190
191 #ifdef ANDROID
192 #include <cutils/log.h>
193 #ifndef LOGE
194 #define printf(format, args...) ALOGE(format, ##args);
195 #else
196 #define printf(format, args...) LOGE(format, ##args);
197 #endif
198 #endif
199
200 #define WIDTH_4K2KTIMING (3840)
201 #define HEIGHT_4K2KTIMING (2160)
202 #define OFFSET_4K2KTIMING (10)
203
204 //hw 2d to 3d macro
205 #define HW_2DTO3D_DEFAULT_CONCAVE 0x0006
206 #define HW_2DTO3D_DEFAULT_ARTIFICIALGAIN 0x0000
207 #define HW_2DTO3D_DEFAULT_GAIN 0x001E
208 #if (HW_2DTO3D_VER >= 4)
209 #define HW_2DTO3D_DEFAULT_OFFSET 0x0080
210 #else
211 #define HW_2DTO3D_DEFAULT_OFFSET 0x00FE
212 #endif
213 #define HW_2DTO3D_DEFAULT_ELESEL 0x0002
214 #define HW_2DTO3D_DEFAULT_MODSEL 0x0003
215 #define HW_2DTO3D_DEFAULT_EDGEBLACKWIDTH 0x0000
216
217 //detect nine lattice macro
218 #define DETECTNL_PIXEL_STEP 16
219 #define DETECTNL_COLORTHRESHOLD 63
220 #define DETECTNL_TRY_TIMES 4
221 #define DETECTNL_NON_VALUE 255
222 #define DETECTNL_LINEAR_DIFF 32
223 #define DETECTNL_COMPUTE_TIME 0
224 #define DETECTNL_LATTICE_NUM 9
225
226 //detect 3d format macro
227 #define DETECT3DFORMAT_DEFAULT_HORSEARCHRANGE 60
228 #define DETECT3DFORMAT_DEFAULT_VERSEARCHRANGE 1
229 #define DETECT3DFORMAT_DEFAULT_GYPIXELTHRESHOLD 14
230 #define DETECT3DFORMAT_DEFAULT_RCRPIXELTHRESHOLD 14
231 #define DETECT3DFORMAT_DEFAULT_BCBPIXELTHRESHOLD 14
232 #define DETECT3DFORMAT_DEFAULT_HORSAMPLECOUNT 8
233 #define DETECT3DFORMAT_DEFAULT_VERSAMPLECOUNT 8
234 #define DETECT3DFORMAT_DEFAULT_MAXCHECKINGFRAMECOUNT 1
235 #define DETECT3DFORMAT_DEFAULT_HITPIXELPERCENTAGE 85
236 #define DETECT3DFORMAT_DEFAULT_HITFRAMEPERCENTAGE 06
237 #define DETECT3DFORMAT_DEFAULT_HORPUREPIXEL 10
238 #define DETECT3DFORMAT_DEFAULT_VERPUREPIXEL 10
239 #define DETECT3DFORMAT_DEFAULT_PUREPIXELPERCENTAGE 85
240
241 #ifndef SUPPORT_SC0_SUB_WIN
242 #define SUPPORT_SC0_SUB_WIN TRUE
243 #endif
244 #ifndef HW_6TAP_MODE_SUPPORT
245 #define HW_6TAP_MODE_SUPPORT TRUE
246 #endif
247
248 #define ENABLE_T3D_DEBUG FALSE //debug 2Dto3D and auto detect 3D format
249 //--------------------------------------------
250 //--------3D struct define-----------------
251 //--------------------------------------------
252
253 //--------------------------------------------
254 //--------3D static variables-----------------
255 //--------------------------------------------
256
257 //----------------------------------------
258 //--------3D internal interface-----------
259 //----------------------------------------
MDrv_SC_3D_Variable_Init(void * pInstance)260 void MDrv_SC_3D_Variable_Init(void *pInstance)
261 {
262 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
263 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
264 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
265 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
266 pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW] = E_XC_3D_INPUT_MODE_NONE;
267 pXCResourcePrivate->stdrvXC_3D._eInput3DMode[SUB_WINDOW] = E_XC_3D_INPUT_MODE_NONE;
268 pXCResourcePrivate->stdrvXC_3D._eOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
269 pXCResourcePrivate->stdrvXC_3D._e3DPanelType = E_XC_3D_PANEL_NONE;
270 pXCResourcePrivate->stdrvXC_3D._b3DMainFirst = TRUE;
271 pXCResourcePrivate->stdrvXC_3D._u163DHShift = 0;
272 pXCResourcePrivate->stdrvXC_3D._ePreUsedInput3DMode[MAIN_WINDOW] = E_XC_3D_INPUT_MODE_NONE;
273 pXCResourcePrivate->stdrvXC_3D._ePreUsedInput3DMode[SUB_WINDOW] = E_XC_3D_INPUT_MODE_NONE;
274 pXCResourcePrivate->stdrvXC_3D._ePreUsedOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
275 pXCResourcePrivate->stdrvXC_3D._bNeedRestore3DFormat = FALSE;
276 #if HW_2DTO3D_SUPPORT
277 pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf = 0;
278 pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf = 0;
279 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u32Hw2dTo3dPara_Version = HW2DTO3DPARA_VERSION;
280 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Concave = HW_2DTO3D_DEFAULT_CONCAVE;
281 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ArtificialGain = HW_2DTO3D_DEFAULT_ARTIFICIALGAIN;
282 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain = HW_2DTO3D_DEFAULT_GAIN;
283 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset = HW_2DTO3D_DEFAULT_OFFSET;
284 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel = HW_2DTO3D_DEFAULT_ELESEL;
285 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ModSel = HW_2DTO3D_DEFAULT_MODSEL;
286 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EdgeBlackWidth = HW_2DTO3D_DEFAULT_EDGEBLACKWIDTH;
287 pXCResourcePrivate->stdrvXC_3D._bIsHW2Dto3DPatchEnabled = FALSE;
288 #endif
289 #if (HW_DESIGN_3D_VER < 2)
290 pXCResourcePrivate->stdrvXC_3D._bFrmpackToLinealterOpt = FALSE;
291 #endif
292 pXCResourcePrivate->stdrvXC_3D._bIsLR_Sbs2Line = FALSE;
293 pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag = FALSE;
294 pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u32Detect3DFormatPara_Version = DETECT3DFORMATPARA_VERSION;
295 pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange = DETECT3DFORMAT_DEFAULT_HORSEARCHRANGE;
296 pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSearchRange = DETECT3DFORMAT_DEFAULT_VERSEARCHRANGE;
297 pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16GYPixelThreshold = DETECT3DFORMAT_DEFAULT_GYPIXELTHRESHOLD;
298 pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16RCrPixelThreshold = DETECT3DFORMAT_DEFAULT_RCRPIXELTHRESHOLD;
299 pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16BCbPixelThreshold = DETECT3DFORMAT_DEFAULT_BCBPIXELTHRESHOLD;
300 pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSampleCount = DETECT3DFORMAT_DEFAULT_HORSAMPLECOUNT;
301 pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSampleCount = DETECT3DFORMAT_DEFAULT_VERSAMPLECOUNT;
302 pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount = DETECT3DFORMAT_DEFAULT_MAXCHECKINGFRAMECOUNT;
303 pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HitPixelPercentage = DETECT3DFORMAT_DEFAULT_HITPIXELPERCENTAGE;
304 pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.bEnableOverscan = TRUE;
305 pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u32FPInfoPara_Version = XC_3D_FPINFOPARA_VERSION;
306 pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting = FALSE;
307 pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank = 0;
308 pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D = TRUE;
309 pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod = E_XC_3D_AUTODETECT_HW_COMPATIBLE;
310 if(pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod == E_XC_3D_AUTODETECT_HW)
311 {
312 pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D = pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D;
313 }
314 else
315 {
316 pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D = FALSE;
317 }
318
319 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
320 pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = FALSE;
321 pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount = 0;
322 pXCResourcePrivate->stdrvXC_3D._bDoubleAlign = FALSE;
323 pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank = TRUE;
324 pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA = FALSE;
325 pXCResourcePrivate->stdrvXC_3D._u16DDHSize = 0; //DD H size
326 pXCResourcePrivate->stdrvXC_3D._u16DDVSize = 0; //DD V size
327 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_MODE_NONE;//FRC 3D input format
328 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;//FRC 3D output format
329 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
330 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
331 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = FALSE;
332 }
333
334 // call this function to know whether current 3D status is 48hz required.
335 // if it is 48hz output, we need to adjust the logic of framelock judgement.
MDrv_SC_3D_IsOutputVfreq48hz(void * pInstance,SCALER_WIN eWindow,MS_U16 u16InputVFreq)336 MS_BOOL MDrv_SC_3D_IsOutputVfreq48hz(void *pInstance, SCALER_WIN eWindow, MS_U16 u16InputVFreq)
337 {
338 MS_ASSERT(eWindow < MAX_WINDOW);
339
340 if(eWindow >= MAX_WINDOW)
341 {
342 return FALSE;
343 }
344 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
345 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
346 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
347 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
348
349 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "@@ gSrcInfo[eWindow].stCapWin.height=%u, Input Vfreq=%u\n",gSrcInfo[eWindow].stCapWin.height, u16InputVFreq)
350 if(IS_OUTPUT_FRAME_ALTERNATIVE()
351 && (u16InputVFreq >= 230)
352 && (u16InputVFreq <= 245)
353 )
354 {
355 return TRUE;
356 }
357 else
358 {
359 return FALSE;
360 }
361 }
362
MDrv_SC_3D_AdjustPreVerSrcForFramepacking(void * pInstance,SCALER_WIN eWindow)363 MS_BOOL MDrv_SC_3D_AdjustPreVerSrcForFramepacking(void *pInstance, SCALER_WIN eWindow)
364 {
365 MS_ASSERT(eWindow < MAX_WINDOW);
366 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
367 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
368 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
369 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
370 if(eWindow >= MAX_WINDOW)
371 {
372 return FALSE;
373 }
374
375 #if (HW_DESIGN_3D_VER >= 2)
376 return FALSE;
377 #else
378 if(IS_INPUT_FRAME_PACKING(eWindow)
379 && IS_OUTPUT_LINE_ALTERNATIVE()
380 && pXCResourcePrivate->stdrvXC_3D._bFrmpackToLinealterOpt)
381 {
382 return TRUE;
383 }
384 else
385 {
386 return FALSE;
387 }
388 #endif
389 }
390
MDrv_SC_3D_Is2TapModeSupportedFormat(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)391 MS_BOOL MDrv_SC_3D_Is2TapModeSupportedFormat(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
392 {
393 MS_ASSERT(eWindow < MAX_WINDOW);
394 MS_ASSERT(pSrcInfo);
395 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
396 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
397 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
398 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
399 if(eWindow >= MAX_WINDOW)
400 {
401 return FALSE;
402 }
403
404 if(pSrcInfo == NULL)
405 {
406 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
407 return FALSE;
408 }
409
410 //LBL to LBL, TB to LBL, FP to LBL can use 2 tap mode to avoid line buffer limitation
411 //SBS to LBL don't need use 2 tap mode, since it's op only fetch 960 pixel
412 //FI to LBL to and sw 2d to 3d have fclk issue, need prescaling down, so not use 2 tap mode
413 //interlace signal can not use 2 tap mode
414 //if capture.width<=lblength, no need to use 2 tap mode
415 //if have custom v prescaling, can not use 2 tap mode
416 #if (HW_DESIGN_3D_VER >= 2)
417 return ((((pSrcInfo->stCapWin.width > SCALER_LINE_BUFFER_MAX) // 4K2K or 2560x720 SBS-FULL
418 && (IS_INPUT_SIDE_BY_SIDE_FULL(eWindow) || IS_INPUT_SIDE_BY_SIDE_HALF(eWindow))
419 && (IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_TOP_BOTTOM()))
420 || ((pSrcInfo->stCapWin.width > MS_3D_LINE_BFF_MAX)
421 && (!((pSrcInfo->Status2.u16PreVCusScalingSrc > pSrcInfo->Status2.u16PreVCusScalingDst)))
422 && (((IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
423 || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
424 || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_TOP_BOTTOM())
425 || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_TOP_BOTTOM())
426 || (IS_INPUT_CHECK_BOARD(eWindow))
427 || (IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
428 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE()))
429 || ((IS_INPUT_FRAME_PACKING(eWindow)
430 || (IS_INPUT_TOP_BOTTOM(eWindow))
431 || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow))
432 || (IS_INPUT_SIDE_BY_SIDE_FULL(eWindow)))
433 && (IS_OUTPUT_FRAME_PACKING())))))
434 #if (HW_2LINEMODE_DEINTERLACE_SUPPORT == FALSE)
435 && (!pSrcInfo->bInterlace)
436 #endif
437 );
438 #else
439 return ((pSrcInfo->stCapWin.width > MS_3D_LINE_BFF_MAX)
440 && (!((pSrcInfo->Status2.u16PreVCusScalingSrc > pSrcInfo->Status2.u16PreVCusScalingDst)))
441 && ((IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_TOP_BOTTOM())
442 || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_TOP_BOTTOM()))
443 && MDrv_SC_3D_Is_LR_Sbs2Line(pInstance)
444 #if (HW_2LINEMODE_DEINTERLACE_SUPPORT == FALSE)
445 && (!pSrcInfo->bInterlace)
446 #endif
447 );
448 #endif
449 }
450
MDrv_SC_3D_Set2TapMode(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)451 MS_BOOL MDrv_SC_3D_Set2TapMode(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
452 {
453 MS_ASSERT(eWindow < MAX_WINDOW);
454 MS_ASSERT(pSrcInfo);
455
456 if(eWindow >= MAX_WINDOW)
457 {
458 return FALSE;
459 }
460
461 if(pSrcInfo == NULL)
462 {
463 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
464 return FALSE;
465 }
466 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
467 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
468 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
469 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
470 if(MDrv_SC_3D_Is2TapModeSupportedFormat(pInstance, pSrcInfo, eWindow))
471 {
472 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, BIT(5), BIT(5)); //Enable HD side by side line buffer mode
473 #if HW_2LINEMODE_DEINTERLACE_SUPPORT
474 if(pSrcInfo->bInterlace)
475 {
476 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, BIT(5), BIT(5)); //Force DI 2-line mode at sc2lb mode
477 }
478 #endif
479
480 // When main and sub is start from 0, it means the main&sub win don't need Fill the sub windows line buffer in vertical blanking
481 MDrv_XC_FilLineBuffer(pInstance, FALSE, MAIN_WINDOW);
482
483 //The starting address of f1 stored at line buffer
484 //Main and Sub window will use the (1920+960) in 2Tap st the same time
485 #ifdef UFO_XC_SUPPORT_3D_DS
486 if(MDrv_XC_Is_SupportSWDS(pInstance))
487 {
488 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK20_13_L, pSrcInfo->u16H_SizeAfterPreScaling, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
489 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK20_1D_L,(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF) || ((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
490 }
491 else
492 #endif
493 {
494 //The starting address of f1 stored at line buffer
495 //Main and Sub window will use the (1920+960) in 2Tap st the same time
496 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_13_L, pSrcInfo->u16H_SizeAfterPreScaling, 0x1FFF);
497
498 //LB offset should be even when 2 tap mode
499 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset &= ~0x1;
500 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
501 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
502 }
503 }
504 else
505 {
506 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x0, BIT(5)); //Disable HD side by side line buffer mode
507 #if HW_2LINEMODE_DEINTERLACE_SUPPORT
508 if(pSrcInfo->bInterlace)
509 {
510 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, 0x0, BIT(5)); //Force DI 2-line mode at sc2lb mode
511 }
512 #endif
513 }
514 return TRUE;
515 }
516
MDrv_SC_3D_PostPQSetting(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)517 MS_BOOL MDrv_SC_3D_PostPQSetting(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
518 {
519 MS_ASSERT(eWindow < MAX_WINDOW);
520 MS_ASSERT(pSrcInfo);
521
522 if(eWindow >= MAX_WINDOW)
523 {
524 return FALSE;
525 }
526
527 if(pSrcInfo == NULL)
528 {
529 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
530 return FALSE;
531 }
532
533 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
534 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
535
536 if(MDrv_SC_3D_Is2TapModeSupportedFormat(pInstance, pSrcInfo, eWindow))
537 {
538 //Set SRAM to linear mode
539 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0B_L, 0x0303);
540 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_2B_L, 0x0303);
541 //disable snr_vertical vertical c low pass and spike NR
542 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK26_50_L, 0x0000, 0x00FF);
543 //disable v cti
544 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK26_31_L, 0x0000, 0xF000);
545 //disable anti pal
546 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_6A_L, 0x0000, BIT(0));
547 //spf bypass
548 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0C_70_L, BIT(0), BIT(0));
549 }
550 return TRUE;
551 }
552
MDrv_SC_3D_IsIPMFetchNoLimitCase(void * pInstance,SCALER_WIN eWindow)553 MS_BOOL MDrv_SC_3D_IsIPMFetchNoLimitCase(void *pInstance, SCALER_WIN eWindow)
554 {
555 MS_ASSERT(eWindow < MAX_WINDOW);
556
557 if(eWindow >= MAX_WINDOW)
558 {
559 return FALSE;
560 }
561
562 #if (HW_DESIGN_3D_VER >= 2)
563 return FALSE;
564 #else
565 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
566 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
567 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
568 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
569
570 if((IS_INPUT_FRAME_PACKING(eWindow)
571 && (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_720X2P_VSIZE))
572 ||
573 IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
574 ||
575 MDrv_SC_3D_Is2TapModeSupportedFormat(pInstance, &gSrcInfo[eWindow], eWindow)
576 )
577 {
578 //no any limits
579 return TRUE;
580 }
581 else
582 {
583 return FALSE;
584 }
585 #endif
586 }
587
MDrv_SC_3D_Adjust_FillLBMode(void * pInstance,SCALER_WIN eWindow)588 void MDrv_SC_3D_Adjust_FillLBMode(void *pInstance, SCALER_WIN eWindow)
589 {
590 MS_ASSERT(eWindow < MAX_WINDOW);
591 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
592 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
593 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
594 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
595 _XC_ENTRY(pInstance);
596
597 #if (HW_DESIGN_3D_VER >= 2)
598 if(IS_OUTPUT_TOP_BOTTOM()
599 || IS_OUTPUT_SIDE_BY_SIDE_HALF()
600 || IS_OUTPUT_LINE_ALTERNATIVE()
601 || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()
602 || IS_OUTPUT_TOP_BOTTOM_HW()
603 )
604 {
605 MDrv_XC_FilLineBuffer(pInstance, TRUE, SUB_WINDOW);
606 }
607 else
608 {
609 MDrv_XC_FilLineBuffer(pInstance, FALSE, SUB_WINDOW);
610 }
611 #else
612 MS_BOOL bEnable = FALSE;
613 if ( IS_OUTPUT_MODE_NONE() )
614 {
615 bEnable = TRUE; // RD suggestion.
616 }
617 else
618 {
619 if ( (IS_OUTPUT_SIDE_BY_SIDE_HALF() || IS_OUTPUT_TOP_BOTTOM()
620 || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW() || IS_OUTPUT_TOP_BOTTOM_HW())
621 && (pXCResourcePrivate->stdrvXC_3D._b3DMainFirst ^ (eWindow == MAIN_WINDOW))) //only trigger the later one
622 bEnable = TRUE;
623 else
624 bEnable = FALSE;
625 }
626 if (eWindow == SUB_WINDOW)
627 {
628 MDrv_XC_FilLineBuffer(pInstance, bEnable, SUB_WINDOW);
629 }
630 #endif
631 // Designer Jeff.Lin: disable fill line buffer of main_window forever.
632 if (eWindow == MAIN_WINDOW)
633 {
634 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
635 /*sc1 fill main line buffer ahead*/
636 if (Hal_SC_3D_IsDualViewMode(pInstance, eWindow) && (psXCInstPri->u32DeviceID == 1))
637 {
638 MDrv_XC_FilLineBuffer(pInstance, ENABLE, MAIN_WINDOW);
639 }
640 else
641 #endif
642 #if (((HW_DESIGN_4K2K_VER == 7) && (MS_3D_LINE_BFF_MAX == 2048))||((HW_DESIGN_4K2K_VER == 7) && (MS_3D_LINE_BFF_MAX == 960)))
643 //By Jeff.Lin: Kano case can enable fill line buffer of main_window
644 //Because of Kano is not share line PIP 3D mode
645 if(IS_OUTPUT_TOP_BOTTOM()
646 || IS_OUTPUT_SIDE_BY_SIDE_HALF()
647 || IS_OUTPUT_LINE_ALTERNATIVE()
648 || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()
649 || IS_OUTPUT_TOP_BOTTOM_HW()
650 )
651 {
652 MDrv_XC_FilLineBuffer(pInstance, ENABLE, MAIN_WINDOW);
653 }
654 else
655 #endif
656
657 {
658 MDrv_XC_FilLineBuffer(pInstance, DISABLE, MAIN_WINDOW);
659 }
660 }
661
662 _XC_RETURN(pInstance);
663 }
664
MDrv_SC_3D_Adjust_PreVLength(void * pInstance,INPUT_SOURCE_TYPE_t enInputSourceType,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)665 void MDrv_SC_3D_Adjust_PreVLength(void *pInstance, INPUT_SOURCE_TYPE_t enInputSourceType,
666 XC_InternalStatus *pSrcInfo,
667 SCALER_WIN eWindow)
668 {
669 MS_ASSERT(eWindow < MAX_WINDOW);
670 MS_ASSERT(pSrcInfo);
671
672 if(pSrcInfo == NULL)
673 {
674 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
675 return;
676 }
677
678 if(eWindow >= MAX_WINDOW)
679 {
680 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
681 return;
682 }
683
684 #if (HW_DESIGN_3D_VER >= 2)
685 return;
686 #else
687 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreVLength(%s): from %u\n", eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16V_Length);
688
689 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
690 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
691 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
692 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
693 if(((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && (!pSrcInfo->bInterlace))
694 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
695 || IS_INPUT_NORMAL_2D_INTERLACE(eWindow)
696 || IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow)
697 || IS_INPUT_NORMAL_2D(eWindow)) &&
698 IS_OUTPUT_LINE_ALTERNATIVE())
699 {
700 pSrcInfo->u16V_Length *= 2;
701 }
702 else if((IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
703 IS_OUTPUT_TOP_BOTTOM())
704 ||
705 (IS_INPUT_NORMAL_2D(eWindow) &&
706 IS_OUTPUT_TOP_BOTTOM())
707 ||
708 (IS_INPUT_NORMAL_2D_HW(eWindow) &&
709 IS_OUTPUT_TOP_BOTTOM_HW())
710 ||
711 (IS_INPUT_TOP_BOTTOM(eWindow) &&
712 IS_OUTPUT_TOP_BOTTOM())
713 ||
714 (IS_INPUT_TOP_BOTTOM(eWindow) &&
715 IS_OUTPUT_SIDE_BY_SIDE_HALF()))
716 {
717 pSrcInfo->u16V_Length /= 2;
718 }
719 else if((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_TOP_BOTTOM())
720 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
721 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
722 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
723 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_L())
724 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_R())
725 )
726 {
727 MS_U16 u16VactVideo = 0;
728 MS_U16 u16VactSpace = 0;
729 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, FALSE);
730 if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
731 {
732 u16VactVideo *= 2; //field size from MDrv_SC_3D_GetFP_Info
733 }
734 pSrcInfo->u16V_Length = u16VactVideo;
735 }
736 else if((IS_INPUT_LINE_ALTERNATIVE(eWindow) || IS_INPUT_TOP_BOTTOM(eWindow))
737 && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
738 {
739 pSrcInfo->u16V_Length /= 2;
740 }
741 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
742 IS_OUTPUT_LINE_ALTERNATIVE())
743 {
744 pSrcInfo->u16V_Length = pSrcInfo->stDispWin.height;
745 }
746 else if ((IS_INPUT_TOP_BOTTOM(eWindow) || IS_INPUT_LINE_ALTERNATIVE(eWindow)) &&
747 (IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R()))
748 {
749 pSrcInfo->u16V_Length /= 2;
750 }
751 else if (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
752 {
753 pSrcInfo->u16V_Length *= 2;
754 }
755 if((SUB_WINDOW == eWindow)
756 && MDrv_SC_3D_IsUseSameBuffer(pInstance)
757 && (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
758 || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
759 )
760 {
761 pSrcInfo->u16V_Length = gSrcInfo[MAIN_WINDOW].u16V_Length;
762 }
763
764 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreVLength(%s): to %u\n",eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16V_Length);
765 #endif
766 }
767
MDrv_SC_3D_Adjust_PreHorDstSize(void * pInstance,INPUT_SOURCE_TYPE_t enInputSourceType,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)768 void MDrv_SC_3D_Adjust_PreHorDstSize(void *pInstance, INPUT_SOURCE_TYPE_t enInputSourceType,
769 XC_InternalStatus *pSrcInfo,
770 SCALER_WIN eWindow)
771 {
772 MS_ASSERT(eWindow < MAX_WINDOW);
773 MS_ASSERT(pSrcInfo);
774
775 if(pSrcInfo == NULL)
776 {
777 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
778 return;
779 }
780
781 if(eWindow >= MAX_WINDOW)
782 {
783 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
784 return;
785 }
786 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
787 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
788 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
789 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
790 pXCResourcePrivate->stdrvXC_3D._bDoubleAlign = FALSE;
791
792 #if HW_2DTO3D_SUPPORT
793 #define HW_2DTO3DBUFFERSIZE 0x200000
794 MS_PHY u32HW2DTO3D_DD_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf;
795 MS_PHY u32HW2DTO3D_DR_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf;
796 MS_BOOL bOnSameMIU = FALSE;
797 if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf >= HAL_MIU1_BASE)
798 {
799 u32HW2DTO3D_DD_Buf -= HAL_MIU1_BASE;
800 }
801
802 if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf >= HAL_MIU1_BASE)
803 {
804 u32HW2DTO3D_DR_Buf -= HAL_MIU1_BASE;
805 }
806
807
808 if(((pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf >= HAL_MIU1_BASE)
809 && (pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf >= HAL_MIU1_BASE)
810 && (pXCResourcePrivate->stdrvXC_Scaling._au32PreFBAddress[eWindow] >= HAL_MIU1_BASE))
811 ||((pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf < HAL_MIU1_BASE)
812 && (pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf < HAL_MIU1_BASE)
813 && (pXCResourcePrivate->stdrvXC_Scaling._au32PreFBAddress[eWindow] < HAL_MIU1_BASE)))
814 {
815 bOnSameMIU = TRUE;
816 }
817 else
818 {
819 bOnSameMIU = FALSE;
820 }
821 if(IS_INPUT_NORMAL_2D_HW(eWindow) //hw 2d to 3d
822 || ((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
823 && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D) //hw auto detect 3d
824 || ((E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
825 && pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D) //hw auto detect 3d compatible way with sw method
826 )
827 {
828 if(bOnSameMIU
829 && (((u32HW2DTO3D_DD_Buf >= (MS_IPM_BASE0(pInstance, eWindow) * BYTE_PER_WORD))
830 && (u32HW2DTO3D_DD_Buf < ((MS_IPM_BASE0(pInstance, eWindow) * BYTE_PER_WORD) + MDrv_XC_GetDNRBufSize(pInstance, eWindow))))
831 || ((u32HW2DTO3D_DR_Buf >= (MS_IPM_BASE0(pInstance, eWindow) * BYTE_PER_WORD))
832 && (u32HW2DTO3D_DR_Buf < ((MS_IPM_BASE0(pInstance, eWindow) * BYTE_PER_WORD) + MDrv_XC_GetDNRBufSize(pInstance, eWindow)))))
833 )
834 {
835 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "scaler dnr buffer is overflow with hw 2d to 3d buffer\n");
836 //E_MMAP_ID_XC_2DTO3D_DD_BUF_LEN+E_MMAP_ID_XC_2DTO3D_DR_BUF_LEN:max:HW_2DTO3DBUFFERSIZE
837 pXCResourcePrivate->stdrvXC_3D.u32OriginalDNRSize = MDrv_XC_GetDNRBufSize(pInstance, eWindow);
838 MDrv_XC_SetDNRBufSize(pInstance, MDrv_XC_GetDNRBufSize(pInstance, eWindow) - HW_2DTO3DBUFFERSIZE, eWindow);
839 pXCResourcePrivate->stdrvXC_3D.bAdjustDNRSize = TRUE;
840 }
841 MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, eWindow,
842 2,
843 pSrcInfo->u16V_SizeAfterPreScaling);
844
845 if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
846 {
847 pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
848 }
849 }
850 else if(pXCResourcePrivate->stdrvXC_3D.bAdjustDNRSize
851 && ((MDrv_XC_GetDNRBufSize(pInstance, eWindow) + HW_2DTO3DBUFFERSIZE) <= pXCResourcePrivate->stdrvXC_3D.u32OriginalDNRSize))
852 {
853 MDrv_XC_SetDNRBufSize(pInstance, MDrv_XC_GetDNRBufSize(pInstance, eWindow) + HW_2DTO3DBUFFERSIZE, eWindow);
854 pXCResourcePrivate->stdrvXC_3D.bAdjustDNRSize = FALSE;
855 }
856
857 if(IS_INPUT_NORMAL_2D_HW(eWindow)
858 && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq == 1200))
859 {
860 if(pSrcInfo->u16H_SizeAfterPreScaling > 1100)
861 {
862 pSrcInfo->u16H_SizeAfterPreScaling = 1100;
863 }
864 MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
865 2,
866 pSrcInfo->u16V_SizeAfterPreScaling);
867 if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
868 {
869 pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
870 }
871 }
872 #endif
873
874 #if (HW_DESIGN_3D_VER == 4)
875 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "PreHorDstSize(%s): %u\n",eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16H_SizeAfterPreScaling);
876 return;
877 #elif (HW_DESIGN_3D_VER >= 2)
878 if(eWindow == MAIN_WINDOW)
879 {
880 if (pSrcInfo->u16H_SizeAfterPreScaling > MST_LINE_BFF_MAX)
881 pSrcInfo->u16H_SizeAfterPreScaling = MST_LINE_BFF_MAX;
882 }
883 else
884 {
885 // sub window
886 if(PIP_SUPPORTED)
887 {
888 if (pSrcInfo->u16H_SizeAfterPreScaling > SUB_MST_LINE_BFF_MAX)
889 {
890 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[PRE] SUB LINE BFF LIMIT : HSrc=%u, HDst=%lu\n",pSrcInfo->u16H_SizeAfterPreScaling, SUB_MST_LINE_BFF_MAX);
891 pSrcInfo->u16H_SizeAfterPreScaling = SUB_MST_LINE_BFF_MAX;
892 }
893 // Avoid Post HSD in PIP/POP case
894 if(pSrcInfo->u16H_SizeAfterPreScaling >= pSrcInfo->stDispWin.width)
895 {
896 #if FRC_INSIDE
897 if( (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC) &&
898 ((pSrcInfo->stCropWin.x != 0) || (pSrcInfo->stCropWin.width != pSrcInfo->stCapWin.width)))
899 {
900 // Consider Crop case, the post HSD clk is not enough for FRC enable case
901 pSrcInfo->u16H_SizeAfterPreScaling = ((pSrcInfo->stCapWin.width*pSrcInfo->stDispWin.width)+(pSrcInfo->stCropWin.width/2))/pSrcInfo->stCropWin.width;
902 }
903 else
904 #endif
905 {
906 pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->stDispWin.width;
907 }
908 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"To avoid Post HSD, HDst=%u\n",pSrcInfo->u16H_SizeAfterPreScaling);
909 }
910 }
911 }
912 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "PreHorDstSize(%s): %u\n",eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16H_SizeAfterPreScaling);
913 return;
914 #else
915
916 //need do prescaling for 3D case especially when pip use same memory
917 if(!(IS_INPUT_MODE_NONE(eWindow) && IS_OUTPUT_MODE_NONE()))
918 {
919 if(pSrcInfo->u16H_SizeAfterPreScaling > pSrcInfo->stDispWin.width)
920 {
921 pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->stDispWin.width;
922 }
923 }
924
925 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreHorDstSize(%s): from %u\n",eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16H_SizeAfterPreScaling);
926
927 if(IS_INPUT_FRAME_PACKING(eWindow) &&
928 IS_OUTPUT_FRAME_ALTERNATIVE())
929 {
930 if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq == 1200)
931 && ((gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
932 || (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)))
933 {
934 if(pSrcInfo->u16H_SizeAfterPreScaling > 900)
935 {
936 pSrcInfo->u16H_SizeAfterPreScaling = 900;
937 }
938 }
939
940 MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
941 2,
942 pSrcInfo->u16V_SizeAfterPreScaling);
943 if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
944 {
945 pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
946 }
947 }
948 else if(((IS_INPUT_LINE_ALTERNATIVE(eWindow) || IS_INPUT_TOP_BOTTOM(eWindow)
949 || IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) || IS_INPUT_FRAME_PACKING(eWindow)
950 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow))
951 && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
952 || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
953 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_L())
954 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_R())
955 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_TOP_BOTTOM())
956 )
957 {
958 MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
959 4 /* 4 frame mode */,
960 pSrcInfo->u16V_SizeAfterPreScaling);
961
962 if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_TOP_BOTTOM())
963 {
964 //do more prescaling down for fclk issue
965 MS_U16 u16Temp = 0;
966 if(MDrv_SC_3D_Is_LR_Sbs2Line(pInstance)) //output line by line
967 {
968 u16Temp = 1300;
969 }
970 else
971 {
972 u16Temp = 720;
973 }
974 pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->u16H_SizeAfterPreScaling > u16Temp ?
975 (u16Temp & ~(OFFSET_PIXEL_ALIGNMENT -1)) : pSrcInfo->u16H_SizeAfterPreScaling;
976 }
977
978 // for memory reason, need support 4 frame mode
979 if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
980 {
981 pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
982 }
983 }
984 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
985 {
986 //for best quality of side by side in, side by side out
987 pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->stCapWin.width;
988 }
989
990 if(((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
991 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)) &&
992 IS_OUTPUT_LINE_ALTERNATIVE())
993 ||
994 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
995 IS_OUTPUT_SIDE_BY_SIDE_HALF() && (pSrcInfo->stCapWin.width != pSrcInfo->stDispWin.width))
996 ||
997 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
998 IS_OUTPUT_TOP_BOTTOM())
999 ||
1000 #if (HW_DESIGN_3D_VER < 1)
1001 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1002 IS_OUTPUT_FRAME_ALTERNATIVE())
1003 ||
1004 #endif
1005 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1006 IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1007 ||
1008 (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && (IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1009 ||
1010 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1011 (IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R()))
1012 ||
1013 (IS_INPUT_FRAME_PACKING(eWindow) &&
1014 IS_OUTPUT_FRAME_ALTERNATIVE())
1015 ||
1016 (IS_INPUT_FRAME_PACKING(eWindow) &&
1017 IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1018 ||
1019 (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) &&
1020 IS_OUTPUT_LINE_ALTERNATIVE())
1021 )
1022 {
1023 MS_U16 u16AlignedWidth = (pSrcInfo->u16H_SizeAfterPreScaling) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
1024 pSrcInfo->u16H_SizeAfterPreScaling = u16AlignedWidth;
1025 pXCResourcePrivate->stdrvXC_3D._bDoubleAlign = TRUE;
1026 }
1027
1028 if(MDrv_SC_3D_IsIPMFetchNoLimitCase(pInstance, eWindow))
1029 {
1030 }
1031 else if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
1032 || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
1033 {
1034 // line buffer check
1035 if (pSrcInfo->u16H_SizeAfterPreScaling > MS_3D_LINE_BFF_MAX)
1036 {
1037 pSrcInfo->u16H_SizeAfterPreScaling = MS_3D_LINE_BFF_MAX;
1038 }
1039 }
1040 else
1041 {
1042 // line buffer check
1043 if(eWindow == MAIN_WINDOW)
1044 {
1045 if (pSrcInfo->u16H_SizeAfterPreScaling > MST_LINE_BFF_MAX)
1046 pSrcInfo->u16H_SizeAfterPreScaling = MST_LINE_BFF_MAX;
1047 }
1048 else
1049 {
1050 // sub window
1051 if(PIP_SUPPORTED)
1052 {
1053 if (pSrcInfo->u16H_SizeAfterPreScaling > SUB_MST_LINE_BFF_MAX)
1054 pSrcInfo->u16H_SizeAfterPreScaling = SUB_MST_LINE_BFF_MAX;
1055 }
1056 // Avoid Post HSD in PIP/POP case
1057 if(pSrcInfo->u16H_SizeAfterPreScaling >= pSrcInfo->stDispWin.width)
1058 {
1059 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[PRE] To avoid HSD : HSrc=%u, HDst=%u\n",pSrcInfo->u16H_SizeAfterPreScaling, pSrcInfo->stDispWin.width);
1060 pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->stDispWin.width;
1061 }
1062 }
1063 }
1064
1065 if((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1066 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1067 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_L())
1068 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_R())
1069 )
1070 {
1071 if(IS_INPUT_FRAME_PACKING(eWindow)
1072 && IS_OUTPUT_TOP_BOTTOM()
1073 && ((gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
1074 || (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)))
1075 {
1076 //do more prescaling down to fclk issue for 1080p fp:the following formula is from experiment
1077 MS_U16 u16TempWidth = 0;
1078 if(MDrv_SC_3D_Is_LR_Sbs2Line(pInstance)) //output line by line
1079 {
1080 u16TempWidth = 1920 * (MS_U32)pSrcInfo->stDispWin.height * 13 / 10800;
1081 }
1082 else
1083 {
1084 u16TempWidth = 640;
1085 }
1086 pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->u16H_SizeAfterPreScaling > u16TempWidth ?
1087 u16TempWidth : pSrcInfo->u16H_SizeAfterPreScaling;
1088 }
1089 MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
1090 2,
1091 pSrcInfo->u16V_SizeAfterPreScaling);
1092 if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
1093 {
1094 pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
1095 }
1096 }
1097 #if (HW_DESIGN_3D_VER == 0)
1098 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1099 {
1100 if(pSrcInfo->stCapWin.width > MST_LINE_BFF_MAX / 2)
1101 {
1102 pSrcInfo->u16H_SizeAfterPreScaling = (MST_LINE_BFF_MAX / 2) & ~(OFFSET_PIXEL_ALIGNMENT - 1);
1103 }
1104 else
1105 {
1106 pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->stCapWin.width & ~(OFFSET_PIXEL_ALIGNMENT - 1);
1107 }
1108 }
1109 #endif
1110 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1111 {
1112 MS_U32 u32TempWidth;
1113 pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->stCapWin.width;
1114 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
1115 4,
1116 pSrcInfo->u16V_SizeAfterPreScaling);
1117 // for memory reason, need support 4 frame mode
1118 if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
1119 {
1120 pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth;
1121 }
1122 #if (HW_DESIGN_3D_VER == 0)
1123 if(pSrcInfo->u16H_SizeAfterPreScaling > MST_LINE_BFF_MAX / 2)
1124 {
1125 pSrcInfo->u16H_SizeAfterPreScaling = MST_LINE_BFF_MAX / 2;
1126 }
1127 #endif
1128 pSrcInfo->u16H_SizeAfterPreScaling &= ~(OFFSET_PIXEL_ALIGNMENT - 1);
1129 }
1130 else if((IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1131 || (IS_INPUT_TOP_BOTTOM_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
1132 {
1133 MS_U32 u32TempWidth;
1134 pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->stCapWin.width;
1135 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
1136 2,
1137 pSrcInfo->u16V_SizeAfterPreScaling);
1138 if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
1139 {
1140 pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth;
1141 }
1142
1143 if (pSrcInfo->u16H_SizeAfterPreScaling > SUB_MST_LINE_BFF_MAX)
1144 {
1145 pSrcInfo->u16H_SizeAfterPreScaling = SUB_MST_LINE_BFF_MAX;
1146 }
1147
1148 pSrcInfo->u16H_SizeAfterPreScaling &= ~(OFFSET_PIXEL_ALIGNMENT - 1);
1149 }
1150 else if(IS_INPUT_FRAME_PACKING(eWindow)
1151 && IS_OUTPUT_LINE_ALTERNATIVE())
1152 {
1153 MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
1154 2,
1155 pSrcInfo->u16V_SizeAfterPreScaling);
1156 if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
1157 {
1158 pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
1159 }
1160 }
1161 #if (HW_DESIGN_3D_VER == 1)
1162 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1163 IS_OUTPUT_FRAME_ALTERNATIVE())
1164 {
1165 MS_U16 u16AlignedWidth = (pSrcInfo->stCapWin.width) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
1166 pSrcInfo->u16H_SizeAfterPreScaling = u16AlignedWidth;
1167 pXCResourcePrivate->stdrvXC_3D._bDoubleAlign = TRUE;
1168 }
1169 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
1170 {
1171 if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq == 1200)
1172 && (pSrcInfo->u16H_SizeAfterPreScaling > 900))
1173 {
1174 pSrcInfo->u16H_SizeAfterPreScaling = 900;
1175 }
1176 MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
1177 4 /* 4 frame mode */,
1178 pSrcInfo->u16V_SizeAfterPreScaling);
1179 // for memory reason, need support 4 frame mode
1180 if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
1181 {
1182 pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
1183 }
1184 }
1185 else if(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()
1186 && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq == 1200))
1187 {
1188 pSrcInfo->u16H_SizeAfterPreScaling = pSrcInfo->u16H_SizeAfterPreScaling > 1200 ? 1200 : pSrcInfo->u16H_SizeAfterPreScaling;
1189 }
1190 #endif
1191
1192 #if ENABLE_2_FRAME_SIZE_PROTECTION
1193 //do a rough check after all, for 2 frame case.
1194 //if it's 4 or other frame case, need detail check in the upper code.
1195 {
1196 MS_U32 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
1197 2,
1198 pSrcInfo->u16V_SizeAfterPreScaling);
1199 if((pSrcInfo->u16H_SizeAfterPreScaling > u32TempWidth)&&(u32TempWidth!=0))
1200 {
1201 pSrcInfo->u16H_SizeAfterPreScaling = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
1202 }
1203 }
1204 #endif
1205
1206 if((SUB_WINDOW == eWindow)
1207 && (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
1208 || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
1209 )
1210 {
1211 pSrcInfo->u16H_SizeAfterPreScaling = gSrcInfo[MAIN_WINDOW].u16H_SizeAfterPreScaling;
1212 }
1213
1214 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreHorDstSize(%s): to %u\n",eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16H_SizeAfterPreScaling);
1215 #endif
1216 }
1217
MDrv_SC_3D_IsDoubleAlign(void * pInstance)1218 MS_BOOL MDrv_SC_3D_IsDoubleAlign(void *pInstance)
1219 {
1220 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1221 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1222 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1223 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1224 return pXCResourcePrivate->stdrvXC_3D._bDoubleAlign;
1225 }
1226
MDrv_SC_3D_Adjust_SubLineBufferOffset(void * pInstance,INPUT_SOURCE_TYPE_t enInputSourceType,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)1227 void MDrv_SC_3D_Adjust_SubLineBufferOffset(void *pInstance, INPUT_SOURCE_TYPE_t enInputSourceType,
1228 XC_InternalStatus *pSrcInfo,
1229 SCALER_WIN eWindow)
1230 {
1231 MS_ASSERT(eWindow < MAX_WINDOW);
1232 MS_ASSERT(pSrcInfo);
1233
1234 #if (HW_DESIGN_3D_VER >= 2)
1235 return;
1236 #else
1237 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1238 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1239 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1240 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1241 //Setting Line Buffer Start offset for Sub Win
1242 if((eWindow == SUB_WINDOW)
1243 && (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
1244 || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
1245 )
1246 {
1247 // we can extend sub window line buffer by setting this register
1248 HAL_SC_SetSubLineBufferOffset(pInstance, MS_3D_LINE_BFF_MAX);
1249 }
1250 #endif
1251 }
1252
MDrv_SC_3D_Adjust_PreVerDstSize(void * pInstance,INPUT_SOURCE_TYPE_t enInputSourceType,XC_InternalStatus * pSrcInfo,MS_U16 u16ScaleDst,SCALER_WIN eWindow)1253 MS_U16 MDrv_SC_3D_Adjust_PreVerDstSize(void *pInstance, INPUT_SOURCE_TYPE_t enInputSourceType,
1254 XC_InternalStatus *pSrcInfo,
1255 MS_U16 u16ScaleDst,
1256 SCALER_WIN eWindow)
1257 {
1258 MS_U16 u16ScaleDstOriginal = u16ScaleDst;
1259 MS_ASSERT(eWindow < MAX_WINDOW);
1260 MS_ASSERT(pSrcInfo);
1261
1262 if(pSrcInfo == NULL)
1263 {
1264 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
1265 return u16ScaleDstOriginal;
1266 }
1267
1268 if(eWindow >= MAX_WINDOW)
1269 {
1270 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
1271 return u16ScaleDstOriginal;
1272 }
1273 #if (HW_DESIGN_3D_VER >= 2)
1274 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"MDrv_SC_3D_Adjust_PreVerDstSize(%s)= %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleDstOriginal)
1275 return u16ScaleDstOriginal;
1276 #else
1277 MS_U16 u16ScaleSrc;
1278 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1279 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1280 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1281 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1282 u16ScaleSrc = pSrcInfo->stCapWin.height;
1283 u16ScaleDst = pSrcInfo->stDispWin.height;
1284
1285 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreVerSrcSize(%s): from %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleSrc);
1286
1287 if(((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && (!pSrcInfo->bInterlace))
1288 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
1289 || IS_INPUT_NORMAL_2D(eWindow)
1290 || IS_INPUT_NORMAL_2D_INTERLACE(eWindow)) &&
1291 IS_OUTPUT_LINE_ALTERNATIVE())
1292 {
1293 if(u16ScaleSrc >= u16ScaleDst/2)
1294 {
1295 u16ScaleDst = u16ScaleDst/2;
1296 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: pre scaling: source V size is bigger than u16ScaleDst/2(%u)\n",u16ScaleDst);
1297 }
1298 else
1299 {
1300 u16ScaleDst = u16ScaleSrc;
1301 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: pre scaling: source V size is smaller than u16ScaleDst/2(%u)\n",u16ScaleDst);
1302 }
1303 }
1304 else if((IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1305 || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() && pSrcInfo->bInterlace)
1306 || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE()))
1307 {
1308 if (u16ScaleSrc > u16ScaleDst)
1309 {
1310 u16ScaleDst = u16ScaleDst;
1311 }
1312 else
1313 {
1314 u16ScaleDst = u16ScaleSrc;
1315 }
1316 }
1317 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1318 {
1319 u16ScaleDst = u16ScaleSrc;
1320 }
1321 else if(IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1322 {
1323 //do noting, just not follow into statement:else
1324 }
1325 else if((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1326 (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1327 ||
1328 (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && (IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1329 )
1330 {
1331 u16ScaleDst = u16ScaleSrc;
1332 }
1333 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
1334 (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))//only for T8 new reg method
1335 {
1336 u16ScaleDst = u16ScaleSrc;
1337 }
1338 else if(IS_INPUT_FRAME_PACKING(eWindow) &&
1339 (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1340 {
1341 u16ScaleDst = u16ScaleSrc;
1342 }
1343 else if(IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
1344 {
1345 u16ScaleDst = u16ScaleSrc;
1346 }
1347 else if(IS_INPUT_FRAME_PACKING(eWindow)
1348 && IS_OUTPUT_LINE_ALTERNATIVE())
1349 {
1350 if((u16ScaleSrc == DOUBLEHD_720X2P_VSIZE) //720 centering opt
1351 && (pSrcInfo->stDispWin.height == DOUBLEHD_720X2P_FRAME_VSIZE))
1352 {
1353 u16ScaleDst = 735;
1354 }
1355 else
1356 {
1357 // we can merge 1080p and 720p frame packing, since
1358 // 1080(one frame size)/45(garbage band) = 720(one frame size)/30(garbage band)
1359 MS_U16 u16Temp = DOUBLEHD_1080X2P_GARBAGE_VSIZE * u16ScaleDst / 2;
1360 // if can not mod, need take more 1 lines to do opt
1361 if(u16Temp % DOUBLEHD_1080X2P_FRAME_VSIZE)
1362 {
1363 pXCResourcePrivate->stdrvXC_3D._bFrmpackToLinealterOpt = TRUE;
1364 u16Temp = u16Temp / DOUBLEHD_1080X2P_FRAME_VSIZE + 1;
1365 }
1366 else
1367 {
1368 pXCResourcePrivate->stdrvXC_3D._bFrmpackToLinealterOpt = FALSE;
1369 u16Temp = u16Temp / DOUBLEHD_1080X2P_FRAME_VSIZE;
1370 }
1371 u16ScaleDst = u16ScaleDst + u16Temp;
1372 }
1373 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: pre scaling: frame packing, V down to %u\n",u16ScaleDst);
1374 }
1375 else if((IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
1376 (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_LINE_ALTERNATIVE()))
1377 ||
1378 (IS_INPUT_TOP_BOTTOM(eWindow) &&
1379 IS_OUTPUT_TOP_BOTTOM())
1380 ||
1381 (IS_INPUT_TOP_BOTTOM(eWindow) &&
1382 IS_OUTPUT_SIDE_BY_SIDE_HALF()))
1383 {
1384 u16ScaleDst = u16ScaleSrc;
1385 }
1386 else if (IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
1387 IS_OUTPUT_FRAME_L())
1388 {
1389 u16ScaleDst = u16ScaleSrc;
1390 }
1391 else if((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1392 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
1393 {
1394 u16ScaleDst = u16ScaleSrc;
1395 }
1396 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
1397 IS_OUTPUT_TOP_BOTTOM())
1398 {
1399 u16ScaleDst = u16ScaleSrc;
1400 }
1401 else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow) &&
1402 (IS_OUTPUT_TOP_BOTTOM()
1403 || IS_OUTPUT_SIDE_BY_SIDE_HALF()
1404 || IS_OUTPUT_LINE_ALTERNATIVE()))
1405 {
1406 u16ScaleDst = u16ScaleSrc;
1407 }
1408 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() )
1409 {
1410 u16ScaleDst = pSrcInfo->stDispWin.height / 2;
1411 }
1412 else if (IS_INPUT_FRAME_PACKING(eWindow) &&
1413 (IS_OUTPUT_FRAME_L()||IS_OUTPUT_FRAME_R()))
1414 {
1415 u16ScaleDst = u16ScaleSrc;
1416 }
1417 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1418 {
1419 u16ScaleDst = u16ScaleSrc;
1420 }
1421 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1422 {
1423 //output line by line case or small video
1424 if((u16ScaleSrc < pSrcInfo->stDispWin.height) || MDrv_SC_3D_Is_LR_Sbs2Line(pInstance))
1425 {
1426 u16ScaleDst = u16ScaleSrc;
1427 }
1428 else
1429 {
1430 u16ScaleDst = pSrcInfo->stDispWin.height;
1431 }
1432 }
1433 else if(IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1434 {
1435 u16ScaleDst = u16ScaleDst / 2;
1436 }
1437 else if((IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1438 || (IS_INPUT_TOP_BOTTOM_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
1439 {
1440 u16ScaleDst = u16ScaleSrc;
1441 }
1442 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
1443 IS_OUTPUT_SIDE_BY_SIDE_HALF())
1444 {
1445 u16ScaleDst = u16ScaleSrc;
1446 }
1447 else if((IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1448 || (IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_TOP_BOTTOM_HW()))
1449 {
1450 if(u16ScaleSrc < pSrcInfo->stDispWin.height)
1451 {
1452 u16ScaleDst = u16ScaleSrc;
1453 }
1454 else
1455 {
1456 u16ScaleDst = pSrcInfo->stDispWin.height;
1457 }
1458 }
1459 else
1460 {
1461 u16ScaleDst = u16ScaleDstOriginal;
1462 }
1463
1464 if((SUB_WINDOW == eWindow)
1465 && MDrv_SC_3D_IsUseSameBuffer(pInstance)
1466 && (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
1467 || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
1468 )
1469 {
1470 pSrcInfo->u16V_SizeAfterPreScaling = gSrcInfo[MAIN_WINDOW].u16V_SizeAfterPreScaling;
1471 u16ScaleDst = gSrcInfo[MAIN_WINDOW].u16V_SizeAfterPreScaling;
1472 }
1473
1474 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreVerDstSize(%s): to %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleDst);
1475 return u16ScaleDst;
1476 #endif
1477 }
1478
MDrv_SC_3D_Adjust_PostHorSrcSize(void * pInstance,XC_InternalStatus * pSrcInfo,MS_U16 u16ScaleSrc,SCALER_WIN eWindow)1479 MS_U16 MDrv_SC_3D_Adjust_PostHorSrcSize(void *pInstance, XC_InternalStatus *pSrcInfo,
1480 MS_U16 u16ScaleSrc,
1481 SCALER_WIN eWindow)
1482 {
1483 MS_ASSERT(eWindow < MAX_WINDOW);
1484 MS_ASSERT(pSrcInfo);
1485
1486 if(pSrcInfo == NULL)
1487 {
1488 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
1489 return u16ScaleSrc;
1490 }
1491
1492 if(eWindow >= MAX_WINDOW)
1493 {
1494 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
1495 return u16ScaleSrc;
1496 }
1497 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1498 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1499 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1500 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1501 #if (HW_DESIGN_3D_VER >= 2)
1502
1503 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "PostHorSrcSize(%s): %u\n",eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16H_SizeAfterPreScaling);
1504 return u16ScaleSrc;
1505 #else
1506 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PostHorSrcSize(%s): from %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleSrc);
1507 if((((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && (!pSrcInfo->bInterlace))
1508 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)) &&
1509 IS_OUTPUT_LINE_ALTERNATIVE())
1510 ||
1511 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1512 IS_OUTPUT_SIDE_BY_SIDE_HALF() && (pSrcInfo->stCapWin.width != pSrcInfo->stDispWin.width))
1513 ||
1514 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1515 IS_OUTPUT_TOP_BOTTOM())
1516 ||
1517 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1518 (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1519 ||
1520 (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && (IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1521 )
1522 {
1523 u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.width/2;
1524 }
1525 else if (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1526 (IS_OUTPUT_FRAME_L()||IS_OUTPUT_FRAME_R()))
1527 {
1528 u16ScaleSrc = u16ScaleSrc/2;
1529 }
1530 #if (HW_DESIGN_3D_VER == 0)
1531 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
1532 && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1533 {
1534 u16ScaleSrc = u16ScaleSrc*2;
1535 }
1536 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1537 {
1538 u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.width * 2;
1539 }
1540 #endif
1541 else if((IS_INPUT_NORMAL_2D_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1542 ||(IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1543 ||(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1544 ||(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
1545 ||(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE()))
1546 {
1547 gSrcInfo[eWindow].ScaledCropWin.width -= pXCResourcePrivate->stdrvXC_3D._u163DHShift;
1548 u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.width;
1549 }
1550 else if((IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1551 || (IS_INPUT_TOP_BOTTOM_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
1552 {
1553 u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.width * 2;
1554 }
1555 else if(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1556 {
1557 u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.width/2;
1558 }
1559 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() && pSrcInfo->bInterlace)
1560 {
1561 u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.width/2;
1562 }
1563
1564 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PostHorSrcSize(%s): to %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleSrc);
1565
1566 return u16ScaleSrc;
1567 #endif
1568 }
1569
MDrv_SC_3D_Adjust_PostHorDstSize(void * pInstance,XC_InternalStatus * pSrcInfo,MS_U16 u16ScaleDst,SCALER_WIN eWindow)1570 MS_U16 MDrv_SC_3D_Adjust_PostHorDstSize(void *pInstance, XC_InternalStatus *pSrcInfo,
1571 MS_U16 u16ScaleDst,
1572 SCALER_WIN eWindow)
1573 {
1574 MS_ASSERT(eWindow < MAX_WINDOW);
1575 MS_ASSERT(pSrcInfo);
1576
1577 if(pSrcInfo == NULL)
1578 {
1579 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
1580 return u16ScaleDst;
1581 }
1582
1583 if(eWindow >= MAX_WINDOW)
1584 {
1585 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
1586 return u16ScaleDst;
1587 }
1588 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1589 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1590 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1591 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1592
1593 #if (HW_DESIGN_3D_VER >= 2)
1594 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "PostHorDstSize(%s): %u\n",eWindow?"Subwindow":"Mainwindow",pSrcInfo->u16H_SizeAfterPreScaling);
1595 return u16ScaleDst;
1596 #else
1597
1598 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PostHorDstSize(%s): from %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleDst);
1599 if(((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
1600 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)) &&
1601 IS_OUTPUT_LINE_ALTERNATIVE())
1602 ||
1603 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1604 IS_OUTPUT_SIDE_BY_SIDE_HALF() && (pSrcInfo->stCapWin.width != pSrcInfo->stDispWin.width))
1605 ||
1606 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1607 IS_OUTPUT_TOP_BOTTOM())
1608 ||
1609 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1610 (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1611 ||
1612 (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && (IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1613 ||
1614 (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1615 )
1616 {
1617 if (u16ScaleDst > pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width)
1618 {
1619 u16ScaleDst = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width;
1620 }
1621 }
1622 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PostHorDstSize(%s): to %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleDst);
1623
1624 return u16ScaleDst;
1625 #endif
1626 }
1627
MDrv_SC_3D_Adjust_PostVerSrcSize(void * pInstance,XC_InternalStatus * pSrcInfo,MS_U16 u16ScaleSrc,SCALER_WIN eWindow)1628 MS_U16 MDrv_SC_3D_Adjust_PostVerSrcSize(void *pInstance, XC_InternalStatus *pSrcInfo,
1629 MS_U16 u16ScaleSrc,
1630 SCALER_WIN eWindow)
1631 {
1632 MS_ASSERT(eWindow < MAX_WINDOW);
1633 MS_ASSERT(pSrcInfo);
1634
1635 if(pSrcInfo == NULL)
1636 {
1637 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
1638 return u16ScaleSrc;
1639 }
1640
1641 if(eWindow >= MAX_WINDOW)
1642 {
1643 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
1644 return u16ScaleSrc;
1645 }
1646
1647 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1648 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1649
1650 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1651 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1652 #if (HW_DESIGN_3D_VER >= 2)
1653 return u16ScaleSrc;
1654 #else
1655 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PostVerSrcSize(%s): from %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleSrc);
1656 if(((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && (!pSrcInfo->bInterlace))
1657 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
1658 || IS_INPUT_NORMAL_2D_INTERLACE(eWindow)
1659 || IS_INPUT_NORMAL_2D(eWindow)) &&
1660 IS_OUTPUT_LINE_ALTERNATIVE())
1661 {
1662 u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.height * 2;
1663 }
1664 else if(IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1665 {
1666 u16ScaleSrc = pSrcInfo->stDispWin.height - gSrcInfo[eWindow].ScaledCropWin.y*2;
1667 }
1668 else if((IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
1669 IS_OUTPUT_TOP_BOTTOM())
1670 ||
1671 (IS_INPUT_TOP_BOTTOM(eWindow) &&
1672 IS_OUTPUT_TOP_BOTTOM())
1673 ||
1674 (IS_INPUT_TOP_BOTTOM(eWindow) &&
1675 IS_OUTPUT_SIDE_BY_SIDE_HALF()))
1676 {
1677 u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.height/2;//E_XC_3D_INPUT_LINE_ALTERNATIVE cannot do v-scaling.
1678 }
1679 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
1680 IS_OUTPUT_FRAME_L())
1681 {
1682 u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.height/2;//E_XC_3D_INPUT_LINE_ALTERNATIVE cannot do v-scaling.
1683 }
1684 else if((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1685 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1686 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
1687 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1688 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_L())
1689 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_R())
1690 )
1691 {
1692 MS_U16 u16VactVideo = 0;
1693 MS_U16 u16VactSpace = 0;
1694 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, FALSE);
1695 if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
1696 {
1697 u16VactVideo *= 2; //field size from MDrv_SC_3D_GetFP_Info
1698 }
1699 u16ScaleSrc = (gSrcInfo[eWindow].ScaledCropWin.height-u16VactSpace)/2;
1700 }
1701 else if((IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
1702 || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()))
1703 {
1704 u16ScaleSrc = u16ScaleSrc/2;
1705 }
1706 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1707 IS_OUTPUT_SIDE_BY_SIDE_HALF() && (pSrcInfo->stCapWin.width != pSrcInfo->stDispWin.width))
1708 {
1709 u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.height;//E_XC_3D_INPUT_LINE_ALTERNATIVE cannot do v-scaling.
1710 }
1711 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1712 IS_OUTPUT_TOP_BOTTOM())
1713 {
1714 u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.height;//E_XC_3D_INPUT_LINE_ALTERNATIVE cannot do v-scaling.
1715 }
1716 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
1717 IS_OUTPUT_TOP_BOTTOM())
1718 {
1719 u16ScaleSrc = pSrcInfo->ScaledCropWin.height;
1720 }
1721 else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow) &&
1722 (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()))
1723 {
1724 u16ScaleSrc = gSrcInfo[eWindow].ScaledCropWin.height / 2;
1725 }
1726 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1727 {
1728 u16ScaleSrc = pSrcInfo->stDispWin.height - gSrcInfo[eWindow].ScaledCropWin.y*2;
1729 }
1730 else if (IS_INPUT_TOP_BOTTOM(eWindow) &&
1731 (IS_OUTPUT_FRAME_L()||IS_OUTPUT_FRAME_R()))
1732 {
1733 u16ScaleSrc = u16ScaleSrc/2;
1734 }
1735 else if((IS_INPUT_LINE_ALTERNATIVE(eWindow) || IS_INPUT_TOP_BOTTOM(eWindow))
1736 && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1737 {
1738 u16ScaleSrc = u16ScaleSrc/2;
1739 }
1740 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
1741 && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1742 {
1743 u16ScaleSrc = u16ScaleSrc/2;
1744 }
1745 else if(IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1746 {
1747 u16ScaleSrc = pSrcInfo->stDispWin.height;
1748 }
1749 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PostVerSrcSize(%s): to %u\n",eWindow?"Subwindow":"Mainwindow",u16ScaleSrc);
1750
1751 return u16ScaleSrc;
1752 #endif
1753 }
1754
MDrv_SC_3D_Adjust_PostVLength(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)1755 void MDrv_SC_3D_Adjust_PostVLength(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
1756 {
1757 MS_ASSERT(eWindow < MAX_WINDOW);
1758 MS_ASSERT(pSrcInfo);
1759
1760 if(pSrcInfo == NULL)
1761 {
1762 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
1763 return;
1764 }
1765
1766 if(eWindow >= MAX_WINDOW)
1767 {
1768 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
1769 return;
1770 }
1771 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1772 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1773 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1774 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1775 #if (HW_DESIGN_3D_VER >= 2)
1776 return;
1777 #else
1778 if(IS_INPUT_FRAME_PACKING(eWindow)
1779 && IS_OUTPUT_LINE_ALTERNATIVE()
1780 && pXCResourcePrivate->stdrvXC_3D._bFrmpackToLinealterOpt)
1781 {
1782 pSrcInfo->u16V_Length -= 2; //to handle odd garbage line scaling
1783 }
1784 #endif
1785 }
1786
MDrv_SC_3D_Adjust_FrameNum(void * pInstance,XC_FRAME_STORE_NUMBER u8FBNumType,SCALER_WIN eWindow)1787 XC_FRAME_STORE_NUMBER MDrv_SC_3D_Adjust_FrameNum(void *pInstance, XC_FRAME_STORE_NUMBER u8FBNumType,
1788 SCALER_WIN eWindow)
1789 {
1790 MS_ASSERT(eWindow < MAX_WINDOW);
1791
1792 if(eWindow >= MAX_WINDOW)
1793 {
1794 return u8FBNumType;
1795 }
1796 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1797 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1798 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1799 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1800 #if (HW_DESIGN_3D_VER == 2)
1801 if((IS_INPUT_FRAME_ALTERNATIVE(eWindow) && (!gSrcInfo[eWindow].bInterlace))||
1802 (IS_INPUT_FRAME_PACKING(eWindow) && (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)))
1803 {
1804 if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
1805 {
1806 u8FBNumType = IMAGE_STORE_5_FRAMES;
1807 }
1808 else
1809 {
1810 u8FBNumType = IMAGE_STORE_4_FRAMES;
1811 }
1812 }
1813 return u8FBNumType;
1814 #elif (HW_DESIGN_3D_VER > 2)
1815 if(IS_INPUT_FRAME_PACKING(eWindow) && (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE))
1816 {
1817 if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
1818 {
1819 u8FBNumType = IMAGE_STORE_5_FRAMES;
1820 }
1821 else
1822 {
1823 u8FBNumType = IMAGE_STORE_4_FRAMES;
1824 }
1825 }
1826 #ifdef TBP_1920X2160_OUTPUT
1827 else if((!pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)
1828 &&(gSrcInfo[MAIN_WINDOW].stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
1829 &&(MDrv_XC_Get_3D_Input_Mode(pInstance, MAIN_WINDOW) == E_XC_3D_INPUT_FRAME_PACKING)
1830 &&(MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_TOP_BOTTOM))
1831 {
1832 if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
1833 {
1834 u8FBNumType = IMAGE_STORE_5_FRAMES;
1835 }
1836 else
1837 {
1838 u8FBNumType = IMAGE_STORE_4_FRAMES;
1839 }
1840 }
1841 #endif
1842 return u8FBNumType;
1843 #else
1844 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "_Mdrv_SC_3D_Adjust_FBNum(%s): from %u\n",eWindow?"Subwindow":"Mainwindow",u8FBNumType);
1845 if(
1846 #if (HW_DESIGN_3D_VER == 0)
1847 ((IS_INPUT_TOP_BOTTOM(eWindow) ||
1848 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && (!gSrcInfo[eWindow].bInterlace)) ||
1849 IS_INPUT_FRAME_PACKING(eWindow) ) &&
1850 IS_OUTPUT_LINE_ALTERNATIVE())
1851 ||
1852 (IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
1853 (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_LINE_ALTERNATIVE()))
1854 ||
1855 (IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
1856 IS_OUTPUT_FRAME_L())
1857 ||
1858 (IS_INPUT_FRAME_PACKING(eWindow) &&
1859 IS_OUTPUT_TOP_BOTTOM())
1860 ||
1861 (IS_INPUT_FRAME_PACKING(eWindow) &&
1862 IS_OUTPUT_SIDE_BY_SIDE_HALF())
1863 ||
1864 (IS_INPUT_FRAME_PACKING(eWindow) &&
1865 IS_OUTPUT_FRAME_ALTERNATIVE())
1866 ||
1867 (IS_INPUT_FRAME_PACKING(eWindow) &&
1868 IS_OUTPUT_FRAME_L())
1869 ||
1870 (IS_INPUT_FRAME_PACKING(eWindow) &&
1871 IS_OUTPUT_FRAME_R())
1872 ||
1873 (IS_INPUT_TOP_BOTTOM(eWindow) &&
1874 IS_OUTPUT_TOP_BOTTOM())
1875 ||
1876 (IS_INPUT_TOP_BOTTOM(eWindow) &&
1877 IS_OUTPUT_SIDE_BY_SIDE_HALF())
1878 ||
1879 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1880 IS_OUTPUT_FRAME_ALTERNATIVE())
1881 ||
1882 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1883 IS_OUTPUT_SIDE_BY_SIDE_HALF())
1884 ||
1885 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
1886 IS_OUTPUT_TOP_BOTTOM())
1887 ||
1888 (IS_INPUT_FRAME_PACKING_OPT(eWindow) &&
1889 IS_OUTPUT_TOP_BOTTOM())
1890 ||
1891 (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) &&
1892 IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())// 2 frames = 4 fields
1893 ||
1894 (IS_INPUT_NORMAL_2D_INTERLACE(eWindow) &&
1895 IS_OUTPUT_LINE_ALTERNATIVE())// 2 frames = 4 fields
1896 ||
1897 (IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow) &&
1898 IS_OUTPUT_LINE_ALTERNATIVE())// 2 frames = 4 fields
1899 ||
1900 (IS_INPUT_FRAME_PACKING_OPT(eWindow) &&
1901 IS_OUTPUT_SIDE_BY_SIDE_HALF())
1902 ||
1903 (IS_INPUT_TOP_BOTTOM_OPT(eWindow) &&
1904 IS_OUTPUT_SIDE_BY_SIDE_HALF())
1905 ||
1906 (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
1907 ||
1908 #endif
1909 (IS_INPUT_FRAME_PACKING(eWindow)
1910 && (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE))
1911 ||
1912 (IS_OUTPUT_FRAME_ALTERNATIVE() && (!IS_INPUT_FRAME_ALTERNATIVE(eWindow)))
1913 )
1914 {
1915 u8FBNumType = IMAGE_STORE_2_FRAMES;
1916 }
1917 else if((IS_INPUT_FRAME_ALTERNATIVE(eWindow) && (IS_OUTPUT_TOP_BOTTOM()|| IS_OUTPUT_LINE_ALTERNATIVE()))
1918 || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1919 || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1920 || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1921 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
1922 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
1923 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_L())
1924 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_R())
1925 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
1926 || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
1927 {
1928 u8FBNumType = IMAGE_STORE_4_FRAMES;
1929 }
1930
1931 if((!IS_INPUT_MODE_NONE(eWindow)) && (SUB_WINDOW == eWindow))
1932 {
1933 u8FBNumType = gSrcInfo[MAIN_WINDOW].Status2.eFrameStoreNumber;
1934 gSrcInfo[eWindow].bLinearMode = gSrcInfo[MAIN_WINDOW].bLinearMode;
1935 }
1936
1937 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "_Mdrv_SC_3D_Adjust_FBNum(%s): to %u\n",eWindow?"Subwindow":"Mainwindow",u8FBNumType);
1938
1939 return u8FBNumType;
1940 #endif
1941 }
1942
MDrv_SC_3D_Adjust_DNRBase(void * pInstance,MS_PHY * pu32DNRBase0,MS_PHY * pu32DNRBase1,SCALER_WIN eWindow)1943 void MDrv_SC_3D_Adjust_DNRBase(void *pInstance, MS_PHY *pu32DNRBase0,
1944 MS_PHY *pu32DNRBase1,
1945 SCALER_WIN eWindow)
1946 {
1947 MS_ASSERT(eWindow < MAX_WINDOW);
1948 MS_ASSERT(pu32DNRBase0);
1949 MS_ASSERT(pu32DNRBase1);
1950
1951 if(eWindow >= MAX_WINDOW)
1952 {
1953 return;
1954 }
1955
1956 if(pu32DNRBase0 == NULL)
1957 {
1958 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D:pu32DNRBase0 is NULL\n");
1959 return;
1960 }
1961
1962 if(pu32DNRBase1 == NULL)
1963 {
1964 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D:pu32DNRBase1 is NULL\n");
1965 return;
1966 }
1967
1968 #if (HW_DESIGN_3D_VER >= 2)
1969 return;
1970 #else
1971 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1972 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1973 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1974 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1975
1976 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_DNRBase(%s): from pu32DNRBase0:0x%lx, pu32DNRBase1:0x%lx\n",eWindow?"Subwindow":"Mainwindow",*pu32DNRBase0,*pu32DNRBase1);
1977 MS_U16 u16DNROffset = (gSrcInfo[eWindow].u16IPMFetch + OFFSET_PIXEL_ALIGNMENT - 1)
1978 & ~(OFFSET_PIXEL_ALIGNMENT-1);
1979 MS_U8 u8BytesPer2Pixel = gSrcInfo[eWindow].u8BitPerPixel * 2 / 8;
1980 if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_TOP_BOTTOM())
1981 {
1982 *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) + (((gSrcInfo[eWindow].u16V_SizeAfterPreScaling)*
1983 (MS_U32)u16DNROffset * ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
1984 }
1985 else if((IS_INPUT_FRAME_ALTERNATIVE(eWindow)
1986 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
1987 || IS_INPUT_NORMAL_2D_INTERLACE(eWindow))
1988 && IS_OUTPUT_LINE_ALTERNATIVE()
1989 )
1990 {
1991 if (IsVMirrorMode(eWindow))
1992 {
1993 *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) - (((1)*(MS_U32)u16DNROffset *
1994 ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
1995 }
1996 else
1997 {
1998 *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) + (((1)*(MS_U32)(u16DNROffset)*
1999 ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2000 }
2001 }
2002 else if(IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() && gSrcInfo[eWindow].bInterlace)
2003 {
2004 if (IsVMirrorMode(eWindow))
2005 {
2006 *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) - (((1)*(MS_U32)u16DNROffset *
2007 ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2008 }
2009 else
2010 {
2011 *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) + (((1)*(MS_U32)u16DNROffset *
2012 ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2013 }
2014 }
2015 else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
2016 {
2017 if (IsVMirrorMode(eWindow))
2018 {
2019 *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) - (((1)*(MS_U32)u16DNROffset *
2020 ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2021 }
2022 else
2023 {
2024 *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) + (((1)*(MS_U32)u16DNROffset *
2025 ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2026 }
2027 }
2028 else if(IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_TOP_BOTTOM() && (eWindow == SUB_WINDOW))
2029 {
2030 Hal_SC_subwindow_disable(pInstance);
2031 *pu32DNRBase0 = MS_IPM_BASE0(MAIN_WINDOW) + (((gSrcInfo[eWindow].stDispWin.height / 2)
2032 * (MS_U32)u16DNROffset * ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2033 }
2034 else if(((IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
2035 || (IS_INPUT_TOP_BOTTOM_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
2036 && (SUB_WINDOW == eWindow))
2037 {
2038 Hal_SC_subwindow_disable(pInstance);
2039 *pu32DNRBase0 = MS_IPM_BASE0(MAIN_WINDOW) + (((1)*(MS_U32)u16DNROffset * ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2040 }
2041 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
2042 {
2043 *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) + (((1)*(MS_U32)u16DNROffset * ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2044 }
2045 #if (HW_DESIGN_3D_VER == 0)
2046 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
2047 {
2048 *pu32DNRBase1 = MS_IPM_BASE0(pInstance, eWindow) + (((1)*(MS_U32)u16DNROffset * ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2049 }
2050 #endif
2051 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_DNRBase(%s): to pu32DNRBase0:0x%lx, pu32DNRBase1:0x%lx\n",eWindow?"Subwindow":"Mainwindow",*pu32DNRBase0,*pu32DNRBase1);
2052 #endif
2053 }
2054
MDrv_SC_3D_Adjust_OPMBase(void * pInstance,MS_PHY * pu32OPMBase0,MS_PHY * pu32OPMBase1,MS_PHY * pu32OPMBase2,MS_PHY u32Offset,SCALER_WIN eWindow)2055 void MDrv_SC_3D_Adjust_OPMBase(void *pInstance, MS_PHY *pu32OPMBase0,
2056 MS_PHY *pu32OPMBase1,
2057 MS_PHY *pu32OPMBase2,
2058 MS_PHY u32Offset,
2059 SCALER_WIN eWindow)
2060 {
2061 MS_ASSERT(eWindow < MAX_WINDOW);
2062
2063 if(eWindow == MAX_WINDOW)
2064 {
2065 return;
2066 }
2067
2068 if(pu32OPMBase0 == NULL)
2069 {
2070 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "pu32OPMBase0 is NULL\n");
2071 return;
2072 }
2073
2074 if(pu32OPMBase1 == NULL)
2075 {
2076 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "pu32OPMBase1 is NULL\n");
2077 return;
2078 }
2079
2080 if(pu32OPMBase2 == NULL)
2081 {
2082 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "pu32OPMBase2 is NULL\n");
2083 return;
2084 }
2085
2086 #if (HW_DESIGN_3D_VER >= 2)
2087 return;
2088 #else
2089 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2090 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2091 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
2092 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
2093 MS_PHY u32DNRBase0 = MS_IPM_BASE0(pInstance, eWindow);
2094 MS_PHY u32DNRBase1 = u32DNRBase0 + ((u32Offset / BYTE_PER_WORD + 0x01) & ~0x01L);
2095 MS_PHY u32DNRBase0Main = MS_IPM_BASE0(MAIN_WINDOW);
2096 MS_PHY u32DNRBase1Main = 0;
2097 MS_PHY u32DNRBase2Main = 0;
2098 MS_U8 u8BytesPer2Pixel = gSrcInfo[eWindow].u8BitPerPixel * 2 / 8;
2099 MS_BOOL bInterlace = gSrcInfo[eWindow].bInterlace;
2100 MS_U16 u16DNROffset = (gSrcInfo[eWindow].u16IPMFetch + OFFSET_PIXEL_ALIGNMENT - 1)
2101 & ~(OFFSET_PIXEL_ALIGNMENT-1);
2102 MS_U32 u32Framesize = (MS_U32)gSrcInfo[eWindow].u16V_SizeAfterPreScaling *
2103 (MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/2;
2104 MS_U8 u8FrameNum = MDrv_XC_TransFrameNumToFactor(pInstance, gSrcInfo[eWindow].Status2.eFrameStoreNumber, gSrcInfo[eWindow].bLinearMode, _FIELD_PACKING_MODE_SUPPORTED);
2105
2106 MS_ASSERT(eWindow < MAX_WINDOW);
2107 MS_ASSERT(pu32OPMBase0);
2108 MS_ASSERT(pu32OPMBase1);
2109
2110 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_OPMBase(%s): from pu32OPMBase0:0x%lx, pu32OPMBase1:0x%lx, pu32OPMBase2:0x%lx\n",eWindow?"Subwindow":"Mainwindow",*pu32OPMBase0,*pu32OPMBase1,*pu32OPMBase2);
2111
2112 if( gSrcInfo[eWindow].Status2.eFrameStoreNumber == IMAGE_STORE_3_FRAMES )
2113 {
2114 u32DNRBase1Main = u32DNRBase0Main + ((MDrv_XC_GetDNRBufSize(pInstance, MAIN_WINDOW) / 3 / BYTE_PER_WORD + 0x01) & ~0x01L);
2115 u32DNRBase2Main = u32DNRBase1Main + ((MDrv_XC_GetDNRBufSize(pInstance, MAIN_WINDOW) / 3 / BYTE_PER_WORD + 0x01) & ~0x01L);
2116 }
2117 else
2118 {
2119 u32DNRBase1Main = u32DNRBase0Main + ((MDrv_XC_GetDNRBufSize(pInstance, MAIN_WINDOW) / 2 / BYTE_PER_WORD + 0x01) & ~0x01L);
2120 u32DNRBase2Main = u32DNRBase0Main;
2121 }
2122
2123 MDrv_SC_3D_Adjust_DNRBase(pInstance,
2124 &u32DNRBase0,
2125 &u32DNRBase1,
2126 eWindow);
2127
2128 //default setting: sub window use mainwindow's scaler buffer
2129 if((!IS_INPUT_MODE_NONE(eWindow)) && (SUB_WINDOW == eWindow))
2130 {
2131 *pu32OPMBase0 = (u32DNRBase0Main + 0x01) & ~0x01L;
2132 *pu32OPMBase1 = (u32DNRBase1Main + 0x01) & ~0x01L;
2133 *pu32OPMBase2 = (u32DNRBase2Main + 0x01) & ~0x01L;
2134 }
2135
2136 if((IS_INPUT_TOP_BOTTOM(eWindow) ||
2137 (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && (!gSrcInfo[eWindow].bInterlace)) ||
2138 IS_INPUT_FRAME_ALTERNATIVE(eWindow)||
2139 IS_INPUT_FRAME_PACKING(eWindow)||
2140 IS_INPUT_NORMAL_2D(eWindow)) &&
2141 IS_OUTPUT_LINE_ALTERNATIVE())
2142 {
2143 MS_U32 u32DoubleHDMidBandSize = 0;
2144 if((gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_720X2P_VSIZE)
2145 || (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2P_VSIZE))
2146 {
2147 u32DoubleHDMidBandSize = (MS_U32)(gSrcInfo[eWindow].u16V_SizeAfterPreScaling - gSrcInfo[eWindow].stDispWin.height) * (MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel;
2148 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u32DoubleHDMidBandSize=%u\n", gSrcInfo[eWindow].u16V_SizeAfterPreScaling - gSrcInfo[eWindow].stDispWin.height);
2149 }
2150
2151 if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
2152 {
2153 *pu32OPMBase1 = u32DNRBase0;
2154 }
2155 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
2156 && (!gSrcInfo[eWindow].bInterlace)
2157 && IS_OUTPUT_LINE_ALTERNATIVE())
2158 {
2159 *pu32OPMBase1 = *pu32OPMBase0 + ((((MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2160 }
2161 else if(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
2162 {
2163 if (IsVMirrorMode(eWindow))
2164 {
2165 *pu32OPMBase1 = *pu32OPMBase0 + ((((MS_U32)1 * (MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift) *
2166 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2167 }
2168 else
2169 {
2170 *pu32OPMBase1 = *pu32OPMBase0;
2171 *pu32OPMBase0 = *pu32OPMBase1 + ((((MS_U32)1 * (MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift) *
2172 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2173 }
2174 }
2175 else if(IS_INPUT_TOP_BOTTOM(eWindow) &&
2176 IS_OUTPUT_LINE_ALTERNATIVE())
2177 {
2178 *pu32OPMBase1 = *pu32OPMBase0 + (((u32Framesize)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2179 }
2180 else if(IS_INPUT_FRAME_PACKING(eWindow) &&
2181 IS_OUTPUT_LINE_ALTERNATIVE())
2182 {
2183 MS_U32 u32SecondFrameOffset = 0;
2184 if(gSrcInfo[eWindow].stDispWin.height == DOUBLEHD_720X2P_FRAME_VSIZE) //720p centering opt
2185 {
2186 u32SecondFrameOffset = (MS_U32)(DOUBLEHD_720X2P_FRAME_VSIZE / 2) * (MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel +
2187 (MS_U32)15 * (MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel;
2188 }
2189 else
2190 {
2191 u32SecondFrameOffset = (MS_U32)(gSrcInfo[eWindow].stDispWin.height / 2) * (MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel +
2192 u32DoubleHDMidBandSize;
2193 }
2194 *pu32OPMBase1 = *pu32OPMBase0 + ((u32SecondFrameOffset/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2195 }
2196 }
2197 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_L())
2198 {
2199 *pu32OPMBase2 = *pu32OPMBase1 = *pu32OPMBase0 = u32DNRBase0;
2200 }
2201 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_R())
2202 {
2203 *pu32OPMBase2 = *pu32OPMBase1 = *pu32OPMBase0 = u32DNRBase1;
2204 }
2205 else if(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
2206 && IS_OUTPUT_LINE_ALTERNATIVE())
2207 {
2208 *pu32OPMBase1 = u32DNRBase0 + ((((MS_U32)1 * (MS_U32)u16DNROffset / 2 * (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2209 }
2210 else if(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
2211 && IS_OUTPUT_LINE_ALTERNATIVE())
2212 {
2213 *pu32OPMBase1 = u32DNRBase0 + ((((MS_U32)1 * (MS_U32)u16DNROffset / 2 *
2214 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2215 }
2216 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() && gSrcInfo[eWindow].bInterlace)
2217 {
2218 *pu32OPMBase1 = u32DNRBase0 + ((((MS_U32)1 * (MS_U32)u16DNROffset / 2 *
2219 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2220 }
2221 else if(IS_INPUT_NORMAL_2D_INTERLACE(eWindow)
2222 && IS_OUTPUT_LINE_ALTERNATIVE())
2223 {
2224 if (IsVMirrorMode(eWindow))
2225 {
2226 *pu32OPMBase1 = *pu32OPMBase0 + ((((MS_U32)1 * (MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift) *
2227 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2228 }
2229 else
2230 {
2231 *pu32OPMBase1 = *pu32OPMBase0;
2232 *pu32OPMBase0 = *pu32OPMBase1 + ((((MS_U32)1 * (MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift) *
2233 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2234 }
2235 }
2236 else if((IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow))
2237 && IS_OUTPUT_LINE_ALTERNATIVE())
2238 {
2239 if (IsVMirrorMode(eWindow))
2240 {
2241 *pu32OPMBase1 = *pu32OPMBase0 + ((((MS_U32)1 * (MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift) *
2242 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2243 }
2244 else
2245 {
2246 *pu32OPMBase1 = *pu32OPMBase0;
2247 *pu32OPMBase0 = *pu32OPMBase1 + ((((MS_U32)1 * (MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift) *
2248 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2249 }
2250 }
2251 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
2252 IS_OUTPUT_TOP_BOTTOM() &&
2253 (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2254 {
2255 *pu32OPMBase0 = u32DNRBase1;
2256 *pu32OPMBase1 = u32DNRBase1;
2257 }
2258 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
2259 IS_OUTPUT_TOP_BOTTOM() &&
2260 (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst != FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2261 {
2262 *pu32OPMBase0 = u32DNRBase0;
2263 *pu32OPMBase1 = u32DNRBase0;
2264 }
2265 else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow) &&
2266 (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()) &&
2267 (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == TRUE)? SUB_WINDOW:MAIN_WINDOW)))
2268 {
2269 *pu32OPMBase0 = ((u32DNRBase0Main + 0x01) & ~0x01L)
2270 + (((gSrcInfo[eWindow].u16V_SizeAfterPreScaling/4)*
2271 (MS_U32)u16DNROffset * ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2272 *pu32OPMBase1 = ((u32DNRBase1Main + 0x01) & ~0x01L)
2273 + (((gSrcInfo[eWindow].u16V_SizeAfterPreScaling/4)*(MS_U32)u16DNROffset *
2274 ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2275 }
2276 else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
2277 {
2278 *pu32OPMBase1 = u32DNRBase1 + (((gSrcInfo[eWindow].u16V_SizeAfterPreScaling/2)*(MS_U32)u16DNROffset *
2279 ((MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD)+ 0x01) & ~0x01L);
2280 }
2281 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
2282 (IS_OUTPUT_TOP_BOTTOM()
2283 #if (HW_DESIGN_3D_VER == 1)
2284 || IS_OUTPUT_SIDE_BY_SIDE_HALF()
2285 #endif
2286 ) &&
2287 (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2288 {
2289 *pu32OPMBase0 = u32DNRBase0Main + 1*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2290 *pu32OPMBase1 = u32DNRBase1Main + 1*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2291 *pu32OPMBase2 = u32DNRBase2Main + 1*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2292 }
2293 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
2294 && IS_OUTPUT_FRAME_L()
2295 && gSrcInfo[eWindow].bInterlace)
2296 {
2297 *pu32OPMBase1 = (((*pu32OPMBase0 + 1*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD)) + 0x01) & ~0x01L);
2298 }
2299 else if(((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_TOP_BOTTOM())
2300 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
2301 && (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2302 {
2303 MS_U16 u16SkipLine_OpmBase0 = 0;
2304 MS_U16 u16SkipLine_OpmBase1 = 0;
2305 MS_U16 u16VactVideo = 0;
2306 MS_U16 u16VactSpace = 0;
2307 MDrv_SC_3D_GetFP_Info(pInstance, &gSrcInfo[eWindow], &u16VactVideo, &u16VactSpace, FALSE);
2308
2309 if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
2310 {
2311 u16SkipLine_OpmBase0 = u16VactVideo + DOUBLEHD_1080X2I_VACT_SPACE1;
2312 u16SkipLine_OpmBase1 = gSrcInfo[eWindow].stCapWin.height - u16VactVideo;
2313 }
2314 else
2315 {
2316 u16SkipLine_OpmBase0 = gSrcInfo[eWindow].stCapWin.height - u16VactVideo;
2317 }
2318
2319 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D----------garbage band----------------u16SkipLine_OpmBase0=%u, u16SkipLine_OpmBase1=%u\n", u16SkipLine_OpmBase0, u16SkipLine_OpmBase1);
2320 *pu32OPMBase0 = u32DNRBase0Main + ((u16SkipLine_OpmBase0*u8FrameNum*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2) + 0x01) & ~0x01L);
2321 *pu32OPMBase1 = u32DNRBase1Main + ((u16SkipLine_OpmBase0*u8FrameNum*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2) + 0x01) & ~0x01L);
2322 *pu32OPMBase2 = u32DNRBase2Main + ((u16SkipLine_OpmBase0*u8FrameNum*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2) + 0x01) & ~0x01L);
2323 if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
2324 {//this format need use madi
2325 *pu32OPMBase1 = u32DNRBase0Main + ((u16SkipLine_OpmBase1*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2326 }
2327 }
2328 else if(((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_TOP_BOTTOM())
2329 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
2330 && (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? SUB_WINDOW:MAIN_WINDOW)))
2331 {
2332 if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
2333 {
2334 MS_U16 u16SkipLine_OpmBase1 = DOUBLEHD_1080X2I_FIELD_VSIZE*2+DOUBLEHD_1080X2I_VACT_SPACE1+DOUBLEHD_1080X2I_VACT_SPACE2;
2335 *pu32OPMBase1 = u32DNRBase0Main + ((u16SkipLine_OpmBase1*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2336 }
2337 }
2338 else if(IS_INPUT_TOP_BOTTOM(eWindow) &&
2339 (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()) &&
2340 (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2341 {
2342 MS_U16 u16SkipLine = gSrcInfo[eWindow].u16V_SizeAfterPreScaling / 2;
2343 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D----------garbage band----------------u16SkipLine=%u\n", u16SkipLine);
2344 *pu32OPMBase0 = u32DNRBase0Main + u16SkipLine/(1 + (TRUE == bInterlace))*u8FrameNum*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2345 *pu32OPMBase1 = u32DNRBase1Main + u16SkipLine/(1 + (TRUE == bInterlace))*u8FrameNum*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2346 *pu32OPMBase2 = u32DNRBase2Main + u16SkipLine/(1 + (TRUE == bInterlace))*u8FrameNum*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2347 }
2348 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2349 IS_OUTPUT_SIDE_BY_SIDE_HALF()&&
2350 (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? MAIN_WINDOW:SUB_WINDOW)) && (gSrcInfo[eWindow].stCapWin.width != gSrcInfo[eWindow].stDispWin.width))
2351 {
2352 *pu32OPMBase0 = u32DNRBase0Main + u8FrameNum*(MS_U32)u16DNROffset/2 * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2353 *pu32OPMBase1 = u32DNRBase1Main + u8FrameNum*(MS_U32)u16DNROffset/2 * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2354 *pu32OPMBase2 = u32DNRBase2Main + u8FrameNum*(MS_U32)u16DNROffset/2 * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2355 }
2356 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2357 IS_OUTPUT_TOP_BOTTOM() &&
2358 (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2359 {
2360 *pu32OPMBase0 = (u32DNRBase0Main + (MS_U32)u16DNROffset/2 * u8FrameNum * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2) + 0x01) & ~0x01L;
2361 *pu32OPMBase1 = (u32DNRBase1Main + (MS_U32)u16DNROffset/2 * u8FrameNum * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2) + 0x01) & ~0x01L;
2362 *pu32OPMBase2 = (u32DNRBase2Main + (MS_U32)u16DNROffset/2 * u8FrameNum * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2) + 0x01) & ~0x01L;
2363 }
2364 #if (HW_DESIGN_3D_VER < 1)
2365 else if((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2366 (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
2367 ||(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && (IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())))
2368
2369 {
2370 *pu32OPMBase0 = u32DNRBase0;
2371 *pu32OPMBase1 = *pu32OPMBase0 + (MS_U32)(u16DNROffset) * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD*2);
2372 }
2373 else if(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
2374 {
2375 if (IsVMirrorMode(eWindow))
2376 {
2377 *pu32OPMBase1 = *pu32OPMBase1 + ((((MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift) *
2378 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2379 }
2380 else
2381 {
2382 *pu32OPMBase0 = *pu32OPMBase0 + ((((MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift) *
2383 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2384 }
2385 }
2386 else if(IS_INPUT_FRAME_PACKING(eWindow) &&
2387 (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
2388 {
2389 MS_U16 u16SkipLine = 0;
2390 MS_U16 u16VactVideo = 0;
2391 MS_U16 u16VactSpace = 0;
2392 MDrv_SC_3D_GetFP_Info(pInstance, &gSrcInfo[eWindow], &u16VactVideo, &u16VactSpace, FALSE);
2393 if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
2394 {
2395 u16VactVideo *= 2; //field size from MDrv_SC_3D_GetFP_Info
2396 }
2397
2398 u16SkipLine = gSrcInfo[eWindow].stCapWin.height - u16VactVideo;
2399 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D----------garbage band----------------u16SkipLine=%u\n", u16SkipLine);
2400 *pu32OPMBase0 = u32DNRBase0;
2401 *pu32OPMBase1 = *pu32OPMBase0 + (MS_U32)u16DNROffset * u16SkipLine * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD);
2402 }
2403 #endif
2404 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
2405 IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
2406 {
2407 *pu32OPMBase1 = *pu32OPMBase0 + (((MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/BYTE_PER_WORD + 0x01) & ~0x01L);
2408 }
2409 else if(IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
2410 {
2411 *pu32OPMBase1 = *pu32OPMBase0 + ((u32Framesize/BYTE_PER_WORD + 0x01) & ~0x01L);
2412 }
2413 else if(IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
2414 {
2415 if(gSrcInfo[eWindow].bInterlace)
2416 {
2417 *pu32OPMBase1 = *pu32OPMBase0 + ((u32Framesize/2/BYTE_PER_WORD + 0x01) & ~0x01L);//only handle one field
2418 }
2419 else
2420 {
2421 *pu32OPMBase1 = *pu32OPMBase0 + ((u32Framesize/BYTE_PER_WORD + 0x01) & ~0x01L);
2422 }
2423 }
2424 else if(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
2425 {
2426 *pu32OPMBase1 = *pu32OPMBase0 + ((((MS_U32)(pXCResourcePrivate->stdrvXC_3D._u163DHShift) *
2427 (MS_U32)u8BytesPer2Pixel)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2428 }
2429 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
2430 IS_OUTPUT_LINE_ALTERNATIVE())
2431 {
2432 *pu32OPMBase1 = *pu32OPMBase0 + ((1*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2433 }
2434 else if(IS_INPUT_FRAME_PACKING(eWindow) && (IS_OUTPUT_FRAME_L()))
2435 {
2436 if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
2437 {
2438 MS_U16 u16SkipLine_OpmBase1 = DOUBLEHD_1080X2I_FIELD_VSIZE*2+DOUBLEHD_1080X2I_VACT_SPACE1+DOUBLEHD_1080X2I_VACT_SPACE2;
2439 *pu32OPMBase0 = u32DNRBase0Main;
2440 *pu32OPMBase1 = u32DNRBase0Main + ((u16SkipLine_OpmBase1*(MS_U32)u16DNROffset * (MS_U32)u8BytesPer2Pixel/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2441 }
2442 }
2443 else if(IS_INPUT_FRAME_PACKING(eWindow) &&
2444 (IS_OUTPUT_FRAME_R()))
2445 {
2446 MS_U16 u16VactVideo = 0;
2447 MS_U16 u16VactSpace = 0;
2448 MDrv_SC_3D_GetFP_Info(pInstance, &gSrcInfo[eWindow], &u16VactVideo, &u16VactSpace, FALSE);
2449 if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
2450 {
2451 MS_U16 u16SkipLine_OpmBase0 = u16VactSpace+DOUBLEHD_1080X2I_VACT_SPACE1;
2452 MS_U16 u16SkipLine_OpmBase1 = gSrcInfo[eWindow].stCapWin.height - u16VactVideo;
2453 *pu32OPMBase0 = u32DNRBase0Main + ((u16SkipLine_OpmBase0*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2454 *pu32OPMBase1 = u32DNRBase0Main + ((u16SkipLine_OpmBase1*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2455 }
2456 else
2457 {
2458 MS_U16 u16SkipLine = 0;
2459 u16SkipLine = gSrcInfo[eWindow].stCapWin.height - u16VactVideo;
2460 *pu32OPMBase0 = u32DNRBase0Main + u16SkipLine*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD);
2461 *pu32OPMBase1 = u32DNRBase1Main + u16SkipLine*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD);
2462 *pu32OPMBase2 = u32DNRBase2Main + u16SkipLine*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD);
2463 }
2464 }
2465 else if(IS_INPUT_TOP_BOTTOM(eWindow) &&
2466 (IS_OUTPUT_FRAME_R()))
2467 {
2468 *pu32OPMBase0 = u32DNRBase0Main + (((u32Framesize/2) * u8FrameNum / (1 + (TRUE == bInterlace)) /(BYTE_PER_WORD) + 0x01) & ~0x01L);
2469 *pu32OPMBase1 = u32DNRBase1Main + (((u32Framesize/2) * u8FrameNum / (1 + (TRUE == bInterlace)) /(BYTE_PER_WORD) + 0x01) & ~0x01L);
2470 *pu32OPMBase2 = u32DNRBase2Main + (((u32Framesize/2) * u8FrameNum / (1 + (TRUE == bInterlace)) /(BYTE_PER_WORD) + 0x01) & ~0x01L);
2471 }
2472 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2473 (IS_OUTPUT_FRAME_R()))
2474 {
2475 *pu32OPMBase0 = u32DNRBase0Main + ((((MS_U32)u16DNROffset/2 * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2476 *pu32OPMBase1 = u32DNRBase1Main + ((((MS_U32)u16DNROffset/2 * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2477 *pu32OPMBase2 = u32DNRBase2Main + ((((MS_U32)u16DNROffset/2 * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2)/(BYTE_PER_WORD) + 0x01) & ~0x01L);
2478 }
2479 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
2480 && IS_OUTPUT_FRAME_R())
2481 {
2482 *pu32OPMBase0 = (((u32DNRBase0Main + 1*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD)) + 0x01) & ~0x01L);
2483 *pu32OPMBase1 = (((u32DNRBase1Main + 1*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD)) + 0x01) & ~0x01L);
2484 *pu32OPMBase2 = (((u32DNRBase2Main + 1*(MS_U32)u16DNROffset * u8FrameNum * (MS_U32)u8BytesPer2Pixel/2/(BYTE_PER_WORD)) + 0x01) & ~0x01L);
2485 }
2486 #if (HW_DESIGN_3D_VER == 0)
2487 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
2488 {
2489 *pu32OPMBase1 = *pu32OPMBase0 = u32DNRBase0;
2490 }
2491 #else
2492 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
2493 IS_OUTPUT_SIDE_BY_SIDE_HALF() &&
2494 (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst == FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2495 {
2496 *pu32OPMBase0 = u32DNRBase0;
2497 *pu32OPMBase1 = u32DNRBase0;
2498 }
2499 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
2500 IS_OUTPUT_SIDE_BY_SIDE_HALF() &&
2501 (eWindow == ((pXCResourcePrivate->stdrvXC_3D._b3DMainFirst != FALSE)? MAIN_WINDOW:SUB_WINDOW)))
2502 {
2503 *pu32OPMBase0 = u32DNRBase1;
2504 *pu32OPMBase1 = u32DNRBase1;
2505 }
2506 #endif
2507
2508 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_OPMBase(%s): to pu32OPMBase0:0x%lx, pu32OPMBase1:0x%lx, pu32OPMBase2:0x%lx\n",eWindow?"Subwindow":"Mainwindow",*pu32OPMBase0,*pu32OPMBase1,*pu32OPMBase2);
2509 #endif
2510 }
2511
2512
2513
MDrv_SC_3D_Adjust_FetchOffset(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)2514 void MDrv_SC_3D_Adjust_FetchOffset(void *pInstance, XC_InternalStatus *pSrcInfo,
2515 SCALER_WIN eWindow)
2516 {
2517 MS_ASSERT(eWindow < MAX_WINDOW);
2518 MS_ASSERT(pSrcInfo);
2519
2520 if(eWindow >= MAX_WINDOW)
2521 {
2522 return;
2523 }
2524
2525 if(pSrcInfo == NULL)
2526 {
2527 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: pSrcInfo is NULL\n");
2528 return;
2529 }
2530 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2531 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2532 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
2533 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
2534
2535 #if (HW_DESIGN_3D_VER >= 2)
2536
2537 if(IS_INPUT_SIDE_BY_SIDE_FULL(eWindow)
2538 && (!pSrcInfo->bInterlace)
2539 && (IS_OUTPUT_FRAME_ALTERNATIVE()||IS_OUTPUT_TOP_BOTTOM()))
2540 {
2541
2542 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_CapSize;
2543 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_CapSize;
2544 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset/2;
2545 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch/2;
2546 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: adjust u16OPMOffset(%u) and u16OPMFetch(%u) to half for E_XC_3D_INPUT_SIDE_BY_SIDE\n",
2547 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset,pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch);
2548 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2549 if (IsEnableDualMode(eWindow))
2550 {
2551 // Fixme: need refine dnr offset fetch
2552 //pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_CapSize;
2553 //pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_CapSize;
2554 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2;
2555 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch/2;
2556 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: adjust u16DualOPMOffset(%u) and u16DualOPMFetch(%u) to half for E_XC_3D_INPUT_SIDE_BY_SIDE\n",
2557 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset,pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch);
2558 }
2559 #endif
2560
2561 }
2562 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
2563 && (!IS_OUTPUT_MODE_NONE()))
2564 {
2565 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset/2;
2566 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2567 if (IsEnableDualMode(eWindow))
2568 {
2569 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2;
2570 }
2571 #endif
2572 }
2573 return;
2574 #else
2575 if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
2576 && (!pSrcInfo->bInterlace)
2577 && IS_OUTPUT_LINE_ALTERNATIVE())
2578 {
2579 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch /= 2;
2580 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2581 if (IsEnableDualMode(eWindow))
2582 {
2583 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch /= 2;
2584 }
2585 #endif
2586 }
2587 else if(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) &&
2588 IS_OUTPUT_LINE_ALTERNATIVE())
2589 {
2590 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset *= 2;
2591 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch /=2;
2592 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2593 if (IsEnableDualMode(eWindow))
2594 {
2595 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset *= 2;
2596 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch /=2;
2597 }
2598 #endif
2599
2600 }
2601 else if(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) &&
2602 IS_OUTPUT_LINE_ALTERNATIVE())
2603 {
2604 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch /=2;
2605 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2606 if (IsEnableDualMode(eWindow))
2607 {
2608 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch /=2;
2609 }
2610 #endif
2611 }
2612 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() && gSrcInfo[eWindow].bInterlace)
2613 {
2614 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch /=2;
2615 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2616 if (IsEnableDualMode(eWindow))
2617 {
2618 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch /=2;
2619 }
2620 #endif
2621 }
2622 else if(IS_INPUT_NORMAL_2D_INTERLACE(eWindow) &&
2623 IS_OUTPUT_LINE_ALTERNATIVE())
2624 {
2625 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset *= 2;
2626 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2627 if (IsEnableDualMode(eWindow))
2628 {
2629 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset *= 2;
2630 }
2631 #endif
2632 }
2633 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
2634 (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_FRAME_L()
2635 || IS_OUTPUT_FRAME_R()))
2636 {
2637 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset *= 2;
2638 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2639 if (IsEnableDualMode(eWindow))
2640 {
2641 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset *=2;
2642 }
2643 #endif
2644
2645 }
2646 else if(IS_INPUT_TOP_BOTTOM(eWindow) &&
2647 (IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()))
2648 {
2649 //change nothing
2650 }
2651 else if(IS_INPUT_TOP_BOTTOM(eWindow)
2652 && IS_OUTPUT_LINE_ALTERNATIVE()
2653 && pSrcInfo->bInterlace)
2654 {
2655 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset *= 2;
2656 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2657 if (IsEnableDualMode(eWindow))
2658 {
2659 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset *= 2;
2660 }
2661 #endif
2662 }
2663 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2664 IS_OUTPUT_SIDE_BY_SIDE_HALF() && (pSrcInfo->stCapWin.width != pSrcInfo->stDispWin.width))
2665 {
2666 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch
2667 - pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset)/2
2668 + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset;
2669 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch +1) & ~1;
2670 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2671 if (IsEnableDualMode(eWindow))
2672 {
2673 // Under Miu dual mode, dual opm fetch need not set linebuffer offset
2674 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch /= 2;
2675 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch +1) & ~1;
2676
2677 }
2678 #endif
2679
2680 }
2681 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2682 IS_OUTPUT_TOP_BOTTOM())
2683 {
2684 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch
2685 - pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset)/2
2686 + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset;
2687 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch +1) & ~1;
2688 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2689 if (IsEnableDualMode(eWindow))
2690 {
2691 // Under Miu dual mode, dual opm fetch need not set linebuffer offset
2692 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch /= 2;
2693 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch +1) & ~1;
2694
2695 }
2696 #endif
2697 }
2698 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() )
2699 {
2700 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset *= 2;
2701
2702 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2703 if (IsEnableDualMode(eWindow))
2704 {
2705 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset *= 2;
2706
2707 }
2708 #endif
2709 }
2710 else if((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2711 (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
2712 ||(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && (IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC()))
2713 )
2714 {
2715 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch
2716 - pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset)/2
2717 + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset;
2718 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch +1) & ~1;
2719 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2720 if (IsEnableDualMode(eWindow))
2721 {
2722 // Under Miu dual mode, dual opm fetch need not set linebuffer offset
2723 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch /= 2;
2724 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch +1) & ~1;
2725
2726 }
2727 #endif
2728 }
2729 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2730 (IS_OUTPUT_FRAME_L()||IS_OUTPUT_FRAME_R()))
2731 {
2732 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch
2733 - pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset)/2
2734 + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset;
2735 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch +1) & ~1;
2736 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2737 if (IsEnableDualMode(eWindow))
2738 {
2739 // Under Miu dual mode, dual opm fetch need not set linebuffer offset
2740 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch /= 2;
2741 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch +1) & ~1;
2742
2743 }
2744 #endif
2745 }
2746 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
2747 IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
2748 {
2749 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset *= 2;
2750 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2751 if (IsEnableDualMode(eWindow))
2752 {
2753 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset *= 2;
2754
2755 }
2756 #endif
2757 }
2758 else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
2759 {
2760 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset *= 2;
2761 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2762 if (IsEnableDualMode(eWindow))
2763 {
2764 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOffset *= 2;
2765 }
2766 #endif
2767 }
2768 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
2769 && (IS_OUTPUT_SIDE_BY_SIDE_HALF()))
2770 {
2771 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset *= 2;
2772 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2773 if (IsEnableDualMode(eWindow))
2774 {
2775 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset *= 2;
2776 }
2777 #endif
2778 #if (HW_DESIGN_3D_VER == 0)
2779 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch *= 2;
2780 #endif
2781 }
2782 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
2783 && IS_OUTPUT_FRAME_L()
2784 && gSrcInfo[eWindow].bInterlace)
2785 {
2786 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset *= 2;
2787 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2788 if (IsEnableDualMode(eWindow))
2789 {
2790 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset *= 2;
2791 }
2792 #endif
2793 }
2794 #if (HW_DESIGN_3D_VER == 0)
2795 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
2796 {
2797 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset *= 2;
2798 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset *= 2;
2799 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch *= 2;
2800 }
2801 #endif
2802 else if((IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
2803 || (IS_INPUT_TOP_BOTTOM_OPT(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
2804 {
2805 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset *= 2;
2806 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset *= 2;
2807 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch *= 2;
2808 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2809 if (IsEnableDualMode(eWindow))
2810 {
2811 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset *= 2;
2812 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset *= 2;
2813 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch *= 2;
2814 }
2815 #endif
2816 }
2817
2818 #if (HW_DESIGN_3D_VER < 1)
2819 //set free_md
2820 Hal_XC_Set_FreeFRCMD(pInstance, (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2821 IS_OUTPUT_FRAME_ALTERNATIVE()) ||
2822 (IS_INPUT_FRAME_PACKING(eWindow) &&
2823 IS_OUTPUT_FRAME_ALTERNATIVE()));
2824 #elif (HW_DESIGN_3D_VER == 1)
2825 //set free_md
2826 Hal_XC_Set_FreeFRCMD(pInstance, (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
2827 || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()));
2828 #endif
2829
2830 #if (HW_DESIGN_3D_VER == 1)
2831 {
2832 if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) &&
2833 IS_OUTPUT_FRAME_ALTERNATIVE())
2834 {
2835 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch /= 2;
2836 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset + (OFFSET_PIXEL_ALIGNMENT*2 -1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
2837 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset + (OFFSET_PIXEL_ALIGNMENT*2 -1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
2838 Hal_XC_H3D_Enable(TRUE);
2839 Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_SIDE_BY_SIDE_FULL);
2840 Hal_XC_H3D_Breakline_Enable(TRUE);
2841 Hal_XC_H3D_HDE((pSrcInfo->u16H_SizeAfterPreScaling+OFFSET_PIXEL_ALIGNMENT-1) & ~(OFFSET_PIXEL_ALIGNMENT-1));
2842 Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
2843 }
2844 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) &&
2845 IS_OUTPUT_FRAME_ALTERNATIVE())
2846 {
2847 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset*2 + (OFFSET_PIXEL_ALIGNMENT*2 -1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
2848 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset*2 + (OFFSET_PIXEL_ALIGNMENT*2 -1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
2849 Hal_XC_H3D_Enable(TRUE);
2850 Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_LINE_ALTERNATIVE);
2851 Hal_XC_H3D_Breakline_Enable(FALSE);
2852 Hal_XC_H3D_HDE(0);
2853 HAL_XC_H3D_OPM_SBYS_PIP_Enable(FALSE);
2854 Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
2855 }
2856 else if(IS_INPUT_FRAME_PACKING(eWindow) &&
2857 IS_OUTPUT_FRAME_ALTERNATIVE())
2858 {
2859 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset*2;
2860 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset*2;
2861 if(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting)
2862 {
2863 Hal_XC_H3D_HBLANK(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank);
2864 }
2865 else
2866 {
2867 Hal_XC_H3D_HBLANK(0x33E);
2868 }
2869 Hal_XC_H3D_HDE(DOUBLEHD_1080X2P_HSIZE);//0x780
2870 Hal_XC_H3D_INIT_VBLANK(0x02);
2871 Hal_XC_H3D_VDE_F0(DOUBLEHD_1080X2P_FRAME_VSIZE);//0x438
2872 Hal_XC_H3D_VBLANK0(DOUBLEHD_1080X2P_GARBAGE_VSIZE);//0x2D
2873 Hal_XC_H3D_VBLANK1(DOUBLEHD_1080X2P_GARBAGE_VSIZE);//0x2D
2874 Hal_XC_H3D_VDE_F2(DOUBLEHD_1080X2P_FRAME_VSIZE);//0x438
2875 Hal_XC_H3D_VBLANK2(DOUBLEHD_1080X2P_GARBAGE_VSIZE);//0x2D
2876 Hal_XC_H3D_VSYNC_WIDTH(0x01);
2877 Hal_XC_H3D_VSYNC_POSITION(0x0400);
2878 Hal_XC_H3D_Enable(TRUE);
2879 Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_FRAME_PACKING);
2880 Hal_XC_H3D_SELECT_REGEN_TIMING(TRUE);
2881 Hal_XC_H3D_Breakline_Enable(FALSE);
2882 HAL_XC_H3D_OPM_SBYS_PIP_Enable(TRUE);
2883 Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
2884
2885 if ((gSrcInfo[eWindow].stCapWin.width == DOUBLEHD_1080X2I_HSIZE) && (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE))
2886 {
2887 if ((pSrcInfo->u16InputVFreq >= 240) && (pSrcInfo->u16InputVFreq <= 260))
2888 {
2889 if(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting)
2890 {
2891 Hal_XC_H3D_HBLANK(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank);
2892 }
2893 else
2894 {
2895 Hal_XC_H3D_HBLANK(0x2D0);//1080i@50Hz
2896 }
2897 }
2898 else if ((pSrcInfo->u16InputVFreq >= 290) && (pSrcInfo->u16InputVFreq <= 310))
2899 {
2900 if(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting)
2901 {
2902 Hal_XC_H3D_HBLANK(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank);
2903 }
2904 else
2905 {
2906 Hal_XC_H3D_HBLANK(0x118);//1080i@60Hz
2907 }
2908 }
2909 Hal_XC_H3D_HDE(DOUBLEHD_1080X2I_HSIZE);//0x780
2910 Hal_XC_H3D_INIT_VBLANK(0x02);
2911 Hal_XC_H3D_VDE_F0(DOUBLEHD_1080X2I_FRAME_VSIZE/2);//0x21C
2912 Hal_XC_H3D_VBLANK0(0x17);//0x17
2913 Hal_XC_H3D_VBLANK1(0x16);//0x16
2914 Hal_XC_H3D_VDE_F2(DOUBLEHD_1080X2I_FRAME_VSIZE/2);//0x21C
2915 Hal_XC_H3D_VBLANK2(0x17);//0x17
2916 Hal_XC_H3D_VSYNC_WIDTH(0x01);
2917 Hal_XC_H3D_VSYNC_POSITION(0x0400);
2918 Hal_XC_H3D_Enable(TRUE);
2919 Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_FRAME_PACKING);
2920 Hal_XC_H3D_SELECT_REGEN_TIMING(TRUE);
2921 Hal_XC_H3D_Breakline_Enable(FALSE);
2922 HAL_XC_H3D_OPM_SBYS_PIP_Enable(TRUE);
2923 Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
2924 }
2925 else if ((gSrcInfo[eWindow].stCapWin.width == DOUBLEHD_720X2P_HSIZE) && (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_720X2P_VSIZE))
2926 {
2927 if ((pSrcInfo->u16InputVFreq >= 470) && (pSrcInfo->u16InputVFreq <= 520))
2928 {
2929 if(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting)
2930 {
2931 Hal_XC_H3D_HBLANK(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank);
2932 }
2933 else
2934 {
2935 Hal_XC_H3D_HBLANK(0x2BC);//50Hz=700
2936 }
2937 }
2938 else if ((pSrcInfo->u16InputVFreq >= 570) && (pSrcInfo->u16InputVFreq <= 620))
2939 {
2940 if(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting)
2941 {
2942 Hal_XC_H3D_HBLANK(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank);
2943 }
2944 else
2945 {
2946 Hal_XC_H3D_HBLANK(0x172);//59.94/60Hz=370
2947 }
2948 }
2949
2950 Hal_XC_H3D_HDE(DOUBLEHD_720X2P_HSIZE);//1280
2951 Hal_XC_H3D_INIT_VBLANK(0x02);
2952 Hal_XC_H3D_VDE_F0(DOUBLEHD_720X2P_FRAME_VSIZE);//720
2953 Hal_XC_H3D_VBLANK0(DOUBLEHD_720X2P_GARBAGE_VSIZE);//0x1E
2954 Hal_XC_H3D_VBLANK1(DOUBLEHD_720X2P_GARBAGE_VSIZE);//0x1E
2955 Hal_XC_H3D_VDE_F2(DOUBLEHD_720X2P_FRAME_VSIZE);//0x2D0
2956 Hal_XC_H3D_VBLANK2(DOUBLEHD_720X2P_GARBAGE_VSIZE);//0x1E
2957 Hal_XC_H3D_VSYNC_WIDTH(0x01);
2958 Hal_XC_H3D_VSYNC_POSITION(0x0400);
2959 Hal_XC_H3D_Enable(TRUE);
2960 Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_FRAME_PACKING);
2961 Hal_XC_H3D_SELECT_REGEN_TIMING(TRUE);
2962 Hal_XC_H3D_Breakline_Enable(FALSE);
2963 HAL_XC_H3D_OPM_SBYS_PIP_Enable(TRUE);
2964 Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
2965 }
2966 }
2967 else if(IS_INPUT_FRAME_PACKING(eWindow) &&
2968 IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
2969 {
2970 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset*2;
2971 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset*2;
2972 if ((pSrcInfo->u16InputVFreq >= 470) && (pSrcInfo->u16InputVFreq <= 520))
2973 {
2974 if(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting)
2975 {
2976 Hal_XC_H3D_HBLANK(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank);
2977 }
2978 else
2979 {
2980 Hal_XC_H3D_HBLANK(0x2BC);//50Hz=700
2981 }
2982 }
2983 else if ((pSrcInfo->u16InputVFreq >= 570) && (pSrcInfo->u16InputVFreq <= 620))
2984 {
2985 if(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.bEnableUserSetting)
2986 {
2987 Hal_XC_H3D_HBLANK(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara.u16HBlank);
2988 }
2989 else
2990 {
2991 Hal_XC_H3D_HBLANK(0x172);//59.94/60Hz=370
2992 }
2993 }
2994 Hal_XC_H3D_HDE(DOUBLEHD_720X2P_HSIZE);//1280
2995 Hal_XC_H3D_INIT_VBLANK(0x02);
2996 Hal_XC_H3D_VDE_F0(DOUBLEHD_720X2P_FRAME_VSIZE);//720
2997 Hal_XC_H3D_VBLANK0(DOUBLEHD_720X2P_GARBAGE_VSIZE);//0x1E
2998 Hal_XC_H3D_VBLANK1(DOUBLEHD_720X2P_GARBAGE_VSIZE);//0x1E
2999 Hal_XC_H3D_VDE_F2(DOUBLEHD_720X2P_FRAME_VSIZE);//0x2D0
3000 Hal_XC_H3D_VBLANK2(DOUBLEHD_720X2P_GARBAGE_VSIZE);//0x1E no need in 1280x1470
3001 Hal_XC_H3D_VSYNC_WIDTH(0x01);
3002 Hal_XC_H3D_VSYNC_POSITION(0x0400);
3003 Hal_XC_H3D_Enable(TRUE);
3004 Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_FRAME_PACKING);
3005 Hal_XC_H3D_SELECT_REGEN_TIMING(TRUE);
3006 Hal_XC_H3D_Breakline_Enable(FALSE);
3007 HAL_XC_H3D_OPM_SBYS_PIP_Enable(TRUE);
3008 Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
3009 }
3010 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
3011 IS_OUTPUT_FRAME_ALTERNATIVE())
3012 {
3013 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase1 = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase0;
3014 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset*2 + (OFFSET_PIXEL_ALIGNMENT*2 -1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
3015 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset*2 + (OFFSET_PIXEL_ALIGNMENT*2 -1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 -1);
3016 Hal_XC_H3D_Enable(FALSE);
3017 Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_FRAME_PACKING);
3018 Hal_XC_H3D_Breakline_Enable(FALSE);
3019 Hal_XC_H3D_HDE(0);
3020 HAL_XC_H3D_OPM_SBYS_PIP_Enable(FALSE);
3021 Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
3022 Hal_XC_H3D_SELECT_REGEN_TIMING(FALSE);
3023 }
3024 else
3025 {
3026 Hal_XC_H3D_Enable(FALSE);
3027 Hal_XC_H3D_Input3DType(E_XC_3D_INPUT_FRAME_PACKING);
3028 Hal_XC_H3D_Breakline_Enable(FALSE);
3029 Hal_XC_H3D_HDE(0);
3030 Hal_XC_H3D_LR_Toggle_Enable(pInstance, FALSE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);
3031 Hal_XC_H3D_SELECT_REGEN_TIMING(FALSE);
3032 Hal_HDMI_Set_YUV422to444_Bypass(TRUE);
3033 }
3034
3035 // Version = 1. 3D mode enable
3036 if (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_70_L, (BIT(15))) )
3037 {
3038 Hal_HDMI_Set_YUV422to444_Bypass(FALSE);
3039 }
3040 }
3041 #endif
3042 // IPM offset / IPM fetch /OPM offset: All project --> 32pix align-----Fix me: Need consider DNR offset and DNR/OPM base
3043 // OPM fetch:
3044 // Janus /T7 --> 32pix align
3045 // Others ( T8/T9/T12/T13/m10/J2 ) --> 2pix align
3046 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = ( pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1 ) & ~1; // pixels alignment;
3047 #ifdef UFO_XC_SUPPORT_DUAL_MIU
3048 if (IsEnableDualMode(eWindow))
3049 {
3050 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch *= ( pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1 ) & ~1;
3051 }
3052 #endif
3053
3054 #endif
3055 }
3056
MDrv_SC_3D_IsFramePaking(void * pInstance,MS_U16 u16Width,MS_U16 u16Height,MS_BOOL bInterlace)3057 MS_BOOL MDrv_SC_3D_IsFramePaking(void *pInstance, MS_U16 u16Width, MS_U16 u16Height, MS_BOOL bInterlace)
3058 {
3059 MS_BOOL bFramePacking = (((u16Width == DOUBLEHD_720X2P_HSIZE)
3060 && (u16Height == DOUBLEHD_720X2P_VSIZE))
3061 || ((u16Width == DOUBLEHD_576X2P_HSIZE)
3062 && (u16Height == DOUBLEHD_576X2P_VSIZE))
3063 || ((u16Width == DOUBLEHD_480X2P_HSIZE)
3064 && (u16Height == DOUBLEHD_480X2P_VSIZE))
3065 || ((u16Width == DOUBLEHD_640_480X2P_HSIZE)
3066 && (u16Height == DOUBLEHD_640_480X2P_VSIZE))
3067 || ((u16Width == DOUBLEHD_1080X2P_HSIZE)
3068 && (u16Height == DOUBLEHD_1080X2P_VSIZE))
3069 || ((u16Width == DOUBLEHD_1080X2I_HSIZE)
3070 && (u16Height == DOUBLEHD_1080X2I_VSIZE))
3071 ) && (!bInterlace);
3072 return bFramePacking;
3073 }
3074
MDrv_SC_3D_FormatValidation(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)3075 MS_BOOL MDrv_SC_3D_FormatValidation(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
3076 {
3077 MS_BOOL bRet = TRUE;
3078 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3079 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3080 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3081 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3082
3083 MS_BOOL bFramePacking = MDrv_SC_3D_IsFramePaking(pInstance, pSrcInfo->stCapWin.width, pSrcInfo->stCapWin.height, pSrcInfo->bInterlace);
3084
3085 MS_ASSERT(eWindow < MAX_WINDOW);
3086 MS_ASSERT(pSrcInfo);
3087
3088 if(eWindow >= MAX_WINDOW)
3089 {
3090 return FALSE;
3091 }
3092
3093 if( IS_INPUT_MODE_NONE(eWindow)^IS_OUTPUT_MODE_NONE() )
3094 {
3095 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3096 if( IS_INPUT_MODE_NONE(eWindow) )
3097 {
3098 bRet = Hal_SC_3D_IsDualViewMode(pInstance, eWindow);
3099 }
3100 #else
3101 bRet = FALSE;
3102 #endif
3103 }
3104 else
3105 {
3106 if( IS_INPUT_MODE_NONE(eWindow))
3107 {
3108 return TRUE;
3109 }
3110 }
3111
3112
3113 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3114 if(!Hal_SC_3D_IsDualViewMode(pInstance, eWindow)) //do not check FP content while in dual view mode
3115 #endif
3116 {
3117 bRet = !(IS_INPUT_FRAME_PACKING(eWindow) ^ bFramePacking);
3118 }
3119
3120 if(!bRet)
3121 {
3122 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: format is invalid,3D Mode=%u !\n", pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow]);
3123 }
3124
3125 #ifdef UFO_XC_FB_LEVEL
3126 if((pSrcInfo->eFBLevel == E_XC_FB_LEVEL_FBL) || (pSrcInfo->bR_FBL == E_XC_FB_LEVEL_RFBL_DI))
3127 #else
3128 if(pSrcInfo->bFBL || pSrcInfo->bR_FBL)
3129 #endif
3130 {
3131 if(!(MDrv_SC_3D_IsSupportFBL3D()
3132 && ((IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
3133 || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE()))))
3134 {
3135 bRet = FALSE;
3136 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: not support this 3d format under fbl\n");
3137 }
3138 }
3139 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow)
3140 || IS_INPUT_CHECK_BOARD(eWindow)
3141 || IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
3142 {
3143 if(pSrcInfo->bInterlace)
3144 {
3145 bRet = FALSE;
3146 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: only progresive timing is supported\n");
3147 }
3148 }
3149 #if (HW_DESIGN_3D_VER < 2)
3150 else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow)
3151 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow))
3152 {
3153 if(!pSrcInfo->bInterlace)
3154 {
3155 bRet = FALSE;
3156 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: only interlace timing is supported\n");
3157 }
3158 }
3159 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow))
3160 {
3161 if(pSrcInfo->bInterlace)
3162 {
3163 bRet = FALSE;
3164 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: only progresive timing is supported\n");
3165 }
3166 }
3167 #endif
3168 #if (HW_DESIGN_3D_VER!= 4)
3169 if(IS_OUTPUT_FRAME_ALTERNATIVE())
3170 {
3171 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 3))//special use only for napoli
3172 if ( pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC &&
3173 (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultHTotal> 3000) &&
3174 (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVTotal> 2000) &&
3175 (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq > 500)) // 4K2K 60 out
3176 {
3177 if (!(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_4K_HALFK_240HZ))
3178 {
3179 bRet = FALSE;
3180
3181 printf("3D: need special flag E_XC_INIT_MISC_A_FRC_INSIDE_4K_HALFK_240HZ for 3D format E_XC_3D_OUTPUT_FRAME_ALTERNATIVE\n");
3182 }
3183 }
3184 else
3185 #endif
3186 if((pSrcInfo->u16InputVFreq > 350)
3187 &&
3188 ((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq == 500)
3189 || (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq == 600)))
3190 {
3191
3192 bRet = FALSE;
3193
3194 printf("3D: need double framerate for 3D formatE_XC_3D_OUTPUT_FRAME_ALTERNATIVE\n");
3195 }
3196 }
3197 #endif
3198
3199 if (IS_OUTPUT_FRAME_PACKING())
3200 {
3201 //3D FP ouput ,display window always full screen
3202 pSrcInfo->stDispWin.x = 0;
3203 pSrcInfo->stDispWin.width = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width;
3204 pSrcInfo->stDispWin.y = 0;
3205 pSrcInfo->stDispWin.height = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
3206 }
3207
3208 if (IS_INPUT_PIXEL_ALTERNATIVE(eWindow) || IS_INPUT_CHECK_BOARD(eWindow))
3209 {
3210 if (IsSrcTypeHDMI(gSrcInfo[eWindow].enInputSourceType))
3211 {
3212 _XC_SEMAPHORE_RETURN(pInstance, E_XC_ID_VAR);
3213 MS_HDMI_COLOR_FORMAT eFormat = MDrv_HDMI_Get_ColorFormat();
3214 _XC_SEMAPHORE_ENTRY(pInstance, E_XC_ID_VAR);
3215 if ((eFormat == MS_HDMI_COLOR_YUV_422) || (eFormat == MS_HDMI_COLOR_YUV_420))
3216 {
3217 bRet = FALSE;
3218 printf("3D: YUV422/YUV420 do not support HDMI PA/CB 3D input.\n");
3219 }
3220 }
3221 else
3222 {
3223 bRet = FALSE;
3224 printf("3D: This source do not support PA/CB 3D input.\n");
3225 }
3226 }
3227
3228 if(!bRet)
3229 {
3230 printf("MDrv_SC_3D_FormatValidation(): invalid format, set to 3d_none\n");
3231 _XC_ENTRY(pInstance);
3232 MDrv_XC_Set_3D_HShift(pInstance, 0);
3233 Hal_SC_subwindow_disable(pInstance);
3234 _XC_RETURN(pInstance);
3235 pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] = E_XC_3D_INPUT_MODE_NONE;
3236
3237 if ((pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_TOP_BOTTOM)
3238 && !(pXCResourcePrivate->stdrvXC_3D._bFAToTB)
3239 && !(pXCResourcePrivate->stdrvXC_3D._bLAToTB))
3240 {
3241 pSrcInfo->stDispWin.y *= 2;
3242 }
3243 else if ((pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF)
3244 && !(pXCResourcePrivate->stdrvXC_3D._bFAToTB)
3245 && !(pXCResourcePrivate->stdrvXC_3D._bLAToTB))
3246 {
3247 pSrcInfo->stDispWin.x *= 2;
3248 }
3249
3250 #if (HW_DESIGN_3D_VER < 2)
3251 if (pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_TOP_BOTTOM)
3252 {
3253 pSrcInfo->stDispWin.height *= 2;
3254 }
3255
3256 if (pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF)
3257 {
3258 pSrcInfo->stDispWin.width *= 2;
3259 }
3260 #endif
3261 pXCResourcePrivate->stdrvXC_3D._eOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
3262 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_MODE_NONE;
3263 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
3264 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
3265 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
3266 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = FALSE;
3267 #if (HW_DESIGN_3D_VER < 2)
3268 MDrv_XC_Enable_3D_LR_Sbs2Line(pInstance, DISABLE);
3269 #endif
3270 }
3271 return bRet;
3272 }
3273
MDrv_SC_3D_AdjustHShift(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)3274 void MDrv_SC_3D_AdjustHShift(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
3275 {
3276 MS_ASSERT(eWindow < MAX_WINDOW);
3277 MS_ASSERT(pSrcInfo);
3278
3279 if(pSrcInfo == NULL)
3280 {
3281 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
3282 return;
3283 }
3284
3285 if(eWindow >= MAX_WINDOW)
3286 {
3287 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3288 return;
3289 }
3290 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3291 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3292 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3293 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3294 #if (HW_DESIGN_3D_VER < 2)
3295 if((IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_TOP_BOTTOM())
3296 || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()))
3297 {
3298 pXCResourcePrivate->stdrvXC_3D._u163DHShift = (pXCResourcePrivate->stdrvXC_3D._u163DHShift + 1) & ~1;
3299 pSrcInfo->stCropWin.width -= pXCResourcePrivate->stdrvXC_3D._u163DHShift;
3300 if(MAIN_WINDOW == eWindow)
3301 {
3302 pSrcInfo->stCropWin.x += pXCResourcePrivate->stdrvXC_3D._u163DHShift;
3303 }
3304 }
3305 #if (HW_2DTO3D_SUPPORT == FALSE)
3306 else
3307 {
3308 pXCResourcePrivate->stdrvXC_3D._u163DHShift = (pXCResourcePrivate->stdrvXC_3D._u163DHShift + OFFSET_PIXEL_ALIGNMENT - 1) & ~(OFFSET_PIXEL_ALIGNMENT-1);
3309 }
3310 #endif
3311 #endif
3312 }
3313
3314 //disable sub window write dnr buffer when no needed
MDrv_SC_3D_SetWriteMemory(void * pInstance,SCALER_WIN eWindow)3315 void MDrv_SC_3D_SetWriteMemory(void *pInstance, SCALER_WIN eWindow)
3316 {
3317 MS_ASSERT(eWindow < MAX_WINDOW);
3318 if(eWindow >= MAX_WINDOW)
3319 {
3320 return;
3321 }
3322 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3323 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3324 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3325 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3326 _XC_ENTRY(pInstance);
3327
3328 #if (HW_DESIGN_3D_VER >= 2)
3329 if(IS_OUTPUT_TOP_BOTTOM()
3330 || IS_OUTPUT_SIDE_BY_SIDE_HALF()
3331 || IS_OUTPUT_LINE_ALTERNATIVE()
3332 || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()
3333 || IS_OUTPUT_TOP_BOTTOM_HW()
3334 )
3335 {
3336 Hal_SC_IP_Memory_Write_Request(pInstance, FALSE, SUB_WINDOW);
3337 Hal_SC_IP_Memory_Read_Request(pInstance, FALSE, SUB_WINDOW);
3338 }
3339 else
3340 {
3341 Hal_SC_IP_Memory_Write_Request(pInstance, TRUE, SUB_WINDOW);
3342 Hal_SC_IP_Memory_Read_Request(pInstance, TRUE, SUB_WINDOW);
3343 }
3344 #else
3345 if(SUB_WINDOW == eWindow)
3346 {
3347 if(IS_INPUT_MODE_NONE(eWindow)
3348 || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF()
3349 && (gSrcInfo[eWindow].stCapWin.width == gSrcInfo[eWindow].stDispWin.width))
3350 || IS_INPUT_FRAME_PACKING_OPT(eWindow)
3351 || IS_INPUT_TOP_BOTTOM_OPT(eWindow)
3352 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_TOP_BOTTOM() && (!MDrv_SC_3D_IsUseSameBuffer(pInstance)))
3353 || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF() && (!MDrv_SC_3D_IsUseSameBuffer(pInstance)))
3354 || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_TOP_BOTTOM() && (!MDrv_SC_3D_IsUseSameBuffer(pInstance)))
3355 || (IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF_HW() && (!MDrv_SC_3D_IsUseSameBuffer(pInstance)))
3356 || (IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_TOP_BOTTOM_HW() && (!MDrv_SC_3D_IsUseSameBuffer(pInstance)))
3357 #if (HW_DESIGN_3D_VER == 1)
3358 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF() && (!MDrv_SC_3D_IsUseSameBuffer(pInstance)))
3359 #endif
3360 )
3361 {// 2D format, sbs in, sbs out centering, framepacking opt,
3362 // or frame alternative in, top bottom out
3363 Hal_SC_IP_Memory_Write_Request(pInstance, TRUE, eWindow);
3364 Hal_SC_IP_Memory_Read_Request(pInstance, TRUE, eWindow);
3365 }
3366 else
3367 {
3368 Hal_SC_IP_Memory_Write_Request(pInstance, FALSE, eWindow);
3369 Hal_SC_IP_Memory_Read_Request(pInstance, FALSE, eWindow);
3370 }
3371 }
3372 #endif
3373
3374 _XC_RETURN(pInstance);
3375 }
3376
MDrv_SC_3D_Is2Dto3DCase(void * pInstance,E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode)3377 MS_BOOL MDrv_SC_3D_Is2Dto3DCase(void *pInstance, E_XC_3D_INPUT_MODE e3dInputMode,
3378 E_XC_3D_OUTPUT_MODE e3dOutputMode)
3379 {
3380 MS_BOOL bRet = FALSE;
3381
3382 #if (HW_DESIGN_3D_VER <= 1)
3383 if(((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D) &&
3384 (e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE))
3385 ||
3386 ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_INTERLACE) &&
3387 (e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE))
3388 ||
3389 ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_INTERLACE_PTP) &&
3390 (e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE))
3391 ||
3392 ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D) &&
3393 (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_NOFRC))
3394 )
3395 {
3396 bRet = TRUE;
3397 }
3398 #endif
3399
3400 return bRet;
3401 }
3402
MDrv_SC_3D_CloneMainSettings(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)3403 void MDrv_SC_3D_CloneMainSettings(void *pInstance, XC_InternalStatus *pSrcInfo,
3404 SCALER_WIN eWindow)
3405 {
3406
3407 MS_ASSERT(eWindow < MAX_WINDOW);
3408 MS_ASSERT(pSrcInfo);
3409
3410 if(pSrcInfo == NULL)
3411 {
3412 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
3413 return;
3414 }
3415
3416 if(eWindow == MAX_WINDOW)
3417 {
3418 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3419 return;
3420 }
3421 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3422 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3423 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3424 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3425 #if (HW_DESIGN_3D_VER <= 1)
3426 if(SUB_WINDOW == eWindow)
3427 {
3428 if(IS_OUTPUT_TOP_BOTTOM()
3429 || IS_OUTPUT_SIDE_BY_SIDE_HALF()
3430 || IS_OUTPUT_TOP_BOTTOM_HW()
3431 || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()
3432 || IS_OUTPUT_FRAME_R())
3433 {
3434 MS_U8 u8Data_Mux = 0;
3435 MS_U8 u8Clk_Mux = 0;
3436 MDrv_XC_EnableCLK_for_SUB(pInstance, TRUE);
3437 Hal_SC_mux_get_mainwin_ip_mux(pInstance, &u8Data_Mux, &u8Clk_Mux);
3438 Hal_SC_set_subwin_ip_mux(pInstance, u8Data_Mux, u8Clk_Mux);
3439 if(MDrv_SC_3D_IsUseSameBuffer(pInstance))
3440 {
3441 if(pSrcInfo->bInterlace)
3442 {
3443 pSrcInfo->eDeInterlaceMode = gSrcInfo[MAIN_WINDOW].eDeInterlaceMode;
3444 }
3445 pSrcInfo->u8BitPerPixel = gSrcInfo[MAIN_WINDOW].u8BitPerPixel;
3446 }
3447 }
3448 }
3449 #else
3450 if(IS_OUTPUT_TOP_BOTTOM()
3451 || IS_OUTPUT_SIDE_BY_SIDE_HALF()
3452 || IS_OUTPUT_TOP_BOTTOM_HW()
3453 || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()
3454 || IS_OUTPUT_LINE_ALTERNATIVE()
3455 || IS_OUTPUT_FRAME_R()
3456 )
3457 {
3458 MS_U8 u8Data_Mux = 0;
3459 MS_U8 u8Clk_Mux = 0;
3460 MDrv_XC_EnableCLK_for_SUB(pInstance, TRUE);
3461 Hal_SC_mux_get_mainwin_ip_mux(pInstance, &u8Data_Mux, &u8Clk_Mux);
3462 Hal_SC_set_subwin_ip_mux(pInstance, u8Data_Mux, u8Clk_Mux);
3463 }
3464 else if(!IS_INPUT_MODE_NONE(MAIN_WINDOW))
3465 {
3466 if (eWindow == MAIN_WINDOW)
3467 MDrv_XC_EnableCLK_for_SUB(pInstance, FALSE);
3468 else
3469 MDrv_XC_EnableCLK_for_SUB(pInstance, TRUE);
3470 }
3471 #endif
3472 }
3473
MDrv_SC_3D_IsUseSameBuffer(void * pInstance)3474 MS_BOOL MDrv_SC_3D_IsUseSameBuffer(void *pInstance)
3475 {
3476 MS_BOOL bRet = FALSE;
3477
3478 #if (HW_DESIGN_3D_VER <= 1)
3479 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3480 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3481 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3482 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3483 return (MS_IPM_BASE0(MAIN_WINDOW) == MS_IPM_BASE0(SUB_WINDOW));
3484 #endif
3485
3486 return bRet;
3487 }
3488
MDrv_SC_3D_Adjust_MirrorDNROffset(void * pInstance,XC_InternalStatus * pSrcInfo,MS_U16 * pu16V_SizeAfterPreScaling,MS_U16 * pu16DNROffset,MS_U16 * pu16Ratio,SCALER_WIN eWindow)3489 void MDrv_SC_3D_Adjust_MirrorDNROffset(void *pInstance, XC_InternalStatus *pSrcInfo,
3490 MS_U16 *pu16V_SizeAfterPreScaling,
3491 MS_U16 *pu16DNROffset,
3492 MS_U16 *pu16Ratio,
3493 SCALER_WIN eWindow)
3494 {
3495 MS_ASSERT(eWindow < MAX_WINDOW);
3496 MS_ASSERT(pSrcInfo);
3497
3498 if(pSrcInfo == NULL)
3499 {
3500 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
3501 return;
3502 }
3503
3504 if(eWindow == MAX_WINDOW)
3505 {
3506 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3507 return;
3508 }
3509 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3510 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3511 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3512 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3513 #if (HW_DESIGN_3D_VER >= 2)
3514 if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
3515 || IS_INPUT_TOP_BOTTOM(eWindow))
3516 {
3517 *pu16V_SizeAfterPreScaling /= 2;
3518 *pu16Ratio *= 2;
3519 }
3520 else if(IS_INPUT_FRAME_PACKING(eWindow))
3521 {
3522 MS_U16 u16VactVideo = 0;
3523 MS_U16 u16VactSpace = 0;
3524 MS_U8 u8Ratio = 2;
3525 if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
3526 {
3527 u8Ratio = 4;
3528 }
3529 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31);
3530 #if (HW_DESIGN_3D_VER == 2)
3531 *pu16V_SizeAfterPreScaling = (*pu16V_SizeAfterPreScaling - u16VactSpace) / u8Ratio;
3532 #else
3533 *pu16V_SizeAfterPreScaling /= u8Ratio;
3534 #endif
3535 *pu16Ratio *= 2;
3536 }
3537 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3538 || IS_INPUT_CHECK_BOARD(eWindow)
3539 || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3540 )
3541 {
3542 *pu16DNROffset = ((*pu16DNROffset / 2) + OFFSET_PIXEL_ALIGNMENT - 1) & ~(OFFSET_PIXEL_ALIGNMENT-1);
3543 *pu16Ratio *= 2;
3544 }
3545 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
3546 {
3547 *pu16DNROffset *= 2;
3548 *pu16Ratio *= 1;
3549 }
3550 #else
3551 if((IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
3552 ||(IS_INPUT_NORMAL_2D_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
3553 ||(IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
3554 ||(IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE() && gSrcInfo[eWindow].bInterlace)
3555 ||(IS_INPUT_FIELD_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
3556 )
3557 {
3558 *pu16V_SizeAfterPreScaling *= 2;
3559 }
3560 #if (HW_DESIGN_3D_VER == 1)
3561 else if(IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
3562 {
3563 MS_U16 u16VactVideo = 0;
3564 MS_U16 u16VactSpace = 0;
3565 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31);
3566 *pu16V_SizeAfterPreScaling = (*pu16V_SizeAfterPreScaling - u16VactSpace) / 2;
3567 *pu16Ratio *= 2;
3568 }
3569 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
3570 {
3571 *pu16DNROffset = ((*pu16DNROffset / 2) + OFFSET_PIXEL_ALIGNMENT - 1) & ~(OFFSET_PIXEL_ALIGNMENT-1);
3572 *pu16Ratio *= 2;
3573 }
3574 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
3575 {
3576 *pu16V_SizeAfterPreScaling /= 2;
3577 *pu16Ratio *= 2;
3578 }
3579 #endif
3580 #endif
3581 }
3582
MDrv_SC_3D_AdjustMirrorCrop(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)3583 void MDrv_SC_3D_AdjustMirrorCrop(void *pInstance, XC_InternalStatus *pSrcInfo,SCALER_WIN eWindow)
3584 {
3585 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3586 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3587 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3588 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3589 #ifndef DISABLE_3D_FUNCTION
3590 #if (HW_DESIGN_3D_VER >= 1)
3591 if(IS_INPUT_TOP_BOTTOM(eWindow)
3592 || IS_INPUT_FRAME_PACKING(eWindow)
3593 || IS_INPUT_FRAME_ALTERNATIVE(eWindow)
3594 || IS_INPUT_LINE_ALTERNATIVE(eWindow))
3595 {
3596 //app set overscan'value that is L crop value,but L and R is two crop'value.
3597 gSrcInfo[eWindow].ScaledCropWin.y = gSrcInfo[eWindow].ScaledCropWin.y * 2;
3598 }
3599 if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3600 || IS_INPUT_CHECK_BOARD(eWindow)
3601 || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3602 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
3603 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
3604 || IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
3605 {
3606 gSrcInfo[eWindow].ScaledCropWin.x =gSrcInfo[eWindow].ScaledCropWin.x * 2;
3607 }
3608 #endif
3609 #endif
3610 if( pSrcInfo->u16H_SizeAfterPreScaling > (gSrcInfo[eWindow].ScaledCropWin.x + gSrcInfo[eWindow].ScaledCropWin.width) )
3611 {
3612 gSrcInfo[eWindow].ScaledCropWin.x = pSrcInfo->u16H_SizeAfterPreScaling - (gSrcInfo[eWindow].ScaledCropWin.x + gSrcInfo[eWindow].ScaledCropWin.width);
3613 // select nearest even number
3614 }
3615 else
3616 {
3617 gSrcInfo[eWindow].ScaledCropWin.x = 0;
3618 if(gSrcInfo[eWindow].ScaledCropWin.width > pSrcInfo->u16H_SizeAfterPreScaling)
3619 {
3620 gSrcInfo[eWindow].ScaledCropWin.width = pSrcInfo->u16H_SizeAfterPreScaling;
3621 }
3622 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Scaled crop[2.a] Force x=%u, width=%u\n",gSrcInfo[eWindow].ScaledCropWin.x, gSrcInfo[eWindow].ScaledCropWin.width);
3623 }
3624
3625 // for interlace, keep y in multiple of 2
3626 if( pSrcInfo->u16V_SizeAfterPreScaling > (gSrcInfo[eWindow].ScaledCropWin.y + gSrcInfo[eWindow].ScaledCropWin.height) )
3627 {
3628 #if SUPPORT_SEAMLESS_ZAPPING
3629 if( gSrcInfo[eWindow].bInterlace || Hal_SC_IsPX2MemFormat(pInstance, eWindow))
3630 #elif (HW_DESIGN_4K2K_VER == 4)
3631 if(gSrcInfo[eWindow].bInterlace
3632 &&
3633 (((psXCInstPri->u32DeviceID == 0) && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE))
3634 ||(psXCInstPri->u32DeviceID == 1)))
3635 #else
3636 if(gSrcInfo[eWindow].bInterlace )
3637 #endif
3638 {
3639 gSrcInfo[eWindow].ScaledCropWin.y = (pSrcInfo->u16V_SizeAfterPreScaling - (gSrcInfo[eWindow].ScaledCropWin.y + gSrcInfo[eWindow].ScaledCropWin.height) + 1) & ~0x1;
3640 }
3641 else
3642 {
3643 gSrcInfo[eWindow].ScaledCropWin.y = (pSrcInfo->u16V_SizeAfterPreScaling - (gSrcInfo[eWindow].ScaledCropWin.y + gSrcInfo[eWindow].ScaledCropWin.height));
3644 }
3645 }
3646 else
3647 {
3648 gSrcInfo[eWindow].ScaledCropWin.y = 0;
3649 if(gSrcInfo[eWindow].ScaledCropWin.height > pSrcInfo->u16V_SizeAfterPreScaling)
3650 {
3651 gSrcInfo[eWindow].ScaledCropWin.height = pSrcInfo->u16V_SizeAfterPreScaling;
3652 }
3653 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Scaled crop[2.b] Force y=%u, height=%u\n",gSrcInfo[eWindow].ScaledCropWin.y, gSrcInfo[eWindow].ScaledCropWin.height);
3654 }
3655 #ifndef DISABLE_3D_FUNCTION
3656 #if (HW_DESIGN_3D_VER >= 1)
3657 if(IS_INPUT_TOP_BOTTOM(eWindow)
3658 || IS_INPUT_FRAME_PACKING(eWindow)
3659 || IS_INPUT_FRAME_ALTERNATIVE(eWindow)
3660 || IS_INPUT_LINE_ALTERNATIVE(eWindow))
3661 {
3662 gSrcInfo[eWindow].ScaledCropWin.y /= 2;
3663 }
3664 if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3665 || IS_INPUT_CHECK_BOARD(eWindow)
3666 || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3667 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
3668 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
3669 || IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
3670 {
3671 gSrcInfo[eWindow].ScaledCropWin.x /= 2;
3672 }
3673 #endif
3674 #endif
3675 }
3676
3677 // In Side by Side input case, DNROffset will be divided into half.
MDrv_SC_3D_Adjust_DNROffset(void * pInstance,MS_U16 * pu16DNROffsetTemp,MS_U16 * pu16DNROffset,SCALER_WIN eWindow)3678 void MDrv_SC_3D_Adjust_DNROffset(void *pInstance, MS_U16 *pu16DNROffsetTemp,MS_U16 *pu16DNROffset, SCALER_WIN eWindow)
3679 {
3680 MS_ASSERT(eWindow < MAX_WINDOW);
3681
3682 if(eWindow == MAX_WINDOW)
3683 {
3684 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3685 return;
3686 }
3687 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3688 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3689 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3690 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3691 #if (HW_DESIGN_3D_VER >= 2)
3692 if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3693 || IS_INPUT_CHECK_BOARD(eWindow)
3694 || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3695 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
3696 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
3697 || IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
3698 {
3699 *pu16DNROffsetTemp = ((*pu16DNROffsetTemp / 2) + OFFSET_PIXEL_ALIGNMENT - 1) & ~(OFFSET_PIXEL_ALIGNMENT-1);
3700 *pu16DNROffset = *pu16DNROffsetTemp*2;
3701 //In Side by Side input case, main and sub set alignment in same way.But in different
3702 //timing, alignment is different.
3703 //If we just care DNROffset's alignment.HW will set main DNROffset/2 and sub DNROffset/2,
3704 //maybe main's DNROffset isn't alignment.
3705 //eg. 800x600 case:
3706 //if we don't do *pu16DNROffset = *pu16DNROffsetTemp*2.DNROffset is 800,
3707 //HW will give main 400 and sub 400.
3708 //But DNROffsetTemp is 416,so it was croped 16*cropwin.y .
3709 }
3710 #endif
3711 }
3712
3713 // In Side by Side input case, pixelOffset will be divided into half.
MDrv_SC_3D_Adjust_PixelOffset(void * pInstance,XC_InternalStatus * pSrcInfo,MS_PHY * pu32FRCM_RPixelOffset,MS_U16 * pu16FRCM_ROffset,MS_U16 * pu16FRCM_ROffset3D,MS_BOOL bLeftSide,SCALER_WIN eWindow)3714 void MDrv_SC_3D_Adjust_PixelOffset(void *pInstance, XC_InternalStatus *pSrcInfo,MS_PHY *pu32FRCM_RPixelOffset,MS_U16 *pu16FRCM_ROffset,MS_U16 *pu16FRCM_ROffset3D, MS_BOOL bLeftSide, SCALER_WIN eWindow)
3715 {
3716 MS_ASSERT(eWindow < MAX_WINDOW);
3717
3718 if(eWindow == MAX_WINDOW)
3719 {
3720 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3721 return;
3722 }
3723 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3724 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3725 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3726 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3727
3728 #ifdef UFO_XC_SUPPORT_DUAL_MIU
3729 MS_U16 u16Offset = pSrcInfo->u16H_SizeAfterPreScaling;
3730 MS_U32 u32LeftFactor = pSrcInfo->Status2.stMiuDualModCfg.u32LeftFactor;
3731 MS_U32 u32RightFactor = pSrcInfo->Status2.stMiuDualModCfg.u32RightFactor;
3732 if (IsEnableDualMode(eWindow))
3733 {
3734 if (IsHMirrorMode(eWindow))
3735 {
3736 u16Offset = u16Offset*u32RightFactor /(u32RightFactor + u32LeftFactor);
3737 u16Offset = (u16Offset + (OFFSET_PIXEL_ALIGNMENT*2 - 1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 - 1);
3738 if (bLeftSide == TRUE)
3739 {
3740 u16Offset = pSrcInfo->u16H_SizeAfterPreScaling - u16Offset;
3741 }
3742 }
3743 else
3744 {
3745 u16Offset = u16Offset*u32LeftFactor /(u32RightFactor + u32LeftFactor);
3746 u16Offset = (u16Offset + (OFFSET_PIXEL_ALIGNMENT*2 - 1)) & ~(OFFSET_PIXEL_ALIGNMENT*2 - 1);
3747 if (bLeftSide == FALSE)
3748 {
3749 u16Offset = pSrcInfo->u16H_SizeAfterPreScaling - u16Offset;
3750 }
3751 }
3752 }
3753 #endif
3754
3755 #if (HW_DESIGN_3D_VER >= 2)
3756 if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3757 || IS_INPUT_CHECK_BOARD(eWindow)
3758 || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3759 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
3760 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
3761 || IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
3762 {
3763 #ifdef UFO_XC_SUPPORT_DUAL_MIU
3764 if (IsEnableDualMode(eWindow))
3765 {
3766 *pu32FRCM_RPixelOffset += (*pu16FRCM_ROffset3D - u16Offset/2);
3767 }
3768 else
3769 #endif
3770 {
3771 if (Hal_SC_get_pre_align_pixel(pInstance, eWindow)== TRUE)
3772 {
3773
3774 *pu32FRCM_RPixelOffset += (gSrcInfo[eWindow].u16IPMFetch - pSrcInfo->u16H_SizeAfterPreScaling)/2;
3775 }
3776 else // disable pre-align
3777 {
3778 *pu32FRCM_RPixelOffset += (*pu16FRCM_ROffset3D - pSrcInfo->u16H_SizeAfterPreScaling/2);
3779 }
3780 }
3781 }
3782 else
3783 {
3784 #ifdef UFO_XC_SUPPORT_DUAL_MIU
3785 if (IsEnableDualMode(eWindow))
3786 {
3787 *pu32FRCM_RPixelOffset += (*pu16FRCM_ROffset3D - u16Offset);
3788 }
3789 else
3790 #endif
3791 {
3792 if (Hal_SC_get_pre_align_pixel(pInstance, eWindow)== TRUE)
3793 {
3794 *pu32FRCM_RPixelOffset += (gSrcInfo[eWindow].u16IPMFetch - pSrcInfo->u16H_SizeAfterPreScaling);
3795 }
3796 else // disable pre-align
3797 {
3798 *pu32FRCM_RPixelOffset += (*pu16FRCM_ROffset - pSrcInfo->u16H_SizeAfterPreScaling);
3799 }
3800 }
3801 }
3802 #endif
3803 }
3804 // In Side by Side input case,main and sub's Cropwinwidth are 1/2;
MDrv_SC_3D_Adjust_CropWinWidth(void * pInstance,MS_U16 * pu16CropWinWidth,SCALER_WIN eWindow)3805 void MDrv_SC_3D_Adjust_CropWinWidth(void *pInstance, MS_U16 *pu16CropWinWidth,SCALER_WIN eWindow)
3806 {
3807 MS_ASSERT(eWindow < MAX_WINDOW);
3808
3809 if(eWindow == MAX_WINDOW)
3810 {
3811 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3812 return;
3813 }
3814 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3815 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3816 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3817 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3818 #if (HW_DESIGN_3D_VER >= 2)
3819 if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3820 || IS_INPUT_CHECK_BOARD(eWindow)
3821 || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3822 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
3823 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
3824 || IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
3825 {
3826 *pu16CropWinWidth /= 2;
3827 if((*pu16CropWinWidth & 0x1)!= 0)
3828 {
3829 *pu16CropWinWidth = (*pu16CropWinWidth+1)& ~1;
3830 }
3831 }
3832 #endif
3833 }
3834
3835 // In Side by Side input case,main and sub's Fetch are 1/2;
MDrv_SC_3D_Adjust_DualOPMFetch(void * pInstance,MS_U16 * pu16Fetch,SCALER_WIN eWindow)3836 void MDrv_SC_3D_Adjust_DualOPMFetch(void *pInstance, MS_U16 *pu16Fetch,SCALER_WIN eWindow)
3837 {
3838 MS_ASSERT(eWindow < MAX_WINDOW);
3839
3840 if(eWindow == MAX_WINDOW)
3841 {
3842 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3843 return;
3844 }
3845 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3846 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3847 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3848 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3849 #if (HW_DESIGN_3D_VER >= 2)
3850 if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3851 || IS_INPUT_CHECK_BOARD(eWindow)
3852 || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3853 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
3854 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
3855 || IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
3856 {
3857 *pu16Fetch /= 2;
3858 if((*pu16Fetch & 0x1)!= 0)
3859 {
3860 *pu16Fetch = (*pu16Fetch+1)& ~1;
3861 }
3862 }
3863 #endif
3864 }
3865
3866
3867 // If 3d is enable for (HW_DESIGN_3D_VER >= 2),
3868 // mem unit will split into L and R, so bytesPerPixel should be doubled.
MDrv_SC_3D_Adjust_BytesPer2Pixel(void * pInstance,MS_U8 * u8BytesPer2PixelTemp,SCALER_WIN eWindow)3869 void MDrv_SC_3D_Adjust_BytesPer2Pixel(void *pInstance, MS_U8 *u8BytesPer2PixelTemp,SCALER_WIN eWindow)
3870 {
3871 MS_ASSERT(eWindow < MAX_WINDOW);
3872
3873 if(eWindow == MAX_WINDOW)
3874 {
3875 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
3876 return;
3877 }
3878 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3879 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3880 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3881 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3882 #if (HW_DESIGN_3D_VER >= 2)
3883 //if REG_SC_BK12_30_L bit0 is enabled, we should add into this case.
3884 if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
3885 || IS_INPUT_SIDE_BY_SIDE_FULL(eWindow)
3886 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow)
3887 || IS_INPUT_CHECK_BOARD(eWindow)
3888 || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
3889 || IS_INPUT_TOP_BOTTOM(eWindow)
3890 || IS_INPUT_FRAME_PACKING(eWindow)
3891 || IS_INPUT_FRAME_ALTERNATIVE(eWindow)
3892 || IS_INPUT_LINE_ALTERNATIVE(eWindow)
3893 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow))
3894 {
3895 *u8BytesPer2PixelTemp *= 2;
3896 }
3897
3898 #endif
3899
3900 }
3901
MDrv_SC_3D_Is_LR_Sbs2Line(void * pInstance)3902 MS_BOOL MDrv_SC_3D_Is_LR_Sbs2Line(void *pInstance)
3903 {
3904 MS_BOOL bSbs2Line = FALSE;
3905 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3906 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3907 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3908 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3909 bSbs2Line = Hal_SC_3D_Is_LR_Sbs2Line(pInstance);
3910 if(bSbs2Line != pXCResourcePrivate->stdrvXC_3D._bIsLR_Sbs2Line)
3911 {
3912 printf("[%s,%5d] Attention: the variable _bIsLR_Sbs2Line(%u) is different from reg's value(%u)",
3913 __FUNCTION__,__LINE__, pXCResourcePrivate->stdrvXC_3D._bIsLR_Sbs2Line, bSbs2Line);
3914 }
3915 return bSbs2Line;
3916 }
3917
MDrv_SC_3D_IsSupportFBL3D()3918 MS_BOOL MDrv_SC_3D_IsSupportFBL3D()
3919 {
3920 return HW_3D_SUPPORT_FBL;
3921 }
3922 #endif
MApi_SC_3D_Is_Skip_Default_LR_Flag_U2(void * pInstance)3923 MS_BOOL MApi_SC_3D_Is_Skip_Default_LR_Flag_U2(void* pInstance)
3924 {
3925 MS_BOOL bReturn = FALSE;
3926 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3927 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3928 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3929
3930 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
3931 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3932 #ifndef DISABLE_3D_FUNCTION
3933 bReturn = pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag;
3934 #else
3935 bReturn = FALSE;
3936 #endif
3937 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
3938 return bReturn;
3939 }
3940
MApi_SC_3D_Is_Skip_Default_LR_Flag(void)3941 MS_BOOL MApi_SC_3D_Is_Skip_Default_LR_Flag(void)
3942 {
3943 if (pu32XCInst == NULL)
3944 {
3945 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
3946 return FALSE;
3947 }
3948
3949 stXC_CHECK_3D_SKIP_DEFAULT_LR_FLAG XCArgs;
3950 XCArgs.bReturnValue = FALSE;
3951
3952 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_3D_SKIP_DEFAULT_LR_FLAG, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
3953 {
3954 printf("Obtain XC engine fail\n");
3955 return FALSE;
3956 }
3957 else
3958 {
3959 return XCArgs.bReturnValue;
3960 }
3961 }
3962
3963
MApi_XC_3D_Enable_Skip_Default_LR_Flag_U2(void * pInstance,MS_BOOL bEnable)3964 MS_BOOL MApi_XC_3D_Enable_Skip_Default_LR_Flag_U2(void* pInstance, MS_BOOL bEnable)
3965 {
3966 MS_BOOL bReturn = FALSE;
3967 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3968 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3969 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3970
3971 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
3972 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3973 #ifndef DISABLE_3D_FUNCTION
3974 pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag = bEnable;
3975 bReturn = TRUE;
3976 #else
3977 UNUSED(bEnable);
3978 bReturn = FALSE;
3979 #endif
3980 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
3981 return bReturn;
3982 }
3983
MApi_XC_3D_Enable_Skip_Default_LR_Flag(MS_BOOL bEnable)3984 MS_BOOL MApi_XC_3D_Enable_Skip_Default_LR_Flag(MS_BOOL bEnable)
3985 {
3986 if (pu32XCInst == NULL)
3987 {
3988 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
3989 return FALSE;
3990 }
3991
3992 stXC_SET_3D_SKIP_DEFAULT_LR_FLAG XCArgs;
3993 XCArgs.bEnable = bEnable;
3994 XCArgs.bReturnValue = FALSE;
3995
3996 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_SKIP_DEFAULT_LR_FLAG, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
3997 {
3998 printf("Obtain XC engine fail\n");
3999 return FALSE;
4000 }
4001 else
4002 {
4003 return XCArgs.bReturnValue;
4004 }
4005 }
4006
4007 #ifndef DISABLE_3D_FUNCTION
4008 //------------------------------------------------------------------------------
4009 //--------HW 2D to 3D CPU Depth Refine Part Begin-------------------------------
4010 //------------------------------------------------------------------------------
4011 //------------------------------------------------------------------------------
4012 // the following part codes is copied from ursa5
4013 #if HW_2DTO3D_SUPPORT
4014 #define PIXELNUMOFBLOCK 32
4015 #define MAXFRAME_3DDETECT_COMPATIBLE 64
4016 #define MAXFRAME_3DDETECT 80
4017 #define PERCENTAGE_3DDETECT 88
4018 #define DRBYTENUM 64
4019 #define DDBYTENUM 32
4020 #define MAXVALUE 255
4021
4022 static void _MDrv_SC_3D_2DTo3D_DepthRefine(SC_INT_SRC eIntNum, void *pParam);
4023
4024 #if (HW_2DTO3D_VER < 3) //old 2d to 3d architecture
4025
4026 #define NBLK_H ((MIN(gSrcInfo[MAIN_WINDOW].stDispWin.width, 1920) + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //60 for full hd panel, 43 for sd panel
4027 #define NBLK_V ((MIN(gSrcInfo[MAIN_WINDOW].stDispWin.height, 1080) + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //34 for full hd panel, 24 for sd panel
4028
minmax(MS_U32 u32X,MS_U32 u32Min,MS_U32 u32Max)4029 static MS_U32 minmax(MS_U32 u32X, MS_U32 u32Min, MS_U32 u32Max)
4030 {
4031 return (u32X <= u32Min) ? u32Min :
4032 (u32X >= u32Max) ? u32Max : u32X;
4033 }
4034
max(MS_U32 u32A,MS_U32 u32B)4035 static MS_U32 max(MS_U32 u32A, MS_U32 u32B)
4036 {
4037 return (u32A <= u32B) ? u32B : u32A;
4038 }
4039
min(MS_U32 u32A,MS_U32 u32B)4040 static MS_U32 min(MS_U32 u32A, MS_U32 u32B)
4041 {
4042 return (u32A <= u32B) ? u32A : u32B;
4043 }
4044
absdiff(MS_S32 a,MS_S32 b)4045 static MS_U32 absdiff(MS_S32 a, MS_S32 b)
4046 {
4047 return abs(a - b);
4048 }
4049
slope_gen(void * pInstance,MS_U8 i,MS_U8 u8Slope,MS_U8 u8Element,MS_U8 u8ModSel,MS_U8 u8Motion)4050 static MS_U32 slope_gen(void *pInstance, MS_U8 i,
4051 MS_U8 u8Slope,
4052 MS_U8 u8Element,
4053 MS_U8 u8ModSel,
4054 MS_U8 u8Motion)
4055 {
4056 MS_U32 u32Rnd = 1;
4057 MS_U32 u32Tmp = (MS_U32)i * u8Slope;
4058 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4059 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4060 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4061 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4062 if (IsVMirrorMode(MAIN_WINDOW))
4063 {
4064 u32Tmp = (MS_U32)(VBLOCKNUM - 1 - i) * u8Slope;
4065 }
4066
4067 if(u8Motion != 0)
4068 {
4069 u32Rnd = (u8ModSel == 0) ? u8Element >> 4:
4070 (u8ModSel == 1) ? u8Element >> 3:
4071 (u8ModSel == 2) ? u8Element >> 2:
4072 u8Element >> 1;
4073 u32Tmp = u32Tmp + u32Rnd;
4074 u32Tmp = (u32Tmp > MAXVALUE) ? MAXVALUE : u32Tmp;
4075 }
4076 return u32Tmp;
4077 }
4078
remap(void * pInstance,MS_U8 u8Cls,MS_U8 u8BlkHght,MS_U8 u8BlkWdth,MS_U8 i,MS_U8 j,MS_U8 u8NrmlEn)4079 static MS_U8 remap(void *pInstance, MS_U8 u8Cls,
4080 MS_U8 u8BlkHght,
4081 MS_U8 u8BlkWdth,
4082 MS_U8 i,
4083 MS_U8 j,
4084 MS_U8 u8NrmlEn)//i: block line number, j: block idx
4085 {
4086 MS_U32 u32Idx = 0;
4087 MS_U8 u8Shift = 0;
4088 MS_U32 u32MapIdx = 0;
4089 MS_U8 u8Result = 0;
4090 MS_U8 u8Bln_u = 0;
4091 MS_U8 u8Bln_d = 0;
4092 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4093 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4094 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4095 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4096 if(pXCResourcePrivate->stdrvXC_3D.s_u8flg == 0)
4097 {
4098 MS_U16 u16TotalBlock = HBLOCKNUM * VBLOCKNUM;
4099 for(u32Idx = 0; u32Idx < MAXINDEX; u32Idx++)
4100 {
4101 pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCurArray[u32Idx] = 0;
4102 pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBseArray[u32Idx] = 0;
4103 }
4104 for(u32Idx = 0; u32Idx < u16TotalBlock; u32Idx++)
4105 {
4106 pXCResourcePrivate->stdrvXC_3D._u8RemapLpfArray[u32Idx] = 0;
4107 }
4108 pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCurSum = 0;
4109 pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBseSum = 0;
4110 pXCResourcePrivate->stdrvXC_3D.s_u8flg = 1;
4111 }
4112 pXCResourcePrivate->stdrvXC_3D.s_u8Ptr = pXCResourcePrivate->stdrvXC_3D.s_u8Ptr + 1;
4113 u8Shift = (i == 5) ? u8BlkWdth-1 :
4114 (i == 6) ? u8BlkWdth-2 :
4115 (i == 7) ? u8BlkWdth-3 :
4116 (i >= 8) ? u8BlkWdth-4 : 0;
4117
4118 u32MapIdx = i * u8BlkWdth + ( (j + u8Shift) % u8BlkWdth );
4119 u8Result = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u8Cls][u32MapIdx];
4120
4121 // noise reduction start
4122 if(i == 0 && j == 0)
4123 {
4124 pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCur = pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCur / ((u8BlkHght - 1) * u8BlkWdth);
4125 pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBse = pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBse / u8BlkWdth;
4126 pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCurSum = pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCurSum
4127 + pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCur
4128 - pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCurArray[pXCResourcePrivate->stdrvXC_3D.s_u8Ptr];
4129 pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCurArray[pXCResourcePrivate->stdrvXC_3D.s_u8Ptr] = pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCur;
4130 pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBseSum = pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBseSum
4131 + pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBse
4132 - pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBseArray[pXCResourcePrivate->stdrvXC_3D.s_u8Ptr];
4133 pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBseArray[pXCResourcePrivate->stdrvXC_3D.s_u8Ptr] = pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBse;
4134 pXCResourcePrivate->stdrvXC_3D._u8RemapAvgBias = (MS_U8)( (pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCurSum >> 8)
4135 - (pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBseSum >> 8));
4136 }
4137
4138 pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCur = (i == 1 && j == 0) ? u8Result :
4139 (i != 0) ? pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCur + (MS_U32)u8Result : pXCResourcePrivate->stdrvXC_3D._u32RemapAvgCur;
4140
4141 pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBse = (i == 0 && j == 0) ? u8Result :
4142 (i == 0) ? pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBse + (MS_U32)u8Result : pXCResourcePrivate->stdrvXC_3D._u32RemapAvgBse;
4143
4144 u8Result = ((u8NrmlEn & 0x02) == 2) ? pXCResourcePrivate->stdrvXC_3D._u8RemapAvgBias :
4145 ( (u8NrmlEn & 0x01) == 1 && i != 0) ? u8Result - pXCResourcePrivate->stdrvXC_3D._u8RemapAvgBias : u8Result;
4146
4147 pXCResourcePrivate->stdrvXC_3D._u8RemapLpfArray[i * u8BlkWdth + j] = u8Result;
4148 u8Bln_u = (i == 0) ? 0 : i - 1;
4149 u8Bln_d = (i == u8BlkHght - 1) ? u8BlkHght - 1 : i + 1;
4150 u8Bln_u = pXCResourcePrivate->stdrvXC_3D._u8RemapLpfArray[u8Bln_u * u8BlkWdth + j];
4151 u8Bln_d = pXCResourcePrivate->stdrvXC_3D._u8RemapLpfArray[u8Bln_d * u8BlkWdth + j];
4152
4153 u8Result = ( (u8NrmlEn & 0x04) == 4) ? ((u8Bln_u + (u8Result << 1) + u8Bln_d) >> 2 ) : u8Result;
4154 // noise reduction end
4155
4156 return u8Result;
4157 }
4158
lpf3x3(void * pInstance,MS_U32 u32YY,MS_U32 u32XX,MS_U32 u32Index)4159 static MS_U32 lpf3x3(void *pInstance, MS_U32 u32YY, MS_U32 u32XX, MS_U32 u32Index)
4160 {
4161 MS_U32 d_r = 0, d_l = 0, d_c = 0;
4162 MS_U32 u_r = 0, u_l = 0, u_c = 0;
4163 MS_U32 c_r = 0, c_l = 0, c_c = 0;
4164 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4165 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4166 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4167 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4168 c_l = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][u32YY * HBLOCKNUM + u32XX - 1];
4169 c_c = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][u32YY * HBLOCKNUM + u32XX];
4170 c_r = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][u32YY * HBLOCKNUM + u32XX + 1];
4171 u_l = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][(u32YY - 1) * HBLOCKNUM + u32XX - 1];
4172 u_c = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][(u32YY - 1) * HBLOCKNUM + u32XX];
4173 u_r = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][(u32YY - 1) * HBLOCKNUM + u32XX + 1];
4174 d_l = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][(u32YY + 1) * HBLOCKNUM + u32XX - 1];
4175 d_c = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][(u32YY + 1) * HBLOCKNUM + u32XX];
4176 d_r = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[u32Index][(u32YY + 1) * HBLOCKNUM + u32XX + 1];
4177
4178 c_l = (u32XX == 0) ? c_c : c_l;
4179 c_r = (u32XX == HBLOCKNUM - 1) ? c_c : c_r;
4180 u_l = ((u32YY == 0) || (u32XX == 0)) ? c_c : u_l;
4181 u_r = ((u32YY == 0) || (u32XX == HBLOCKNUM - 1)) ? c_c : u_r;
4182 u_c = (u32YY == 0) ? c_c : u_c;
4183 d_l = ((u32YY == VBLOCKNUM - 1) || (u32XX == 0)) ? c_c : d_l;
4184 d_r = ((u32YY == VBLOCKNUM - 1) || (u32XX == HBLOCKNUM - 1)) ? c_c : d_r;
4185 d_c = (u32YY == VBLOCKNUM - 1) ? c_c : d_c;
4186 c_c = (u_r + u_c + u_l +
4187 c_r + c_c + c_l +
4188 d_r + d_c + d_l) >> 4;
4189
4190 return c_c;
4191 }
4192
4193 #if 0
4194 static MS_U32 yslp_func(MS_U32 u32VDirEn,
4195 MS_U32 u32VDirPn,
4196 MS_U32 u32VDirStrd,
4197 MS_U32 u32BuildFlag,
4198 MS_U32 u32YAxis,
4199 MS_U32 u32Result)
4200 {
4201 MS_U32 u32Slope = (u32VDirPn) ? (VBLOCKNUM - u32YAxis) : u32YAxis;
4202 MS_U32 u32YResult = (u32BuildFlag) ? u32Result : (u32Slope * u32VDirStrd + ( u32Result - 128 ) / 4 );
4203 return u32Result = (u32VDirEn) ? u32YResult : u32Result;
4204 }
4205
4206 static MS_U32 vlpf1x3(MS_U32 u32YY, MS_U32 u32XX, MS_U32 u32Index, MS_U32 u32FltrEn)
4207 {
4208 MS_U32 d_c = 0;
4209 MS_U32 u_c = 0;
4210 MS_U32 c_c = 0;
4211
4212 c_c = _u8FieldArray[u32Index][u32YY * HBLOCKNUM + u32XX];
4213 u_c = _u8FieldArray[u32Index][(u32YY - 1) * HBLOCKNUM + u32XX];
4214 d_c = _u8FieldArray[u32Index][(u32YY + 1) * HBLOCKNUM + u32XX];
4215
4216 if(u32FltrEn)
4217 {
4218 u_c = (u32YY == 0)?c_c:u_c;
4219 d_c = (u32YY == 33)?c_c:d_c;
4220 c_c = (u_c + (c_c << 1) + d_c) >> 2;
4221 }
4222 return c_c;
4223 }
4224 #endif
4225
4226 #define NBLK_PITCH 60 //pitch block for 2d to 3d hw engine
4227 #define COEF (100 * (NBLK_H / 2 - 4) * (NBLK_V - 4) / ((HBLOCKNUM / 2 - 4) * (VBLOCKNUM - 4))) //derived from full hd panel
4228
_MDrv_SC_3D_SourceDetection(void * pInstance)4229 static void _MDrv_SC_3D_SourceDetection(void *pInstance)
4230 {
4231 MS_U16 i = 0, j = 0;
4232 MS_U16 u16C_Index = 0;
4233 MS_U8 u8Detect_Con = 0;
4234 MS_U8 u8Diff_Th = 8;
4235 MS_U8 u8Reg_A = 0;
4236 MS_U8 u8Reg_B1 = 0, u8Reg_B2 = 0, u8Reg_B3 = 0, u8Reg_B4 = 0, u8Reg_B5 = 0;
4237 MS_U8 u8Reg_C1 = 0;
4238 MS_U8 u8Diff_Frame = 0;
4239 MS_U16 u16Sum_Tb = 0;
4240 MS_U16 u16Sum_Ss = 0;
4241 MS_U16 u16Sum_Ss_Mir = 0;
4242 MS_U16 u16Sum_Tb_1 = 0;
4243 MS_U16 u16Sum_Tb_2 = 0;
4244 MS_U16 u16Sum_Tb_3 = 0;
4245 MS_U16 u16Sum_Tb_4 = 0;
4246 MS_U16 u16Sum_Tb_5 = 0;
4247 MS_U16 u16Sum_Ss_1 = 0;
4248 MS_U16 u16Sum_Ss_2 = 0;
4249 MS_U16 u16Sum_Ss_3 = 0;
4250 MS_U16 u16Sum_Ss_4 = 0;
4251 MS_U16 u16Sum_Ss_5 = 0;
4252 MS_U16 u16Diff_Ss = 0;
4253 MS_U16 u16HBlockShift = 0;
4254 MS_U16 u16VBlockShift = 0;
4255 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4256 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4257 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4258 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4259 if(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.bEnableOverscan)
4260 {
4261 if(gSrcInfo[MAIN_WINDOW].u16HCusScalingSrc > 0)
4262 {
4263 u16HBlockShift = (MS_U32)gSrcInfo[MAIN_WINDOW].ScaledCropWin.x
4264 * gSrcInfo[MAIN_WINDOW].u16HCusScalingDst
4265 / gSrcInfo[MAIN_WINDOW].u16HCusScalingSrc / PIXELNUMOFBLOCK;
4266 }
4267
4268 if(gSrcInfo[MAIN_WINDOW].u16VCusScalingSrc > 0)
4269 {
4270 u16VBlockShift = (MS_U32)gSrcInfo[MAIN_WINDOW].ScaledCropWin.y
4271 * gSrcInfo[MAIN_WINDOW].u16VCusScalingDst
4272 / gSrcInfo[MAIN_WINDOW].u16VCusScalingSrc / PIXELNUMOFBLOCK;
4273 }
4274 }
4275
4276 if(u16HBlockShift > 2)
4277 {
4278 u16HBlockShift = 2;
4279 }
4280
4281 if(u16VBlockShift > 2)
4282 {
4283 u16VBlockShift = 2;
4284 }
4285
4286 if(pXCResourcePrivate->stdrvXC_3D._bResetFrameCount)
4287 {
4288 pXCResourcePrivate->stdrvXC_3D._u16SBSCount = 0;
4289 pXCResourcePrivate->stdrvXC_3D._u16TBCount = 0;
4290 pXCResourcePrivate->stdrvXC_3D._u162DCount = 0;
4291 pXCResourcePrivate->stdrvXC_3D._u16TotalCount = 0;
4292 pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = FALSE;
4293 }
4294
4295 // Detect side by side pattern ================================================
4296 for (i = 2-u16VBlockShift; i < NBLK_V-2-u16VBlockShift; i++)
4297 {
4298 u16Sum_Ss_1 = 0;
4299 u16Sum_Ss_2 = 0;
4300 u16Sum_Ss_3 = 0;
4301 u16Sum_Ss_4 = 0;
4302 u16Sum_Ss_5 = 0;
4303 for (j = 2-u16HBlockShift; j < NBLK_H/2-2-u16HBlockShift; j++)
4304 {
4305 u16C_Index = i*NBLK_PITCH + j;
4306 u8Reg_A = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index];
4307 u8Reg_B1 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + NBLK_H / 2 - 2 + u16HBlockShift];
4308 u8Reg_B2 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + NBLK_H / 2 - 1 + u16HBlockShift];
4309 u8Reg_B3 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + NBLK_H / 2 + u16HBlockShift];
4310 u8Reg_B4 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + NBLK_H / 2 + 1 + u16HBlockShift];
4311 u8Reg_B5 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + NBLK_H / 2 + 2 + u16HBlockShift];
4312 u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B1);
4313
4314 u16Sum_Ss_1 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Ss_1 + 1 : u16Sum_Ss_1;
4315 u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B2);
4316 u16Sum_Ss_2 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Ss_2 + 1 : u16Sum_Ss_2;
4317 u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B3);
4318 u16Sum_Ss_3 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Ss_3 + 1 : u16Sum_Ss_3;
4319 u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B4);
4320 u16Sum_Ss_4 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Ss_4 + 1 : u16Sum_Ss_4;
4321 u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B5);
4322 u16Sum_Ss_5 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Ss_5 + 1 : u16Sum_Ss_5;
4323
4324 if(j < NBLK_H / 2)
4325 {
4326 u16C_Index = i*NBLK_PITCH - j;
4327 u8Reg_C1 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + NBLK_H - 1];
4328 u8Diff_Frame = absdiff( u8Reg_A, u8Reg_C1);
4329 u16Sum_Ss_Mir = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Ss_Mir + 1 : u16Sum_Ss_Mir; // for mirror case
4330 }
4331 }
4332 u16Sum_Ss_1 = min(u16Sum_Ss_1, u16Sum_Ss_2);
4333 u16Sum_Ss_1 = min(u16Sum_Ss_1, u16Sum_Ss_3);
4334 u16Sum_Ss_1 = min(u16Sum_Ss_1, u16Sum_Ss_4);
4335 u16Sum_Ss_1 = min(u16Sum_Ss_1, u16Sum_Ss_5);
4336 u16Sum_Ss = u16Sum_Ss + u16Sum_Ss_1;
4337 }
4338 // ==========================================================================
4339
4340 u16Sum_Ss_1 = 0;
4341 // Detect top down pattern ================================================
4342 for (i = 2-u16VBlockShift; i < NBLK_V/2-2-u16VBlockShift; i++)
4343 {
4344 u16Sum_Tb_1 = 0;
4345 u16Sum_Tb_2 = 0;
4346 u16Sum_Tb_3 = 0;
4347 u16Sum_Tb_4 = 0;
4348 u16Sum_Tb_5 = 0;
4349 for (j = 2-u16HBlockShift; j < NBLK_H-2-u16HBlockShift; j++)
4350 {
4351 u16C_Index = i*NBLK_PITCH + j;
4352 u8Reg_A = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index];
4353 u16C_Index = u16C_Index + NBLK_V / 2 * NBLK_PITCH;
4354 u8Reg_B1 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index - 2 + u16HBlockShift];
4355 u8Reg_B2 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index - 1 + u16HBlockShift];
4356 u8Reg_B3 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + u16HBlockShift];
4357 u8Reg_B4 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + 1 + u16HBlockShift];
4358 u8Reg_B5 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][u16C_Index + 2 + u16HBlockShift];
4359 u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B1);
4360 u16Sum_Tb_1 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Tb_1 + 1 : u16Sum_Tb_1;
4361 u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B2);
4362 u16Sum_Tb_2 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Tb_2 + 1 : u16Sum_Tb_2;
4363 u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B3);
4364 u16Sum_Tb_3 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Tb_3 + 1 : u16Sum_Tb_3;
4365 u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B4);
4366 u16Sum_Tb_4 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Tb_4 + 1 : u16Sum_Tb_4;
4367 u8Diff_Frame = absdiff( u8Reg_A, u8Reg_B5);
4368 u16Sum_Tb_5 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Tb_5 + 1 : u16Sum_Tb_5;
4369
4370 if(i < NBLK_V / 2)
4371 {
4372 u8Reg_C1 = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][(NBLK_V - 1 - i)*NBLK_PITCH + j];
4373 u8Diff_Frame = absdiff( u8Reg_A, u8Reg_C1);
4374 u16Sum_Ss_1 = (u8Diff_Frame > u8Diff_Th) ? u16Sum_Ss_1 + 1 : u16Sum_Ss_1; // for mirror case
4375 }
4376 }
4377 u16Sum_Tb_1 = min(u16Sum_Tb_1, u16Sum_Tb_2);
4378 u16Sum_Tb_1 = min(u16Sum_Tb_1, u16Sum_Tb_3);
4379 u16Sum_Tb_1 = min(u16Sum_Tb_1, u16Sum_Tb_4);
4380 u16Sum_Tb_1 = min(u16Sum_Tb_1, u16Sum_Tb_5);
4381 u16Sum_Tb= u16Sum_Tb + u16Sum_Tb_1;
4382 }
4383 // ==========================================================================
4384
4385 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u16Sum_Tb=%u, u16Sum_Ss=%u, mirror_ss=%u, mirror_tb=%u\n", u16Sum_Tb, u16Sum_Ss, u16Sum_Ss_Mir, u16Sum_Ss_1);
4386
4387 // Make decision
4388 if(absdiff(u16Sum_Tb, u16Sum_Ss)>=100*COEF/100)
4389 {
4390 if((u16Sum_Ss < 50*COEF/100) && ((u16Sum_Ss*8) < u16Sum_Tb))
4391 {
4392 u8Detect_Con = 1; // Source : SS
4393 }
4394 else if((u16Sum_Ss < 100*COEF/100) && ((u16Sum_Ss*3) < u16Sum_Tb))
4395 {
4396 u8Detect_Con = 1; // Source : SS
4397 }
4398 else if((u16Sum_Ss < 150*COEF/100) && ((u16Sum_Ss*12/5) < u16Sum_Tb))
4399 {
4400 u8Detect_Con = 1; // Source : SS
4401 }
4402 else if((u16Sum_Ss < 200*COEF/100) && ((u16Sum_Ss*9/4) < u16Sum_Tb))
4403 {
4404 u8Detect_Con = 1; // Source : SS
4405 }
4406 else if((u16Sum_Ss < 250*COEF/100) && ((u16Sum_Ss*2) < u16Sum_Tb))
4407 {
4408 u8Detect_Con = 1; // Source : SS
4409 }
4410 else if(u16Sum_Ss*2 < u16Sum_Tb)
4411 {
4412 u8Detect_Con = 1; // Source : SS
4413 }
4414 else if((u16Sum_Tb < 50*COEF/100) && ((u16Sum_Tb*8) < u16Sum_Ss))
4415 {
4416 u8Detect_Con = 2; // Source : TB
4417 }
4418 else if((u16Sum_Tb < 100*COEF/100) && ((u16Sum_Tb*3) < u16Sum_Ss))
4419 {
4420 u8Detect_Con = 2; // Source : TB
4421 }
4422 else if((u16Sum_Tb < 150*COEF/100) && ((u16Sum_Tb*9/4) < u16Sum_Ss))
4423 {
4424 u8Detect_Con = 2; // Source : TB
4425 }
4426 else if((u16Sum_Tb < 220*COEF/100) && ((u16Sum_Tb*2) < u16Sum_Ss))
4427 {
4428 u8Detect_Con = 2; // Source : TB
4429 }
4430 else if((u16Sum_Tb < 250*COEF/100) && ((u16Sum_Tb*9/5) < u16Sum_Ss))
4431 {
4432 u8Detect_Con = 2; // Source : TB
4433 }
4434 else if(u16Sum_Tb*2 < u16Sum_Ss)
4435 {
4436 u8Detect_Con = 2; // Source : TB
4437 }
4438 else
4439 {
4440 u8Detect_Con = 3; // Source : 2D
4441 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d 1\n");
4442 }
4443 }
4444 else
4445 {
4446 if((u16Sum_Ss < 50*COEF/100) && ((u16Sum_Ss*8) < u16Sum_Tb))
4447 {
4448 u8Detect_Con = 1; // Source : SS
4449 }
4450 else if((u16Sum_Tb < 50*COEF/100) && ((u16Sum_Tb*8) < u16Sum_Ss))
4451 {
4452 u8Detect_Con = 2; // Source : TB
4453 }
4454 else
4455 {
4456 u8Detect_Con = 3; // Source : 2D
4457 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d 2\n");
4458 }
4459 }
4460
4461 // Correct some wrong decision
4462 u16Diff_Ss = absdiff(u16Sum_Ss, u16Sum_Ss_Mir);
4463
4464 if((u8Detect_Con == 2) && (u16Sum_Ss_1 <= u16Sum_Tb*9/5))
4465 {
4466 u8Detect_Con = 3; // Source : 2D
4467 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d 3\n");
4468 }
4469 else if((u8Detect_Con == 1) && (u16Diff_Ss < 40*COEF/100) && (u16Sum_Ss_Mir < 250*COEF/100))
4470 {
4471 u8Detect_Con = 3; // Source : 2D
4472 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d 4\n");
4473 }
4474 else if((u8Detect_Con==3) && (u16Sum_Ss_Mir > u16Sum_Ss*3/2) && (u16Sum_Ss*3/2 < u16Sum_Tb))
4475 {
4476 u8Detect_Con = 1; // Source : SS
4477 }
4478 else if((u8Detect_Con==3) && (u16Sum_Ss_1 > u16Sum_Tb*3/2) && (u16Sum_Tb*3/2 < u16Sum_Ss))
4479 {
4480 u8Detect_Con = 2; // Source : TB
4481 }
4482
4483 ///frame statistics
4484 pXCResourcePrivate->stdrvXC_3D._u16TotalCount++;
4485 if(u8Detect_Con == 1)
4486 {
4487 pXCResourcePrivate->stdrvXC_3D._u16SBSCount++;
4488 }
4489 else if(u8Detect_Con == 2)
4490 {
4491 pXCResourcePrivate->stdrvXC_3D._u16TBCount++;
4492 }
4493 else if(u8Detect_Con == 3)
4494 {
4495 pXCResourcePrivate->stdrvXC_3D._u162DCount++;
4496 }
4497
4498 if(E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
4499 {
4500 if(pXCResourcePrivate->stdrvXC_3D._u16TotalCount >= MAXFRAME_3DDETECT)
4501 {
4502 pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
4503 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d_cnt=%u,ss_cnt=%u,tb_cnt=%u\n"
4504 , pXCResourcePrivate->stdrvXC_3D._u162DCount
4505 , pXCResourcePrivate->stdrvXC_3D._u16SBSCount
4506 , pXCResourcePrivate->stdrvXC_3D._u16TBCount);
4507 if((pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u16TBCount)
4508 && (pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
4509 {
4510 if(pXCResourcePrivate->stdrvXC_3D._u16SBSCount >= PERCENTAGE_3DDETECT * pXCResourcePrivate->stdrvXC_3D._u16TotalCount / 100)
4511 {
4512 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "side by side\n");
4513 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_SIDE_BY_SIDE_HALF;
4514 MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
4515 }
4516 else
4517 {
4518 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
4519 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
4520 }
4521 }
4522 else if((pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u16SBSCount)
4523 && (pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
4524 {
4525 if(pXCResourcePrivate->stdrvXC_3D._u16TBCount >= PERCENTAGE_3DDETECT * pXCResourcePrivate->stdrvXC_3D._u16TotalCount / 100)
4526 {
4527 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "top bottom\n");
4528 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_TOP_BOTTOM;
4529 MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
4530 }
4531 else
4532 {
4533 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
4534 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
4535 }
4536 }
4537 else
4538 {
4539 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
4540 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
4541 }
4542 }
4543 }
4544 else if(E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
4545 {
4546 if(pXCResourcePrivate->stdrvXC_3D._u16TotalCount >= MAXFRAME_3DDETECT_COMPATIBLE)
4547 {
4548 pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
4549 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d_cnt=%u,ss_cnt=%u,tb_cnt=%u\n"
4550 , pXCResourcePrivate->stdrvXC_3D._u162DCount
4551 , pXCResourcePrivate->stdrvXC_3D._u16SBSCount
4552 , pXCResourcePrivate->stdrvXC_3D._u16TBCount);
4553 if((pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u16TBCount)
4554 && (pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
4555 {
4556 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "side by side\n");
4557 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_SIDE_BY_SIDE_HALF;
4558 }
4559 else if((pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u16SBSCount)
4560 && (pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
4561 {
4562 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "top bottom\n");
4563 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_TOP_BOTTOM;
4564 }
4565 else
4566 {
4567 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
4568 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
4569 }
4570 pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount++;
4571 }
4572 }
4573 }
4574
_MDrv_SC_3D_2DTo3D_Art_Detect(void * pInstance)4575 static MS_U32 _MDrv_SC_3D_2DTo3D_Art_Detect(void* pInstance)
4576 {
4577 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4578 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4579 MS_U32 i = 0;
4580 MS_U32 u32HisgrmArray[16];
4581 MS_U32 u32XStart = 512;
4582 MS_U32 u32XEnd = 1408; //896
4583 MS_U32 u32YStart = 256; //640
4584 MS_U32 u32YEnd = 896;
4585 MS_U32 u32PureColorBlkCnt = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_3D_L); //16bit 3d => 8bit 7a,7b
4586 MS_U32 u32GradLevelBlkCnt = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_3E_L); //16bit 3e => 8bit 7c,7d
4587 MS_U32 u32HighFreqBlkCnt = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_3F_L); //16bit 3f => 8bit 7e,7f
4588 MS_U32 u32HisWeightCur = 0;
4589 MS_U32 u32MinRatio = 0;
4590 MS_U32 u32NonSmallHistogramCnt = 0;
4591 MS_U32 u32NonzeroHistogramCnt = 0;
4592 MS_U32 u32BiggestHistogram = 0;
4593 MS_U32 u32BiggestHistogramIdx = 0;
4594 MS_U32 u32SecondHistogram = 0;
4595 MS_U32 u32SecondHistogramIdx = 0;
4596 MS_U32 u32ThirdHistogram = 0;
4597 MS_U32 u32TempRatio1 = 0;
4598 MS_U32 u32TempRatio2 = 0;
4599 MS_U32 u32ArtWeightCurHF = 0; // HF weight
4600 MS_U32 u32ArtIndex = 0;
4601 MS_U32 u32ArtWeightCurAll = 0;
4602 MS_U32 u32ArtWeightCur = 0;
4603 MS_U32 u32X1 = 0;
4604 MS_U32 u32DBit0 = 0;
4605 MS_U32 u32DBit1 = 0;
4606 MS_U32 u32DBit2 = 0;
4607 MS_U32 u32DBit3 = 0;
4608 MS_U32 u32DitherOut = 0;
4609 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4610 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4611 // read histogram
4612 u32HisgrmArray[0] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_30_L, 0xFF00) >> 8;
4613 u32HisgrmArray[1] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_30_L, 0x00FF);
4614 u32HisgrmArray[2] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_31_L, 0xFF00) >> 8;
4615 u32HisgrmArray[3] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_31_L, 0x00FF);
4616 u32HisgrmArray[4] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_32_L, 0xFF00) >> 8;
4617 u32HisgrmArray[5] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_32_L, 0x00FF);
4618 u32HisgrmArray[6] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_33_L, 0xFF00) >> 8;
4619 u32HisgrmArray[7] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_33_L, 0x00FF);
4620 u32HisgrmArray[8] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_34_L, 0xFF00) >> 8;
4621 u32HisgrmArray[9] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_34_L, 0x00FF);
4622 u32HisgrmArray[10] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_35_L, 0xFF00) >> 8;
4623 u32HisgrmArray[11] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_35_L, 0x00FF);
4624 u32HisgrmArray[12] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_36_L, 0xFF00) >> 8;
4625 u32HisgrmArray[13] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_36_L, 0x00FF);
4626 u32HisgrmArray[14] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_37_L, 0xFF00) >> 8;
4627 u32HisgrmArray[15] = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_37_L, 0x00FF);
4628
4629 //------------- Set Detection Window --------------------------
4630 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_28_L, u32XStart);
4631 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_29_L, u32XEnd);
4632 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_2A_L, u32YStart);
4633 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_2B_L, u32YEnd);
4634
4635 u32X1 = ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x01000000) >> 24) ^ ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x00001000) >> 12);
4636 u32DBit0 = ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x00000008) >> 3) ^ ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x00001000) >> 12); // bit 3 ^ bit 12
4637 u32DBit1 = ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x00000040) >> 6) ^ ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x00040000) >> 18); // bit 6 ^ bit 18
4638 u32DBit2 = ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x01000000) >> 24) ^ ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x40000000) >> 30); // bit 24 ^ bit 30
4639 u32DBit3 = ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x00000200) >> 9) ^ ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x00100000) >> 20); // bit 9 ^ bit 20
4640 u32DitherOut = (u32DBit3 << 3) + (u32DBit2 << 2) + (u32DBit1 << 1) + u32DBit0;
4641
4642 pXCResourcePrivate->stdrvXC_3D._u32X = ((pXCResourcePrivate->stdrvXC_3D._u32X & 0x7fffffff) << 1) + u32X1;
4643
4644 u32HisWeightCur = 0;
4645 u32SecondHistogram = 0;
4646 u32BiggestHistogram = 0;
4647
4648 for(i = 0; i < 16; i++)
4649 {
4650 if(u32HisgrmArray[i] >= 0x3)
4651 {
4652 u32NonSmallHistogramCnt++;
4653 }
4654
4655 if(u32HisgrmArray[i] > 0)
4656 {
4657 u32NonzeroHistogramCnt++;
4658 }
4659
4660 if(u32HisgrmArray[i] == 0x0)
4661 {
4662 u32HisgrmArray[i] = 0x1;
4663 }
4664
4665 if(u32HisgrmArray[i] > u32BiggestHistogram)
4666 {
4667 u32BiggestHistogram = u32HisgrmArray[i];
4668 u32BiggestHistogramIdx = i;
4669 }
4670 }
4671
4672 for(i = 0; i < 16; i++)
4673 {
4674 if(i != u32BiggestHistogramIdx && u32HisgrmArray[i] >= u32SecondHistogram)
4675 {
4676 u32SecondHistogram = u32HisgrmArray[i];
4677 u32SecondHistogramIdx = i;
4678 }
4679 }
4680
4681 for(i = 0; i < 16; i++)
4682 {
4683 if(i != u32BiggestHistogramIdx && i != u32SecondHistogramIdx && u32HisgrmArray[i] >= u32ThirdHistogram)
4684 {
4685 u32ThirdHistogram = u32HisgrmArray[i];
4686 }
4687 }
4688
4689 for(i = 0; i < 16; i++)
4690 {
4691 if(i == 0)
4692 {
4693 u32MinRatio = min(u32HisgrmArray[0] / (u32HisgrmArray[1] + u32HisgrmArray[2]), 8);
4694 if(u32HisgrmArray[0] > 2 * u32HisgrmArray[1])
4695 {
4696 u32HisWeightCur = u32HisWeightCur + min((u32HisgrmArray[0] * u32MinRatio)/64, 8);
4697 }
4698 }
4699 else if (i == 15)
4700 {
4701 u32MinRatio = min(u32HisgrmArray[15] / (u32HisgrmArray[14] + u32HisgrmArray[13]), 8);
4702 if(u32HisgrmArray[15] > 2 * u32HisgrmArray[14])
4703 {
4704 u32HisWeightCur = u32HisWeightCur + min((u32HisgrmArray[15] * u32MinRatio) / 64, 8);
4705 }
4706 }
4707 else
4708 {
4709 u32MinRatio = min((u32HisgrmArray[i] / ((u32HisgrmArray[i + 1]) + (u32HisgrmArray[i - 1]))), 8);
4710 if((u32HisgrmArray[i] > 2 * u32HisgrmArray[i + 1]) && (u32HisgrmArray[i] > 2 * u32HisgrmArray[i - 1]))
4711 {
4712 u32HisWeightCur = u32HisWeightCur + min((u32HisgrmArray[i] * u32MinRatio) / 64, 8);
4713 }
4714 }
4715 }
4716
4717 u32TempRatio1 = (u32BiggestHistogram / (u32SecondHistogram+u32ThirdHistogram + (u32NonzeroHistogramCnt + u32NonSmallHistogramCnt) / 3));
4718 u32TempRatio2 = ((u32BiggestHistogram + u32SecondHistogram)/(u32ThirdHistogram + u32NonzeroHistogramCnt + u32NonSmallHistogramCnt) );
4719
4720 u32TempRatio1 = min(u32TempRatio1, 12);
4721 u32TempRatio2 = min(u32TempRatio2, 8);
4722
4723 if(u32TempRatio1 <= 2)
4724 {
4725 u32TempRatio1 = 0;
4726 }
4727 if(u32TempRatio2 <= 3)
4728 {
4729 u32TempRatio2 = 0;
4730 }
4731
4732 u32HisWeightCur = u32HisWeightCur + u32TempRatio1 + u32TempRatio2;
4733
4734 if((u32BiggestHistogram + u32SecondHistogram + u32ThirdHistogram) * 18000 > u32PureColorBlkCnt * 128 * 4)
4735 {
4736 u32HisWeightCur = u32HisWeightCur / 3;
4737 }
4738 else if((u32BiggestHistogram + u32SecondHistogram + u32ThirdHistogram) * 18000 > u32PureColorBlkCnt * 128 * 3)
4739 {
4740 u32HisWeightCur = u32HisWeightCur / 2;
4741 }
4742 else if((u32BiggestHistogram + u32SecondHistogram + u32ThirdHistogram) * 18000 > u32PureColorBlkCnt * 128 * 2)
4743 {
4744 u32HisWeightCur = u32HisWeightCur * 2 / 3;
4745 }
4746
4747 if(u32HisWeightCur <= 5)
4748 {
4749 u32HisWeightCur = 0;
4750 }
4751
4752 u32HisWeightCur = min(u32HisWeightCur, 15);
4753
4754 pXCResourcePrivate->stdrvXC_3D._u32HisWeight = (u32HisWeightCur * 1 + pXCResourcePrivate->stdrvXC_3D._u32HisWeight * 15 + u32DitherOut) / 16;
4755
4756 pXCResourcePrivate->stdrvXC_3D._u32HisWeight = min(pXCResourcePrivate->stdrvXC_3D._u32HisWeight , 15);
4757
4758 if(u32HighFreqBlkCnt >= 450 )
4759 {
4760 u32ArtWeightCurHF = 15;
4761 }
4762 else if(u32HighFreqBlkCnt > 300 )
4763 {
4764 u32ArtWeightCurHF = 8;
4765 }
4766 else
4767 {
4768 u32ArtWeightCurHF = 0;
4769 }
4770
4771 // All weight
4772 u32ArtIndex = (u32PureColorBlkCnt / 4 * (min(u32HisWeightCur, 8) / 8)) + u32GradLevelBlkCnt;
4773 u32ArtWeightCurAll = 0;
4774 if(u32ArtIndex >= 3500)
4775 {
4776 u32ArtWeightCurAll = 15;
4777 }
4778 else if(u32ArtIndex <= 2600)
4779 {
4780 u32ArtWeightCurAll = 0;
4781 }
4782 else
4783 {
4784 u32ArtWeightCurAll = (u32ArtIndex - 2600) * 15 / 900;
4785 }
4786
4787 u32ArtWeightCur =max(u32ArtWeightCurHF, u32ArtWeightCurAll);
4788 u32ArtWeightCur = min(u32ArtWeightCur, 15);
4789 pXCResourcePrivate->stdrvXC_3D._u32ArtWeight = (u32ArtWeightCur * 1 + pXCResourcePrivate->stdrvXC_3D._u32ArtWeight * 15 + u32DitherOut) / 16;
4790 pXCResourcePrivate->stdrvXC_3D._u32ArtWeight = min(pXCResourcePrivate->stdrvXC_3D._u32ArtWeight, 15);
4791 pXCResourcePrivate->stdrvXC_3D._u32ReturnWeightCur = max(pXCResourcePrivate->stdrvXC_3D._u32HisWeight, pXCResourcePrivate->stdrvXC_3D._u32ArtWeight);
4792 pXCResourcePrivate->stdrvXC_3D._u32ReturnWeightCur = min(pXCResourcePrivate->stdrvXC_3D._u32ReturnWeightCur, 15);
4793 pXCResourcePrivate->stdrvXC_3D._u32ReturnWeight = (pXCResourcePrivate->stdrvXC_3D._u32ReturnWeightCur + pXCResourcePrivate->stdrvXC_3D._u32ReturnWeight * 7 + (u32DitherOut >> 1)) / 8;
4794
4795 return pXCResourcePrivate->stdrvXC_3D._u32ReturnWeight;
4796 }
4797
_MDrv_SC_3D_2DTo3D_DepthRefine(SC_INT_SRC eIntNum,void * pParam)4798 static void _MDrv_SC_3D_2DTo3D_DepthRefine(SC_INT_SRC eIntNum, void *pParam)
4799 {
4800 void *pInstance = pu32XCInst_private;
4801 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4802 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4803 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4804 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4805 MS_U32 i = 0, j = 0;
4806 MS_VIRT u32DDBase = MsOS_PA2KSEG1(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf);
4807 if(0 == u32DDBase)
4808 {
4809 printf("%s :u32DDBase = 0!,error!!!\n", __FUNCTION__);
4810 assert(u32DDBase != 0);
4811 }
4812 MS_VIRT u32DRBase = (MS_U32)MsOS_PA2KSEG1(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf);
4813 if(0 == u32DRBase)
4814 {
4815 printf("%s :u32DRBase = 0!,error!!!\n", __FUNCTION__);
4816 assert(u32DRBase != 0);
4817 }
4818 MS_U8 u8DepthMode = 0;
4819 MS_VIRT u32Base = u32DDBase;
4820 MS_U32 u32ArtWt = 0;
4821 MS_U32 u32NatWt = 0;
4822 MS_U8 u8ArtWt_t = 0;
4823 MS_U8 u8YCtr_Cur = 0;
4824 MS_U8 u8LoopVIndex = VBLOCKNUM;
4825 MS_U8 u8LoopHIndex = HBLOCKNUM;
4826
4827 eIntNum = eIntNum;
4828 pParam = pParam;
4829
4830 if(IS_INPUT_NORMAL_2D_HW(MAIN_WINDOW))
4831 {
4832 if(pXCResourcePrivate->stdrvXC_3D.bFirstFlag) //initial
4833 {
4834 MS_U16 u16TotalBlock = HBLOCKNUM * VBLOCKNUM;
4835 for(j = 0; j < u16TotalBlock; j++)
4836 {
4837 pXCResourcePrivate->stdrvXC_3D._32YSumArray[j] = 0;
4838 }
4839
4840 for(i = 0; i < MAXINDEX; i++)
4841 {
4842 for(j = 0; j < u16TotalBlock; j++)
4843 {
4844 pXCResourcePrivate->stdrvXC_3D._u8YCtrArray[i][j] = 0;
4845 }
4846 }
4847 }
4848
4849 for(i = 0; i < VBLOCKNUM; i++)
4850 {
4851 for(j = 0; j < HBLOCKNUM; j++)
4852 {
4853 pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YMAX][i * HBLOCKNUM + j] = *((volatile MS_U8*)(( i * HBLOCKNUM * DDBYTENUM + j * DDBYTENUM + YMAXBUFINDEX) + u32Base));//y max
4854 pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YMIN][i * HBLOCKNUM + j] = *((volatile MS_U8*)(( i * HBLOCKNUM * DDBYTENUM + j * DDBYTENUM + YMINBUFINDEX) + u32Base));//y min
4855 pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YCTRS][i * HBLOCKNUM + j] = minmax ((pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YMAX][i * HBLOCKNUM + j] - pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YMIN][i * HBLOCKNUM + j]), 0, MAXVALUE);
4856 #if 0
4857 _u8FieldArray[YAVG][i * HBLOCKNUM + j] = *((volatile MS_U8*)(( i * HBLOCKNUM * DDBYTENUM + j * DDBYTENUM + YAVGBUFINDEX) + u32Base));//y avg
4858 _u8FieldArray[HEDGE][i * HBLOCKNUM + j] = *((volatile MS_U8*)(( i * HBLOCKNUM * DDBYTENUM + j * DDBYTENUM + YHEDGEBUFINDEX) + u32Base));//prog cnt 0
4859 _u8FieldArray[VEDGE][i * HBLOCKNUM + j] = *((volatile MS_U8*)(( i * HBLOCKNUM * DDBYTENUM + j * DDBYTENUM + YVEDGEBUFINDEX) + u32Base));//prog cnt 1
4860 _u8FieldArray[BUILDING][i * HBLOCKNUM + j] = max(_u8FieldArray[HEDGE][i * HBLOCKNUM + j], _u8FieldArray[VEDGE][i * HBLOCKNUM + j]);
4861 #endif
4862 if(pXCResourcePrivate->stdrvXC_3D._bIsHW2Dto3DPatchEnabled)
4863 {
4864 u8YCtr_Cur = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YCTRS][i * HBLOCKNUM + j];
4865 pXCResourcePrivate->stdrvXC_3D._32YSumArray[i * HBLOCKNUM + j] = pXCResourcePrivate->stdrvXC_3D._32YSumArray[i * HBLOCKNUM + j] - pXCResourcePrivate->stdrvXC_3D._u8YCtrArray[pXCResourcePrivate->stdrvXC_3D.u8Ptr][i * HBLOCKNUM + j] + u8YCtr_Cur;
4866 pXCResourcePrivate->stdrvXC_3D._u8FieldArray[BLUE][i * HBLOCKNUM + j] = pXCResourcePrivate->stdrvXC_3D._32YSumArray[i * HBLOCKNUM + j] >> 8;
4867 pXCResourcePrivate->stdrvXC_3D._u8YCtrArray[pXCResourcePrivate->stdrvXC_3D.u8Ptr][i * HBLOCKNUM + j]= u8YCtr_Cur;
4868 }
4869 else
4870 {
4871 #if 1
4872 u8YCtr_Cur = pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YCTRS][i * HBLOCKNUM + j];
4873 pXCResourcePrivate->stdrvXC_3D._32YSumArray[i * HBLOCKNUM + j] = pXCResourcePrivate->stdrvXC_3D._32YSumArray[i * HBLOCKNUM + j] - pXCResourcePrivate->stdrvXC_3D._u8YCtrArray[pXCResourcePrivate->stdrvXC_3D.u8Ptr][i * HBLOCKNUM + j] + u8YCtr_Cur;
4874 pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YCTRS][i * HBLOCKNUM + j] = pXCResourcePrivate->stdrvXC_3D._32YSumArray[i * HBLOCKNUM + j] >> 8;
4875 pXCResourcePrivate->stdrvXC_3D._u8YCtrArray[pXCResourcePrivate->stdrvXC_3D.u8Ptr][i * HBLOCKNUM + j]= u8YCtr_Cur;
4876 #else
4877 _u8YCtrArray[u8Ptr][i * HBLOCKNUM + j] = _u8FieldArray[YCTRS][i * HBLOCKNUM + j];
4878 // u8YCtr_Cur = _u8FieldArray[YCTRS][i * HBLOCKNUM + j];
4879 // _32YSumArray[i * HBLOCKNUM + j] = _32YSumArray[i * HBLOCKNUM + j] - _u8YCtrArray[u8Ptr][i * HBLOCKNUM + j] + u8YCtr_Cur;
4880 // _u8FieldArray[YCTRS][i * HBLOCKNUM + j] = _32YSumArray[i * HBLOCKNUM + j] >> 8;
4881 // _u8YCtrArray[u8Ptr][i * HBLOCKNUM + j]= u8YCtr_Cur;
4882 #endif
4883 }
4884 }
4885 }
4886 pXCResourcePrivate->stdrvXC_3D.u8Ptr++;
4887 pXCResourcePrivate->stdrvXC_3D.bFirstFlag = FALSE;
4888
4889 if (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ArtificialGain != 0)
4890 {
4891 u8ArtWt_t = (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ArtificialGain == MAXARTGAIN) ? MAXARTGAIN + 1 : pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ArtificialGain;
4892 u32ArtWt = _MDrv_SC_3D_2DTo3D_Art_Detect(pInstance);
4893 u32NatWt = MAXARTGAIN - min((u32ArtWt * u8ArtWt_t) >> 4, MAXARTGAIN);
4894 }
4895 else
4896 {
4897 u32NatWt = MAXARTGAIN;
4898 }
4899
4900 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//left depth offset
4901 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//right depth offset
4902 #if (HW_2DTO3D_VER < 2)
4903 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, ((pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain*u32NatWt)>>4)<<8, 0x3F00);//left depth gain:6bits
4904 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, ((pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain*u32NatWt)>>4)<<8, 0x3F00);//right depth gain:6bits
4905 #else
4906 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, ((pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain*u32NatWt)>>4)<<8, 0x7F00);//left depth gain:7bits
4907 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, ((pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain*u32NatWt)>>4)<<8, 0x7F00);//right depth gain:7bits
4908 #endif
4909 if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_6C_L,BIT(1)))
4910 {
4911 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, 0x7F00, 0x7F00);//left depth offset
4912 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, 0x3F00, 0x7F00);//right depth offset
4913 }
4914 if(pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EdgeBlackWidth > 0)
4915 {
4916 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_72_L, BIT(7), BIT(7)); //draw left/right black enable
4917 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_72_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EdgeBlackWidth, 0x007F); //draw left/right black width
4918 }
4919 else
4920 {
4921 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_72_L, 0x0000, 0x00FF); //draw left/right black enable, draw left/right black width
4922 }
4923
4924 if(IS_OUTPUT_TOP_BOTTOM_HW())
4925 {
4926 u8LoopVIndex = u8LoopVIndex / 2;
4927 }
4928 else if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
4929 {
4930 u8LoopHIndex = u8LoopHIndex / 2;
4931 }
4932
4933 for(i = 0; i < u8LoopVIndex; i++)
4934 {
4935 for(j = 0; j < u8LoopHIndex; j++)
4936 {
4937 MS_U32 u32Result = 0;
4938 MS_U8 u8Res = 0;
4939 if(pXCResourcePrivate->stdrvXC_3D._bIsHW2Dto3DPatchEnabled)
4940 {
4941 u8Res = (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel == 0) ? remap(pInstance, YCTRS, VBLOCKNUM, HBLOCKNUM, i, j, 0x05) :
4942 (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel == 1) ? remap(pInstance, YAVG, VBLOCKNUM, HBLOCKNUM, i, j, 0x05) :
4943 (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel == 2) ? remap(pInstance, BLUE, VBLOCKNUM, HBLOCKNUM, i, j, 0x05) : 0;
4944 }
4945 else
4946 {
4947 pXCResourcePrivate->stdrvXC_3D._u8FieldArray[BLUE][i * HBLOCKNUM + j] = lpf3x3(pInstance, i,j,YCTRS);
4948 u8Res = (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel == 0) ? pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YCTRS][i*HBLOCKNUM + j]:
4949 (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel == 1) ? pXCResourcePrivate->stdrvXC_3D._u8FieldArray[YAVG ][i*HBLOCKNUM + j]:
4950 (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel == 2) ? pXCResourcePrivate->stdrvXC_3D._u8FieldArray[BLUE ][i*HBLOCKNUM + j]: 0;
4951 }
4952 switch(u8DepthMode)
4953 {
4954 case 0:
4955 u32Result = slope_gen(pInstance, i, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Concave, u8Res, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ModSel, 1);// V gradual pattern test
4956 break;
4957 case 1:
4958 u32Result = MAXVALUE - (7 * i);// V gradual pattern test (inverse)
4959 break;
4960 case 2:
4961 u32Result = 4 * j;// H gradual pattern test
4962 break;
4963 case 3:
4964 u32Result = MAXVALUE - (4 * j);// H gradual pattern test (inverse)
4965 break;
4966 case 4:
4967 u32Result = (abs(i - VBLOCKNUM / 2) + abs(j - HBLOCKNUM / 2)) <<3;// center gradual pattern test
4968 break;
4969 default:
4970 u32Result = 7 * i;// V gradual pattern test
4971 break;
4972 }
4973 #if 0
4974 u32Result = minmax(u32Result, 0, MAXVALUE);
4975 u32Result = (j == 0 || j >= (((gSrcInfo[MAIN_WINDOW].stDispWin.width + PIXELNUMOFBLOCK - 1)/PIXELNUMOFBLOCK)-1)) ? _st3DHw2DTo3DPara.u16Offset : u32Result;//left/rightest side no 2d3d effect
4976 (*((volatile MS_U8*)((i * DRBYTENUM + j) + u32DRBase))) = u32Result;
4977 #else
4978 u32Result = minmax(u32Result, 0, MAXVALUE);
4979 u32Result = ((j == 0) || (j >= (u8LoopHIndex-1))) ? pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset : u32Result;
4980 (*((volatile MS_U8*)((i * DRBYTENUM + j) + u32DRBase))) = u32Result;
4981 if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()&&(j == (u8LoopHIndex-1))) //hardware SBS patch for disorder
4982 {
4983 (*((volatile MS_U8*)((i * DRBYTENUM + j+1) + u32DRBase))) = u32Result;
4984 }
4985 #endif
4986 if(IS_OUTPUT_TOP_BOTTOM_HW())
4987 {
4988 (*((volatile MS_U8*)(((i + u8LoopVIndex) * DRBYTENUM + j) + u32DRBase))) = MAXVALUE - u32Result;
4989 }
4990 else if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
4991 {
4992 (*((volatile MS_U8*)((i * DRBYTENUM + j + u8LoopHIndex) + u32DRBase))) = MAXVALUE - u32Result;
4993 }
4994 }
4995 }
4996 MsOS_FlushMemory();
4997 }
4998 else if(((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
4999 && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D)
5000 || ((E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
5001 && pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D))
5002 {
5003 if(!pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank)
5004 {
5005 u32Base += DDBANKOFFSET;
5006 }
5007
5008 if(pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank)//write bank0 currently, let hw to write bank1 for next frame
5009 {
5010 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_41_L, 0x0001, 0x000F); // DD force bank1
5011 }
5012 else
5013 {
5014 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_41_L, 0x0000, 0x000F); // DD force bank0
5015 }
5016 pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank = !pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank;
5017
5018 for(i = 0; i < VBLOCKNUM; i++)
5019 {
5020 for(j = 0; j < HBLOCKNUM; j++)
5021 {
5022 pXCResourcePrivate->stdrvXC_3D._u8FieldArray[VEDGE][i * HBLOCKNUM + j] = *((volatile MS_U8*)(( i * HBLOCKNUM * DDBYTENUM + j * DDBYTENUM + YVEDGEBUFINDEX) + u32Base));//prog cnt 1
5023 }
5024 }
5025 _MDrv_SC_3D_SourceDetection(pInstance);
5026 }
5027 }
5028
5029 #else //new 2d to 3d architecture
5030
5031 #define MINMAX(v,a,b) (((v)<(a))? (a) : ((v)>(b)) ? (b) : (v))
5032 #define MAX3(a,b,c) MAX(a,MAX(b,c))
5033 #define MIN3(a,b,c) MIN(a,MIN(b,c))
5034 #define BLEND128( a, b, r ) ((a*(128-r)+b*r+64)>>7)
5035 #define LBOX_BLKCOLOR 3
5036 #define BLKCOLOR 32
5037 #if (HW_2DTO3D_VER == 4)
5038 #define DISPLAY_DD_H (pXCResourcePrivate->stdrvXC_3D._u16DDHSize)
5039 #define DISPLAY_DD_V (pXCResourcePrivate->stdrvXC_3D._u16DDVSize)
5040 #define NBLK_DD_H ((DISPLAY_DD_H + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //dd h block
5041 #define NBLK_DD_V ((DISPLAY_DD_V + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //dd v block
5042 #define NBLK_DD_H_MAX ((1920 + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //dd max h block
5043 #define NBLK_DD_V_MAX ((1080 + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //dd max v block
5044 #define NBLK_DR_H (pXCResourcePrivate->stdrvXC_3D._u8NBLK_DR_H)
5045 #define NBLK_DR_V (pXCResourcePrivate->stdrvXC_3D._u8NBLK_DR_V)
5046 #define PANEL_WIDTH (pXCResourcePrivate->stdrvXC_3D._u16PanelWidth)
5047 #define PANEL_HEIGHT (pXCResourcePrivate->stdrvXC_3D._u16PanelHeight)
5048
5049 //#define NBLK_DR_H ((gSrcInfo[MAIN_WINDOW].stDispWin.width + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //dr h block
5050 //#define NBLK_DR_V ((gSrcInfo[MAIN_WINDOW].stDispWin.height + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //dr v block
5051 #else
5052
_GetCurDispWinWidth(void * pInstance)5053 static MS_U16 _GetCurDispWinWidth(void *pInstance)
5054 {
5055 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5056 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5057 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5058 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5059
5060 MS_U16 u16MainDispWidth = gSrcInfo[MAIN_WINDOW].stDispWin.width;
5061 MS_WINDOW_TYPE stDispWin;
5062 memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
5063 MDrv_XC_get_dispwin_from_reg(pInstance, MAIN_WINDOW, &stDispWin);
5064 if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW] == E_XC_3D_INPUT_MODE_NONE)
5065 {
5066 u16MainDispWidth = stDispWin.width;
5067 }
5068 return u16MainDispWidth;
5069 }
_GetCurDispWinHeight(void * pInstance)5070 static MS_U16 _GetCurDispWinHeight(void *pInstance)
5071 {
5072 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5073 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5074 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5075 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5076
5077 MS_U16 u16MainDispHeight = gSrcInfo[MAIN_WINDOW].stDispWin.height;
5078 MS_WINDOW_TYPE stDispWin;
5079 memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
5080 MDrv_XC_get_dispwin_from_reg(pInstance, MAIN_WINDOW, &stDispWin);
5081 if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW] == E_XC_3D_INPUT_MODE_NONE)
5082 {
5083 u16MainDispHeight = stDispWin.height;
5084 }
5085 return u16MainDispHeight;
5086 }
5087
5088 #define DISPLAY_DD_H MIN(_GetCurDispWinWidth(pInstance), 1920)
5089 #define DISPLAY_DD_V MIN(_GetCurDispWinHeight(pInstance), 1080)
5090 #define NBLK_DD_H ((DISPLAY_DD_H + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //dd h block
5091 #define NBLK_DD_V ((DISPLAY_DD_V + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //dd v block
5092 #define NBLK_DR_H ((_GetCurDispWinWidth(pInstance) + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //dr h block
5093 #define NBLK_DR_V ((_GetCurDispWinHeight(pInstance) + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK) //dr v block
5094 #endif
5095 #define NBLK_DD_PITCH 60
5096 #define FHD_W 1920
5097 #define FHD_H 1080
5098 #define DVIEW_WEI 0
5099 #define DVIEW_WEI2 1
5100 #define ENABLE_CrDEPTH 1
5101 #define FRAME_WIDTH_DLC 1920 //need DLC information
5102 #define FRAME_HEIGHT_DLC 1080 //need DLC information
5103 #define HW_2DTO3D_3DDetect_THRESHOLD 20
5104 #define HW_2DTO3D_3DDetect_PERCENTAGE 40
5105 #define PRINTINFO 0
5106 #define BOUNDARY_MODE 1
5107 #define AUTO_ADJUST 0
5108 #define BACKLIGHTIIR 1
5109 #define PATTERN_THRESLD 10
5110 #if (HW_2DTO3D_VER == 4)
5111 //Ursa9 new
5112 #define DUMYGAINCTRL 0//LG use it
5113
5114 //DepthDectectionBLK
5115 #define MOTIONDETECTION 1
5116 #define OPTIMIZE 1
5117 #endif
5118 typedef enum
5119 {
5120 E_3D_FORMAT_2D,
5121 E_3D_FORMAT_TB,
5122 E_3D_FORMAT_SS,
5123 E_3D_FORMAT_SS_PATTERN,
5124 E_3D_FORMAT_TB_PATTERN,
5125 }EN_3D_FORMAT;
5126
RGB2YUV(PIXEL stIn)5127 PIXEL RGB2YUV(PIXEL stIn)
5128 {
5129 MS_S32 s32Y = 0, s32U = 0, s32V = 0;
5130 PIXEL stOut;
5131
5132 stOut.R = 0;
5133 stOut.G = 0;
5134 stOut.B = 0;
5135
5136 s32Y = ( ( 257*stIn.R + 504*stIn.G + 98*stIn.B + 16000)*4+500 ) / 1000;
5137 s32U = ( (-148*stIn.R - 291*stIn.G + 439*stIn.B + 128000)*4+500 ) / 1000;
5138 s32V = ( ( 439*stIn.R - 368*stIn.G - 71*stIn.B + 128000)*4+500 ) / 1000;
5139
5140 stOut.R = MINMAX(s32U,0,1023);
5141 stOut.G = MINMAX(s32Y,0,1023);
5142 stOut.B = MINMAX(s32V,0,1023);
5143
5144 return stOut;
5145 }
5146 #if (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_YUV2RGB(PIXEL pin)5147 PIXEL _MDrv_SC_3D_2DTo3D_YUV2RGB(PIXEL pin)
5148 {
5149
5150 PIXEL pout;
5151 // YUV888 -> RGB888
5152 MS_S16 r = (1164*(pin.G-16) + 1596*(pin.R-128) + 500 )/1000;
5153 MS_S16 g = (1164*(pin.G-16) - 813*(pin.R-128) - 391*(pin.B-128) + 500 )/1000;
5154 MS_S16 b = (1164*(pin.G-16) + 2018*(pin.B-128) + 500 )/1000;
5155
5156 pout.R = MINMAX(r,0,1023);
5157 pout.G = MINMAX(g,0,1023);
5158 pout.B = MINMAX(b,0,1023);
5159
5160 return pout;
5161 }
5162 #endif
5163 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_HWInfo_Read(void * pInstance)5164 void _MDrv_SC_3D_2DTo3D_HWInfo_Read(void *pInstance)
5165 {
5166 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5167 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5168 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5169 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5170 MS_S32 i = 0, j = 0, i_dummy = 0, j_dummy = 0;
5171 MS_U8 u8Y_Avg_Edge_H = 0;
5172 MS_U8 u8R_Cr_Avg = 0;
5173 MS_U8 u8G_Y_Avg = 0;
5174 MS_U8 u8B_Cb_Avg = 0;
5175 MS_VIRT u32DDBase = MsOS_PA2KSEG1(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf);
5176 if(0 == u32DDBase)
5177 {
5178 printf("%s :u32DDBase = 0!,error!!!\n", __FUNCTION__);
5179 assert(u32DDBase != 0);
5180 }
5181 MS_U16 u16DDBlock_DramSize = DDBYTENUM;
5182 MS_U32 u32DDBlockLinePitch = (NBLK_DD_PITCH*DDBYTENUM);
5183 MS_U8 u8Idx = 0;
5184
5185 for (i = 0; i < NBLK_DD_V; i++)
5186 {
5187 i_dummy = i * u32DDBlockLinePitch;
5188
5189 for (j = 0; j < NBLK_DD_H; j++)
5190 {
5191 j_dummy = j* u16DDBlock_DramSize;
5192
5193 u8Y_Avg_Edge_H = *((volatile MS_U8*)((MS_U64)( i_dummy + j_dummy + 1) + u32DDBase));
5194
5195 u8R_Cr_Avg = *((volatile MS_U8*)((MS_U64)( i_dummy + j_dummy + 17) + u32DDBase));
5196 u8G_Y_Avg = *((volatile MS_U8*)((MS_U64)( i_dummy + j_dummy + 15) + u32DDBase));
5197 u8B_Cb_Avg = *((volatile MS_U8*)((MS_U64)( i_dummy + j_dummy + 16) + u32DDBase));
5198
5199
5200 u8R_Cr_Avg = MINMAX((((u8R_Cr_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
5201 u8G_Y_Avg = MINMAX((((u8G_Y_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
5202 u8B_Cb_Avg = MINMAX((((u8B_Cb_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
5203
5204 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[i][j].R = u8R_Cr_Avg; // avg color value
5205 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[i][j].G = u8G_Y_Avg; // avg color value
5206 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[i][j].B = u8B_Cb_Avg; // avg color value
5207
5208 if(u8Y_Avg_Edge_H>0x1A)
5209 {
5210 pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[i][j] = u8Y_Avg_Edge_H-0x1A; // edge info
5211 }
5212 else
5213 {
5214 pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[i][j] = 0;
5215 }
5216
5217 }
5218 }
5219
5220 for(u8Idx = 0 ; u8Idx < 32 ; u8Idx++)
5221 {
5222 pXCResourcePrivate->stdrvXC_3D._u32Histogram[u8Idx] = 0;
5223 }
5224 }
5225 #elif (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_HWInfo_Read_U9(void * pInstance)5226 void _MDrv_SC_3D_2DTo3D_HWInfo_Read_U9(void *pInstance)
5227 {
5228 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5229 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5230 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5231 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5232 MS_U32 i = 0, j = 0, i_dummy = 0, j_dummy = 0;
5233 MS_U8 u8Y_Avg_Edge_H = 0;
5234 MS_U8 u8R_Cr_Avg = 0;
5235 MS_U8 u8G_Y_Avg = 0;
5236 MS_U8 u8B_Cb_Avg = 0;
5237 MS_U8 u8_Y_Max = 0;//u9
5238 MS_U8 u8_Y_Min = 0;//u9
5239 MS_U8 u8_Motion = 0;//u9
5240 MS_U32 u32_Mot_Cnt = 0;
5241 MS_VIRT u32DDBase = MsOS_PA2KSEG1(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf);
5242 if(0 == u32DDBase)
5243 {
5244 printf("%s :u32DDBase = 0!,error!!!\n", __FUNCTION__);
5245 assert(u32DDBase != 0);
5246 }
5247 //if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x0010)==0x10)
5248 //printf("[DDBase:%8x, DD_Buf:%x]\r\n",u32DDBase,pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf);
5249 MS_U16 u16DDBlock_DramSize = DDBYTENUM;
5250 MS_U32 u32DDBlockLinePitch = (NBLK_DD_PITCH*DDBYTENUM);
5251 MS_U8 u8Idx = 0;
5252
5253 /*if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x0001)==1)
5254 {
5255 printf("[%d %d]\r\n",gSrcInfo[MAIN_WINDOW].stDispWin.width,NBLK_DD_H);
5256 }*/
5257 //H-Upscaling
5258 //if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK15_01_L)&0x07ff)==0x3C0)
5259 if(!IsVMirrorMode(MAIN_WINDOW))
5260 {
5261 for (i = 0; i < NBLK_DD_V; i++)
5262 {
5263 i_dummy = i * u32DDBlockLinePitch;
5264
5265 for (j = 0; j < NBLK_DD_H/2; j++)
5266 {
5267 j_dummy = j* u16DDBlock_DramSize;
5268
5269 u8Y_Avg_Edge_H = *((volatile MS_U8*)(( i_dummy + j_dummy + 1UL) + u32DDBase));
5270 #if 0
5271 u8R_Cr_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 16) + u32DDBase));
5272 u8G_Y_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 15) + u32DDBase));
5273 u8B_Cb_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 17) + u32DDBase));
5274 #else
5275 u8R_Cr_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 17UL) + u32DDBase));
5276 u8G_Y_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 15UL) + u32DDBase));
5277 u8B_Cb_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 16UL) + u32DDBase));
5278 #endif
5279 //u9 status
5280 u8_Y_Max = *((volatile MS_U8*)(( i_dummy + j_dummy + 9UL) + u32DDBase));
5281 u8_Y_Min = *((volatile MS_U8*)(( i_dummy + j_dummy + 12UL) + u32DDBase));
5282 u8_Motion = *((volatile MS_U8*)(( i_dummy + j_dummy + 18UL) + u32DDBase));
5283
5284 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2].R = u8R_Cr_Avg; // avg color value
5285 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2+1].R = u8R_Cr_Avg; // avg color value
5286 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2].G = u8G_Y_Avg; // avg color value
5287 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2+1].G = u8G_Y_Avg; // avg color value
5288 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2].B = u8B_Cb_Avg; // avg color value
5289 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2+1].B = u8B_Cb_Avg; // avg color value
5290 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[i][j*2] = _MDrv_SC_3D_2DTo3D_YUV2RGB(pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2]);
5291 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[i][j*2+1] = _MDrv_SC_3D_2DTo3D_YUV2RGB(pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j*2+1]);
5292
5293 pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[i][j*2] = u8Y_Avg_Edge_H;
5294 pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[i][j*2+1] = u8Y_Avg_Edge_H;
5295 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_mot[i][j*2] = u8_Motion;
5296 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_mot[i][j*2+1] = u8_Motion;
5297 u32_Mot_Cnt = u32_Mot_Cnt + u8_Motion;
5298 //basic depth
5299 pXCResourcePrivate->stdrvXC_3D._field[i*NBLK_DD_H + j*2] = MAX( u8_Y_Max - u8_Y_Min, 0);
5300 pXCResourcePrivate->stdrvXC_3D._field[i*NBLK_DD_H + j*2+1] = MAX( u8_Y_Max - u8_Y_Min, 0);
5301 }
5302 }
5303 }
5304 else
5305 {
5306 for (i = 0; i < NBLK_DD_V; i++)
5307 {
5308 i_dummy = i * u32DDBlockLinePitch;
5309
5310 for (j = 0; j < NBLK_DD_H/2; j++)
5311 {
5312 j_dummy = j* u16DDBlock_DramSize;
5313
5314 u8Y_Avg_Edge_H = *((volatile MS_U8*)(( i_dummy + j_dummy + 1UL) + u32DDBase));
5315
5316 u8R_Cr_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 17UL) + u32DDBase));
5317 u8G_Y_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 15UL) + u32DDBase));
5318 u8B_Cb_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 16UL) + u32DDBase));
5319
5320 //u9 status
5321 u8_Y_Max = *((volatile MS_U8*)(( i_dummy + j_dummy + 9UL) + u32DDBase));
5322 u8_Y_Min = *((volatile MS_U8*)(( i_dummy + j_dummy + 12UL) + u32DDBase));
5323 u8_Motion = *((volatile MS_U8*)(( i_dummy + j_dummy + 18UL) + u32DDBase));
5324
5325 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i - 1][j*2].R = u8R_Cr_Avg; // avg color value
5326 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i - 1][j*2+1].R = u8R_Cr_Avg; // avg color value
5327 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i - 1][j*2].G = u8G_Y_Avg; // avg color value
5328 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i - 1][j*2+1].G = u8G_Y_Avg; // avg color value
5329 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i - 1][j*2].B = u8B_Cb_Avg; // avg color value
5330 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i - 1][j*2+1].B = u8B_Cb_Avg; // avg color value
5331 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V - i - 1][j*2] = _MDrv_SC_3D_2DTo3D_YUV2RGB(pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i][j*2]);
5332 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V - i - 1][j*2+1] = _MDrv_SC_3D_2DTo3D_YUV2RGB(pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[NBLK_DD_V - i][j*2+1]);
5333 pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[NBLK_DD_V - i - 1][j*2] = u8Y_Avg_Edge_H;
5334 pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[NBLK_DD_V - i - 1][j*2+1] = u8Y_Avg_Edge_H;
5335 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_mot[NBLK_DD_V - i - 1][j*2] = u8_Motion;
5336 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_mot[NBLK_DD_V - i - 1][j*2+1] = u8_Motion;
5337 u32_Mot_Cnt = u32_Mot_Cnt + u8_Motion;
5338 //basic depth
5339 pXCResourcePrivate->stdrvXC_3D._field[(NBLK_DD_V - i - 1)*NBLK_DD_H + j*2] = MAX( u8_Y_Max - u8_Y_Min, 0);
5340 pXCResourcePrivate->stdrvXC_3D._field[(NBLK_DD_V - i - 1)*NBLK_DD_H + j*2+1] = MAX( u8_Y_Max - u8_Y_Min, 0);
5341 }
5342 }
5343 }
5344 /*
5345 else
5346 {
5347 for (i = 0; i < NBLK_DD_V; i++)
5348 {
5349 i_dummy = i * u32DDBlockLinePitch;
5350
5351 for (j = 0; j < NBLK_DD_H; j++)
5352 {
5353 j_dummy = j* u16DDBlock_DramSize;
5354
5355 u8Y_Avg_Edge_H = *((volatile MS_U8*)(( i_dummy + j_dummy + 1) + u32DDBase));
5356 #if 0
5357 u8R_Cr_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 16) + u32DDBase));
5358 u8G_Y_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 15) + u32DDBase));
5359 u8B_Cb_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 17) + u32DDBase));
5360 #else
5361 u8R_Cr_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 17) + u32DDBase));
5362 u8G_Y_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 15) + u32DDBase));
5363 u8B_Cb_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 16) + u32DDBase));
5364 #endif
5365 //u9 status
5366 u8_Y_Max = *((volatile MS_U8*)(( i_dummy + j_dummy + 9) + u32DDBase));
5367 u8_Y_Min = *((volatile MS_U8*)(( i_dummy + j_dummy + 12) + u32DDBase));
5368 u8_Motion = *((volatile MS_U8*)(( i_dummy + j_dummy + 18) + u32DDBase));
5369
5370 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j].R = u8R_Cr_Avg; // avg color value
5371 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j].G = u8G_Y_Avg; // avg color value
5372 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j].B = u8B_Cb_Avg; // avg color value
5373
5374 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[i][j] = _MDrv_SC_3D_2DTo3D_YUV2RGB(pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[i][j]);
5375
5376 pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[i][j] = u8Y_Avg_Edge_H;
5377 pXCResourcePrivate->stdrvXC_3D._stBlockStatus_mot[i][j] = u8_Motion;
5378 u32_Mot_Cnt = u32_Mot_Cnt + u8_Motion;
5379 //basic depth
5380 pXCResourcePrivate->stdrvXC_3D._field[i*NBLK_DD_H + j] = MAX( u8_Y_Max - u8_Y_Min, 0);
5381 }
5382 }
5383 }
5384 */
5385 for(u8Idx = 0 ; u8Idx < 32 ; u8Idx++)
5386 {
5387 pXCResourcePrivate->stdrvXC_3D._u32Histogram[u8Idx] = 0;
5388 }
5389 }
5390 #endif
5391
5392 #if (HW_2DTO3D_VER >= 3)
_MDrv_Is_T3DDE_UseMainDisplayWindow(void * pInstance)5393 static MS_BOOL _MDrv_Is_T3DDE_UseMainDisplayWindow(void *pInstance)
5394 {
5395 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5396 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5397 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5398 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5399 MS_BOOL bUseMainDE = FALSE;
5400
5401 MS_U16 u16MainDispWidth = gSrcInfo[MAIN_WINDOW].stDispWin.width;
5402 MS_U16 u16MainDispHeight = gSrcInfo[MAIN_WINDOW].stDispWin.height;
5403 MS_WINDOW_TYPE stDispWin;
5404 memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
5405 MDrv_XC_get_dispwin_from_reg(pInstance, MAIN_WINDOW, &stDispWin);
5406
5407 if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW] == E_XC_3D_INPUT_MODE_NONE)
5408 {
5409 u16MainDispWidth = stDispWin.width;
5410 u16MainDispHeight = stDispWin.height;
5411 }
5412
5413 if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width == u16MainDispWidth)
5414 && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height == u16MainDispHeight))
5415 {
5416 bUseMainDE = FALSE;
5417 }
5418 else if (FALSE == MDrv_XC_Is_SubWindowEanble(pInstance))
5419 {
5420 bUseMainDE = TRUE;
5421 }
5422 else //PIP, not full-frame mode
5423 {
5424 bUseMainDE = FALSE;
5425 }
5426
5427 return bUseMainDE;
5428 }
5429 #endif
5430
_MDrv_SC_3D_GetDispWinWidthForT3D(void * pInstance)5431 static MS_U16 _MDrv_SC_3D_GetDispWinWidthForT3D(void *pInstance)
5432 {
5433 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5434 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5435 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5436 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5437
5438 MS_U16 u16MainDispWidth = 0;
5439 MS_U16 u16MainDispHStart = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L);
5440 MS_U16 u16MainDispHEnd = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L);
5441
5442 //T3D 2P engine, get two piexl a time,start must be even,end must be odd
5443 u16MainDispHStart = u16MainDispHStart - (u16MainDispHStart & 0x01);
5444 u16MainDispHEnd = u16MainDispHEnd + ((u16MainDispHEnd&0x1)^0x1);
5445 u16MainDispWidth = u16MainDispHEnd - u16MainDispHStart + 1;
5446
5447 return u16MainDispWidth;
5448 }
5449
_MDrv_SC_3D_2DTo3D_HW_Info_Write(void * pInstance)5450 static void _MDrv_SC_3D_2DTo3D_HW_Info_Write(void *pInstance)
5451 {
5452 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5453 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5454 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5455 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5456 #if defined (__aarch64__)
5457 MS_U64 x = 0, y = 0;
5458 #else
5459 MS_S16 x = 0, y = 0;
5460 #endif
5461 MS_U8 s16BLKWeight=0,s16BLKDepth=0;//S16->U8
5462 MS_U8 u8DRBLKLinePitch = 0, u8DRPixBLKLinePitch = 0;
5463 MS_U8 u8BLKDepth_NoDC =0;
5464 MS_U8 u8BLKDepth_2D3D = 0;
5465 MS_U8 u8Auto_Adjust_En = 0;
5466 MS_VIRT u32DRBase = MsOS_PA2KSEG1(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf);
5467 MS_S32 s32Depth = 0;
5468 MS_U8 u8BLKDepth_Mod = 0;
5469 MS_U8 **u8QueueDataBLKWeight;
5470 MS_U8 **u8QueueDataBLKDepth;
5471 MS_S16 x_0 = 0, x_1 = 0, x_2 = 0, x_3 = 0;
5472
5473 u8QueueDataBLKWeight = (MS_U8 **)malloc(sizeof(MS_U8 *) * NBLK_DR_V);
5474 u8QueueDataBLKDepth = (MS_U8 **)malloc(sizeof(MS_U8 *) * NBLK_DR_V);
5475 for( y = 0;y < NBLK_DR_V ;y++)
5476 {
5477 u8QueueDataBLKWeight[y]=(MS_U8 *)malloc(sizeof(MS_U8) * NBLK_DR_H);
5478 u8QueueDataBLKDepth[y]=(MS_U8 *)malloc(sizeof(MS_U8) * NBLK_DR_H);
5479 }
5480
5481 if(0 == u32DRBase)
5482 {
5483 printf("%s :u32DRBase = 0!,error!!!\n", __FUNCTION__);
5484 assert(u32DRBase != 0);
5485 }
5486
5487 u8DRBLKLinePitch = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_50_L, 0x00ff) *32;//256 bit alignment = 32 byte
5488 u8DRPixBLKLinePitch = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_50_L, 0xff00)>>8 )*32;//256 bit alignment = 32 byte
5489
5490 #if AUTO_ADJUST
5491 MS_S32 s32Total = 0;
5492 MS_S32 s32Count = 0;
5493 MS_S32 s32Diff = 0;
5494 MS_S32 s32Depth_Control_Var = 0;
5495 MS_S32 s32Mean_Depth = 0;
5496 u8Auto_Adjust_En = 1;
5497
5498 for ( y = 5; y < NBLK_DR_V - 5; y ++ )
5499 {
5500 for ( x = 5; x < NBLK_DR_H - 5; x ++ )
5501 {
5502 u8BLKDepth_Mod = pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x];
5503 s32Total += u8BLKDepth_Mod;
5504 s32Count++;
5505 }
5506 }
5507 s32Count=MAX(s32Count,1);
5508 s32Mean_Depth=s32Total/s32Count;
5509
5510 for ( y = 5; y < NBLK_DR_V-5; y ++ )
5511 {
5512 for ( x = 5; x < NBLK_DR_H-5; x ++ )
5513 {
5514 u8BLKDepth_Mod = pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x];
5515 s32Diff += abs(u8BLKDepth_Mod-s32Mean_Depth);
5516 }
5517 }
5518 s32Depth_Control_Var=s32Diff/s32Count;
5519 s32Depth_Control_Var=MAX(s32Depth_Control_Var,12);
5520 pXCResourcePrivate->stdrvXC_3D._s32Depth_Control_Var_IIR = (pXCResourcePrivate->stdrvXC_3D._s32Depth_Control_Var_IIR*112+s32Depth_Control_Var*(128-112) + 64 )>>7;
5521 pXCResourcePrivate->stdrvXC_3D._s32Mean_Depth_IIR = (pXCResourcePrivate->stdrvXC_3D._s32Mean_Depth_IIR*112+s32Mean_Depth*(128-112) + 64 )>>7;
5522 #endif
5523
5524
5525 for ( y = 0; y < NBLK_DR_V; y ++ )
5526 for ( x = 0; x < NBLK_DR_H; x ++ )
5527 {
5528 u8BLKDepth_Mod = pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x];
5529 #if AUTO_ADJUST
5530 if(pXCResourcePrivate->stdrvXC_3D._s32Depth_Control_Var_IIR == 0)
5531 {
5532 s32Depth = (u8BLKDepth_Mod - pXCResourcePrivate->stdrvXC_3D._s32Mean_Depth_IIR)*pXCResourcePrivate->stdrvXC_3D._s8Multi_Gain + 160-pXCResourcePrivate->stdrvXC_3D._s8Shift_Value;
5533 }
5534 else
5535 {
5536 s32Depth = (u8BLKDepth_Mod - pXCResourcePrivate->stdrvXC_3D._s32Mean_Depth_IIR)*pXCResourcePrivate->stdrvXC_3D._s8Multi_Gain/pXCResourcePrivate->stdrvXC_3D._s32Depth_Control_Var_IIR + 160-pXCResourcePrivate->stdrvXC_3D._s8Shift_Value;
5537 }
5538 s32Depth = MINMAX(s32Depth,160-pXCResourcePrivate->stdrvXC_3D._s8Clamp_Value-pXCResourcePrivate->stdrvXC_3D._s8Shift_Value,160+pXCResourcePrivate->stdrvXC_3D._s8Clamp_Value-pXCResourcePrivate->stdrvXC_3D._s8Shift_Value);
5539 #endif
5540 s32Depth = MINMAX(s32Depth,0,MAXVALUE);
5541 s16BLKDepth = s32Depth;
5542
5543
5544 u8BLKDepth_2D3D = pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x];
5545 u8BLKDepth_NoDC = u8BLKDepth_2D3D;
5546 s16BLKDepth = u8Auto_Adjust_En ? s16BLKDepth: u8BLKDepth_NoDC ;
5547 s16BLKWeight = pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x];
5548 u8QueueDataBLKWeight[y][x] = s16BLKWeight;
5549 u8QueueDataBLKDepth[y][x] = s16BLKDepth;
5550 }
5551
5552 //========Write Queue Data, each round 64bit ==========
5553 if(!IsVMirrorMode(MAIN_WINDOW))
5554 {
5555 for ( y = 0; y < NBLK_DR_V; y++ )
5556 {
5557 for ( x = 0; x < NBLK_DR_H; x += 4 )
5558 {
5559 x_0 = MIN(x, NBLK_DR_H-1);
5560 x_1 = MIN(x+1, NBLK_DR_H-1);
5561 x_2 = MIN(x+2, NBLK_DR_H-1);
5562 x_3 = MIN(x+3, NBLK_DR_H-1);
5563
5564 (*((volatile MS_U32*)((y*u8DRBLKLinePitch + x) + u32DRBase))) = (((MS_U32)u8QueueDataBLKWeight[y][x_3] << 24)
5565 |((MS_U32)u8QueueDataBLKWeight[y][x_2] << 16)
5566 |((MS_U32)u8QueueDataBLKWeight[y][x_1] << 8)
5567 |((MS_U32)u8QueueDataBLKWeight[y][x_0])) ; //dr pixel base address
5568 (*((volatile MS_U32*)((y*u8DRBLKLinePitch + x) + u32DRBase + HW_2DTO3D_BLOCK_DR_BUF_SIZE))) =(((MS_U32)u8QueueDataBLKDepth[y][x_3] << 24)
5569 |((MS_U32)u8QueueDataBLKDepth[y][x_2] << 16)
5570 |((MS_U32)u8QueueDataBLKDepth[y][x_1] << 8)
5571 |((MS_U32)u8QueueDataBLKDepth[y][x_0])) ; //dr block base address
5572
5573 }
5574 MsOS_FlushMemory();
5575 }
5576 }
5577 else
5578 {
5579 for ( y = NBLK_DR_V-1; y >= 0; y-- )
5580 {
5581 for ( x = 0; x < NBLK_DR_H; x += 4 )
5582 {
5583 x_0 = MIN(x, NBLK_DR_H-1);
5584 x_1 = MIN(x+1, NBLK_DR_H-1);
5585 x_2 = MIN(x+2, NBLK_DR_H-1);
5586 x_3 = MIN(x+3, NBLK_DR_H-1);
5587
5588 (*((volatile MS_U32*)((y*u8DRBLKLinePitch + x) + u32DRBase))) = (((MS_U32)u8QueueDataBLKWeight[NBLK_DR_V - y - 1][x_3] << 24)
5589 |((MS_U32)u8QueueDataBLKWeight[NBLK_DR_V - y - 1][x_2] << 16)
5590 |((MS_U32)u8QueueDataBLKWeight[NBLK_DR_V - y - 1][x_1] << 8)
5591 |((MS_U32)u8QueueDataBLKWeight[NBLK_DR_V - y - 1][x_0])) ; //dr pixel base address
5592 (*((volatile MS_U32*)((y*u8DRBLKLinePitch + x) + u32DRBase + HW_2DTO3D_BLOCK_DR_BUF_SIZE))) = (((MS_U32)u8QueueDataBLKDepth[NBLK_DR_V - y - 1][x_3] << 24)
5593 |((MS_U32)u8QueueDataBLKDepth[NBLK_DR_V - y - 1][x_2] << 16)
5594 |((MS_U32)u8QueueDataBLKDepth[NBLK_DR_V - y - 1][x_1] << 8)
5595 |((MS_U32)u8QueueDataBLKDepth[NBLK_DR_V - y - 1][x_0])) ; //dr block base address
5596
5597 }
5598 MsOS_FlushMemory();
5599 }
5600 }
5601 for( y = 0;y < NBLK_DR_V ;y++)
5602 {
5603 free(u8QueueDataBLKWeight[y]);
5604 free(u8QueueDataBLKDepth[y]);
5605 }
5606 free(u8QueueDataBLKWeight);
5607 free(u8QueueDataBLKDepth);
5608 u8QueueDataBLKWeight = NULL;
5609 u8QueueDataBLKDepth = NULL;
5610 }
5611
5612 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_HorizontalDetection(void * pInstance)5613 static MS_U16 _MDrv_SC_3D_2DTo3D_HorizontalDetection(void *pInstance)
5614 {
5615 MS_U16 x = 0, y = 0;
5616 MS_U16 u16Cplx_Sum = 0;
5617 MS_U16 u16Cplx = 0;
5618 MS_U8 u8Cplx_Idx = 0;
5619 MS_U32 u32CplxHist[NBLK_V_MAX];
5620 PIXEL stPP;
5621 MS_U16 u16Y_Sep_Out = 0;
5622 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5623 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5624 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5625 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5626 memset(&stPP, 0, sizeof(PIXEL));
5627
5628 for( x =0; x< NBLK_DD_V; x++)
5629 u32CplxHist[x] = 0;
5630
5631 for ( y = 0; y < NBLK_DD_V; y ++ )
5632 {
5633 u16Cplx_Sum = 0;
5634 for ( x = 0; x < NBLK_DD_H; x ++ )
5635 {
5636 //to avoid dark letter box
5637 stPP = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
5638 if(stPP.R<=LBOX_BLKCOLOR&&stPP.G<=LBOX_BLKCOLOR&&stPP.B<=LBOX_BLKCOLOR)
5639 continue;
5640
5641 u16Cplx = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
5642 u8Cplx_Idx = MINMAX(u16Cplx/4,0,63);//for 32 level histogram
5643 u16Cplx_Sum = u8Cplx_Idx + u16Cplx_Sum ;
5644
5645 }
5646 u32CplxHist[y] = u16Cplx_Sum;
5647 }
5648
5649 u16Y_Sep_Out = 0;
5650
5651 for ( y = 0; y < NBLK_DD_V; y ++)
5652 {
5653 if (u32CplxHist[y] > 250 && u32CplxHist[(y)+1] > 250)
5654 {
5655 u16Y_Sep_Out =y;
5656 break;
5657 }
5658 }
5659
5660 u16Y_Sep_Out = u16Y_Sep_Out*pXCResourcePrivate->stdrvXC_3D._u8Vertical_Step;
5661 if (u16Y_Sep_Out >= DISPLAY_DD_V)
5662 u16Y_Sep_Out =0;
5663
5664 return u16Y_Sep_Out;
5665 }
5666 #endif
5667 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_BGColorDetection(void * pInstance)5668 static void _MDrv_SC_3D_2DTo3D_BGColorDetection(void *pInstance)
5669 {
5670 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5671 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5672 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5673 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5674 MS_U32 u32CplxHistoTp[64];
5675 MS_U32 u32CplxHistoDn[64];
5676 MS_U32 u32CplxHistoALL1[64];
5677 MS_S16 x = 0, y = 0;
5678 PIXEL stPP;
5679 MS_S16 s16MaxEdgeRGB = 0;
5680 MS_S16 s16Cplx = 0;
5681 MS_S16 s16Cplx_Idx = 0;
5682 MS_S16 s16CpxThrdTp = 0;
5683 MS_S16 s16CpxThrdDn = 0;
5684 MS_S16 blkSum_bgTp = 0, blkSum_bgDn = 0;
5685 MS_S32 s32RSum = 0, s32GSum = 0, s32BSum = 0;
5686 MS_S16 s16TBB_CplxBinThrd = 0, s16FlatAccuTp = 0, s16FlatAccuDn = 0;
5687 MS_BOOL bBGCOLOR_Tp = 0, bBGCOLOR_Dn = 0;
5688 MS_S16 s16Tp14_BGCOLORCnt = 0, s16Dn14_BGCOLORCnt = 0, s16AntiTp14_BGCOLORCnt = 0, s16AntiDn14_BGCOLORCnt = 0;
5689 MS_S16 s16ValidTpCnt = 0, s16ValidDnCnt = 0;
5690 MS_U32 u32ScalingRatio = DISPLAY_DD_H*DISPLAY_DD_V*1000/FHD_W/FHD_H;
5691
5692 memset(&stPP, 0, sizeof(PIXEL));
5693
5694 //--------Cplx histogram initialize start-------------//
5695 for(x =0; x<64; x++)
5696 {
5697 u32CplxHistoTp[x] = 0;
5698 u32CplxHistoDn[x] = 0;
5699 u32CplxHistoALL1[x] = 0;
5700 }
5701 //--------Cplx histogram initialize end-------------//
5702
5703
5704 //--------blur background weight estimate start-----//
5705 for ( y = 0; y < NBLK_DD_V; y ++ )
5706 {
5707 for ( x = 0; x < NBLK_DD_H; x++ )
5708 {
5709 //to avoid dark letter box
5710 stPP = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
5711 if(stPP.R<=LBOX_BLKCOLOR&&stPP.G<=LBOX_BLKCOLOR&&stPP.B<=LBOX_BLKCOLOR)
5712 continue;
5713
5714 s16Cplx = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
5715 s16Cplx_Idx = MINMAX(s16Cplx/4,0,63);//for 32 level histogram
5716
5717 u32CplxHistoALL1[s16Cplx_Idx] = u32CplxHistoALL1[s16Cplx_Idx] +1 ;
5718
5719 if( (y>= 0) && (y <= NBLK_DD_V/4))
5720 u32CplxHistoTp[s16Cplx_Idx] = u32CplxHistoTp[s16Cplx_Idx] +1 ;
5721
5722 if( (y>= NBLK_DD_V*3/4) && (y <= NBLK_DD_V))
5723 u32CplxHistoDn[s16Cplx_Idx] = u32CplxHistoDn[s16Cplx_Idx] +1 ;
5724 }
5725 }
5726
5727 if(u32ScalingRatio == 0)
5728 {
5729 u32ScalingRatio = 1;
5730 }
5731
5732 //--------blur background weight estimate end-----//
5733
5734 //try to useconstant value
5735 s16CpxThrdTp =3;
5736 s16CpxThrdDn =3;
5737 //--------estimate s16Cplx thrd end-----//
5738
5739
5740 //--------estimate Table B background color select weight start-----//
5741 s16TBB_CplxBinThrd = MIN(s16CpxThrdDn, s16CpxThrdTp);
5742 s16FlatAccuTp = 0;
5743 s16FlatAccuDn = 0;
5744 for(x = 0; x<63;x++)
5745 {
5746 s16FlatAccuTp = s16FlatAccuTp +u32CplxHistoTp[x];
5747 s16FlatAccuDn = s16FlatAccuDn +u32CplxHistoDn[x];
5748 if(x>=s16TBB_CplxBinThrd)
5749 break;
5750 }
5751
5752 //**********************************************************************************************//
5753 pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei = MINMAX((s16FlatAccuTp-s16FlatAccuDn)*1000/u32ScalingRatio,-32,32);
5754 pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei = (pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei+32)/2;// range: 0~32
5755
5756 pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei = MINMAX((s16FlatAccuTp-s16FlatAccuDn)*1000/u32ScalingRatio,-32,32);
5757 pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei = (pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei+32)/2;// range: 0~32
5758
5759 #if PRINTINFO
5760 printf("FlatTp=%u, FlatDn=%u\n",s16FlatAccuTp,s16FlatAccuDn);
5761 #endif
5762
5763 //**********************************************************************************************//
5764 //--------estimate Table B background color select weight end-----//
5765
5766 //--------estimate Top 1/4 & Bottom 1/4 background color start-----//
5767
5768 //Top Quarter Avg Color
5769 blkSum_bgTp=0;
5770 //PIXEL _stBgPixelTp;
5771 s32RSum = 0;
5772 s32GSum = 0;
5773 s32BSum = 0;
5774 for ( y = 0; y < NBLK_DD_V/4; y ++ )
5775 {
5776 for ( x = 0; x < NBLK_DD_H; x ++ )
5777 {
5778 stPP = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
5779 s16Cplx = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
5780 if ( s16Cplx/4 <= s16CpxThrdTp && !(stPP.R<=LBOX_BLKCOLOR&&stPP.G<=LBOX_BLKCOLOR&&stPP.B<=LBOX_BLKCOLOR)) //if ( s16Cplx < 32 )
5781 {
5782 s32RSum += stPP.R;
5783 s32GSum += stPP.G;
5784 s32BSum += stPP.B;
5785 blkSum_bgTp ++;
5786 }
5787
5788 }
5789 }
5790 if(blkSum_bgTp==0)
5791 {
5792 pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.R= 0 ;
5793 pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.G= 0 ;
5794 pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.B= 0 ;
5795 }
5796 else
5797 {
5798 pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.R=s32RSum/blkSum_bgTp;
5799 pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.G=s32GSum/blkSum_bgTp;
5800 pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.B=s32BSum/blkSum_bgTp;
5801 }
5802
5803 //last Quarter Avg Color
5804 blkSum_bgDn=0;
5805 //PIXEL _stBgPixelDn;
5806 s32RSum = 0;
5807 s32GSum = 0;
5808 s32BSum = 0;
5809 for ( y = NBLK_DD_V*3/4; y < NBLK_DD_V; y ++ )
5810 {
5811 for ( x = 0; x < NBLK_DD_H; x ++ )
5812 {
5813 stPP = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
5814 s16Cplx = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
5815 if ( s16Cplx/4 <= s16CpxThrdDn && !(stPP.R<=LBOX_BLKCOLOR&&stPP.G<=LBOX_BLKCOLOR&&stPP.B<=LBOX_BLKCOLOR)) //if ( s16Cplx < 32 )
5816 {
5817 s32RSum += stPP.R;
5818 s32GSum += stPP.G;
5819 s32BSum += stPP.B;
5820 blkSum_bgDn ++;
5821 }
5822 }
5823 }
5824 if(blkSum_bgDn==0)
5825 {
5826 pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.R= 0;
5827 pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.G= 0;
5828 pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.B= 0;
5829 }
5830 else
5831 {
5832 pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.R= s32RSum/blkSum_bgDn;
5833 pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.G= s32GSum/blkSum_bgDn;
5834 pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.B= s32BSum/blkSum_bgDn;
5835 }
5836
5837 pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC = RGB2YUV(pXCResourcePrivate->stdrvXC_3D._stBgPixelTp);
5838 pXCResourcePrivate->stdrvXC_3D._stBgPixelDnYCC = RGB2YUV(pXCResourcePrivate->stdrvXC_3D._stBgPixelDn);
5839
5840 //--------estimate Top 1/4 & Bottom 1/4 background color end-----//
5841
5842 for ( y = 0; y < NBLK_DD_V ; y ++ )
5843 for ( x = 0; x < NBLK_DD_H; x ++ )
5844 {
5845 stPP = RGB2YUV(pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x]);
5846 s16MaxEdgeRGB = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
5847
5848 bBGCOLOR_Tp = (s16MaxEdgeRGB < 32) && abs(stPP.B - pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.B)/4<16 && abs(stPP.G - pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.G)/4<16 && abs(stPP.R - pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.R)/4<16;
5849 bBGCOLOR_Dn = (s16MaxEdgeRGB < 32) && abs(stPP.B - pXCResourcePrivate->stdrvXC_3D._stBgPixelDnYCC.B)/4<16 && abs(stPP.G - pXCResourcePrivate->stdrvXC_3D._stBgPixelDnYCC.G)/4<16 && abs(stPP.R - pXCResourcePrivate->stdrvXC_3D._stBgPixelDnYCC.R)/4<16;
5850
5851 if( bBGCOLOR_Tp )
5852 pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x] = true;
5853 else
5854 pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x] = false;
5855
5856 if( bBGCOLOR_Dn )
5857 pXCResourcePrivate->stdrvXC_3D._bDnBGColorMarker[y][x] = true;
5858 else
5859 pXCResourcePrivate->stdrvXC_3D._bDnBGColorMarker[y][x] = false;
5860
5861 }
5862
5863 s16Tp14_BGCOLORCnt = 0;
5864 s16Dn14_BGCOLORCnt = 0;
5865 s16AntiTp14_BGCOLORCnt = 0;
5866 s16AntiDn14_BGCOLORCnt = 0;
5867
5868 s16ValidTpCnt = 0;
5869 s16ValidDnCnt = 0;
5870
5871 for ( y = 0; y < NBLK_DD_V; y ++ )
5872 for ( x = 0; x < NBLK_DD_H; x ++ )
5873 {
5874 s16MaxEdgeRGB = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
5875 stPP = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
5876
5877 bBGCOLOR_Tp = pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x];
5878 bBGCOLOR_Dn = pXCResourcePrivate->stdrvXC_3D._bDnBGColorMarker[y][x];
5879
5880 if(y>=0&&y<=NBLK_DD_V/4&&(s16MaxEdgeRGB/4)<3&&bBGCOLOR_Tp)
5881 s16ValidTpCnt++;
5882 if(y>=NBLK_DD_V*3/4&&y<=NBLK_DD_V&&(s16MaxEdgeRGB/4)<3&&bBGCOLOR_Dn)
5883 s16ValidDnCnt++;
5884
5885 if(y>=0&&y<=NBLK_DD_V/4)
5886 {
5887 if(bBGCOLOR_Tp)
5888 s16Tp14_BGCOLORCnt++;
5889 if(bBGCOLOR_Dn)
5890 s16AntiDn14_BGCOLORCnt++;
5891 }
5892
5893 if(y>=NBLK_DD_V*3/4&&y<=NBLK_DD_V)
5894 {
5895 if(bBGCOLOR_Dn)
5896 s16Dn14_BGCOLORCnt++;
5897 if(bBGCOLOR_Tp)
5898 s16AntiTp14_BGCOLORCnt++;
5899 }
5900 }
5901
5902 #if PRINTINFO
5903 printf("TpBGC R = %u, G = %d, B = %u\n",pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.R,pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.G,pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.B);
5904 printf("BtBGC R = %u, G = %d, B = %u\n",pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.R,pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.G,pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.B);
5905 #endif
5906
5907 pXCResourcePrivate->stdrvXC_3D._s16TpBGCOLOR_ValidWei = MINMAX((s16ValidTpCnt*1000/u32ScalingRatio-32)/2,0,32);
5908 pXCResourcePrivate->stdrvXC_3D._s16DnBGCOLOR_ValidWei = MINMAX((s16ValidDnCnt*1000/u32ScalingRatio-32)/2,0,32);
5909
5910 #if PRINTINFO
5911 printf("s16Tp14_BGCOLORCnt = %u, s16AntiDn14_BGCOLORCnt = %u\n",s16Tp14_BGCOLORCnt,s16AntiDn14_BGCOLORCnt);
5912 printf("s16Dn14_BGCOLORCnt = %u, s16AntiTp14_BGCOLORCnt = %u\n",s16Dn14_BGCOLORCnt,s16AntiTp14_BGCOLORCnt);
5913 #endif
5914
5915 s16Tp14_BGCOLORCnt = MINMAX(s16Tp14_BGCOLORCnt/4*1000/u32ScalingRatio-16,0,48);//Tp color on top
5916 s16AntiDn14_BGCOLORCnt = MINMAX((s16AntiDn14_BGCOLORCnt/4*1000/u32ScalingRatio-4),0,48);//Dn color on Top
5917 s16Dn14_BGCOLORCnt = MINMAX(s16Dn14_BGCOLORCnt/4*1000/u32ScalingRatio-16,0,48);//Dn color at bottom
5918 s16AntiTp14_BGCOLORCnt = MINMAX((s16AntiTp14_BGCOLORCnt/4*1000/u32ScalingRatio-4),0,48);//Tp color at bottom
5919
5920 #if PRINTINFO
5921 printf("Tp14_BGCOLOR_Wei = %u, AntiDn14_BGCOLOR_Wei = %u\n",s16Tp14_BGCOLORCnt,s16AntiDn14_BGCOLORCnt);
5922 printf("Dn14_BGCOLOR_Wei = %u, AntiTp14_BGCOLOR_Wei = %u\n",s16Dn14_BGCOLORCnt,s16AntiTp14_BGCOLORCnt);
5923 #endif
5924
5925 pXCResourcePrivate->stdrvXC_3D._s16DistantViewWei = MINMAX(s16Tp14_BGCOLORCnt-MAX(s16AntiDn14_BGCOLORCnt,s16AntiTp14_BGCOLORCnt), 0,32);
5926 pXCResourcePrivate->stdrvXC_3D._s16DistantViewWei_Bottom = MINMAX(s16Dn14_BGCOLORCnt-MAX(s16AntiDn14_BGCOLORCnt,s16AntiTp14_BGCOLORCnt), 0,32);
5927
5928 pXCResourcePrivate->stdrvXC_3D._s16TBA_BGColorWei = MINMAX(s16Tp14_BGCOLORCnt,0,32);
5929 pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorWei = MINMAX(s16Dn14_BGCOLORCnt,0,32);
5930 }
5931 #elif (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_BGColorDetection_U9(void * pInstance)5932 static void _MDrv_SC_3D_2DTo3D_BGColorDetection_U9(void* pInstance)
5933 {
5934
5935 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5936 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5937 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5938 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5939
5940 MS_U32 CbHistoTp[32];
5941 MS_U32 CrHistoTp[32];
5942 MS_U32 CbHistoBn[32];
5943 MS_U32 CrHistoBn[32];
5944 MS_U32 YHistoTp[32];
5945 MS_U32 YHistoBn[32];
5946
5947 int x,y;
5948 PIXEL pp, ppYCC;
5949 MS_U32 cplx;
5950 MS_U32 CbTpMaxidx=0,CrTpMaxidx=0,CbBnMaxidx=0,CrBnMaxidx=0,CbMaxidx=0,CrMaxidx=0;
5951 MS_U32 CbTpMaxcnt=0,CrTpMaxcnt=0,CbBnMaxcnt=0,CrBnMaxcnt=0,CbMaxcnt=0,CrMaxcnt=0;
5952 MS_U32 YTpMaxidx=0,YBnMaxidx=0,YTpMaxcnt=0,YBnMaxcnt=0;
5953
5954 MS_U32 CbTpMaxinBncnt = 0, CrTpMaxinBncnt = 0;
5955 MS_U32 u32ScalingRatio = DISPLAY_DD_H*DISPLAY_DD_V*1000/FHD_W/FHD_H;
5956 for(x =0; x<32; x++)
5957 {
5958 CbHistoTp[x] = 0;
5959 CrHistoTp[x] = 0;
5960 CbHistoBn[x] = 0;
5961 CrHistoBn[x] = 0;
5962
5963 YHistoTp[x] = 0;
5964 YHistoBn[x] = 0;
5965 }
5966
5967 for ( y = 0; y < NBLK_DD_V/4; y ++ )
5968 for ( x = 0; x < NBLK_DD_H; x++ )
5969 {
5970 //to avoid dark letter box
5971 pp = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
5972 ppYCC = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[y][x];
5973
5974 //cplx = field[YCTRS][(y)*NBLK_DD_H+(x)];
5975 cplx = pXCResourcePrivate->stdrvXC_3D._field[(y)*NBLK_DD_H+(x)];
5976 //if ( cplx <= 24 && ppYCC.G>LBOX_BLKCOLOR)
5977 //if ( cplx <= 32 && ppYCC.G>LBOX_BLKCOLOR)
5978 if ( cplx <= 32 && ppYCC.G>BLKCOLOR)
5979 {
5980 CbHistoTp[ppYCC.B/8]++;
5981 CrHistoTp[ppYCC.R/8]++;
5982 YHistoTp[ppYCC.G/8]++;
5983 }
5984 }
5985
5986 for ( y = NBLK_DD_V*3/4; y < NBLK_DD_V; y ++ )
5987 for ( x = 0; x < NBLK_DD_H; x++ )
5988 {
5989 //to avoid dark letter box
5990 pp = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
5991 ppYCC = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[y][x];
5992
5993 //cplx = field[YCTRS][(y)*NBLK_DD_H+(x)];
5994 cplx = pXCResourcePrivate->stdrvXC_3D._field[(y)*NBLK_DD_H+(x)];
5995 //if ( cplx <= 24 && ppYCC.G>LBOX_BLKCOLOR)
5996 //if ( cplx <= 32 && ppYCC.G>LBOX_BLKCOLOR)
5997 if ( cplx <= 32 && ppYCC.G>32)
5998 {
5999 CbHistoBn[ppYCC.B/8]++;
6000 CrHistoBn[ppYCC.R/8]++;
6001 YHistoBn[ppYCC.G/8]++;
6002 }
6003 }
6004
6005
6006 for(x =0; x<32; x++)
6007 {
6008 CbTpMaxidx = (CbHistoTp[x]>CbHistoTp[CbTpMaxidx])?x:CbTpMaxidx;
6009 CrTpMaxidx = (CrHistoTp[x]>CrHistoTp[CrTpMaxidx])?x:CrTpMaxidx;
6010 CbBnMaxidx = (CbHistoBn[x]>CbHistoBn[CbBnMaxidx])?x:CbBnMaxidx;
6011 CrBnMaxidx = (CrHistoBn[x]>CrHistoBn[CrBnMaxidx])?x:CrBnMaxidx;
6012
6013 CbMaxidx = (CbHistoTp[x]+CbHistoBn[x]>CbHistoTp[CbMaxidx]+CbHistoBn[CbMaxidx])?x:CbMaxidx;
6014 CrMaxidx = (CrHistoTp[x]+CrHistoBn[x]>CrHistoTp[CrMaxidx]+CrHistoBn[CrMaxidx])?x:CrMaxidx;
6015
6016 YTpMaxidx = (YHistoTp[x]>YHistoTp[YTpMaxidx])?x:YTpMaxidx;
6017 YBnMaxidx = (YHistoBn[x]>YHistoBn[YBnMaxidx])?x:YBnMaxidx;
6018 }
6019
6020 if(CbTpMaxidx==0)
6021 CbTpMaxcnt=CbHistoTp[0]+CbHistoTp[1];
6022 else if(CbTpMaxidx==31)
6023 CbTpMaxcnt=CbHistoTp[30]+CbHistoTp[31];
6024 else
6025 CbTpMaxcnt=CbHistoTp[CbTpMaxidx-1]+CbHistoTp[CbTpMaxidx]+CbHistoTp[CbTpMaxidx+1];
6026
6027 if(CrTpMaxidx==0)
6028 CrTpMaxcnt=CrHistoTp[0]+CrHistoTp[1];
6029 else if(CrTpMaxidx==31)
6030 CrTpMaxcnt=CrHistoTp[30]+CrHistoTp[31];
6031 else
6032 CrTpMaxcnt=CrHistoTp[CrTpMaxidx-1]+CrHistoTp[CrTpMaxidx]+CrHistoTp[CrTpMaxidx+1];
6033
6034 if(CbBnMaxidx==0)
6035 CbBnMaxcnt=CbHistoBn[0]+CbHistoBn[1];
6036 else if(CbBnMaxidx==31)
6037 CbBnMaxcnt=CbHistoBn[30]+CbHistoBn[31];
6038 else
6039 CbBnMaxcnt=CbHistoBn[CbBnMaxidx-1]+CbHistoBn[CbBnMaxidx]+CbHistoBn[CbBnMaxidx+1];
6040
6041 if(CrBnMaxidx==0)
6042 CrBnMaxcnt=CrHistoBn[0]+CrHistoBn[1];
6043 else if(CrBnMaxidx==31)
6044 CrBnMaxcnt=CrHistoBn[30]+CrHistoBn[31];
6045 else
6046 CrBnMaxcnt=CrHistoBn[CrBnMaxidx-1]+CrHistoBn[CrBnMaxidx]+CrHistoBn[CrBnMaxidx+1];
6047
6048 if(CbMaxidx==0)
6049 CbMaxcnt=CbHistoTp[0]+CbHistoTp[1]+CbHistoBn[0]+CbHistoBn[1];
6050 else if(CbMaxidx==31)
6051 CbMaxcnt=CbHistoTp[30]+CbHistoTp[31]+CbHistoBn[30]+CbHistoBn[31];
6052 else
6053 CbMaxcnt=CbHistoTp[CbMaxidx-1]+CbHistoTp[CbMaxidx]+CbHistoTp[CbMaxidx+1]+CbHistoBn[CbMaxidx-1]+CbHistoBn[CbMaxidx]+CbHistoBn[CbMaxidx+1];
6054
6055 if(CrMaxidx==0)
6056 CrMaxcnt=CrHistoTp[0]+CrHistoTp[1]+CrHistoBn[0]+CrHistoBn[1];
6057 else if(CrMaxidx==31)
6058 CrMaxcnt=CrHistoTp[30]+CrHistoTp[31]+CrHistoBn[30]+CrHistoBn[31];
6059 else
6060 CrMaxcnt=CrHistoTp[CrMaxidx-1]+CrHistoTp[CrMaxidx]+CrHistoTp[CrMaxidx+1]+CrHistoBn[CrMaxidx-1]+CrHistoBn[CrMaxidx]+CrHistoBn[CrMaxidx+1];
6061
6062 if(YTpMaxidx==0)
6063 YTpMaxcnt=YHistoTp[0]+YHistoTp[1];
6064 else if(YTpMaxidx==31)
6065 YTpMaxcnt=YHistoTp[30]+YHistoTp[31];
6066 else
6067 YTpMaxcnt=YHistoTp[YTpMaxidx-1]+YHistoTp[YTpMaxidx]+YHistoTp[YTpMaxidx+1];
6068
6069 if(YBnMaxidx==0)
6070 YBnMaxcnt=YHistoBn[0]+YHistoBn[1];
6071 else if(YBnMaxidx==31)
6072 YBnMaxcnt=YHistoBn[30]+YHistoBn[31];
6073 else
6074 YBnMaxcnt=YHistoBn[YBnMaxidx-1]+YHistoBn[YBnMaxidx]+YHistoBn[YBnMaxidx+1];
6075
6076 MS_U32 CntL2,CntL1,CntCur,CntR1,CntR2;
6077
6078 CntL2 = (CbTpMaxidx<2)?0:CbHistoBn[CbTpMaxidx-2];
6079 CntL1 = (CbTpMaxidx<1)?0:CbHistoBn[CbTpMaxidx-1];
6080 CntCur= CbHistoBn[CbTpMaxidx];
6081 CntR1 = (CbTpMaxidx+1>=32)?0:CbHistoBn[CbTpMaxidx+1];
6082 CntR2 = (CbTpMaxidx+2>=32)?0:CbHistoBn[CbTpMaxidx+2];
6083
6084 CbTpMaxinBncnt = CntL2+CntL1+CntCur+CntR1+CntR2;
6085
6086 CntL2 = (CrTpMaxidx<2)?0:CrHistoBn[CrTpMaxidx-2];
6087 CntL1 = (CrTpMaxidx<1)?0:CrHistoBn[CrTpMaxidx-1];
6088 CntCur= CbHistoBn[CbTpMaxidx];
6089 CntR1 = (CrTpMaxidx+1>=32)?0:CrHistoBn[CrTpMaxidx+1];
6090 CntR2 = (CrTpMaxidx+2>=32)?0:CrHistoBn[CrTpMaxidx+2];
6091
6092 CrTpMaxinBncnt = CntL2+CntL1+CntCur+CntR1+CntR2;
6093
6094
6095 pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp = CbTpMaxidx*8;
6096 pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp = CrTpMaxidx*8;
6097 pXCResourcePrivate->stdrvXC_3D.BGColor_CbBn = CbBnMaxidx*8;
6098 pXCResourcePrivate->stdrvXC_3D.BGColor_CrBn = CrBnMaxidx*8;
6099
6100 pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntforTp = MIN(CbTpMaxcnt,CrTpMaxcnt)*1000/u32ScalingRatio;
6101 pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntforBn = MIN(CbBnMaxcnt,CrBnMaxcnt)*1000/u32ScalingRatio;
6102
6103
6104 //printf("\nTpCb %d TpCr %d\n",BGColor_CbTp,BGColor_CrTp);
6105 //printf("\nCbrCnt: %d %d / %d %d",CbTpMaxcnt,CrTpMaxcnt,CbTpMaxinBncnt,CrTpMaxinBncnt);
6106 //printf("\nCbrIdx: %d %d",CbTpMaxidx*8,CrTpMaxidx*8);
6107
6108 //printf("\nCbrCnt: %d %d / %d %d / %d %d\n",CbTpMaxcnt,CrTpMaxcnt,CbBnMaxcnt,CrBnMaxcnt,CbMaxcnt,CrMaxcnt);
6109 //printf("CbrIdx: %d %d / %d %d / %d %d\n\n",CbTpMaxidx*8,CrTpMaxidx*8,CbBnMaxidx*8,CrBnMaxidx*8,CbMaxidx*8,CrMaxidx*8);
6110
6111 #if 1
6112 //2014.02.06 add by CL, for LG subtitle pattern
6113 MS_BOOL isBGCOLOR_Tp;
6114 //U8 u8tempval1EF8 = MFC_ReadByte(REG_1EF8);
6115
6116 pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntTp = 0;
6117 pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntBn = 0;
6118 for ( y = 0; y < NBLK_DD_V ; y ++ )
6119 for ( x = 0; x < NBLK_DD_H; x ++ )
6120 {
6121 ppYCC = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[y][x];
6122 cplx = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
6123
6124 //isBGCOLOR_Tp = (cplx <= 32) && abs((ppYCC.R>>3)-(BGColor_CrTp>>3))<=2 && abs((ppYCC.B>>3)-(BGColor_CbTp>>3))<=2;
6125 //LGE patch
6126 //if((u8tempval1EF8&0x04)==0x04)
6127 isBGCOLOR_Tp = (cplx <= 32) && abs((ppYCC.R>>3)-(pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp>>3))<=1 && abs((ppYCC.B>>3)-(pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp>>3))<=1&&ppYCC.G>=48;
6128 //else
6129 //isBGCOLOR_Tp = (cplx <= 32) && abs((ppYCC.R>>2)-(BGColor_CrTp>>2))<=3 && abs((ppYCC.B>>2)-(BGColor_CbTp>>2))<=3&&ppYCC.G>=48;
6130
6131 if( isBGCOLOR_Tp )
6132 pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x] = true;
6133 else
6134 pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x] = false;
6135
6136 if(y>=0&&y<(NBLK_DD_V>>2)&&isBGCOLOR_Tp)
6137 pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntTp++;
6138 if(y>=((NBLK_DD_V*3)>>2)&&y<NBLK_DD_V&&isBGCOLOR_Tp)
6139 pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntBn++;
6140 }
6141
6142 pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntTp = pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntTp*1000/u32ScalingRatio;
6143 pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntBn = pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntBn*1000/u32ScalingRatio;
6144 //BGColorBlkCntTp = MIN(CbTpMaxcnt,CrTpMaxcnt)/sizeratio;
6145 //BGColorBlkCntBn = MIN(CbTpMaxinBncnt,CrTpMaxinBncnt)/sizeratio;
6146
6147 //printf("\nTpBGCnt %d nDnBGCnt %d\n",BGColorBlkCntTp,BGColorBlkCntBn);
6148 #endif
6149 }
6150 #endif
6151 #if 0
6152 static MS_U16 _MDrv_SC_3D_2DTo3D_BackLightDetection(void)
6153 {
6154 MS_S32 s32Low_Thrd = 6;
6155 MS_S32 s32Hi_Thrd = 20;
6156 MS_S32 s32Low_Sum_Thrd = 200;
6157 MS_S32 s32High_Sum_Thrd = 11;
6158 MS_S32 s32Mean_Thrd = 170;
6159 MS_S32 s32H_Diff_Thrd = 200 ;
6160 MS_S32 s32H_Mean_Thrd = 490 ;
6161 MS_S32 s32Contrast_Thrd = 160; //180
6162 MS_S32 s32Hist_Shift = 32;
6163 MS_S32 s32TotalPix = FRAME_HEIGHT_DLC*FRAME_WIDTH_DLC/s32Hist_Shift;
6164
6165 MS_S32 s32Hist[32];
6166 MS_S32 s32Contrast = 0;
6167 MS_S32 s32Hist_Sum = 0;
6168 MS_S32 s32Hist_Temp = 0;
6169 MS_S32 s32Hist_Mean = 0;
6170 MS_S32 s32H_Mean = 0, s32H_Diff = 0, s32H_Twice = 0, s32H_Half = 0;
6171 MS_S32 s32Hist_Mean_Twice =0;
6172 MS_S32 s32Hist_Mean_Half =0;
6173 MS_S32 s32Index_BL = 0, s32Index_Y_Low = 0, s32Index_Y_Hi = 0;
6174 MS_S32 s32Index_H_Mean = 0, s32Index_H_Diff= 0, s32Index_Contrast = 0, s32Index_Mean = 0;
6175 MS_S32 s32HisData = 0;
6176 MS_S32 x = 0;
6177 MS_S32 s32Low_Sum = 0, s32Hi_Sum = 0;
6178 MS_S32 s32Hist_Count = 0;
6179
6180 //Histogram Check
6181 for(x = 0 ; x < 32 ; x++)
6182 {
6183 s32HisData = _u32Histogram[x];
6184 s32Hist_Count = s32Hist_Count + s32HisData;
6185 }
6186
6187 if(s32Hist_Count!=0)
6188 s32TotalPix = s32Hist_Count;
6189
6190 for( x = 31; x >= 0; x-- )
6191 {
6192 s32Hist_Sum = x* _u32Histogram[x] + s32Hist_Sum;
6193 s32Hist_Temp = _u32Histogram[x] + s32Hist_Temp;
6194 s32Hist[x] = (s32Hist_Temp*1000/s32TotalPix); //100
6195 }
6196
6197 s32Hist_Mean = s32Hist_Sum /s32TotalPix;
6198 s32Hist_Mean_Twice = MIN(31, s32Hist_Mean +4);
6199 s32Hist_Mean_Half = MAX(0, s32Hist_Mean -4 );
6200
6201 s32H_Mean = s32Hist[s32Hist_Mean];
6202 s32H_Twice = s32Hist[s32Hist_Mean_Twice];
6203 s32H_Half = s32Hist[s32Hist_Mean_Half];
6204 s32H_Diff = MIN(s32H_Mean- s32H_Twice, s32H_Half - s32H_Mean);
6205
6206 s32Low_Sum =0;
6207 s32Hi_Sum =0;
6208
6209 //X =0;
6210 for( x=2; x< s32Low_Thrd ; x++)
6211 s32Low_Sum = s32Low_Sum + _u32Histogram[x];
6212
6213 //31
6214 for( x=31; x > s32Hi_Thrd ; x--)
6215 s32Hi_Sum = s32Hi_Sum + _u32Histogram[x];
6216
6217 s32Contrast = ((s32Low_Sum- s32Hi_Sum)*1000/s32TotalPix);
6218
6219 if (s32Hi_Sum*1000/s32TotalPix > s32High_Sum_Thrd)
6220 s32Index_Y_Hi =10;
6221 else
6222 s32Index_Y_Hi = (MINMAX(10 - s32High_Sum_Thrd + s32Hi_Sum*1000/s32TotalPix, 0, 10));
6223
6224 if (s32Low_Sum*1000/s32TotalPix > s32Low_Sum_Thrd)
6225 s32Index_Y_Low =10;
6226 else
6227 s32Index_Y_Low = (MINMAX(10 - s32Low_Sum_Thrd + s32Low_Sum*1000/s32TotalPix, 0, 10));
6228
6229 if (s32H_Mean > s32H_Mean_Thrd)
6230 s32Index_H_Mean =10;
6231 else
6232 s32Index_H_Mean = MINMAX( 10- s32H_Mean_Thrd + s32H_Mean, 0, 10);
6233
6234 if (s32H_Diff < s32H_Diff_Thrd)
6235 s32Index_H_Diff =10;
6236 else
6237 s32Index_H_Diff = MINMAX( 10- s32H_Diff + s32H_Diff_Thrd, 0, 10);
6238
6239 if (s32Contrast > s32Contrast_Thrd)
6240 s32Index_Contrast = 10;
6241 else
6242 s32Index_Contrast = MINMAX( 10 - s32Contrast_Thrd + s32Contrast , 0, 10);
6243
6244 s32Hist_Mean = s32Hist_Sum*20 /s32TotalPix;
6245 if (s32Hist_Mean > s32Mean_Thrd)
6246 s32Index_Mean = 10;
6247 else
6248 s32Index_Mean = MINMAX( 10 - s32Mean_Thrd + s32Hist_Mean , 0, 10);
6249
6250 s32Index_BL = MIN(MIN3(s32Index_Y_Low, s32Index_Y_Hi, s32Index_Mean), MIN3(s32Index_H_Diff, s32Index_H_Mean, s32Index_Contrast));
6251
6252 return s32Index_BL;
6253 }
6254 #endif
6255
6256 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT(void * pInstance,MS_U16 u16Index_BL)6257 static void _MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT(void *pInstance, MS_U16 u16Index_BL)
6258 {
6259 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6260 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6261 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6262 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6263 MS_U8 u8RIdx = 0,u8GIdx = 0, u8BIdx = 0;
6264 MS_S16 s16R = 0, s16G = 0, s16B = 0, s16Depth = 0, s16Depth2 = 0;
6265 MS_S16 s16Y = 0, s16Cb = 0, s16Cr = 0;
6266 MS_S16 s16CrDepth = 0, s16CbDepth = 0, s16Sat = 0, s16YDepth = 0, s16CrCbDepth = 0;
6267 MS_S16 s16Sat_Wei = 0;
6268 #if (DVIEW_WEI || DVIEW_WEI2)
6269 MS_S16 s16DViewDepth = 0;
6270 #endif
6271 MS_S16 s16YDark = 0;
6272 PIXEL stRGB, stYCC;
6273 MS_S16 s16BGDiff3 = 0, s16BGdepthWei3 = 0;
6274 //Only in TableB
6275 MS_S16 s16BG_R = 0, s16BG_G = 0, s16BG_B = 0;
6276 PIXEL stRGBBG, stYCCBG;
6277 MS_S16 s16BGColor_ValidWei = 0;
6278
6279 memset(&stRGB, 0, sizeof(PIXEL));
6280 memset(&stYCC, 0, sizeof(PIXEL));
6281 memset(&stRGBBG, 0, sizeof(PIXEL));
6282 memset(&stYCCBG, 0, sizeof(PIXEL));
6283
6284 // Table A for Sky ( default : white in back )
6285 {
6286 for ( u8RIdx = 0; u8RIdx < 8; u8RIdx++ )
6287 for ( u8GIdx = 0; u8GIdx < 8; u8GIdx++ )
6288 for ( u8BIdx = 0; u8BIdx < 8; u8BIdx++ )
6289 {
6290 s16R = (u8RIdx<<5)*8/7; // u8RIdx<<5;
6291 s16G = (u8GIdx<<5)*8/7; // u8GIdx<<5;
6292 s16B = (u8BIdx<<5)*8/7; // u8BIdx<<5;
6293 s16Depth = 0;
6294
6295 #if ENABLE_CrDEPTH
6296 s16Y = ( ( 257*s16R + 504*s16G + 98*s16B + 16000)+500 ) / 1000;
6297 s16Cb = ( (-148*s16R - 291*s16G + 439*s16B + 128000)+500 ) / 1000;
6298 s16Cr = ( ( 439*s16R - 368*s16G - 71*s16B + 128000)+500 ) / 1000;
6299
6300 s16CrDepth = MINMAX((s16Cr-20), 0, MAXVALUE) ;
6301 //int s16YDepth = MAX((s16Y-128), 0);
6302 s16CbDepth = MINMAX((MAXVALUE- s16Cb), 0, MAXVALUE) ;
6303 s16Sat = (abs(s16Cr-128)+ abs(s16CbDepth-128));
6304 s16YDepth = MIN( MAXVALUE-s16Y, s16Y );
6305
6306 s16Sat_Wei = MINMAX(s16Sat,0,32);
6307 //int s16CrCbDepth = (2*s16Cr + s16CbDepth)/3;
6308 s16CrCbDepth = MINMAX((s16CrDepth + s16CbDepth)/2, 0, MAXVALUE);
6309 s16CrCbDepth= MINMAX(s16CrCbDepth*s16CrCbDepth/MAXVALUE, 0, MAXVALUE);
6310 s16Depth = (s16CrCbDepth*s16Sat_Wei + s16YDepth *(32-s16Sat_Wei)+16)/32;
6311 //s16Depth = MINMAX(((s16Depth-128)*3/2)+128,0,MAXVALUE);
6312 #else
6313 s16Y = ( ( 257*s16R + 504*s16G + 98*s16B + 16000)*4+500 ) / 4000;
6314 s16Depth = MAX( s16R,s16G ) - MIN3( s16R, s16G, s16B );
6315 s16Depth = s16Depth - MINMAX( s16B - MAX( s16R, s16G ), 0, MAXVALUE) + MINMAX(128 - s16B,0,MAXVALUE)/2;
6316 s16Depth = MAX( s16Depth, MIN3( 180, s16R*3 - s16G*3, s16B*6 - s16G*6 ) );
6317 #endif
6318
6319 //method3
6320 stRGB.R = s16R; stRGB.G = s16G; stRGB.B = s16B;
6321 stYCC = RGB2YUV(stRGB);
6322 s16BGDiff3 = MAX3( abs(stYCC.G-pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.G)*2/3/4, abs(stYCC.B-pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.B)/4, abs(stYCC.R-pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.R)/4 );
6323 s16BGdepthWei3 = MINMAX(s16BGDiff3*2/3,0,32);
6324
6325 s16Depth2 = (s16BGdepthWei3*s16Depth+(32-s16BGdepthWei3)*16+16)>>5;//method3
6326 s16Depth2 = (pXCResourcePrivate->stdrvXC_3D._s16TpBGCOLOR_ValidWei*s16Depth2+(32-pXCResourcePrivate->stdrvXC_3D._s16TpBGCOLOR_ValidWei)*s16Depth+16)>>5;
6327 s16Depth2 = (pXCResourcePrivate->stdrvXC_3D._s16TBA_BGColorWei*s16Depth2+(32-pXCResourcePrivate->stdrvXC_3D._s16TBA_BGColorWei)*s16Depth+16)>>5;//normal BG color case
6328
6329 s16Depth = (s16Depth*pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt+s16Depth2*(32-pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt)+16)>>5;//for blue sky color == BG color
6330
6331 #if DVIEW_WEI
6332 //for DView
6333 s16DViewDepth = MINMAX(s16Depth-64,0,MAXVALUE);
6334 //int s16DViewDepth = MINMAX(s16Depth-100,0,MAXVALUE);
6335 s16Depth = (s16DViewDepth*pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3+s16Depth*(32-pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3)+16)>>5;
6336 #elif DVIEW_WEI2
6337 //int s16DViewDepth = MINMAX(s16Depth-64,0,MAXVALUE);// Ver 1
6338 //int s16DViewDepth = MINMAX(s16Depth-100,0,MAXVALUE);// Ver 2
6339 s16DViewDepth = MINMAX(s16Depth-50,0,MAXVALUE);// Ver 3
6340
6341 s16Depth = (s16DViewDepth*pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3+s16Depth*(32-pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3)+16)>>5;
6342 #endif
6343
6344 {
6345 s16YDark = MIN(150, (80-s16Y)*6 );
6346 s16Depth = ( MINMAX( MAX( s16YDark, s16Depth), 0, MAXVALUE )*u16Index_BL + s16Depth*(10 - u16Index_BL))/10;
6347 }
6348
6349 s16Depth = MINMAX( s16Depth, 0, MAXVALUE );
6350 pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8RIdx][u8GIdx][u8BIdx] = s16Depth;
6351 //_u8RGB3DLUT_A[u8RIdx][u8GIdx][u8BIdx] = u8GIdx*32;
6352 }
6353 }
6354
6355 // Table B for Non-Sky
6356 {
6357 for ( u8RIdx = 0; u8RIdx < 8; u8RIdx++ )
6358 for ( u8GIdx = 0; u8GIdx < 8; u8GIdx++ )
6359 for ( u8BIdx = 0; u8BIdx < 8; u8BIdx++ )
6360 {
6361 s16R = (u8RIdx<<5)*8/7; // u8RIdx<<5;
6362 s16G = (u8GIdx<<5)*8/7; // u8GIdx<<5;
6363 s16B = (u8BIdx<<5)*8/7; // u8BIdx<<5;
6364 s16Depth = 0;
6365
6366 #if ENABLE_CrDEPTH
6367 s16Y = ( ( 257*s16R + 504*s16G + 98*s16B + 16000)+500 ) / 1000;
6368 s16Cb = ( (-148*s16R - 291*s16G + 439*s16B + 128000)+500 ) / 1000;
6369 s16Cr = ( ( 439*s16R - 368*s16G - 71*s16B + 128000)+500 ) / 1000;
6370
6371 s16CrDepth = MINMAX((s16Cr-30), 0, MAXVALUE) ;
6372 s16CbDepth = MINMAX((MAXVALUE- s16Cb), 0, MAXVALUE) ;
6373 //int s16CrCbDepth = MINMAX((2*s16Cr + s16CbDepth)/3, 0, MAXVALUE);
6374 s16CrCbDepth = MINMAX((s16Cr + s16CbDepth)/2, 0, MAXVALUE);
6375 //int s16Sat = MAX(abs(s16Cr-128), abs(s16CbDepth-128)) + MIN(abs(s16Cr-128), abs(s16CbDepth-128))/2;
6376 s16Sat =(abs(s16Cr-128)+ abs(s16CbDepth-128));
6377 s16YDepth = MIN( 180, s16Y);
6378
6379 s16Sat_Wei = MINMAX(s16Sat-5,0,32);
6380 s16Depth = (s16CrCbDepth*s16Sat_Wei + s16YDepth *(32-s16Sat_Wei)+16)/32;
6381 //s16Depth = MINMAX(((s16Depth-128)*3/2)+128,0,MAXVALUE);
6382 #else
6383 s16Y = ( ( 257*s16R + 504*s16G + 98*s16B + 16000)*4+500 ) / 4000;
6384 s16Depth = MAX( s16R,s16G ) - MIN3( s16R, s16G, s16B );
6385 s16Depth = s16Depth - MINMAX( s16B - MAX( s16R, s16G ), 0, MAXVALUE) + MINMAX(128 - s16B,0,MAXVALUE)/2;
6386 s16Depth = MAX( s16Depth, MIN3( 180, s16R*3 - s16G*3, s16B*6 - s16G*6 ) );
6387 #endif
6388
6389 #if ENABLE_CrDEPTH
6390 s16Depth = s16Depth;
6391 #else
6392 s16Sat = (MAX3(s16R,s16G,s16B)==0)?0:((MAX3(s16R,s16G,s16B)-MIN3(s16R,s16G,s16B))*256)/MAX3(s16R,s16G,s16B);
6393 s16YDepth = MIN( 200, s16Y )-( MAX(s16Sat-32,0)*5/4 );
6394 s16Depth = MINMAX( MAX( s16YDepth, s16Depth), 0, MAXVALUE );
6395 #endif
6396
6397 //Tp/Dn BG color blending
6398 stRGB.R = s16R; stRGB.G = s16G; stRGB.B = s16B;
6399 stYCC = RGB2YUV(stRGB);
6400
6401 s16BG_R = (pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei*pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.R+(32-pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei)*pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.R+16)>>5;
6402 s16BG_G = (pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei*pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.G+(32-pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei)*pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.G+16)>>5;
6403 s16BG_B = (pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei*pXCResourcePrivate->stdrvXC_3D._stBgPixelTp.B+(32-pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei)*pXCResourcePrivate->stdrvXC_3D._stBgPixelDn.B+16)>>5;
6404
6405 stRGBBG.R = s16BG_R; stRGBBG.G = s16BG_G; stRGBBG.B = s16BG_B;
6406 stYCCBG = RGB2YUV(stRGBBG);
6407
6408 s16BGDiff3 = MAX3( abs(stYCC.G-stYCCBG.G)*2/3/4, abs(stYCC.B-stYCCBG.B)/4, abs(stYCC.R-stYCCBG.R)/4 );
6409 s16BGdepthWei3 = MINMAX(s16BGDiff3*2/3,0,32);
6410
6411 //BG color back off s16Depth
6412 s16Depth2 = (s16BGdepthWei3*s16Depth+(32-s16BGdepthWei3)*32+16)>>5;//method3
6413
6414 s16BGColor_ValidWei = MAX(pXCResourcePrivate->stdrvXC_3D._s16TpBGCOLOR_ValidWei,pXCResourcePrivate->stdrvXC_3D._s16DnBGCOLOR_ValidWei);
6415 s16Depth2 = (s16BGColor_ValidWei*s16Depth2+(32-s16BGColor_ValidWei)*s16Depth+16)>>5;
6416 s16Depth2 = (pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorWei*s16Depth2+(32-pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorWei)*s16Depth+16)>>5;//normal BG color case
6417 s16Depth2 = (pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3*s16Depth+(32-pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3)*s16Depth2+16)>>5;// if Distant View, not apply BG color to TBB
6418 s16Depth = (s16Depth*pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt+s16Depth2*(32-pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt)+16)>>5;//for blue sky color == BG color
6419
6420 #if DVIEW_WEI
6421 //for DView
6422 s16DViewDepth = MINMAX((s16Depth*4/5)+160,0,MAXVALUE);
6423 s16Depth = (s16DViewDepth*pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3+s16Depth*(32-pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3)+16)>>5;
6424 #elif DVIEW_WEI2
6425 s16DViewDepth = MINMAX((s16Depth*4/5)+100,0,MAXVALUE); //ver 2
6426 s16Depth = (s16DViewDepth*pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3+s16Depth*(32-pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3)+16)>>5;
6427 #endif
6428 //backlight
6429 s16YDark = (MAXVALUE-s16Y);
6430 s16Depth = (MINMAX( MAX( s16Depth*4/5, s16YDark), 0, MAXVALUE )*u16Index_BL + s16Depth*(10 - u16Index_BL))/10;
6431
6432 s16Depth = MINMAX( s16Depth, 0, MAXVALUE );
6433 pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8RIdx][u8GIdx][u8BIdx] = s16Depth;
6434 //_u8RGB3DLUT_B[u8RIdx][u8GIdx][u8BIdx] = gIdx*32;
6435 }
6436 }
6437
6438 #if PRINTINFO
6439 printf("======Table A======\n");
6440 printf("_s16TpBGCOLOR_ValidWei = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16TpBGCOLOR_ValidWei );
6441 printf("_s16TBA_BGColorWei = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16TBA_BGColorWei );
6442 printf("_s16BothTpBGSKY_COLORCnt = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt );
6443 printf("_s16DistantViewRatio3 = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3 );
6444 printf("u16Index_BL = 0x%X\n", u16Index_BL );
6445 printf("=====Table B======\n");
6446 printf("_s16TBB_BGColorSelWei = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorSelWei );
6447 printf("s16BGColor_ValidWei = 0x%X\n", s16BGColor_ValidWei );
6448 printf("_s16TBB_BGColorWei = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16TBB_BGColorWei );
6449 printf("_s16BothDnBGSKY_COLORCnt = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt );
6450 printf("_s16DistantViewRatio3 = 0x%X\n", pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3 );
6451 printf("u16Index_BL = 0x%X\n", u16Index_BL );
6452 #endif
6453 }
6454 #elif (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT2_U9(void * pInstance)6455 static void _MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT2_U9(void *pInstance)
6456 {
6457
6458 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6459 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6460 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6461 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6462 MS_U8 rIdx,gIdx,bIdx;
6463 MS_S16 r, g, b,depth,depth2;
6464 MS_S16 y,Cb,Cr;
6465 MS_S16 CrDepth,CbDepth,sat,yDepth,CrCbDepth;
6466 MS_S16 sat_wei;
6467 MS_S16 DViewDepth;
6468 // MS_S16 yDark;
6469
6470 PIXEL pRGB,pYCC;
6471 MS_S16 BGDiff3,BGdepthWei3;
6472
6473 //Only in TableB
6474 // MS_S16 BG_R,BG_G,BG_B;
6475 // PIXEL pRGBBG,pYCCBG;
6476 // MS_S16 BGCOLOR_ValidWei;
6477 MS_U8 BGColorTrustWei;
6478 MS_U8 BGDepth;
6479
6480 // MS_U8 BGColorTrustWei_forTBABGColor;
6481 MS_U8 BGDepth_forTpBGColor;
6482 MS_S16 BGDiff3_forTpBGColor,BGdepthWei3_forTpBGColor, depth2_forTpBGColor;
6483
6484 MS_S16 Cbtmp,Crtmp;
6485
6486
6487 MS_S16 u8testval1 = 0x20;//MFC_ReadByte(REG_0EB6);//0x20
6488 MS_S16 u8testval2 = 0x40;//MFC_ReadByte(REG_0EB7);//0x40
6489 MS_S16 u8testval3 = 0x20;//MFC_ReadByte(REG_0EB8);//0x20
6490 MS_S16 u8testval4 = 0x20;//MFC_ReadByte(REG_0EB9);//0x20
6491 #if DUMYGAINCTRL
6492 MS_U8 u8tmpval = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5A_L, 0xff));//MFC_ReadByte(REG_1EFA);
6493 MS_U8 u8tmpval2 = 0x00;
6494
6495 MS_S16 u8testval7 = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5C_L, 0xff)); //for edge depth
6496 MS_S16 u8testval8 = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5D_L, 0xff00))>>8;//0x07; //for [0]:cbcr enable [1]:y enable [2]:edge enable
6497 MS_S16 u8testval9 = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5D_L, 0xff));//0x10; //for sat_wei
6498 MS_S16 u8testvalA = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5E_L, 0xff00))>>8;//0x10; //for y_depth gain
6499 #else
6500 MS_U8 u8tmpval = 0x00;// = MFC_ReadByte(REG_1EFA);
6501 MS_U8 u8tmpval2 = 0x00;// = MFC_ReadByte(REG_1EFB);
6502
6503 MS_S16 u8testval7 = 0x30; //for edge depth
6504 MS_S16 u8testval8 = 0x07; //for [0]:cbcr enable [1]:y enable [2]:edge enable
6505 MS_S16 u8testval9 = 0x10; //for sat_wei
6506 MS_S16 u8testvalA = 0x10; //for y_depth gain
6507 #endif
6508
6509
6510
6511 //U8 u8tmpval1EF8 = MFC_ReadByte(REG_1EF8);
6512 MS_S16 u8tmpval1EF9 = 0x50;//MFC_ReadByte(REG_1EF9);
6513
6514 // Table A for Sky ( default : white in back )
6515 {
6516 for ( rIdx = 0; rIdx < 8; rIdx++ )
6517 for ( gIdx = 0; gIdx < 8; gIdx++ )
6518 for ( bIdx = 0; bIdx < 8; bIdx++ )
6519 {
6520 r = (rIdx<<5)*8/7; // rIdx<<5;
6521 g = (gIdx<<5)*8/7; // gIdx<<5;
6522 b = (bIdx<<5)*8/7; // bIdx<<5;
6523 depth = 0;
6524
6525 y = ( ( 257*r + 504*g + 98*b + 16000)+500 ) / 1000;
6526 Cb = ( (-148*r - 291*g + 439*b + 128000)+500 ) / 1000;
6527 Cr = ( ( 439*r - 368*g - 71*b + 128000)+500 ) / 1000;
6528
6529 CrDepth = MINMAX((Cr)*16/15, 0, 255) ;
6530 CbDepth = MINMAX((256- Cb)*16/15, 0, 255) ;
6531
6532 //enhance red/yellow color depth to green color
6533 CrDepth = MAX(CrDepth-u8tmpval1EF9,0);
6534 CrDepth = MIN((CrDepth*u8testval4)>>4,255);
6535
6536 sat = (abs(Cr-128)+ abs(Cb-128));
6537
6538
6539 yDepth = MIN( 255-y, y );
6540
6541
6542 MS_U32 black_base_depth;
6543 black_base_depth = 0x60;//MFC_ReadByte(REG_1EFE);
6544
6545 //2013.06.27 make white color depth could be lower than black color in TBA, and black color depth limited to 0x60, for Sky pattern
6546 //if(1)
6547 {
6548 MS_U32 ydepth_base;
6549 ydepth_base = 255;
6550
6551 yDepth = MAX(MIN( ydepth_base-y, y ),0);
6552
6553 if((u8tmpval&0x20)==0x00)
6554 {
6555 if(y>(ydepth_base-y))
6556 yDepth = yDepth;//make white go more back, not be limited
6557 else
6558 yDepth = MAX(yDepth,black_base_depth);
6559 }
6560 else
6561 yDepth = yDepth;
6562 }
6563
6564 sat_wei = MINMAX(sat-16,0,32);
6565
6566 //make blue color go back more
6567 {
6568 MS_U8 blueback_item;
6569 //blueback_item = MAX(b-MAX(r,g)+MIN(r,g),0);
6570 if(0)
6571 {
6572 Cbtmp = MAX(Cb-128,0);
6573 Crtmp = Cr-128;
6574 if(Crtmp>=0)
6575 blueback_item = MAX(Cbtmp-2*Crtmp,0);
6576 else
6577 blueback_item = MAX(Cbtmp+Crtmp/2,0);
6578 }
6579 else
6580 blueback_item = MAX(b-MIN(r,g*3/2),0);
6581 #if 0
6582 if((u8tmpval&0x10)==0x00)
6583 CrCbDepth = MINMAX((CrDepth + CbDepth)/2 - blueback_item, 0, 255);
6584 else
6585 CrCbDepth = (CrDepth + CbDepth)/2;
6586 #else
6587 CrCbDepth = MINMAX((CrDepth + CbDepth)/2- blueback_item, 0, 255);
6588 #endif
6589 }
6590 #if 0
6591 if((u8tmpval&0x03)==0x03)
6592 depth = 0;
6593 else if((u8tmpval&0x03)==0x01)
6594 depth = CrCbDepth;
6595 else if((u8tmpval&0x03)==0x02)
6596 depth = yDepth;
6597 else if((u8tmpval&0x03)==0x00)
6598 depth = (CrCbDepth*sat_wei + yDepth *(32-sat_wei)+16)/32;
6599 else
6600 depth = 0;
6601 #else
6602 sat_wei = MIN((sat_wei*u8testval9)>>4,32);//0~32
6603 yDepth = (yDepth*u8testvalA)>>4;//0~32
6604 if((u8testval8&0x03)==0x01)
6605 depth = CrCbDepth;
6606 else if((u8testval8&0x03)==0x02)
6607 depth = yDepth;
6608 else if((u8testval8&0x03)==0x03)
6609 depth = (CrCbDepth*sat_wei + yDepth *(32-sat_wei)+16)/32;
6610 #endif
6611 //method3
6612 pRGB.R = r;
6613 pRGB.G = g;
6614 pRGB.B = b;
6615 pYCC = RGB2YUV(pRGB);
6616 if((u8tmpval&0x40)==0x00)
6617 {
6618 BGColorTrustWei = MINMAX(pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntforTp/4,0,32);
6619 BGDepth = ( MIN(16,depth)*BGColorTrustWei+depth*(32-BGColorTrustWei))>>5;
6620
6621 //BGDiff3 = MAX( abs(pYCC.B/4-BGColor_CbTp), abs(pYCC.R/4-BGColor_CrTp) );
6622 BGDiff3 = MAX( abs(Cb-pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp), abs(Cr-pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp) );
6623 BGdepthWei3 = MINMAX(BGDiff3,0,32);
6624
6625 depth2 = (BGdepthWei3*depth+(32-BGdepthWei3)*BGDepth+16)>>5;//method3
6626 }
6627 else
6628 {
6629 BGDiff3 = MAX3( abs(pYCC.G-pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.G)*2/3/4, abs(pYCC.B-pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.B)/4, abs(pYCC.R-pXCResourcePrivate->stdrvXC_3D._stBgPixelTpYCC.R)/4 );
6630 BGdepthWei3 = MINMAX(BGDiff3*2/3,0,32);
6631 depth2 = (BGdepthWei3*depth+(32-BGdepthWei3)*16+16)>>5;//method3
6632 }
6633
6634
6635 if((u8tmpval&0x04)==0x00)
6636 depth = MIN(depth,depth2);
6637
6638
6639
6640 DViewDepth = MINMAX(depth,0,255);
6641
6642 depth = (DViewDepth*pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3+depth*(32-pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3)+16)>>5;
6643
6644
6645 //LOCALDEPTH_ENHANCE
6646 MS_U32 skyRatio1, skyRatio2;
6647 MS_U32 skyRatioDiff_wei;
6648
6649 MS_U32 gainU=0, gainD=0;
6650 MS_U32 offset;
6651
6652 skyRatio1 = (MS_U32)pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1;
6653 skyRatio2 = (MS_U32)MIN(pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1,pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio2);
6654
6655 skyRatioDiff_wei = skyRatio1 - skyRatio2;//0~32
6656 {
6657 gainU = 4;
6658 gainD = 3;
6659 }
6660
6661 offset = MAX(128*gainU/gainD - 128,0);
6662 if((u8tmpval&0x08)==0x00)
6663 depth = depth + ( depth* (gainU-gainD)/gainD * skyRatioDiff_wei/32 - offset * skyRatioDiff_wei/32);
6664
6665
6666 //for edge enhance in TBA
6667 MS_U32 egde_depth;
6668 if((u8testval8&0x04)==0x04)
6669 egde_depth = ((u8testval3)*(u8testval7))>>4;// 8.0*2.4
6670 else
6671 egde_depth = 0;
6672
6673 depth = depth - egde_depth;
6674
6675
6676 depth = MINMAX( depth, 0, 255 );
6677 /*if((SC_R2BYTE(REG_SC_BK23_59_L)&0x00f0)==0x00)
6678 {
6679 pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[rIdx][gIdx][bIdx] = depth;
6680 }
6681 else*/
6682 {
6683 pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[rIdx][gIdx][bIdx] = depth;
6684 //pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[rIdx][gIdx][bIdx] = depth;
6685
6686 }
6687 }
6688 }
6689
6690
6691 // Table B for Non-Sky
6692 {
6693 for ( rIdx = 0; rIdx < 8; rIdx++ )
6694 for ( gIdx = 0; gIdx < 8; gIdx++ )
6695 for ( bIdx = 0; bIdx < 8; bIdx++ )
6696 {
6697 r = (rIdx<<5)*8/7; // rIdx<<5;
6698 g = (gIdx<<5)*8/7; // gIdx<<5;
6699 b = (bIdx<<5)*8/7; // bIdx<<5;
6700 depth = 0;
6701
6702 y = ( ( 257*r + 504*g + 98*b + 16000)+500 ) / 1000;
6703 Cb = ( (-148*r - 291*g + 439*b + 128000)+500 ) / 1000;
6704 Cr = ( ( 439*r - 368*g - 71*b + 128000)+500 ) / 1000;
6705
6706 CrDepth = MINMAX((Cr)*16/15, 0, 255) ;
6707 CbDepth = MINMAX((256- Cb)*16/15, 0, 255) ;
6708
6709 //enhance red/yellow color depth to green color
6710 CrDepth = MAX(CrDepth-u8tmpval1EF9,0);
6711 CrDepth = MIN((CrDepth*u8testval4)>>4,255);
6712
6713
6714 //make blue color go back more
6715 {
6716 MS_U8 blueback_item;
6717 //blueback_item = MAX(b-MAX(r,g)+MIN(r,g),0);
6718 if(0)
6719 {
6720 Cbtmp = MAX(Cb-128,0);
6721 Crtmp = Cr-128;
6722 if(Crtmp>=0)
6723 blueback_item = MAX(Cbtmp-2*Crtmp,0);
6724 else
6725 blueback_item = MAX(Cbtmp+Crtmp/2,0);
6726 }
6727 else
6728 blueback_item = MAX(b-MIN(r,g*3/2),0);
6729 #if 0
6730 if((u8tmpval&0x10)==0x00)
6731 CrCbDepth = MINMAX((CrDepth + CbDepth)/2 - blueback_item, 0, 255);
6732 else
6733 CrCbDepth = (CrDepth + CbDepth)/2;
6734 #else
6735 CrCbDepth = MINMAX(CrDepth, 0, 255);
6736 #endif
6737 }
6738
6739 sat =(abs(Cr-128)+ abs(Cb-128));
6740
6741 yDepth = MIN( 180, y);
6742
6743 {
6744 MS_U32 black_base_depth;
6745 black_base_depth = (MS_U32)u8testval2;//48//u8tmpval2;//
6746
6747 if((u8tmpval&0x20)==0x00)
6748 yDepth = MAX(yDepth,black_base_depth);
6749 else
6750 yDepth = yDepth;
6751
6752 yDepth = yDepth + u8testval1;
6753 }
6754
6755
6756
6757
6758 sat_wei = MINMAX(sat-16,0,32);
6759 #if 0
6760 if((u8tmpval&0x03)==0x03)
6761 depth = 0;
6762 else if((u8tmpval&0x03)==0x01)
6763 depth = CrCbDepth;
6764 else if((u8tmpval&0x03)==0x02)
6765 depth = yDepth;
6766 else if((u8tmpval&0x03)==0x00)
6767 depth = (CrCbDepth*sat_wei + yDepth *(32-sat_wei)+16)/32;
6768 else
6769 depth = 0;
6770 #else
6771 sat_wei = MIN((sat_wei*u8testval9)>>4,32);//0~32
6772 yDepth = (yDepth*u8testvalA)>>4;//0~32
6773 if((u8testval8&0x03)==0x01)
6774 depth = CrCbDepth;
6775 else if((u8testval8&0x03)==0x02)
6776 depth = yDepth;
6777 else if((u8testval8&0x03)==0x03)
6778 depth = (CrCbDepth*sat_wei + yDepth *(32-sat_wei)+16)/32;
6779 #endif
6780 //method3
6781 pRGB.R = r;
6782 pRGB.G = g;
6783 pRGB.B = b;
6784 pYCC = RGB2YUV(pRGB);
6785 if((u8tmpval&0x40)==0x00)
6786 {
6787 BGColorTrustWei = MINMAX(pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntforBn/4,0,32);
6788 BGDepth = ( MIN(32,depth)*BGColorTrustWei+depth*(32-BGColorTrustWei))>>5;
6789
6790 //BGDiff3 = MAX( abs(pYCC.B/4-BGColor_CbBn), abs(pYCC.R/4-BGColor_CrBn) );
6791 BGDiff3 = MAX( abs(Cb-pXCResourcePrivate->stdrvXC_3D.BGColor_CbBn), abs(Cr-pXCResourcePrivate->stdrvXC_3D.BGColor_CrBn) );
6792 BGdepthWei3 = MINMAX(BGDiff3,0,32);
6793
6794 //BG color back off depth
6795 depth2 = (BGdepthWei3*depth+(32-BGdepthWei3)*BGDepth+16)>>5;//method3
6796
6797 //for the strength of TpBGcolor in TBB
6798 BGDepth_forTpBGColor = ( MIN(16,depth)*pXCResourcePrivate->stdrvXC_3D._u8TBABGColorWei+depth*(32-pXCResourcePrivate->stdrvXC_3D._u8TBABGColorWei))>>5;
6799 BGDiff3_forTpBGColor = MAX( abs(Cb-pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp), abs(Cr-pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp) );
6800 BGdepthWei3_forTpBGColor = MINMAX(BGDiff3_forTpBGColor,0,32);
6801 //TpBG color back off depth
6802 depth2_forTpBGColor = (BGdepthWei3_forTpBGColor*depth+(32-BGdepthWei3_forTpBGColor)*BGDepth_forTpBGColor+16)>>5;//method3
6803
6804 //if use TpBGColor
6805 if((u8tmpval2&0x01)==0x00)
6806 depth2 = MIN(depth2,depth2_forTpBGColor);
6807
6808 }
6809 else
6810 {
6811 BGDiff3 = MAX3( abs(pYCC.G-pXCResourcePrivate->stdrvXC_3D._stBgPixelDnYCC.G)*2/3/4, abs(pYCC.B-pXCResourcePrivate->stdrvXC_3D._stBgPixelDnYCC.B)/4, abs(pYCC.R-pXCResourcePrivate->stdrvXC_3D._stBgPixelDnYCC.R)/4 );
6812 BGdepthWei3 = MINMAX(BGDiff3*2/3,0,32);
6813 //BG color back off depth
6814 depth2 = (BGdepthWei3*depth+(32-BGdepthWei3)*32+16)>>5;//method3
6815 }
6816
6817
6818 if((u8tmpval&0x04)==0x00)
6819 depth = MIN(depth,depth2);
6820
6821
6822 DViewDepth = MINMAX(depth,0,255); //ver 2
6823 depth = (DViewDepth*pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3+depth*(32-pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3)+16)>>5;
6824
6825
6826 //LOCALDEPTH_ENHANCE
6827 MS_U32 skyRatio1, skyRatio2;
6828 MS_U32 skyRatioDiff_wei;
6829
6830 MS_U32 gainU=0, gainD=0;
6831 MS_U32 offset;
6832
6833 skyRatio1 = (MS_U32)pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1;
6834 skyRatio2 = (MS_U32)MIN(pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1,pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio2);
6835
6836 skyRatioDiff_wei = skyRatio1 - skyRatio2;//0~32
6837 {
6838 gainU = 4;
6839 gainD = 3;
6840 }
6841
6842 offset = MAX(128*gainU/gainD - 128,0);
6843 if((u8tmpval&0x08)==0x00)
6844 depth = depth + ( depth* (gainU-gainD)/gainD * skyRatioDiff_wei/32 - offset * skyRatioDiff_wei/32);
6845
6846
6847 //for edge enhance in TBB
6848 MS_U32 egde_depth;
6849 if((u8testval8&0x04)==0x04)
6850 egde_depth = ((u8testval3)*(u8testval7))>>4;// 8.0*2.4
6851 else
6852 egde_depth = 0;
6853
6854 depth = depth + egde_depth;
6855
6856 depth = MINMAX( depth, 0, 255 );
6857
6858 pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[rIdx][gIdx][bIdx] = depth;
6859
6860
6861 }
6862 }
6863
6864
6865 }
6866
6867 #endif
_MDrv_SC_3D_2DTo3D_InterpolationDepthFromRGB_BLK(void * pInstance,MS_U16 u16X,MS_U16 u16Y,MS_U16 u16R,MS_U16 u16G,MS_U16 u16B)6868 static MS_S32 _MDrv_SC_3D_2DTo3D_InterpolationDepthFromRGB_BLK(void *pInstance, MS_U16 u16X, MS_U16 u16Y, MS_U16 u16R, MS_U16 u16G, MS_U16 u16B)
6869 {
6870 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6871 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6872 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6873 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6874 MS_S32 s32DepthA = 0;
6875 MS_S32 s32DepthB = 0;
6876 MS_S32 s32BlendWeight = 0;
6877 MS_S32 s32Depth = 0;
6878 MS_S32 s32R00 = 0, s32R01 = 0, s32R10 = 0, s32R11 = 0, s32G0 = 0, s32G1 = 0;
6879
6880 MS_S32 s32R = 0, s32G = 0, s32B = 0;
6881 MS_S32 s32RIdx = 0, s32GIdx = 0, s32BIdx = 0;
6882 MS_S32 s32RIdxN = 0, s32GIdxN = 0, s32BIdxN = 0;
6883 MS_S32 s32RRatio = 0, s32GRatio = 0, s32BRatio = 0;
6884
6885 // Check RGB 3D LUT
6886 s32R = MINMAX( u16R * 7 / 8, 0, 224*4 );
6887 s32G = MINMAX( u16G * 7 / 8, 0, 224*4 );
6888 s32B = MINMAX( u16B * 7 / 8, 0, 224*4 );
6889 s32RIdx = s32R>>7; // u16R>>5;
6890 s32GIdx = s32G>>7; // u16G>>5;
6891 s32BIdx = s32B>>7; // u16B>>5;
6892 s32RIdxN = MIN( s32RIdx+1, 7 ); //MIN( s32RIdx+1, 8 );
6893 s32GIdxN = MIN( s32GIdx+1, 7 ); //MIN( s32GIdx+1, 8 );
6894 s32BIdxN = MIN( s32BIdx+1, 7 ); //MIN( s32BIdx+1, 8 );
6895 s32RRatio = s32R & 0x7f;
6896 s32GRatio = s32G & 0x7f;
6897 s32BRatio = s32B & 0x7f;
6898
6899 //RGB3DLUT_A
6900 {
6901 // Interpolate in R domain
6902 s32R00 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdx][s32GIdx ][s32BIdx], pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdxN][s32GIdx ][s32BIdx], s32RRatio );
6903 s32R01 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdx][s32GIdxN][s32BIdx], pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdxN][s32GIdxN][s32BIdx], s32RRatio );
6904 s32R10 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdx][s32GIdx ][s32BIdxN], pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdxN][s32GIdx ][s32BIdxN], s32RRatio );
6905 s32R11 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdx][s32GIdxN][s32BIdxN], pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[s32RIdxN][s32GIdxN][s32BIdxN], s32RRatio );
6906 // Interpolate in G domain
6907 s32G0 = BLEND128( s32R00, s32R01, s32GRatio );
6908 s32G1 = BLEND128( s32R10, s32R11, s32GRatio );
6909 // Interpolate in B domain
6910 s32DepthA = BLEND128( s32G0, s32G1, s32BRatio );
6911 }
6912
6913 //RGB3DLUT_B
6914 {
6915 // Interpolate in R domain
6916 s32R00 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdx][s32GIdx ][s32BIdx], pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdxN][s32GIdx ][s32BIdx], s32RRatio );
6917 s32R01 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdx][s32GIdxN][s32BIdx], pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdxN][s32GIdxN][s32BIdx], s32RRatio );
6918 s32R10 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdx][s32GIdx ][s32BIdxN], pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdxN][s32GIdx ][s32BIdxN], s32RRatio );
6919 s32R11 = BLEND128( pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdx][s32GIdxN][s32BIdxN], pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[s32RIdxN][s32GIdxN][s32BIdxN], s32RRatio );
6920 // Interpolate in G domain
6921 s32G0 = BLEND128( s32R00, s32R01, s32GRatio );
6922 s32G1 = BLEND128( s32R10, s32R11, s32GRatio );
6923 // Interpolate in B domain
6924 s32DepthB = BLEND128( s32G0, s32G1, s32BRatio );
6925 }
6926
6927 #if 0
6928 // blend s32DepthA & s32DepthB
6929 {
6930 // bilinear interpolation regionWeight
6931 wUL = _u8RegionBlkWeightFrame[MINMAX(u16Y/VERTICAL_STEP_OUT,0,NBLK_V_OUT-1)][MINMAX(u16X/HORIZONTAL_STEP_OUT,0,NBLK_H_OUT-1)];
6932 wUR = _u8RegionBlkWeightFrame[MINMAX(u16Y/VERTICAL_STEP_OUT,0,NBLK_V_OUT-1)][MINMAX(u16X/HORIZONTAL_STEP_OUT+1,0,NBLK_H_OUT-1)];
6933 wDL = _u8RegionBlkWeightFrame[MINMAX(u16Y/VERTICAL_STEP_OUT+1,0,NBLK_V_OUT-1)][MINMAX(u16X/HORIZONTAL_STEP_OUT,0,NBLK_H_OUT-1)];
6934 wDR = _u8RegionBlkWeightFrame[MINMAX(u16Y/VERTICAL_STEP_OUT+1,0,NBLK_V_OUT-1)][MINMAX(u16X/HORIZONTAL_STEP_OUT+1,0,NBLK_H_OUT-1)];
6935 xRatio = u16X%HORIZONTAL_STEP_OUT;
6936 wU = ( (HORIZONTAL_STEP_OUT-xRatio)*wUL + xRatio*wUR ) / HORIZONTAL_STEP_OUT;
6937 wD = ( (HORIZONTAL_STEP_OUT-xRatio)*wDL + xRatio*wDR ) / HORIZONTAL_STEP_OUT;
6938 yRatio = u16Y%VERTICAL_STEP_OUT;
6939 s32BlendWeight = ( (VERTICAL_STEP_OUT-yRatio)*wU + yRatio*wD ) / VERTICAL_STEP_OUT;
6940 }
6941 s32Depth = ( s32DepthA * ( 256 - s32BlendWeight ) + s32DepthB * s32BlendWeight ) >> 8;
6942 #else
6943 s32BlendWeight = pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[u16Y][u16X];
6944 s32Depth = ( s32DepthA * ( 256 - s32BlendWeight ) + s32DepthB * s32BlendWeight ) >> 8;
6945 #endif
6946 if(pXCResourcePrivate->stdrvXC_3D._u8DepthAB == 1)
6947 s32Depth = s32DepthA;
6948 else if (pXCResourcePrivate->stdrvXC_3D._u8DepthAB == 2)
6949 s32Depth = s32DepthB;
6950 else if (pXCResourcePrivate->stdrvXC_3D._u8DepthAB == 3)
6951 s32Depth = s32BlendWeight;
6952
6953 return s32Depth;
6954 }
6955
_MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT_IIR(void * pInstance)6956 static void _MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT_IIR(void *pInstance)
6957 {
6958 MS_S16 s16CurDepthA = 0, s16CurDepthB = 0;
6959 MS_S16 s16PreDepthA = 0, s16PreDepthB = 0;
6960 MS_U8 u8RIdx = 0, u8GIdx = 0, u8BIdx = 0;
6961 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6962 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6963 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6964 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6965 for ( u8RIdx = 0; u8RIdx < 8; u8RIdx++ )
6966 for ( u8GIdx = 0; u8GIdx < 8; u8GIdx++ )
6967 for ( u8BIdx = 0; u8BIdx < 8; u8BIdx++ )
6968 {
6969 s16CurDepthA = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8RIdx][u8GIdx][u8BIdx];
6970 s16CurDepthB = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8RIdx][u8GIdx][u8BIdx];
6971 s16PreDepthA = pXCResourcePrivate->stdrvXC_3D.u16Pre_RGB3DLUT_A[u8RIdx][u8GIdx][u8BIdx];
6972 s16PreDepthB = pXCResourcePrivate->stdrvXC_3D.u16Pre_RGB3DLUT_B[u8RIdx][u8GIdx][u8BIdx];
6973
6974 s16CurDepthA = s16CurDepthA<<4;
6975 s16CurDepthB = s16CurDepthB<<4;
6976
6977 s16CurDepthA = (s16PreDepthA*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+s16CurDepthA*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
6978 s16CurDepthB = (s16PreDepthB*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+s16CurDepthB*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
6979
6980 pXCResourcePrivate->stdrvXC_3D.u16Pre_RGB3DLUT_A[u8RIdx][u8GIdx][u8BIdx] = s16CurDepthA;
6981 pXCResourcePrivate->stdrvXC_3D.u16Pre_RGB3DLUT_B[u8RIdx][u8GIdx][u8BIdx] = s16CurDepthB;
6982
6983 pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8RIdx][u8GIdx][u8BIdx] = (s16CurDepthA+8)>>4;
6984 pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8RIdx][u8GIdx][u8BIdx] = (s16CurDepthB+8)>>4;
6985 }
6986 }
6987
_MDrv_SC_3D_2DTo3D_PrepareBLKDepth_IIR(void * pInstance)6988 static void _MDrv_SC_3D_2DTo3D_PrepareBLKDepth_IIR(void *pInstance)
6989 {
6990 MS_S16 s16X = 0, s16Y = 0;
6991 MS_U16 u16CurDepth = 0, u16PreDepth = 0;
6992 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6993 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6994 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6995 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6996 for ( s16Y = 0; s16Y < NBLK_DR_V; s16Y ++ )
6997 for ( s16X = 0; s16X < NBLK_DR_H; s16X ++ )
6998 {
6999 u16CurDepth = pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[s16Y][s16X];
7000 u16PreDepth = pXCResourcePrivate->stdrvXC_3D.u16Pre_depthBlkBased[s16Y][s16X];
7001 u16CurDepth = u16CurDepth<<4;
7002 u16CurDepth = (u16PreDepth*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+u16CurDepth*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
7003 pXCResourcePrivate->stdrvXC_3D.u16Pre_depthBlkBased[s16Y][s16X] = u16CurDepth;
7004 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[s16Y][s16X] = (u16CurDepth+8)>>4;
7005 }
7006 }
7007 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_UpdateRGB3DLUT(void * pInstance)7008 static void _MDrv_SC_3D_2DTo3D_UpdateRGB3DLUT(void *pInstance)
7009 {
7010 MS_U8 u8AddrIdx = 0;
7011 MS_U8 u8IdxR = 0, u8IdxG = 0, u8IdxB = 0;
7012 MS_U8 u8Idx = 0;
7013 MS_U8 u8SRAMDataA[8][64];
7014 MS_U8 u8SRAMDataB[8][64];
7015 MS_U8 u8SRAMDataIn0 = 0;
7016 MS_U8 u8SRAMDataIn1 = 0;
7017 MS_U8 u8SRAMDataIn2 = 0;
7018 MS_U8 u8SRAMDataIn3 = 0;
7019 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7020 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7021 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7022 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7023 for(u8AddrIdx =0; u8AddrIdx<64; u8AddrIdx++)
7024 {
7025 u8IdxR = u8AddrIdx&0x03;
7026 u8IdxG = (u8AddrIdx>>2)&0x03;
7027 u8IdxB = (u8AddrIdx>>4)&0x03;
7028 u8SRAMDataA[0][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+0];
7029 u8SRAMDataA[1][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+0];
7030 u8SRAMDataA[2][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+0];
7031 u8SRAMDataA[3][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+0];
7032 u8SRAMDataA[4][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+1];
7033 u8SRAMDataA[5][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+1];
7034 u8SRAMDataA[6][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+1];
7035 u8SRAMDataA[7][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+1];
7036
7037 u8SRAMDataB[0][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+0];
7038 u8SRAMDataB[1][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+0];
7039 u8SRAMDataB[2][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+0];
7040 u8SRAMDataB[3][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+0];
7041 u8SRAMDataB[4][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+1];
7042 u8SRAMDataB[5][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+1];
7043 u8SRAMDataB[6][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+1];
7044 u8SRAMDataB[7][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+1];
7045 }
7046
7047 //select no SRAM & Enable SRAM write
7048 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x0000);//Choose in TBA,Choose in TBB
7049 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x00,0x80);//SRAM write disable
7050
7051 for(u8Idx =0; u8Idx<8; u8Idx++)
7052 for(u8AddrIdx =0; u8AddrIdx<16; u8AddrIdx++)
7053 {
7054 u8SRAMDataIn0 = u8SRAMDataA[u8Idx][u8AddrIdx*4+0];
7055 u8SRAMDataIn1 = u8SRAMDataA[u8Idx][u8AddrIdx*4+1];
7056 u8SRAMDataIn2 = u8SRAMDataA[u8Idx][u8AddrIdx*4+2];
7057 u8SRAMDataIn3 = u8SRAMDataA[u8Idx][u8AddrIdx*4+3];
7058
7059 //Write SRAM A
7060 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, u8AddrIdx<<8, 0xff00);//SRAM Addr
7061 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, (0x1<<u8Idx)&0xFF, 0xff);//Choose SRAM
7062 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, (u8SRAMDataIn1<<8) | u8SRAMDataIn0);//SRAM Data
7063 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_75_L, (u8SRAMDataIn3<<8)|u8SRAMDataIn2);//SRAM Data
7064 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x80,0x80);//SRAM write enable
7065 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x00,0x80);//SRAM write disable
7066 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x00, 0xff);//Choose no SRAM
7067 }
7068
7069 for(u8Idx =0; u8Idx<8; u8Idx++)
7070 for(u8AddrIdx =0; u8AddrIdx<16; u8AddrIdx++)
7071 {
7072 u8SRAMDataIn0 = u8SRAMDataB[u8Idx][u8AddrIdx*4+0];
7073 u8SRAMDataIn1 = u8SRAMDataB[u8Idx][u8AddrIdx*4+1];
7074 u8SRAMDataIn2 = u8SRAMDataB[u8Idx][u8AddrIdx*4+2];
7075 u8SRAMDataIn3 = u8SRAMDataB[u8Idx][u8AddrIdx*4+3];
7076
7077 //Write SRAM B
7078 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, u8AddrIdx<<8, 0xff00);//SRAM Addr
7079 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, ((0x1<<u8Idx)&0xFF)<<8, 0xff00);//Choose SRAM
7080 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, (u8SRAMDataIn1<<8) | u8SRAMDataIn0);//SRAM Data
7081 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_75_L, (u8SRAMDataIn3<<8)|u8SRAMDataIn2);//SRAM Data
7082 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x80,0x80);//SRAM write enable
7083 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x00,0x80);//SRAM write disable
7084 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x0000, 0xff00);//Choose no SRAM
7085 }
7086 }
7087 #elif (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_PreSetting(void * pInstance)7088 static void _MDrv_SC_3D_2DTo3D_PreSetting(void *pInstance)
7089 {
7090 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7091 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7092 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7093 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7094
7095 //#define NBLK_DR_H (pXCResourcePrivate->stdrvXC_3D._u8NBLK_DR_H);
7096 //#define NBLK_DR_V (pXCResourcePrivate->stdrvXC_3D._u8NBLK_DR_V);
7097 //#define PANEL_WIDTH (pXCResourcePrivate->stdrvXC_3D._u16PanelWidth)
7098 //#define PANEL_HEIGHT (pXCResourcePrivate->stdrvXC_3D._u16PanelHeight)
7099
7100 //Get panel size output width
7101 MS_BOOL bT3DDE_Use_MainDisplayWindow = _MDrv_Is_T3DDE_UseMainDisplayWindow(pInstance);
7102 if(bT3DDE_Use_MainDisplayWindow)
7103 {
7104 PANEL_WIDTH = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L) + 1;
7105 PANEL_HEIGHT= SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L) + 1;
7106 }
7107 else
7108 {
7109 PANEL_WIDTH = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_04_L) + 1;
7110 PANEL_HEIGHT= SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L) + 1;
7111 }
7112 if(PANEL_WIDTH==0)
7113 PANEL_WIDTH = 0xf00;
7114 if(PANEL_HEIGHT==0)
7115 PANEL_HEIGHT = 0x870;
7116
7117 NBLK_DR_H = ((PANEL_WIDTH + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK); //dr h block
7118 NBLK_DR_V = ((PANEL_HEIGHT + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK); //dr v block
7119
7120 }
7121
_MDrv_SC_3D_2DTo3D_UpdateRGB3DLUT_U9(void * pInstance)7122 static void _MDrv_SC_3D_2DTo3D_UpdateRGB3DLUT_U9(void *pInstance)
7123 {
7124 MS_U8 u8AddrIdx = 0;
7125 MS_U8 u8IdxR = 0, u8IdxG = 0, u8IdxB = 0;
7126 MS_U8 u8Idx = 0;
7127 MS_U8 u8SRAMDataA[8][64];
7128 MS_U8 u8SRAMDataB[8][64];
7129 MS_U8 u8SRAMDataIn0 = 0;
7130 MS_U8 u8SRAMDataIn1 = 0;
7131 MS_U8 u8SRAMDataIn2 = 0;
7132 MS_U8 u8SRAMDataIn3 = 0;
7133 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7134 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7135 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7136 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7137 for(u8AddrIdx =0; u8AddrIdx<64; u8AddrIdx++)
7138 {
7139 u8IdxR = u8AddrIdx&0x03;
7140 u8IdxG = (u8AddrIdx>>2)&0x03;
7141 u8IdxB = (u8AddrIdx>>4)&0x03;
7142 u8SRAMDataA[0][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+0];
7143 u8SRAMDataA[1][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+0];
7144 u8SRAMDataA[2][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+0];
7145 u8SRAMDataA[3][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+0];
7146 u8SRAMDataA[4][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+1];
7147 u8SRAMDataA[5][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+1];
7148 u8SRAMDataA[6][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+1];
7149 u8SRAMDataA[7][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_A[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+1];
7150
7151 u8SRAMDataB[0][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+0];
7152 u8SRAMDataB[1][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+0];
7153 u8SRAMDataB[2][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+0];
7154 u8SRAMDataB[3][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+0];
7155 u8SRAMDataB[4][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+0][u8IdxB*2+1];
7156 u8SRAMDataB[5][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+0][u8IdxB*2+1];
7157 u8SRAMDataB[6][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+0][u8IdxG*2+1][u8IdxB*2+1];
7158 u8SRAMDataB[7][u8AddrIdx] = pXCResourcePrivate->stdrvXC_3D._u8RGB3DLUT_B[u8IdxR*2+1][u8IdxG*2+1][u8IdxB*2+1];
7159 }
7160
7161 //select no SRAM & Enable SRAM write
7162 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x0000);//Choose in TBA,Choose in TBB
7163 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x00,0x80);//SRAM write disable
7164
7165 for(u8Idx =0; u8Idx<8; u8Idx++)
7166 for(u8AddrIdx =0; u8AddrIdx<16; u8AddrIdx++)
7167 {
7168 u8SRAMDataIn0 = u8SRAMDataA[u8Idx][u8AddrIdx*4+0];
7169 u8SRAMDataIn1 = u8SRAMDataA[u8Idx][u8AddrIdx*4+1];
7170 u8SRAMDataIn2 = u8SRAMDataA[u8Idx][u8AddrIdx*4+2];
7171 u8SRAMDataIn3 = u8SRAMDataA[u8Idx][u8AddrIdx*4+3];
7172
7173 //Write SRAM A
7174 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, u8AddrIdx<<8, 0xff00);//SRAM Addr
7175 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, (0x1<<u8Idx)&0xFF, 0xff);//Choose SRAM
7176 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, (u8SRAMDataIn1<<8) | u8SRAMDataIn0);//SRAM Data
7177 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_75_L, (u8SRAMDataIn3<<8)|u8SRAMDataIn2);//SRAM Data
7178 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x80,0x80);//SRAM write enable
7179 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x00,0x80);//SRAM write disable
7180 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x00, 0xff);//Choose no SRAM
7181 }
7182
7183 for(u8Idx =0; u8Idx<8; u8Idx++)
7184 for(u8AddrIdx =0; u8AddrIdx<16; u8AddrIdx++)
7185 {
7186 u8SRAMDataIn0 = u8SRAMDataB[u8Idx][u8AddrIdx*4+0];
7187 u8SRAMDataIn1 = u8SRAMDataB[u8Idx][u8AddrIdx*4+1];
7188 u8SRAMDataIn2 = u8SRAMDataB[u8Idx][u8AddrIdx*4+2];
7189 u8SRAMDataIn3 = u8SRAMDataB[u8Idx][u8AddrIdx*4+3];
7190
7191 //Write SRAM B
7192 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, u8AddrIdx<<8, 0xff00);//SRAM Addr
7193 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, ((0x1<<u8Idx)&0xFF)<<8, 0xff00);//Choose SRAM
7194 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, (u8SRAMDataIn1<<8) | u8SRAMDataIn0);//SRAM Data
7195 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_75_L, (u8SRAMDataIn3<<8)|u8SRAMDataIn2);//SRAM Data
7196 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x80,0x80);//SRAM write enable
7197 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L,0x00,0x80);//SRAM write disable
7198 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x0000, 0xff00);//Choose no SRAM
7199 }
7200 }
7201 #endif
7202 #if (HW_2DTO3D_VER == 4)
MainObjectDetection_U9(void)7203 static void MainObjectDetection_U9(void)//only for bule sky pattern (Golf pattern)
7204 {
7205 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7206 UtopiaResourceGetPrivate(g_pXCResource[E_XC_POOL_ID_INTERNAL_VARIABLE],(void**)(&pXCResourcePrivate));
7207
7208 int x,y;
7209 MS_U8 MaxPosDiff_SkyColor=0;
7210 MS_U8 MaxNegDiff_SkyColor=0;
7211 MS_U32 AvgDiff_SkyColor=0;
7212 MS_U32 Avg_NonSkyColorIdx=0;
7213
7214 MS_U8 MaxPosDiff_TpBGColor=0;
7215 MS_U8 MaxNegDiff_TpBGColor=0;
7216 MS_U32 AvgDiff_TpBGColor=0;
7217 MS_U32 Avg_NonTpBGColorIdx=0;
7218
7219 int Diff;
7220
7221 MS_U8 MainObjWei_SkyColor;
7222 MS_U8 MainObjWei_TpBGColor;
7223
7224 MS_U8 BLK_cnt=0;
7225
7226 MS_U8 tmpColorIdx[NBLK_H_MAX];
7227
7228
7229
7230 BLK_cnt = 0;
7231 //mark the idx of the start of non-sky BLK
7232 for ( x = 0; x < NBLK_DD_H; x ++ )
7233 {
7234 pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x]=0;
7235 pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x]=0;
7236
7237 BLK_cnt = 0;
7238 //for ( y = 0; y < NBLK_DD_V ; y ++ )
7239 for ( y = 1; y < NBLK_DD_V ; y ++ )
7240 {
7241 if(pXCResourcePrivate->stdrvXC_3D._bSkyMarker[y][x])
7242 BLK_cnt++;
7243 }
7244 pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x] = BLK_cnt;
7245
7246 BLK_cnt = 0;
7247 //for ( y = 0; y < NBLK_DD_V ; y ++ )
7248 for ( y = 1; y < NBLK_DD_V ; y ++ )
7249 {
7250 if(pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x])
7251 BLK_cnt++;
7252 }
7253 pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x] = BLK_cnt;
7254 }
7255
7256 //2014.02.10 for high building pattern, median filter for stable statistic data
7257 for ( x = 0; x < NBLK_DD_H; x ++ )
7258 tmpColorIdx[x]=pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x];
7259 for ( x = 1; x < NBLK_DD_H-1; x ++ )
7260 pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x] = MED(pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x-1],pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x],pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x+1]);
7261
7262 for ( x = 0; x < NBLK_DD_H; x ++ )
7263 tmpColorIdx[x]=pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x];
7264 for ( x = 1; x < NBLK_DD_H-1; x ++ )
7265 pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x] = MED(pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x-1],pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x],pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x+1]);
7266
7267
7268 BLK_cnt=0;
7269 //for ( x = NBLK_DD_H/4; x < NBLK_DD_H*3/4; x ++ )
7270 for ( x = NBLK_DD_H/3; x < NBLK_DD_H*2/3; x ++ )
7271 {
7272 BLK_cnt++;
7273
7274 Diff = pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x] -pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x+3];
7275 AvgDiff_SkyColor = AvgDiff_SkyColor + abs(Diff);
7276
7277 if( Diff>=0 && abs(Diff)>MaxPosDiff_SkyColor )
7278 MaxPosDiff_SkyColor = abs(Diff);
7279 if( Diff<=0 && abs(Diff)>MaxNegDiff_SkyColor )
7280 MaxNegDiff_SkyColor = abs(Diff);
7281 }
7282 AvgDiff_SkyColor = AvgDiff_SkyColor;///BLK_cnt;
7283
7284
7285 BLK_cnt=0;
7286 //for ( x = NBLK_DD_H/4; x < NBLK_DD_H*3/4; x ++ )
7287 for ( x = NBLK_DD_H/3; x < NBLK_DD_H*2/3; x ++ )
7288 {
7289 BLK_cnt++;
7290
7291 Diff = pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x] -pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x+3];
7292 AvgDiff_TpBGColor = AvgDiff_TpBGColor + abs(Diff);
7293 if( Diff>=0 && abs(Diff)>MaxPosDiff_TpBGColor )
7294 MaxPosDiff_TpBGColor = abs(Diff);
7295 if( Diff<=0 && abs(Diff)>MaxNegDiff_TpBGColor )
7296 MaxNegDiff_TpBGColor = abs(Diff);
7297 }
7298 AvgDiff_TpBGColor = AvgDiff_TpBGColor;///BLK_cnt;
7299
7300 BLK_cnt=0;
7301 for ( x = NBLK_DD_H/4; x < NBLK_DD_H*3/4; x ++ )
7302 BLK_cnt++;
7303 for ( x = NBLK_DD_H/4; x < NBLK_DD_H*3/4; x ++ )
7304 Avg_NonSkyColorIdx=Avg_NonSkyColorIdx+pXCResourcePrivate->stdrvXC_3D._u8NonSkyColorIdx[x];
7305 for ( x = NBLK_DD_H/4; x < NBLK_DD_H*3/4; x ++ )
7306 Avg_NonTpBGColorIdx=Avg_NonTpBGColorIdx+pXCResourcePrivate->stdrvXC_3D._u8NonTpBGColorIdx[x];
7307
7308 Avg_NonSkyColorIdx = Avg_NonSkyColorIdx/BLK_cnt;
7309 Avg_NonTpBGColorIdx=Avg_NonTpBGColorIdx/BLK_cnt;
7310
7311 #if 0
7312 MainObjWei_SkyColor = MaxPosDiff_SkyColor + MaxNegDiff_SkyColor;
7313 MainObjWei_TpBGColor= MaxPosDiff_TpBGColor+ MaxNegDiff_TpBGColor;
7314 #else
7315 MainObjWei_SkyColor = MAX(MaxPosDiff_SkyColor, MaxNegDiff_SkyColor)*2;
7316 MainObjWei_TpBGColor= MAX(MaxPosDiff_TpBGColor, MaxNegDiff_TpBGColor)*2;
7317 #endif
7318 //printf("\nSk %d %d %d",MaxPosDiff_SkyColor,MaxNegDiff_SkyColor,Avg_NonSkyColorIdx);
7319 //printf("\nBG %d %d %d",MaxPosDiff_TpBGColor,MaxNegDiff_TpBGColor,Avg_NonTpBGColorIdx);
7320
7321 //MainObjWei = MIN( MAX(MainObjWei_SkyColor-MAX(4,Avg_NonSkyColorIdx/4),0), 32);
7322 //2014.02.06 add by CL, for LG subtitle pattern
7323 //MainObjWei = MIN( max3(MainObjWei_SkyColor-MAX(4,Avg_NonSkyColorIdx/4),MainObjWei_TpBGColor-MAX(4,Avg_NonTpBGColorIdx/4),0), 32);
7324
7325 MS_U8 MainObjWeiSky = MIN( MAX(MainObjWei_SkyColor*2-MAX(8,Avg_NonSkyColorIdx),0), 32);
7326 MS_U8 MainObjWeiBGC = MIN( MAX(MainObjWei_TpBGColor*2-MAX(8,Avg_NonTpBGColorIdx),0), 32);
7327
7328 MS_BOOL isBlue = (pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp>=132&&pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp<=192)&&(pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp>=56&&pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp<=124);
7329 MS_BOOL isWCloud = (pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp>=124&&pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp<=152)&&(pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp>=104&&pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp<=132);
7330
7331 //MainObjWei = MIN( max3(MainObjWei_SkyColor*2-MAX(8,Avg_NonSkyColorIdx),MainObjWei_TpBGColor*2-MAX(8,Avg_NonTpBGColorIdx),0), 32);
7332 if(isBlue||isWCloud)
7333 pXCResourcePrivate->stdrvXC_3D._u8MainObjWei = MainObjWeiSky;
7334 else
7335 pXCResourcePrivate->stdrvXC_3D._u8MainObjWei = MAX(MainObjWeiSky,MainObjWeiBGC);
7336
7337
7338 }
7339 #endif
7340 #if (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_TrendDetection(void * pInstance)7341 static void _MDrv_SC_3D_2DTo3D_TrendDetection(void *pInstance)
7342 {
7343 //for Global Variable
7344
7345 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7346 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7347 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7348 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7349
7350 MS_S16 x,y;
7351 //int OUTIN_Ratio_Ver,OUTIN_Ratio_Hor;
7352 MS_S32 HorCplxSum,VerCplxSum;
7353 MS_S16 CplxTimes;
7354
7355 CplxTimes = 2;
7356
7357 MS_U8 VerTrend_1D[NBLK_V_MAX]={0};
7358 MS_U8 HorTrend_1D[NBLK_H_MAX]={0};
7359
7360 MS_S32 VerTrendDiff_Max=0;
7361 MS_S32 VerTrendDiff=0;
7362 MS_S32 VerTrendDiff_Sum1=0;
7363 MS_S32 VerTrendDiff_Sum2=0;
7364 MS_S32 VerTrendDiff_Sum =0;
7365
7366 MS_S32 VerTrendCplx_min=255;
7367 MS_S32 VerTrendCplx_Max=0;
7368
7369 MS_S32 HorTrendCplx_min=255;
7370 MS_S32 HorTrendCplx_Max=0;
7371 memset(HorTrend_1D,0,(sizeof(MS_U8)*NBLK_H_MAX));
7372
7373 for ( y = 0; y < NBLK_DD_V ; y ++ )
7374 {
7375 HorCplxSum = 0;
7376 for ( x = 0; x < NBLK_DD_H; x ++ )
7377 {
7378 HorCplxSum = HorCplxSum + pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
7379 }
7380 HorCplxSum = HorCplxSum/NBLK_DD_H;
7381 HorCplxSum = MINMAX(HorCplxSum*CplxTimes,0,255);
7382
7383 VerTrend_1D[y]=HorCplxSum;
7384 }
7385
7386 for ( x = 0; x < NBLK_DD_H ; x ++ )
7387 {
7388 VerCplxSum = 0;
7389 for ( y = 0; y < NBLK_DD_V; y ++ )
7390 {
7391 VerCplxSum = VerCplxSum + pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
7392 }
7393 VerCplxSum = VerCplxSum/NBLK_DD_V;
7394 VerCplxSum = MINMAX(VerCplxSum*CplxTimes,0,255);
7395
7396 HorTrend_1D[x] = VerCplxSum;
7397 }
7398
7399
7400 for( y = NBLK_DD_V/8; y < NBLK_DD_V*7/8 ; y ++ )
7401 {
7402 VerTrendDiff = VerTrend_1D[y]-VerTrend_1D[y+1];
7403
7404 VerTrendDiff_Sum1 = VerTrendDiff_Sum1 + VerTrendDiff;
7405 VerTrendDiff_Max = MAX(VerTrendDiff_Max,abs(VerTrendDiff));
7406
7407 if(y >= NBLK_DD_V/2)
7408 VerTrendDiff_Sum2 = VerTrendDiff_Sum2 + VerTrendDiff;
7409 }
7410
7411 //VerTrendDiff_Sum = MAX(VerTrendDiff_Sum1,VerTrendDiff_Sum2);
7412 VerTrendDiff_Sum = MAX(VerTrendDiff_Sum1,0)+MAX(VerTrendDiff_Sum2,0);
7413
7414 for( y = NBLK_DD_V/8; y < NBLK_DD_V*7/8 ; y ++ )
7415 {
7416 VerTrendCplx_min = MIN(VerTrendCplx_min,VerTrend_1D[y]);
7417 VerTrendCplx_Max = MAX(VerTrendCplx_Max,VerTrend_1D[y]);
7418 }
7419
7420 for( x = NBLK_DD_H/8; x < NBLK_DD_H*7/8 ; x ++ )
7421 {
7422 HorTrendCplx_min = MIN(HorTrendCplx_min,HorTrend_1D[x]);
7423 HorTrendCplx_Max = MAX(HorTrendCplx_Max,HorTrend_1D[x]);
7424 }
7425
7426 /*
7427 if((SC_R2BYTE(REG_SC_BK23_20_L)&0x0008)==8)
7428 {
7429 printf("[%d %d !%d @%d]\r\n",HorTrendCplx_min,HorTrendCplx_Max,MINMAX((2*HorTrendCplx_min-HorTrendCplx_Max-12),0,32),MINMAX(((HorTrendCplx_min-HorTrendCplx_Max)+50)*MINMAX(HorTrendCplx_min,0,40)/40,0,32));
7430 }
7431 */
7432
7433 MS_S32 VerTrendDiff_Sum_Wei;
7434 MS_S32 VerTrendDiff_Max_Wei;
7435
7436 MS_S32 VerTrendCplx_Max_Wei;
7437 MS_S32 VerTrendCplx_min_Wei;
7438
7439 MS_S32 HorTrendCplx_Max_Wei;
7440 MS_S32 HorTrendCplx_min_Wei;
7441
7442 MS_S32 VerTrendCplx_Range_Wei;
7443
7444 MS_S32 times,timesH,timesV;
7445 //times = 0x56;//MFC_ReadByte(REG_1EFB);
7446 times = 0x52;
7447 timesH = times&0x0F;
7448 timesV = (times&0xF0)>>4;
7449
7450 VerTrendDiff_Sum_Wei = MINMAX(VerTrendDiff_Sum-4,0,16);//>>4
7451 VerTrendDiff_Max_Wei = MINMAX(32-VerTrendDiff_Max, 0, 16);//8~16 >>4
7452
7453 //VerTrendCplx_Max_Wei = MINMAX((VerTrendCplx_min*4+32) - VerTrendCplx_Max, 0, 32);// >>5
7454 //VerTrendCplx_min_Wei = MINMAX(VerTrendCplx_min,0,16);//>>4
7455 VerTrendCplx_Max_Wei = MINMAX((VerTrendCplx_min*timesV+32) - VerTrendCplx_Max, 0, 32);// >>5//timesV=5
7456 VerTrendCplx_min_Wei = MINMAX(VerTrendCplx_min+4,0,16);//>>4
7457
7458 //HorTrendCplx_Max_Wei = MINMAX((HorTrendCplx_min*timesH/2+32) - HorTrendCplx_Max, 0, 32);//>>5//timesH=5
7459 //2014.02.05 for seafood outdoor false detection
7460 //HorTrendCplx_Max_Wei = MINMAX((HorTrendCplx_min*timesH-12) - HorTrendCplx_Max, 0, 32);//>>5//timesH=5
7461 //2014.05.30 for lm14 pic mode
7462 HorTrendCplx_Max_Wei = MINMAX(((HorTrendCplx_min-HorTrendCplx_Max)+50)*MINMAX(HorTrendCplx_min,0,40)/40,0,32);
7463 HorTrendCplx_min_Wei = MINMAX(HorTrendCplx_min,0,16);//>>4
7464
7465 VerTrendCplx_Range_Wei = MINMAX((VerTrendCplx_min_Wei+VerTrendDiff_Sum+32)-VerTrendCplx_Max,0,32);
7466
7467 //VerGLB_Wei = (VerTrendDiff2_Max_Wei*HorTrendCplx_min_Wei*VerTrendDiff_Sum_Wei*VerTrendDiff_Max_Wei*VerTrendCplx_min_Wei)>>14;//8,16,16,16,16
7468 pXCResourcePrivate->stdrvXC_3D.u8VerGLB_Wei = (VerTrendDiff_Sum_Wei*VerTrendCplx_Max_Wei*VerTrendCplx_min_Wei*HorTrendCplx_Max_Wei*HorTrendCplx_min_Wei)>>17;//16,32,16,32,16
7469 /*if((SC_R2BYTE(REG_SC_BK23_20_L)&0x0001)==1)
7470 printf("[%d %d %d %d %d]\r\n",VerTrendDiff_Sum_Wei,VerTrendCplx_Max_Wei,VerTrendCplx_min_Wei,HorTrendCplx_Max_Wei,HorTrendCplx_min_Wei);
7471 */
7472 //VerGLB_Wei = (VerTrendCplx_Range_Wei*VerTrendDiff_Sum_Wei*VerTrendCplx_Max_Wei*VerTrendCplx_min_Wei*HorTrendCplx_Max_Wei*HorTrendCplx_min_Wei)>>22;//32,16,32,16,32,16
7473 #if 0
7474 {
7475 printf("\nVS %d, VM %d, Vm %d, HM %d, Hm %d",VerTrendDiff_Sum_Wei,VerTrendCplx_Max_Wei,VerTrendCplx_min_Wei,HorTrendCplx_Max_Wei,HorTrendCplx_min_Wei);
7476 printf("\nGLB=%d",VerGLB_Wei);
7477 }
7478 #endif
7479
7480
7481 }
7482 #endif
7483
7484
7485 #if (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_DepthDetectionTmp(void * pInstance)7486 static void _MDrv_SC_3D_2DTo3D_DepthDetectionTmp(void *pInstance)
7487 {
7488 //for Global Variable
7489
7490 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7491 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7492 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7493 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7494
7495 #if 1
7496 MS_U16 x,y,idx_x,idx_y;
7497 MS_U8 BLKWeight,BLKDepth;
7498 MS_U16 RVal,GVal,BVal,YVal;
7499 MS_U16 OUTIN_Ratio_Ver,OUTIN_Ratio_Hor;
7500 MS_U16 EDGEVal,YMinMaxDiff;
7501
7502
7503 MS_U8 u8testval_1EFE = 128;//MFC_ReadByte(REG_1EFE);
7504
7505
7506 if(NBLK_DR_V>NBLK_DD_V)
7507 {
7508 OUTIN_Ratio_Ver = NBLK_DR_V/NBLK_DD_V;
7509 }
7510 else
7511 {
7512 OUTIN_Ratio_Ver = NBLK_DD_V/NBLK_DR_V;
7513 }
7514
7515 if(NBLK_DR_H>NBLK_DD_H)
7516 {
7517 OUTIN_Ratio_Hor = NBLK_DR_H/NBLK_DD_H;
7518 }
7519 else
7520 {
7521 OUTIN_Ratio_Hor = NBLK_DD_H/NBLK_DR_H;
7522 }
7523 for ( y = 0; y < NBLK_DR_V ; y ++ )
7524 for ( x = 0; x < NBLK_DR_H; x ++ )
7525 {
7526 if(NBLK_DR_H>NBLK_DD_H)
7527 {
7528 idx_x = x/OUTIN_Ratio_Hor;
7529 }
7530 else
7531 {
7532 idx_x = x*OUTIN_Ratio_Hor;
7533 }
7534
7535 if(NBLK_DR_V>NBLK_DD_V)
7536 {
7537 idx_y = y/OUTIN_Ratio_Ver;
7538 }
7539 else
7540 {
7541 idx_y = y*OUTIN_Ratio_Ver;
7542 }
7543
7544 RVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[idx_y][idx_x].R;
7545 GVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[idx_y][idx_x].G;
7546 BVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[idx_y][idx_x].B;
7547 EDGEVal = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[idx_y][idx_x];
7548 YVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[idx_y][idx_x].G;
7549 YMinMaxDiff = pXCResourcePrivate->stdrvXC_3D._field[(idx_y)*NBLK_DD_H+(idx_x)];
7550
7551 if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x01)
7552 {
7553 BLKWeight = MINMAX((RVal+GVal+BVal)/3,0,255);
7554 BLKDepth = MINMAX((RVal+GVal+BVal)/3,0,255);
7555 }
7556 else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x02)
7557 {
7558 BLKWeight = MINMAX(RVal,0,255);
7559 BLKDepth = MINMAX(RVal,0,255);
7560 }
7561 else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x03)
7562 {
7563 BLKWeight = MINMAX(GVal,0,255);
7564 BLKDepth = MINMAX(GVal,0,255);
7565 }
7566 else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x04)
7567 {
7568 BLKWeight = MINMAX(BVal,0,255);
7569 BLKDepth = MINMAX(BVal,0,255);
7570 }
7571 else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x05)
7572 {
7573 BLKWeight = MINMAX(EDGEVal,0,255);
7574 BLKDepth = MINMAX(EDGEVal,0,255);
7575 }
7576 else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x06)
7577 {
7578 BLKWeight = ((x+y)*5);
7579 BLKDepth = ((x+y)*5);
7580 }
7581 else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x07)
7582 {
7583 BLKWeight = ((x+y)<<2);
7584 BLKDepth = ((x+y)<<2);
7585 }
7586 else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x08)
7587 {
7588 BLKWeight = (pXCResourcePrivate->stdrvXC_3D._bSkyMarker[idx_y][idx_x])?200:0;
7589 BLKDepth = (pXCResourcePrivate->stdrvXC_3D._bSkyMarker[idx_y][idx_x])?200:0;
7590 }
7591 else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x09)
7592 {
7593 BLKWeight = (pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[idx_y][idx_x])?200:0;
7594 BLKDepth = (pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[idx_y][idx_x])?200:0;
7595 }
7596 else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0A)
7597 {
7598 BLKWeight =(EDGEVal>=u8testval_1EFE)?200:0;
7599 BLKDepth = (EDGEVal>=u8testval_1EFE)?200:0;
7600 }
7601 else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0B)
7602 {
7603 BLKWeight =(YVal>=u8testval_1EFE)?200:0;
7604 BLKDepth = (YVal>=u8testval_1EFE)?200:0;
7605 }
7606 else if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0C)
7607 {
7608 BLKWeight =(YMinMaxDiff>=u8testval_1EFE)?200:0;
7609 BLKDepth = (YMinMaxDiff>=u8testval_1EFE)?200:0;
7610 }
7611 else// if(DBG_En==0x05)
7612 {
7613 BLKWeight = 0;
7614 BLKDepth = 0;
7615 }
7616 //BLKWeight = MINMAX(RVal,0,255);//MINMAX(x+y,0,255);
7617 //BLKDepth = MINMAX(GVal,0,255);//MINMAX(x+y,0,255);
7618
7619 pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x] = BLKWeight;
7620 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = BLKDepth;
7621 }
7622 #if ENABLE_T3D_DEBUG
7623 if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0F)
7624 {
7625 MS_U32 dummy_x = (SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_5A_L)&0x00FF);
7626 MS_U32 dummy_y = (SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_5A_L)&0xFF00)>>8;
7627 RVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[dummy_y/OUTIN_Ratio_Ver][dummy_x/OUTIN_Ratio_Hor].R;
7628 GVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[dummy_y/OUTIN_Ratio_Ver][dummy_x/OUTIN_Ratio_Hor].G;
7629 BVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[dummy_y/OUTIN_Ratio_Ver][dummy_x/OUTIN_Ratio_Hor].B;
7630 EDGEVal = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[dummy_y/OUTIN_Ratio_Ver][dummy_x/OUTIN_Ratio_Hor];
7631 YVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[dummy_y/OUTIN_Ratio_Ver][dummy_x/OUTIN_Ratio_Hor].G;
7632 MS_U16 CbVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[dummy_y/OUTIN_Ratio_Ver][dummy_x/OUTIN_Ratio_Hor].B;
7633 MS_U16 CrVal = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[dummy_y/OUTIN_Ratio_Ver][dummy_x/OUTIN_Ratio_Hor].R;
7634 printf("\n");
7635 printf("DDH:%d, DDV:%d\n",NBLK_DD_H,NBLK_DD_V);
7636 printf("DRH:%d, DRV:%d\n",NBLK_DR_H,NBLK_DR_V);
7637 printf("BSR1=%d, BSR2=%d\n",pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1,pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio2);
7638 printf("BGCb:%d, BGCr:%d\n",pXCResourcePrivate->stdrvXC_3D.BGColor_CbTp,pXCResourcePrivate->stdrvXC_3D.BGColor_CrTp);
7639 printf("[RGB]=[%d,%d,%d]\n",RVal,GVal,BVal);
7640 printf("[edge]=[%d]\n",EDGEVal);
7641 printf("[YCbCr]=[%d,%d,%d]\n",YVal,CbVal,CrVal);
7642
7643 printf("\n");
7644 }
7645 #endif
7646 #endif
7647
7648
7649 #if 0
7650 //S16 CurDepthA,CurDepthB;
7651 U8 rIdx,gIdx,bIdx;
7652
7653 for ( rIdx = 0; rIdx < 8; rIdx++ )
7654 for ( gIdx = 0; gIdx < 8; gIdx++ )
7655 for ( bIdx = 0; bIdx < 8; bIdx++ )
7656 {
7657 _RGB3DLUT_A[rIdx][gIdx][bIdx] = rIdx*32;
7658 _RGB3DLUT_B[rIdx][gIdx][bIdx] = rIdx*32;
7659 }
7660 #endif
7661
7662 }
7663 #endif
7664
7665 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_DepthDetectionPIX(void * pInstance)7666 static void _MDrv_SC_3D_2DTo3D_DepthDetectionPIX(void *pInstance)
7667 {
7668 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7669 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7670 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7671 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7672 MS_S16 s16BlueAndFlatBlkCnt = 0;
7673 MS_S16 s16BlueAndFlatBlkCnt_Dn = 0;
7674 MS_S16 x = 0, y = 0;
7675 PIXEL stPP;
7676 MS_S16 s16MaxEdgeRGB = 0, s16BlkSat = 0;
7677 MS_BOOL bBlue = FALSE, bWCloud = FALSE;
7678 MS_BOOL bBGCOLOR_Tp = FALSE, bBGCOLOR_Dn = FALSE;
7679 MS_S16 s16BlueSkyRatio1 = 0, s16BlueSkyRatio2 = 0;
7680 MS_S16 s16NonSkyRate = 0;
7681 MS_S8 i = 0, j = 0;
7682 MS_U32 u32SumEdge = 0;
7683 //IIR related
7684 MS_S16 s16DistantViewRatio1 = 0, s16DistantViewRatio2 = 0;
7685 MS_S16 s16Index_BL = 0;
7686 MS_U8 u8RegionBlkWeightFrame_Tmp[NBLK_V_MAX][NBLK_H_MAX];
7687 MS_S16 s16OutIn_Ratio_Ver = 0, s16OutIn_Ratio_Hor = 0;
7688 MS_S16 s16Cur_YSep = 0;
7689 MS_U32 u32RegionBlkWei = 0;
7690 MS_U32 u32PreRegionBlkWei = 0;
7691 MS_U32 u32ScalingRatio = DISPLAY_DD_H*DISPLAY_DD_V*1000/FHD_W/FHD_H;
7692 MS_U32 u32VRatio = gSrcInfo[MAIN_WINDOW].stDispWin.height*10/DISPLAY_DD_V;
7693 MS_U32 u32HRatio = gSrcInfo[MAIN_WINDOW].stDispWin.width*10/DISPLAY_DD_H;
7694
7695 MS_WINDOW_TYPE stDispWin;
7696 memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
7697 MDrv_XC_get_dispwin_from_reg(pInstance, MAIN_WINDOW, &stDispWin);
7698 if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW] == E_XC_3D_INPUT_MODE_NONE)
7699 {
7700 u32VRatio = stDispWin.height*10/DISPLAY_DD_V;
7701 u32HRatio = stDispWin.width*10/DISPLAY_DD_H;
7702 }
7703
7704 memset(&stPP, 0, sizeof(PIXEL));
7705 if(u32ScalingRatio == 0)
7706 {
7707 u32ScalingRatio = 1;
7708 }
7709
7710 _MDrv_SC_3D_2DTo3D_BGColorDetection(pInstance);
7711
7712 s16BlueAndFlatBlkCnt = 0;
7713 s16BlueAndFlatBlkCnt_Dn = 0;
7714
7715 pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt = 0;
7716 pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt = 0;
7717
7718 #if BACKLIGHTIIR
7719 //inital IIR buffer
7720 if(pXCResourcePrivate->stdrvXC_3D.s_bFirst)
7721 {
7722 MS_U8 u8IdxR = 0, u8IdxG = 0, u8IdxB = 0;
7723 MS_U8 x = 0, y = 0;
7724 for(u8IdxR=0;u8IdxR<8;u8IdxR++)
7725 for(u8IdxG=0;u8IdxG<8;u8IdxG++)
7726 for(u8IdxB=0;u8IdxB<8;u8IdxB++)
7727 {
7728 pXCResourcePrivate->stdrvXC_3D.u16Pre_RGB3DLUT_A[u8IdxR][u8IdxG][u8IdxB] = 128<<4;//.4
7729 pXCResourcePrivate->stdrvXC_3D.u16Pre_RGB3DLUT_B[u8IdxR][u8IdxG][u8IdxB] = 128<<4;//.4
7730 }
7731
7732 for(y=0;y<NBLK_DR_V;y++)
7733 for(x=0;x<NBLK_DR_H;x++)
7734 {
7735 pXCResourcePrivate->stdrvXC_3D.u16Pre_depthBlkBased[y][x] = 128<<4;//.4
7736 pXCResourcePrivate->stdrvXC_3D.u16Pre_RegionBlkWeightFrame[y][x] = 128<<4;//.4
7737 }
7738 pXCResourcePrivate->stdrvXC_3D.s_bFirst = FALSE;
7739 }
7740
7741 if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
7742 {
7743 s16Cur_YSep = (_MDrv_SC_3D_2DTo3D_HorizontalDetection(pInstance))<<4;
7744 pXCResourcePrivate->stdrvXC_3D._u16Y_Sep = ( pXCResourcePrivate->stdrvXC_3D.u16Pre_YSep * pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight + s16Cur_YSep * (128 -pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) +64)>>7; // do IIR
7745 pXCResourcePrivate->stdrvXC_3D.u16Pre_YSep = pXCResourcePrivate->stdrvXC_3D._u16Y_Sep;
7746 pXCResourcePrivate->stdrvXC_3D._u16Y_Sep = (pXCResourcePrivate->stdrvXC_3D._u16Y_Sep+8)>>4;
7747 }
7748 else
7749 {
7750 pXCResourcePrivate->stdrvXC_3D._u16Y_Sep = _MDrv_SC_3D_2DTo3D_HorizontalDetection(pInstance);
7751 }
7752 #else
7753 pXCResourcePrivate->stdrvXC_3D._u16Y_Sep = _MDrv_SC_3D_2DTo3D_HorizontalDetection(pInstance);
7754 #endif
7755
7756 pXCResourcePrivate->stdrvXC_3D._u16Y_Sep_OUT = pXCResourcePrivate->stdrvXC_3D._u16Y_Sep*u32VRatio/10;
7757
7758 #if PRINTINFO
7759 printf("=====_u16Y_Sep=====\n");
7760 printf("_u16Y_Sep_OUT = %u\n", pXCResourcePrivate->stdrvXC_3D._u16Y_Sep_OUT);
7761 #endif
7762 for ( y = 0; y < NBLK_DD_V ; y ++ )
7763 {
7764 for ( x = 0; x < NBLK_DD_H; x ++ )
7765 {
7766 s16MaxEdgeRGB = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
7767
7768 stPP = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
7769 //bBlue = s16MaxEdgeRGB < 10 && stPP.B > 100 && stPP.B > stPP.R*1.25 && stPP.B > stPP.G && stPP.G > stPP.R; //latest by CL
7770 // bBlue = s16MaxEdgeRGB < 16 && stPP.B > 100 && stPP.B > stPP.R*1.25 && stPP.B > stPP.G && stPP.G > stPP.R;
7771 //bBlue = s16MaxEdgeRGB < 10 && stPP.B > 100 && stPP.B > stPP.G && stPP.G > stPP.R; //by tomato
7772 bBlue = (s16MaxEdgeRGB < 10) && (stPP.B > 100) && (stPP.B > (stPP.R*5/4)) && (stPP.B > stPP.G) && (stPP.G > stPP.R); //latest by CL
7773
7774 s16BlkSat = (MAX3(stPP.R,stPP.G,stPP.B)==0)?0:((MAX3(stPP.R,stPP.G,stPP.B)-MIN3(stPP.R,stPP.G,stPP.B))*256)/MAX3(stPP.R,stPP.G,stPP.B);
7775 //bWCloud = (s16MaxEdgeRGB < 10) && MIN3(stPP.R,stPP.G,stPP.B)>210 && s16BlkSat<24 && (y <= NBLK_V/4);
7776 //bWCloud = (s16MaxEdgeRGB < 10) && MIN3(stPP.R,stPP.G,stPP.B)>200 && s16BlkSat<24 && (y <= NBLK_V/4);
7777 //bWCloud = (s16MaxEdgeRGB < 10) && MIN3(stPP.R,stPP.G,stPP.B)>190 && s16BlkSat<52 && (y <= NBLK_V/4);
7778 bWCloud = (s16MaxEdgeRGB < 10) && MIN(stPP.R,stPP.G)>170&& stPP.B>190 && s16BlkSat<52 && (y <= NBLK_DD_V/4);
7779
7780 bBlue = (bBlue||bWCloud);
7781
7782 if ( bBlue ) // upper & white
7783 {
7784 //if(y<=NBLK_V/4)// 2012.11.30 modify by CL
7785 if(y<=NBLK_DD_V/4&& x>=NBLK_DD_H/4 && x<=NBLK_DD_H*3/4 )// 2012.11.30 modify by CL
7786 s16BlueAndFlatBlkCnt=s16BlueAndFlatBlkCnt+2;
7787 else
7788 s16BlueAndFlatBlkCnt ++;
7789 }
7790
7791 if(bBlue&&y>=NBLK_DD_V*3/4)
7792 s16BlueAndFlatBlkCnt_Dn++;
7793 //for both BlueSky & BG color
7794 bBGCOLOR_Tp = pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x];
7795 bBGCOLOR_Dn = pXCResourcePrivate->stdrvXC_3D._bDnBGColorMarker[y][x];
7796
7797 if(bBGCOLOR_Tp && bBlue)
7798 pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt++;
7799
7800 if(bBGCOLOR_Dn && bBlue)
7801 pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt++;
7802 }
7803 }
7804
7805 pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueAndFlatBlkCnt = s16BlueAndFlatBlkCnt;
7806 pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueAndFlatBlkCnt_Dn = s16BlueAndFlatBlkCnt_Dn;
7807
7808 //_s16BothTpBGSKY_COLORCnt = MINMAX(_s16BothTpBGSKY_COLORCnt/(FRAME_WIDTH*FRAME_HEIGHT/FHD_W/FHD_H),0,32);
7809 //_s16BothDnBGSKY_COLORCnt = MINMAX(_s16BothDnBGSKY_COLORCnt/(FRAME_WIDTH*FRAME_HEIGHT/FHD_W/FHD_H),0,32);
7810 pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt = MINMAX(pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt*1000/u32ScalingRatio/2,0,32);
7811 pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt = MINMAX(pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt*1000/u32ScalingRatio/2,0,32);
7812
7813 s16BlueSkyRatio1 = MINMAX( s16BlueAndFlatBlkCnt*1000/u32ScalingRatio/2, 0, 32 );
7814 s16BlueSkyRatio2 = MINMAX( s16BlueAndFlatBlkCnt_Dn*1000/u32ScalingRatio/2, 0, 32 );
7815
7816 #if PRINTINFO
7817 printf("Cnt =%u, Rat1=%u, PR1=%u\n", s16BlueAndFlatBlkCnt,s16BlueSkyRatio1,pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1);
7818 printf("CntD=%u, Rat2=%u, PR2=%u\n", s16BlueAndFlatBlkCnt_Dn,s16BlueSkyRatio2,pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2);
7819 #endif
7820
7821 s16BlueSkyRatio1 = MAX(MAX(s16BlueSkyRatio1,pXCResourcePrivate->stdrvXC_3D._s16DistantViewWei),0);
7822 s16BlueSkyRatio2 = MAX(s16BlueSkyRatio2,0);
7823
7824 s16BlueSkyRatio1 = MINMAX(s16BlueSkyRatio1,0,32);
7825 s16BlueSkyRatio2 = MINMAX(s16BlueSkyRatio2,0,32);
7826
7827 // keeps sky ratio stable
7828 {
7829 if(abs(s16BlueSkyRatio1-pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1)<=3 &&abs(s16BlueSkyRatio2-pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2)<=3)
7830 {
7831 s16BlueSkyRatio1 = pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1;
7832 s16BlueSkyRatio2 = pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2;
7833 }
7834
7835 if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
7836 {
7837 s16BlueSkyRatio1 = (pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+s16BlueSkyRatio1*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
7838 s16BlueSkyRatio2 = (pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+s16BlueSkyRatio2*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
7839 }
7840
7841 pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1 = s16BlueSkyRatio1;
7842 pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2 = s16BlueSkyRatio2;
7843 }
7844
7845 pXCResourcePrivate->stdrvXC_3D._s16BlueSkyRatio = s16BlueSkyRatio1;
7846
7847 #if PRINTINFO
7848 printf("BSCnt =%u\n", pXCResourcePrivate->stdrvXC_3D._s16BothTpBGSKY_COLORCnt);
7849 printf("BSCntD=%u\n", pXCResourcePrivate->stdrvXC_3D._s16BothDnBGSKY_COLORCnt);
7850 printf("DistantViewRatio1_Cur = %u, DistantViewRatio2_Cur = %u\n",s16BlueSkyRatio1,s16BlueSkyRatio2);
7851 #endif
7852
7853 #if BACKLIGHTIIR
7854 if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
7855 {
7856 #if PRINTINFO
7857 printf("In IIR Processing\n");
7858 printf("DistantViewRatio1_Cur = %u, DistantViewRatio2_Cur = %u\n",s16BlueSkyRatio1,s16BlueSkyRatio2);
7859 printf("DistantViewRatio1_Pre = %u, DistantViewRatio2_Pre = %u\n",pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio1>>4,pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio2>>4);
7860 #endif
7861 s16DistantViewRatio1 = s16BlueSkyRatio1<<4;
7862 s16DistantViewRatio2 = s16BlueSkyRatio2<<4;
7863
7864 s16DistantViewRatio1 = (pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio1*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+s16DistantViewRatio1*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
7865 s16DistantViewRatio2 = (pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio2*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+s16DistantViewRatio2*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
7866
7867 pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio1 = s16DistantViewRatio1;
7868 pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio2 = s16DistantViewRatio2;
7869
7870 s16DistantViewRatio1 = (s16DistantViewRatio1+8)>>4;
7871 s16DistantViewRatio2 = (s16DistantViewRatio2+8)>>4;
7872 #if PRINTINFO
7873 printf("DistantViewRatio1_new = %u, DistantViewRatio2_new = %u\n",s16DistantViewRatio1,s16DistantViewRatio2);
7874 #endif
7875
7876 }
7877 else
7878 {
7879 s16DistantViewRatio1 = s16BlueSkyRatio1;
7880 s16DistantViewRatio2 = s16BlueSkyRatio2;
7881 }
7882 #else
7883 s16DistantViewRatio1 = s16BlueSkyRatio1;
7884 s16DistantViewRatio2 = s16BlueSkyRatio2;
7885 #endif
7886
7887 pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3 = MINMAX(s16DistantViewRatio1-s16DistantViewRatio2,0,32);//DView weight
7888 s16OutIn_Ratio_Ver = MAX(u32VRatio, 10);
7889 s16OutIn_Ratio_Hor = MAX(u32HRatio, 10);
7890
7891 for ( y = 0; y < NBLK_DD_V; y ++ )
7892 {
7893 for ( x = 0; x < NBLK_DD_H; x ++ )
7894 {
7895 // ---------default method ----------------//
7896 //int s16NonSkyRate = _u16BlockStatus_Edge[y/_u8Vertical_Step][x/_u8Horizontal_Step]; // edge
7897 //s16NonSkyRate = MAX( s16NonSkyRate, 256 - s16BlueSkyRatio1*8 );
7898 //s16NonSkyRate = MAX( s16NonSkyRate, y*256/FRAME_HEIGHT ); // vertical position
7899 //s16NonSkyRate = MINMAX(s16NonSkyRate- s16BlueSkyRatio2*4,0,MAXVALUE);// for full blue sky background
7900 //--------------end of default method ----------------//
7901
7902 s16NonSkyRate = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x]; // edge
7903 s16NonSkyRate = MAX( s16NonSkyRate, 256 - s16BlueSkyRatio1*8 );
7904
7905 if(NBLK_DD_V == 0)
7906 {
7907 s16NonSkyRate = MAX( s16NonSkyRate, y*256); // vertical position
7908 }
7909 else
7910 {
7911 s16NonSkyRate = MAX( s16NonSkyRate, (y*256)/NBLK_DD_V ); // vertical position
7912 }
7913
7914 //s16NonSkyRate = MAX( s16NonSkyRate, new_y*256/(FRAME_HEIGHT-_u16Y_Sep)); // vertical position
7915 s16NonSkyRate = MINMAX(s16NonSkyRate- s16BlueSkyRatio2*8,0,MAXVALUE);// for full blue sky background
7916 s16NonSkyRate = MINMAX( s16NonSkyRate, 0, MAXVALUE );
7917
7918 u8RegionBlkWeightFrame_Tmp[y][x] = s16NonSkyRate;
7919 }
7920 }
7921
7922 #if PRINTINFO
7923 printf("_s16DistantViewWei = %u, _s16DistantViewWei_Bottom = %u\n",pXCResourcePrivate->stdrvXC_3D._s16DistantViewWei,pXCResourcePrivate->stdrvXC_3D._s16DistantViewWei_Bottom);
7924 #endif
7925
7926 // LPF of _u8RegionBlkWeightFrame
7927 for ( y = 0; y < NBLK_DR_V; y ++ )
7928 {
7929 for ( x = 0; x < NBLK_DR_H; x ++ )
7930 {
7931 // 5x5 LPF
7932 u32SumEdge = MAXVALUE;
7933
7934 if(x>=1&&x<NBLK_DR_H-1&&y>=1&&y<NBLK_DR_V-1)//boundary case
7935 {
7936 for ( i = -1; i <= 1; i ++ )
7937 for ( j = -1; j <= 1; j ++ )
7938 {
7939 u32SumEdge = MIN( u32SumEdge, u8RegionBlkWeightFrame_Tmp[(y+j)*10/s16OutIn_Ratio_Ver][(x+i)*10/s16OutIn_Ratio_Hor]);
7940 //u32SumEdge += u8RegionBlkWeightFrame_Tmp[y+j][x+i];
7941 }
7942 }
7943 else//boundary case
7944 {
7945 for ( i = -1; i <= 1; i ++ )
7946 for ( j = -1; j <= 1; j ++ )
7947 {
7948 u32SumEdge = MIN( u32SumEdge, u8RegionBlkWeightFrame_Tmp[MINMAX(y+j,0,NBLK_DR_V-1)*10/s16OutIn_Ratio_Ver][MINMAX(x+i,0,NBLK_DR_H-1)*10/s16OutIn_Ratio_Hor]);
7949 //u32SumEdge += u8RegionBlkWeightFrame_Tmp[y+j][x+i];
7950 }
7951 }
7952 u32SumEdge = MINMAX( u32SumEdge, 0, MAXVALUE );
7953 //u32SumEdge = MINMAX( u32SumEdge/9, 0, MAXVALUE );
7954
7955 pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x] = u32SumEdge;
7956
7957
7958 }
7959 }
7960
7961 #if BACKLIGHTIIR
7962 if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
7963 {
7964 for ( y = 0; y < NBLK_DR_V; y ++ )
7965 for ( x = 0; x < NBLK_DR_H; x ++ )
7966 {
7967 u32RegionBlkWei = (pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x])<<4;
7968 u32PreRegionBlkWei = pXCResourcePrivate->stdrvXC_3D.u16Pre_RegionBlkWeightFrame[y][x];
7969 u32RegionBlkWei = ( u32PreRegionBlkWei * pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight + u32RegionBlkWei * (128 -pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) +64)>>7; // doBL_IIR
7970 pXCResourcePrivate->stdrvXC_3D.u16Pre_RegionBlkWeightFrame[y][x] = u32RegionBlkWei;
7971 pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x] = (u32RegionBlkWei+8) >>4;
7972 }
7973 }
7974 #endif
7975
7976 // Prepare RGB 3D LUT 8x8x8, SW based!!!
7977 _MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT(pInstance, s16Index_BL );
7978 #if BACKLIGHTIIR
7979 if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
7980 {
7981 _MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT_IIR(pInstance);
7982 }
7983 #endif
7984 }
7985 #elif (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_DepthDetectionPIX_U9(void * pInstance)7986 static void _MDrv_SC_3D_2DTo3D_DepthDetectionPIX_U9(void *pInstance)
7987 {
7988
7989 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7990 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7991 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7992 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7993
7994 MS_S16 x,y;
7995 MS_S16 blueSkyRatio1, blueSkyRatio2;
7996 MS_S16 nonSkyRate;
7997
7998 MS_S8 i,j;
7999 MS_U32 sumEdge;
8000 MS_S8 mapping_yidx;
8001 MS_S8 mapping_xidx;
8002
8003 //IIR related
8004 MS_S16 DistantViewRatio1, DistantViewRatio2;
8005
8006 MS_U8 **_RegionBlkWeightFrame_tmp;
8007 MS_S16 OUTIN_Ratio_Ver,OUTIN_Ratio_Hor;
8008 MS_U32 RegionBlkWei = 0;
8009 MS_U32 PreRegionBlkWei = 0;
8010
8011 MS_S16 BGColorBlkCnt =0;
8012 MS_S16 BGColorBlkCnt_Dn =0;
8013
8014 MS_U8 BGColorRatio1,BGColorRatio2;
8015
8016 //Blue SKy Detection
8017 PIXEL pp,ppYCC;
8018 MS_U8 maxedgeRGB;
8019 MS_U8 BlkSat, notSkyFlat;
8020 MS_S16 blueAndFlatBlkCnt = 0;
8021 MS_S16 blueAndFlatBlkCnt_Dn = 0;
8022
8023 MS_BOOL isBlue,isWCloud,isSky,isSky_ful;
8024 MS_U8 id_v=0,id_h=0;
8025 MS_U8 u8tmpval = 0x18;//16;//
8026
8027 MS_U32 u32ScalingRatio = DISPLAY_DD_H*DISPLAY_DD_V*1000/FHD_W/FHD_H;
8028 if(u32ScalingRatio == 0)
8029 {
8030 u32ScalingRatio = 1;
8031 }
8032
8033 #if DUMYGAINCTRL
8034 MS_U8 u8tempval1EFC = (SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_59_L)&0x00F0)>>4;
8035 #else
8036 MS_U8 u8tempval1EFC = 0;//
8037 #endif
8038 _RegionBlkWeightFrame_tmp = (MS_U8 **)malloc(sizeof(MS_U8 *) * NBLK_V_MAX);
8039 for( y = 0;y < NBLK_V_MAX ;y++)
8040 _RegionBlkWeightFrame_tmp[y]=(MS_U8 *)malloc(sizeof(MS_U8) * NBLK_H_MAX);
8041 for ( y = 0; y < NBLK_DD_V ; y ++ )
8042 for ( x = 0; x < NBLK_DD_H; x ++ )
8043 //for ( x = NBLK_DD_H>>3; x < (NBLK_DD_H*7)>>3; x ++ )//2014.02.11 for LG seafood dish
8044 {
8045 maxedgeRGB = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x];
8046 pp = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
8047 ppYCC = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[y][x];
8048
8049 //isBlue = (maxedgeRGB < u8tmpval) && (pp.B > 100) && (pp.B > (pp.R*9/8)) && (pp.B > pp.G) && (pp.G > pp.R); //latest by CL
8050 isBlue = (maxedgeRGB < u8tmpval)&&(ppYCC.B>=132&&ppYCC.B<=192)&&(ppYCC.R>=56&&ppYCC.R<=124)&& (ppYCC.G>=56) && pp.B>=0;//ppYCC.B>=140;//ppYCC.G>=52;//&& ppYCC.G>=96
8051
8052 BlkSat = (MAX3(pp.R,pp.G,pp.B)<=32)?0:((MAX3(pp.R,pp.G,pp.B)-MIN3(pp.R,pp.G,pp.B))*256)/MAX3(pp.R,pp.G,pp.B);
8053
8054 //isWCloud = (maxedgeRGB < u8tmpval) && MIN(pp.R,pp.G)>170&& pp.B>190 && BlkSat<52 && (y <= NBLK_DD_V/4 && x>=NBLK_DD_H/4 && x<=NBLK_DD_H*3/4);
8055 //isWCloud = (maxedgeRGB < u8tmpval) && (ppYCC.B>=124&&ppYCC.B<=140)&&(ppYCC.R>=116&&ppYCC.R<=132)&& ppYCC.G>=160;
8056 isWCloud = (maxedgeRGB < u8tmpval) && (ppYCC.B>=124&&ppYCC.B<=152)&&(ppYCC.R>=104&&ppYCC.R<=132)&& (ppYCC.G>=160);
8057 //isWCloud = false;
8058
8059 isSky = (isBlue||isWCloud);
8060 notSkyFlat = (maxedgeRGB < u8tmpval)&&(!isSky)&&(BlkSat>200);
8061
8062 if(x >= (NBLK_DD_H>>3) && x <= ((NBLK_DD_H*7)>>3))
8063 {
8064 if ( isSky ) // upper & white
8065 {
8066 if(y<=NBLK_DD_V>>2&& x>=NBLK_DD_H>>2 && x<=(NBLK_DD_H*3)>>2 )// 2012.11.30 modify by CL
8067 blueAndFlatBlkCnt=blueAndFlatBlkCnt+2;
8068 else if(y<=NBLK_DD_V>>2 && ( x<NBLK_DD_H>>2 || x>(NBLK_DD_H*3)>>2))
8069 blueAndFlatBlkCnt ++;
8070 }
8071 else if(notSkyFlat)
8072 blueAndFlatBlkCnt--;
8073
8074 if(isSky&&y>=(NBLK_DD_V*3)>>2)
8075 blueAndFlatBlkCnt_Dn++;
8076 else if(notSkyFlat && y>=(NBLK_DD_V*3)>>2)
8077 blueAndFlatBlkCnt_Dn--;
8078 }
8079
8080 //isWCloud is the same formula with upper one, but no spatial limit
8081 //isWCloud = (maxedgeRGB < u8tmpval) && MIN(pp.R,pp.G)>170&& pp.B>190 && BlkSat<52;
8082 //isWCloud = (maxedgeRGB < u8tmpval) && (ppYCC.B>=116&&ppYCC.B<=140)&&(ppYCC.R>=116&&ppYCC.R<=140)&& ppYCC.G>=160;
8083 isWCloud = (maxedgeRGB < u8tmpval) && (ppYCC.B>=124&&ppYCC.B<=152)&&(ppYCC.R>=104&&ppYCC.R<=132)&& ppYCC.G>=160;
8084 isSky_ful = (isBlue||isWCloud);//detect Sky without spatial limit
8085
8086 if(isSky_ful)
8087 pXCResourcePrivate->stdrvXC_3D._bSkyMarker[y][x] = true;
8088 else
8089 pXCResourcePrivate->stdrvXC_3D._bSkyMarker[y][x] = false;
8090
8091 }
8092 if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0e)
8093 {
8094 printf("\nskycnt1:%d, Dn:%d, scalingR:%td",blueAndFlatBlkCnt,blueAndFlatBlkCnt_Dn,(ptrdiff_t)u32ScalingRatio);
8095 printf("\nDisDD_H:%d, DisDD_V:%d",DISPLAY_DD_H,DISPLAY_DD_V);
8096 }
8097
8098 //printf("\nBFC:%d, BFCDn:%d",blueAndFlatBlkCnt,blueAndFlatBlkCnt_Dn);
8099
8100 //blueSkyRatio1 = MINMAX( blueAndFlatBlkCnt/sizeratio/2, 0, 32 );
8101 //blueSkyRatio2 = MINMAX( blueAndFlatBlkCnt_Dn/sizeratio/2, 0, 32 );
8102 blueSkyRatio1 = MINMAX( (MS_S16)((blueAndFlatBlkCnt-32)*1000/u32ScalingRatio)/2, 0, 32 );
8103 blueSkyRatio2 = MINMAX( (MS_S16)((blueAndFlatBlkCnt_Dn-32)*1000/u32ScalingRatio)/2, 0, 32 );
8104
8105 BGColorBlkCnt = MIN(pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntTp,128);
8106 BGColorBlkCnt_Dn = MIN( MIN(pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntTp,pXCResourcePrivate->stdrvXC_3D.BGColorBlkCntBn), 128);
8107
8108 BGColorRatio1 = MINMAX( (BGColorBlkCnt-16)/4, 0, 32 );
8109 BGColorRatio2 = MINMAX( (BGColorBlkCnt_Dn-16)/4, 0, 32 );
8110
8111 //printf("\nBG1:%d, BG2:%d",BGColorRatio1,BGColorRatio2);
8112 //printf("\nsky1:%d, sky2:%d",blueSkyRatio1,blueSkyRatio2);
8113 if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0e)
8114 {
8115 printf("\nBG1:%d, BG2:%d",BGColorRatio1,BGColorRatio2);
8116 printf("\nsky1:%d, sky2_d:%d",blueSkyRatio1,blueSkyRatio2);
8117 }
8118
8119 MS_S16 s16Skyratiodiff = blueSkyRatio1 - blueSkyRatio2;
8120 MS_S16 s16BGCratiodiff = BGColorRatio1 - BGColorRatio2;
8121
8122
8123 blueSkyRatio1 = MIN( blueSkyRatio2+MAX(s16Skyratiodiff,s16BGCratiodiff), 32 );
8124 blueSkyRatio2 = blueSkyRatio2;
8125
8126 pXCResourcePrivate->stdrvXC_3D._u8TBABGColorWei = MINMAX(BGColorRatio2-blueSkyRatio2,0,32);//When TBB is affect by BGColor more than Sky color, use TBA BG color in TBB;
8127
8128
8129 //printf("\nfnsky1:%d, fnsky2:%d",blueSkyRatio1,blueSkyRatio2);
8130 if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0e)
8131 {
8132 printf("\nfnsky1:%d, fnsky2:%d",blueSkyRatio1,blueSkyRatio2);
8133 }
8134 //----- TRENDDETECTON -----
8135 blueSkyRatio1 = MAX(blueSkyRatio1,pXCResourcePrivate->stdrvXC_3D.u8VerGLB_Wei);
8136 //printf("\nftsky1:%d, ftsky2:%d",blueSkyRatio1,blueSkyRatio2);
8137 if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0e)
8138 {
8139 printf("\nftsky1:%d, ftsky2:%d",blueSkyRatio1,blueSkyRatio2);
8140 }
8141
8142
8143
8144 //----- MAINOBJDETECTON ----
8145 MainObjectDetection_U9();
8146 blueSkyRatio1 = MAX(blueSkyRatio1- pXCResourcePrivate->stdrvXC_3D._u8MainObjWei,0);
8147 blueSkyRatio2 = MAX(blueSkyRatio2- pXCResourcePrivate->stdrvXC_3D._u8MainObjWei,0);
8148 //printf("\nfmsky1:%d, fmsky2:%d\n",blueSkyRatio1,blueSkyRatio2);
8149 if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En==0x0e)
8150 {
8151 printf("\nfmsky1:%d, fmsky2:%d\n",blueSkyRatio1,blueSkyRatio2);
8152 }
8153
8154
8155 //DBG
8156 MS_U8 force_TBAB = 0;
8157
8158 if(force_TBAB==0x1)//all TBA
8159 {
8160 blueSkyRatio1 = 32;
8161 blueSkyRatio2 = 32;
8162 }
8163 else if(force_TBAB==0x2)//all TBB
8164 {
8165 blueSkyRatio1 = 0;
8166 blueSkyRatio2 = 0;
8167 }
8168 else if(force_TBAB==0x3)//all TBA->TBB
8169 {
8170 blueSkyRatio1 = 32;
8171 blueSkyRatio2 = 0;
8172 }
8173
8174 // keeps sky ratio stable
8175 {
8176 if(abs(blueSkyRatio1-pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1)<=3 &&abs(blueSkyRatio2-pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2)<=3)
8177 {
8178 blueSkyRatio1 = pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1;
8179 blueSkyRatio2 = pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2;
8180 }
8181 pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio1 = blueSkyRatio1;
8182 pXCResourcePrivate->stdrvXC_3D._u8Pre_BlueSkyRatio2 = blueSkyRatio2;
8183 }
8184
8185
8186
8187
8188 if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
8189 {
8190 DistantViewRatio1 = blueSkyRatio1<<4;
8191 DistantViewRatio2 = blueSkyRatio2<<4;
8192
8193 DistantViewRatio1 = (pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio1*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+DistantViewRatio1*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
8194 DistantViewRatio2 = (pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio2*pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight+DistantViewRatio2*(128-pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) + 64 )>>7;
8195
8196 pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio1 = DistantViewRatio1;
8197 pXCResourcePrivate->stdrvXC_3D.u16PreDistantViewRatio2 = DistantViewRatio2;
8198
8199 DistantViewRatio1 = (DistantViewRatio1+8)>>4;
8200 DistantViewRatio2 = (DistantViewRatio2+8)>>4;
8201 #if PRINTINFO
8202 printf(" \r\nDistantViewRatio1_new = %d, DistantViewRatio2_new = %d \r\n",DistantViewRatio1,DistantViewRatio2);
8203 #endif
8204
8205 }
8206 else
8207 {
8208 DistantViewRatio1 = blueSkyRatio1;
8209 DistantViewRatio2 = blueSkyRatio2;
8210 }
8211
8212
8213 pXCResourcePrivate->stdrvXC_3D._s16DistantViewRatio3 = MINMAX(DistantViewRatio1-DistantViewRatio2,0,32);//DView weight
8214
8215 if(NBLK_DR_V>NBLK_DD_V)
8216 {
8217 OUTIN_Ratio_Ver = NBLK_DR_V/NBLK_DD_V;
8218 }
8219 else
8220 {
8221 OUTIN_Ratio_Ver = NBLK_DD_V/NBLK_DR_V;
8222 }
8223 if(NBLK_DR_H>NBLK_DD_H)
8224 {
8225 OUTIN_Ratio_Hor = NBLK_DR_H/NBLK_DD_H;
8226 }
8227 else
8228 {
8229 OUTIN_Ratio_Hor = NBLK_DD_H/NBLK_DR_H;
8230 }
8231
8232 for(id_v=0; OUTIN_Ratio_Ver>1; id_v++)
8233 {
8234 OUTIN_Ratio_Ver=OUTIN_Ratio_Ver>>1;
8235 }
8236 for(id_h=0; OUTIN_Ratio_Hor>1; id_h++)
8237 {
8238 OUTIN_Ratio_Hor=OUTIN_Ratio_Hor>>1;
8239 }
8240
8241 pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1 = blueSkyRatio1;
8242 pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio2 = blueSkyRatio2;
8243 MS_U8 BLK_Y;
8244 MS_BOOL BGSkyCheck;
8245
8246 for ( y = 0; y < NBLK_DD_V; y ++ )
8247 {
8248 for ( x = 0; x < NBLK_DD_H; x ++ )
8249 {
8250 // ---------default method ----------------//
8251 //int nonSkyRate = _blockStatus2[y/VERTICAL_STEP][x/HORIZONTAL_STEP]; // edge
8252 //nonSkyRate = MAX( nonSkyRate, 256 - blueSkyRatio1*8 );
8253 //nonSkyRate = MAX( nonSkyRate, y*256/FRAME_HEIGHT ); // vertical position
8254 //nonSkyRate = MINMAX(nonSkyRate- blueSkyRatio2*4,0,255);// for full blue sky background
8255 //--------------end of default method ----------------//
8256 BGSkyCheck = pXCResourcePrivate->stdrvXC_3D._bSkyMarker[y][x]||pXCResourcePrivate->stdrvXC_3D._bTpBGColorMarker[y][x];
8257 BLK_Y = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_YCCAvg[y][x].G;
8258 maxedgeRGB = pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x]; // edge
8259 nonSkyRate = maxedgeRGB;
8260 nonSkyRate = MAX( nonSkyRate, 256 - blueSkyRatio1*8 );
8261
8262 nonSkyRate = MAX( nonSkyRate, (y*256)/NBLK_DD_V ); // vertical position
8263
8264 // nonSkyRate = MAX( nonSkyRate, new_y*256/(FRAME_HEIGHT-y_sep)); // vertical position
8265 nonSkyRate = MINMAX(nonSkyRate- blueSkyRatio2*8,0,255);// for full blue sky background
8266
8267 nonSkyRate = MAX(nonSkyRate,pXCResourcePrivate->stdrvXC_3D._u16BlockStatus_Edge[y][x]);
8268
8269 nonSkyRate = MINMAX( nonSkyRate, 0, 255 );
8270
8271 //nonSkyRate = MIN(nonSkyRate,(maxedgeRGB<<4));
8272 if((BGSkyCheck)&&maxedgeRGB<=16&&(u8tempval1EFC)==0x08)
8273 {
8274 if(maxedgeRGB>8)
8275 nonSkyRate = (MIN(nonSkyRate,maxedgeRGB)+nonSkyRate)>>1;
8276 else
8277 nonSkyRate = MIN(nonSkyRate,maxedgeRGB);
8278 }
8279
8280 _RegionBlkWeightFrame_tmp[y][x] = nonSkyRate;
8281
8282 }
8283 }
8284
8285
8286 // LPF of _RegionBlkWeightFrame
8287 for ( y = 0; y < NBLK_DR_V; y ++ )
8288 {
8289 for ( x = 0; x < NBLK_DR_H; x ++ )
8290 {
8291
8292 if(NBLK_DR_V>NBLK_DD_V)
8293 {
8294 mapping_yidx = y>>id_v;
8295 }
8296 else
8297 {
8298 mapping_yidx = y<<id_v;
8299 }
8300
8301 if(NBLK_DR_H>NBLK_DD_H)
8302 {
8303 mapping_xidx = x>>id_h;
8304 }
8305 else
8306 {
8307 mapping_xidx = x<<id_h;
8308 }
8309 sumEdge = _RegionBlkWeightFrame_tmp[mapping_yidx][mapping_xidx];
8310 for ( i = -2; i <= 2; i ++ )
8311 for ( j = -2; j <= 2; j ++ )
8312 {
8313 sumEdge = sumEdge+ _RegionBlkWeightFrame_tmp[MINMAX(mapping_yidx+j,0,NBLK_DR_V-1)][MINMAX(mapping_xidx+i,0,NBLK_DR_H-1)];
8314 }
8315 //sumEdge = MINMAX( sumEdge, 0, 255 );
8316 sumEdge = MINMAX( sumEdge/25, 0, 255 );
8317
8318 pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x] = sumEdge;
8319 }
8320 }
8321
8322 // add new backlight detection
8323
8324
8325 if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
8326 {
8327 for ( y = 0; y < NBLK_DR_V; y ++ )
8328 for ( x = 0; x < NBLK_DR_H; x ++ )
8329 {
8330
8331 RegionBlkWei = (pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x])<<4;
8332 PreRegionBlkWei = pXCResourcePrivate->stdrvXC_3D.u16Pre_RegionBlkWeightFrame[y][x];
8333 RegionBlkWei = ( PreRegionBlkWei * pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight + RegionBlkWei * (128 -pXCResourcePrivate->stdrvXC_3D.u16BL_IIRweight) +64)>>7; // doBL_IIR
8334 pXCResourcePrivate->stdrvXC_3D.u16Pre_RegionBlkWeightFrame[y][x] = RegionBlkWei;
8335 pXCResourcePrivate->stdrvXC_3D._u8RegionBlkWeightFrame[y][x] = (RegionBlkWei+8) >>4;
8336 }
8337 }
8338
8339 for( y = 0;y < NBLK_V_MAX ;y++)
8340 free(_RegionBlkWeightFrame_tmp[y]);
8341 free(_RegionBlkWeightFrame_tmp);
8342
8343 }
8344 #endif
8345
8346 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_DepthDetectionBLK(void * pInstance)8347 static void _MDrv_SC_3D_2DTo3D_DepthDetectionBLK(void *pInstance)
8348 {
8349 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8350 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8351 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8352 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8353 MS_S16 x = 0, y = 0, xx = 0, yy = 0, xj = 0, yj = 0;
8354 MS_S16 s16XRange = 0;
8355 MS_S16 s16Yrange = 0;
8356 MS_S16 s16Num = 1;
8357 PIXEL stAvgPixel, stCurPixel, stJPixel;
8358 MS_S16 s16Depth = 0;
8359 MS_U16 u16OutIn_Ratio_Ver = 0,u16OutIn_Ratio_Hor = 0;
8360 MS_U8 u8DepthBlkBased_Tmp[NBLK_V_MAX][NBLK_H_MAX];
8361 MS_U8 u8DepthBlkBased_Tmp2[NBLK_V_MAX][NBLK_H_MAX];
8362 MS_S32 s32YDiff = 0;
8363 MS_S32 s32WRatio = 0;
8364 MS_U16 u16Weight = 0;
8365 MS_U8 u8YVar = 24;
8366 MS_S32 s32WSum = 0, s32DSum = 0;
8367 MS_U16 u16Diff_Table[32] ={1000, 368, 135, 50, 18, 7, 2, 1,
8368 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8369 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
8370 MS_U32 u32VRatio = gSrcInfo[MAIN_WINDOW].stDispWin.height*10/DISPLAY_DD_V;
8371 MS_U32 u32HRatio = gSrcInfo[MAIN_WINDOW].stDispWin.width*10/DISPLAY_DD_H;
8372
8373 MS_WINDOW_TYPE stDispWin;
8374 memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
8375 MDrv_XC_get_dispwin_from_reg(pInstance, MAIN_WINDOW, &stDispWin);
8376
8377 if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW] == E_XC_3D_INPUT_MODE_NONE)
8378 {
8379 u32VRatio = stDispWin.height*10/DISPLAY_DD_V;
8380 u32HRatio = stDispWin.width*10/DISPLAY_DD_H;
8381 }
8382
8383 memset(&stAvgPixel, 0, sizeof(PIXEL));
8384 memset(&stCurPixel, 0, sizeof(PIXEL));
8385 memset(&stJPixel, 0, sizeof(PIXEL));
8386
8387 #if BOUNDARY_MODE
8388 MS_U8 u8BlkOffset = 0;
8389 #endif
8390
8391 // Use Pixel based RGB3D LUT
8392 u16OutIn_Ratio_Ver = MAX(u32VRatio, 10);
8393 u16OutIn_Ratio_Hor = MAX(u32HRatio, 10);
8394
8395 for ( y = 0; y < NBLK_DD_V; y ++ )
8396 for ( x = 0; x < NBLK_DD_H; x ++ )
8397 {
8398 stAvgPixel = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
8399
8400 s16Depth = _MDrv_SC_3D_2DTo3D_InterpolationDepthFromRGB_BLK(pInstance, x, y, stAvgPixel.R*4, stAvgPixel.G*4, stAvgPixel.B*4 );
8401
8402 u8DepthBlkBased_Tmp[y][x] = s16Depth;
8403
8404 }
8405
8406 //lowpass setting
8407 if (pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En == 1)
8408 {
8409 s16XRange =1;
8410 s16Yrange =1;
8411 s16Num = 9;
8412 }
8413 else if(pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En == 2)
8414 {
8415 s16XRange =2;
8416 s16Yrange =2;
8417 s16Num =25;
8418 }
8419 else if (pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En == 3)
8420 {
8421 s16XRange =3;
8422 s16Yrange =3;
8423 s16Num = 49;
8424 }
8425 else
8426 {
8427 s16XRange =0;
8428 s16Yrange =0;
8429 s16Num = 1;
8430 }
8431
8432 //lowpass or bilateral filter
8433 for(y = 0; y < NBLK_DD_V; y ++)
8434 for(x = 0; x < NBLK_DD_H; x ++)
8435 {
8436 if(pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En != 0 && pXCResourcePrivate->stdrvXC_3D._u8Bilateral_En ==0)// lowpass
8437 {
8438 s16Depth = 0;
8439 if(x>=s16XRange && x<NBLK_DD_H-s16XRange && y>=s16Yrange && y<NBLK_DD_V-s16Yrange)//normal case
8440 {
8441 for ( yy = -s16Yrange; yy <= s16Yrange; yy ++ )
8442 for ( xx = -s16XRange; xx <= s16XRange; xx ++ )
8443 {
8444 yj = y+yy;
8445 xj = x+xx;
8446 s16Depth += u8DepthBlkBased_Tmp[yj][xj];
8447 }
8448 }
8449 else // boundary case
8450 {
8451 for ( yy = -s16Yrange; yy <= s16Yrange; yy ++ )
8452 for ( xx = -s16XRange; xx <= s16XRange; xx ++ )
8453 {
8454 yj = MINMAX(y+yy, 0,NBLK_DD_V-1);
8455 xj = MINMAX(x+xx, 0,NBLK_DD_H-1);
8456 s16Depth += u8DepthBlkBased_Tmp[yj][xj];
8457 }
8458 }
8459 u8DepthBlkBased_Tmp2[y][x]= s16Depth/s16Num;
8460 }
8461 else if (pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En != 0 && pXCResourcePrivate->stdrvXC_3D._u8Bilateral_En ==1) //bilateral
8462 {
8463 s32WSum = 0;
8464 s32DSum = 0;
8465 s32YDiff = 0;
8466 s32WRatio = 0;
8467 u16Weight = 0;
8468 stCurPixel = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
8469
8470 if(x>=s16XRange && x<NBLK_DD_H-s16XRange && y>=s16Yrange && y<NBLK_DD_V-s16Yrange) // normal case
8471 {
8472 for ( yy = -s16Yrange; yy <= s16Yrange; yy ++ )
8473 for ( xx = -s16XRange; xx <= s16XRange; xx ++ )
8474 {
8475 xj = x+xx;
8476 yj = y+yy;
8477 stJPixel = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[yj][xj];
8478 s32YDiff = (abs( stCurPixel.R - stJPixel.R) + abs( stCurPixel.G - stJPixel.G) + abs( stCurPixel.B - stJPixel.B));
8479 s32WRatio = s32YDiff/u8YVar;
8480
8481 u16Weight = u16Diff_Table[s32WRatio];
8482 s32WSum = u16Weight + s32WSum;
8483 s32DSum = u16Weight* u8DepthBlkBased_Tmp[yj][xj] + s32DSum ;
8484 }
8485 }
8486 else // boundary case
8487 {
8488 for ( yy = -s16Yrange; yy <= s16Yrange; yy ++ )
8489 for ( xx = -s16XRange; xx <= s16XRange; xx ++ )
8490 {
8491 xj = MINMAX(x+xx, 0,NBLK_DD_H-1);
8492 yj = MINMAX(y+yy, 0,NBLK_DD_V-1);
8493 stJPixel = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[yj][xj];
8494 s32YDiff = (abs( stCurPixel.R - stJPixel.R) + abs( stCurPixel.G - stJPixel.G) + abs( stCurPixel.B - stJPixel.B));
8495 s32WRatio = s32YDiff/u8YVar;
8496
8497 u16Weight = u16Diff_Table[s32WRatio];
8498 s32WSum = u16Weight + s32WSum;
8499 s32DSum = u16Weight* u8DepthBlkBased_Tmp[yj][xj] + s32DSum ;
8500 }
8501 }
8502
8503 if(s32WSum >0)
8504 u8DepthBlkBased_Tmp2[y][x] = s32DSum/s32WSum;
8505 else
8506 u8DepthBlkBased_Tmp2[y][x] = u8DepthBlkBased_Tmp[y][x];
8507
8508 }
8509 else
8510 {
8511 u8DepthBlkBased_Tmp2[y][x]= u8DepthBlkBased_Tmp[y][x];
8512 }
8513 }
8514
8515 // bilinear interpolation to scale up
8516 for ( y = 0; y < NBLK_DR_V; y ++ )
8517 for ( x = 0; x < NBLK_DR_H; x ++ )
8518 {
8519 MS_U8 idx_x,idx_y;
8520 idx_x =x*10/u16OutIn_Ratio_Hor;
8521 idx_y =y*10/u16OutIn_Ratio_Ver;
8522 s16Depth = 0;
8523 if(idx_x>=1 && idx_x<(NBLK_DD_H-1) && idx_y>=1 && idx_y< (NBLK_DD_V-1)) //normal case
8524 {
8525 if (x%2 == 0 && y%2 == 0)
8526 s16Depth=u8DepthBlkBased_Tmp2[idx_y][idx_x];
8527 else if (x%2 == 1 && y%2 == 0)
8528 s16Depth=(u8DepthBlkBased_Tmp2[idx_y][idx_x]+u8DepthBlkBased_Tmp2[idx_y][idx_x+1])/2;
8529 else if (x%2 == 0 && y%2 == 1)
8530 s16Depth=(u8DepthBlkBased_Tmp2[idx_y][idx_x]+u8DepthBlkBased_Tmp2[idx_y+1][idx_x])/2;
8531 else
8532 s16Depth=(u8DepthBlkBased_Tmp2[idx_y][idx_x]+u8DepthBlkBased_Tmp2[idx_y][idx_x+1]+u8DepthBlkBased_Tmp2[idx_y+1][idx_x]+u8DepthBlkBased_Tmp2[idx_y+1][idx_x+1])/4;
8533 }
8534 else //boundary case
8535 {
8536 if (x%2 == 0 && y%2 == 0)
8537 s16Depth=u8DepthBlkBased_Tmp2[idx_y][idx_x];
8538 else if (x%2 == 1 && y%2 == 0)
8539 s16Depth=(u8DepthBlkBased_Tmp2[idx_y][idx_x]+u8DepthBlkBased_Tmp2[idx_y][MINMAX(idx_x+1,0,NBLK_DD_H-1)])/2;
8540 else if (x%2 == 0 && y%2 == 1)
8541 s16Depth=(u8DepthBlkBased_Tmp2[idx_y][idx_x]+u8DepthBlkBased_Tmp2[MINMAX(idx_y,0,NBLK_DD_V-1)][idx_x])/2;
8542 else
8543 s16Depth=(u8DepthBlkBased_Tmp2[idx_y][idx_x]+u8DepthBlkBased_Tmp2[idx_y][MINMAX(idx_x+1,0,NBLK_DD_H-1)]+u8DepthBlkBased_Tmp2[MINMAX(idx_y+1,0,NBLK_DD_V-1)][idx_x]+u8DepthBlkBased_Tmp2[MINMAX(idx_y+1,0,NBLK_DD_V-1)][MINMAX(idx_x+1,0,NBLK_DD_H-1)])/4;
8544 }
8545
8546 if( pXCResourcePrivate->stdrvXC_3D._u8Bilinear_En == 0)
8547 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = u8DepthBlkBased_Tmp2[y*10/u16OutIn_Ratio_Ver][x*10/u16OutIn_Ratio_Hor];
8548 else
8549 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = s16Depth;
8550 }
8551
8552 #if BOUNDARY_MODE
8553 u8BlkOffset = pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset;
8554 for ( y = 0; y < NBLK_DR_V; y ++ )
8555 {
8556 for ( x = 0; x < NBLK_DR_H; x ++ )
8557 {
8558 if(x==0||x==NBLK_DR_H-1)
8559 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = u8BlkOffset;
8560 else if(x==1)
8561 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = ( u8BlkOffset+ 2*pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] + pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x+1] + 2)>>2;
8562 else if(x==NBLK_DR_H-2)
8563 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = ( pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x-1] + 2*pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] + u8BlkOffset + 2)>>2;
8564 }
8565 }
8566 #endif
8567
8568 #if BACKLIGHTIIR
8569 if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
8570 {
8571 _MDrv_SC_3D_2DTo3D_PrepareBLKDepth_IIR(pInstance);
8572 }
8573 #endif
8574 }
8575 #elif (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_DepthDetectionBLK_TEST(void * pInstance)8576 static void _MDrv_SC_3D_2DTo3D_DepthDetectionBLK_TEST(void *pInstance)
8577 {
8578 //for Global Variable
8579
8580 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8581 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8582 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8583 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8584 MS_BOOL bT3DDE_Use_MainDisplayWindow = _MDrv_Is_T3DDE_UseMainDisplayWindow(pInstance);
8585 PIXEL avgPixel;
8586 MS_S16 x,y,xx,yy, xj, yj;
8587 MS_S16 s16Xrange =0;
8588 MS_S16 s16Yrange =0;
8589 MS_S16 s16Num = 1;
8590 //PIXEL curPixel, jPixel;
8591 MS_S16 depth=0;
8592
8593 MS_U16 u16OutIn_Ratio_Ver,u16OutIn_Ratio_Hor;
8594
8595 MS_U8 **_depthBlkBased_tmp;
8596 MS_U8 **_depthBlkBased_tmp2;
8597
8598 MS_U8 id_v=0,id_h=0;
8599
8600 MS_U32 u32VRatio = PANEL_HEIGHT*10/DISPLAY_DD_V;
8601 MS_U32 u32HRatio = PANEL_WIDTH*10/DISPLAY_DD_H;
8602
8603
8604 #if MOTIONDETECTION
8605 MS_S16 blk_mot;
8606 MS_S16 mot_depth;
8607
8608 //MS_S16 GMvSXsize,GMvSYsize,GMvsize;
8609 MS_U8 GMvWei;
8610
8611 //GMvSXsize = abs(MFC_ReadByte(REG_29CC)-0x80);
8612 //GMvSYsize = abs((MFC_ReadByte(REG_29CD)&0x7F)-0x40);
8613 //GMvsize = (GMvSXsize+GMvSYsize);
8614
8615 GMvWei = 0x10;//MINMAX(24 - GMvsize,0,16);
8616
8617 #endif
8618
8619 _depthBlkBased_tmp = (MS_U8 **)malloc(sizeof(MS_U8 *) * NBLK_V_MAX);
8620 for( y = 0;y < NBLK_V_MAX ;y++)
8621 _depthBlkBased_tmp[y]=(MS_U8 *)malloc(sizeof(MS_U8) * NBLK_H_MAX);
8622 _depthBlkBased_tmp2 = (MS_U8 **)malloc(sizeof(MS_U8 *) * NBLK_V_MAX);
8623 for( y = 0;y < NBLK_V_MAX ;y++)
8624 _depthBlkBased_tmp2[y]=(MS_U8 *)malloc(sizeof(MS_U8) * NBLK_H_MAX);
8625
8626 // Use Pixel based RGB3D LUT
8627 u16OutIn_Ratio_Ver = MAX(u32VRatio, 10);
8628 u16OutIn_Ratio_Hor = MAX(u32HRatio, 10);
8629
8630 #if DUMYGAINCTRL
8631 MS_U8 u8testval_1EFC = 0x00;//MFC_ReadByte(REG_1EFC);
8632
8633 MS_U8 u8testval_0EBA = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5E_L, 0xff);//MFC_ReadByte(REG_0EBA);//default:0x00 for LGE 0x18
8634 MS_U8 u8testval_0EBB = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5F_L, 0xff00)>>8;//MFC_ReadByte(REG_0EBB);//default:0x20 for LGE 0x20
8635 #else
8636 MS_U8 u8testval_1EFC = 0x00;//MFC_ReadByte(REG_1EFC);
8637
8638 MS_U8 u8testval_0EBA = 0x00;//default:0x00 for LGE 0x18
8639 MS_U8 u8testval_0EBB = 0x20;//default:0x20 for LGE 0x20
8640 #endif
8641
8642 //S16 BLKnonSkyRate;
8643 MS_S16 BLKblueSkyRatioDiff;
8644 MS_S16 DepthSlope;
8645
8646 #if BOUNDARY_MODE
8647 MS_U8 u8BlkOffset = 0;
8648 #endif
8649
8650 MS_U16 u16DispWidth = gSrcInfo[MAIN_WINDOW].stDispWin.width;
8651 MS_WINDOW_TYPE stDispWin;
8652 memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
8653 MDrv_XC_get_dispwin_from_reg(pInstance, MAIN_WINDOW, &stDispWin);
8654 if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW] == E_XC_3D_INPUT_MODE_NONE)
8655 {
8656 u16DispWidth = stDispWin.width;
8657 }
8658
8659 pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio2 = MIN(pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1,pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio2);
8660 //BLKblueSkyRatioDiff = MAX(BLKblueSkyRatio1 - BLKblueSkyRatio2, GLB_Depth_Min);
8661 BLKblueSkyRatioDiff = MINMAX(pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio1 - pXCResourcePrivate->stdrvXC_3D._s16BLKblueSkyRatio2, u8testval_0EBA,u8testval_0EBB);
8662
8663 DepthSlope = BLKblueSkyRatioDiff*256/32;
8664 MS_S16 BLKnum_V = NBLK_DD_V;
8665
8666 if((u8testval_1EFC&0x20)==0x20)
8667 {
8668 for ( y = 0; y < NBLK_DD_V; y ++ )
8669 for ( x = 0; x < NBLK_DD_H; x ++ )
8670 {
8671 avgPixel = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
8672 depth = _MDrv_SC_3D_2DTo3D_InterpolationDepthFromRGB_BLK(pInstance, x, y, avgPixel.R*4, avgPixel.G*4, avgPixel.B*4 );
8673
8674 if( (u8testval_1EFC&0x10)==0x10)
8675 {
8676 //int blk_mot;
8677 //int mot_depth;
8678 blk_mot = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_mot[y][x];
8679 //mot_depth = 0x80;//MFC_ReadByte(REG_1EFE);//max additional mot depth
8680 mot_depth = blk_mot>>1;//MIN( (mot_depth*blk_mot)>>8, 255);
8681 mot_depth = (mot_depth*GMvWei)>>4;
8682
8683 depth = depth + mot_depth;
8684 }
8685
8686
8687 _depthBlkBased_tmp[y][x] = MINMAX(depth,0,255);
8688
8689 }
8690 }
8691 else
8692 {
8693 for ( y = 0; y < NBLK_DD_V; y ++ )
8694 {
8695 for ( x = 0; x < NBLK_DD_H; x ++ )
8696 {
8697 if(((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK62_69_L)&0x80)==0x00))
8698 {
8699 depth = (DepthSlope*(y-(BLKnum_V>>1))/(BLKnum_V) )+128;
8700 #if MOTIONDETECTION
8701 //add motion cue
8702 if( (u8testval_1EFC&0x10)==0x10)
8703 {
8704
8705 blk_mot = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_mot[y][x];
8706 //mot_depth = 0x80;//MFC_ReadByte(REG_1EFE);//max additional mot depth
8707 mot_depth = blk_mot>>1;//min( (mot_depth*blk_mot)>>8, 255);
8708 mot_depth = (mot_depth*GMvWei)>>4;
8709
8710 depth = depth + mot_depth;
8711 }
8712 #endif
8713 _depthBlkBased_tmp[y][x] = MINMAX(depth,0,255);
8714 }
8715 else
8716 {
8717 DepthSlope = MAX(DepthSlope, 200);
8718 //Depth Slope 0~255
8719 if(y < NBLK_DD_V/4)
8720 depth = (DepthSlope*(y)/(BLKnum_V) )+128;
8721 else if(y < NBLK_DD_V*3/4)
8722 depth = (DepthSlope*((BLKnum_V>>1)-y)/(BLKnum_V) )+128;
8723 else
8724 depth = (DepthSlope*(y-BLKnum_V)/(BLKnum_V) )+128;
8725 _depthBlkBased_tmp[y][x] = MINMAX(depth,0,255);
8726 }
8727 }
8728 }
8729 }
8730
8731 //lowpass setting
8732 if (pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En == 1)
8733 {
8734 s16Xrange =1;
8735 s16Yrange =1;
8736 s16Num = 9;
8737 }
8738 else if(pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En == 2)
8739 {
8740 s16Xrange =2;
8741 s16Yrange =2;
8742 s16Num =25;
8743 }
8744 else if (pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En == 3)
8745 {
8746 s16Xrange =3;
8747 s16Yrange =3;
8748 s16Num = 49;
8749 }
8750 else
8751 {
8752 s16Xrange =0;
8753 s16Yrange =0;
8754 s16Num = 1;
8755 }
8756
8757 //lowpass or bilateral filter
8758 for(y = 0; y < NBLK_DD_V; y ++)
8759 for(x = 0; x < NBLK_DD_H; x ++)
8760 {
8761
8762 if(pXCResourcePrivate->stdrvXC_3D._u8Lowpass_En != 0 ) // lowpass
8763 {
8764 depth = 0;
8765 if(x>=s16Xrange && x<NBLK_DD_H-s16Xrange && y>=s16Yrange && y<NBLK_DD_V-s16Yrange) //normal case
8766 {
8767 for ( yy = -s16Yrange; yy <= s16Yrange; yy ++ )
8768 for ( xx = -s16Xrange; xx <= s16Xrange; xx ++ )
8769 {
8770 yj = y+yy;
8771 xj = x+xx;
8772 depth += _depthBlkBased_tmp[yj][xj];
8773 }
8774 }
8775 else // boundary case
8776 {
8777 for ( yy = -s16Yrange; yy <= s16Yrange; yy ++ )
8778 for ( xx = -s16Xrange; xx <= s16Xrange; xx ++ )
8779 {
8780 yj = MINMAX(y+yy, 0,NBLK_DD_V-1);
8781 xj = MINMAX(x+xx, 0,NBLK_DD_H-1);
8782 depth += _depthBlkBased_tmp[yj][xj];
8783 }
8784 }
8785 _depthBlkBased_tmp2[y][x]= depth/s16Num;
8786 }
8787 else
8788 {
8789 _depthBlkBased_tmp2[y][x]= _depthBlkBased_tmp[y][x];
8790 }
8791
8792 }
8793
8794 u16OutIn_Ratio_Ver = u16OutIn_Ratio_Ver/10;
8795 u16OutIn_Ratio_Hor = u16OutIn_Ratio_Hor/10;
8796 #if OPTIMIZE
8797 for(id_v=0; u16OutIn_Ratio_Ver>1; id_v++)
8798 {
8799 u16OutIn_Ratio_Ver=u16OutIn_Ratio_Ver>>1;
8800 }
8801 for(id_h=0; u16OutIn_Ratio_Hor>1; id_h++)
8802 {
8803 u16OutIn_Ratio_Hor=u16OutIn_Ratio_Hor>>1;
8804 }
8805 #endif
8806 // bilinear interpolation to scale up
8807 for ( y = 0; y < NBLK_DR_V; y ++ )
8808 for ( x = 0; x < NBLK_DR_H; x ++ )
8809 {
8810 MS_U8 idx_x,idx_y;
8811 #if OPTIMIZE
8812 idx_x =x>>id_h;//OUTIN_Ratio_Hor;
8813 idx_y =y>>id_v;//OUTIN_Ratio_Ver;
8814 #else
8815 idx_x =x/u16OutIn_Ratio_Hor;
8816 idx_y =y/u16OutIn_Ratio_Ver;
8817 #endif
8818 depth = 0;
8819 if(idx_x>=1 && idx_x<(NBLK_DD_H-1) && idx_y>=1 && idx_y< (NBLK_DD_V-1)) //normal case
8820 {
8821 if (x%2 == 0 && y%2 == 0)
8822 depth=_depthBlkBased_tmp2[idx_y][idx_x];
8823 else if (x%2 == 1 && y%2 == 0)
8824 depth=(_depthBlkBased_tmp2[idx_y][idx_x]+_depthBlkBased_tmp2[idx_y][idx_x+1])>>1;
8825 else if (x%2 == 0 && y%2 == 1)
8826 depth=(_depthBlkBased_tmp2[idx_y][idx_x]+_depthBlkBased_tmp2[idx_y+1][idx_x])>>1;
8827 else
8828 depth=(_depthBlkBased_tmp2[idx_y][idx_x]+_depthBlkBased_tmp2[idx_y][idx_x+1]+_depthBlkBased_tmp2[idx_y+1][idx_x]+_depthBlkBased_tmp2[idx_y+1][idx_x+1])>>2;
8829 }
8830 else //boundary case
8831 {
8832
8833 if (x%2 == 0 && y%2 == 0)
8834 depth=_depthBlkBased_tmp2[idx_y][idx_x];
8835 else if (x%2 == 1 && y%2 == 0)
8836 depth=(_depthBlkBased_tmp2[idx_y][idx_x]+_depthBlkBased_tmp2[idx_y][MINMAX(idx_x+1,0,NBLK_DD_H-1)])>>1;
8837 else if (x%2 == 0 && y%2 == 1)
8838 depth=(_depthBlkBased_tmp2[idx_y][idx_x]+_depthBlkBased_tmp2[MINMAX(idx_y,0,NBLK_DD_V-1)][idx_x])>>1;
8839 else
8840 depth=(_depthBlkBased_tmp2[idx_y][idx_x]+_depthBlkBased_tmp2[idx_y][MINMAX(idx_x+1,0,NBLK_DD_H-1)]+_depthBlkBased_tmp2[MINMAX(idx_y+1,0,NBLK_DD_V-1)][idx_x]+_depthBlkBased_tmp2[MINMAX(idx_y+1,0,NBLK_DD_V-1)][MINMAX(idx_x+1,0,NBLK_DD_H-1)])>>2;
8841 }
8842
8843
8844
8845
8846 if( pXCResourcePrivate->stdrvXC_3D._u8Bilinear_En == 0)
8847 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = _depthBlkBased_tmp2[idx_y][idx_x];
8848 else
8849 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = depth;
8850
8851 }
8852
8853 #if BOUNDARY_MODE
8854 if(E_XC_3D_OUTPUT_TOP_BOTTOM_HW != MDrv_XC_Get_3D_Output_Mode(pInstance))
8855 {
8856 u8BlkOffset = pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset;
8857 }
8858 else
8859 {
8860 u8BlkOffset = 0x80;
8861 }
8862 for ( y = 0; y < NBLK_DR_V; y ++ )
8863 {
8864 for ( x = 0; x < NBLK_DR_H; x ++ )
8865 {
8866 if(bT3DDE_Use_MainDisplayWindow)//((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x2) == 0x2) //flag for MainDEonly mode
8867 {
8868 if(x==0||(x>=((u16DispWidth + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK)-1))
8869 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = u8BlkOffset;
8870 else if(x==1)
8871 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = ( u8BlkOffset+ 2*pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] + pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x+1] + 2)>>2;
8872 else if(x==((u16DispWidth + PIXELNUMOFBLOCK - 1) / PIXELNUMOFBLOCK)-2)
8873 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = ( pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x-1] + 2*pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] + u8BlkOffset + 2)>>2;
8874 }
8875 else
8876 {
8877 if(x==0||x==NBLK_DR_H-1)
8878 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = u8BlkOffset;
8879 else if(x==1)
8880 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = ( u8BlkOffset+ 2*pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] + pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x+1] + 2)>>2;
8881 else if(x==NBLK_DR_H-2)
8882 pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] = ( pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x-1] + 2*pXCResourcePrivate->stdrvXC_3D._u8DepthBlkBased[y][x] + u8BlkOffset + 2)>>2;
8883 }
8884 }
8885 }
8886 #endif
8887
8888 #if BACKLIGHTIIR
8889 if(pXCResourcePrivate->stdrvXC_3D.u8IIR_En==1)
8890 {
8891 _MDrv_SC_3D_2DTo3D_PrepareBLKDepth_IIR(pInstance);
8892 }
8893
8894 #endif
8895
8896 for( y = 0;y < NBLK_V_MAX ;y++)
8897 free(_depthBlkBased_tmp[y]);
8898 free(_depthBlkBased_tmp);
8899 for( y = 0;y < NBLK_V_MAX ;y++)
8900 free(_depthBlkBased_tmp2[y]);
8901 free(_depthBlkBased_tmp2);
8902
8903 }
8904 #endif
8905
_MDrv_SC_3D_IsPattern(void * pInstance,MS_U16 x,MS_U16 y,MS_BOOL bHonrizantol)8906 static MS_BOOL _MDrv_SC_3D_IsPattern(void *pInstance, MS_U16 x, MS_U16 y, MS_BOOL bHonrizantol)
8907 {
8908 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8909 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8910 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8911 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8912 MS_BOOL bRet = FALSE;
8913 PIXEL Pixel1Quadrant = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H - 1 - x];
8914 PIXEL Pixel2Quadrant = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
8915 PIXEL Pixel3Quadrant = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V - 1 - y][x];
8916 PIXEL Pixel4Quadrant = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V - 1 - y][NBLK_DD_H - 1 - x];
8917 if (bHonrizantol)
8918 {
8919 MS_U16 u16Diff1_2 = ((abs( Pixel1Quadrant.R - Pixel2Quadrant.R) + abs( Pixel1Quadrant.G - Pixel2Quadrant.G) + abs( Pixel1Quadrant.B - Pixel2Quadrant.B)));
8920 MS_U16 u16Diff3_4 = ((abs( Pixel3Quadrant.R - Pixel4Quadrant.R) + abs( Pixel3Quadrant.G - Pixel4Quadrant.G) + abs( Pixel3Quadrant.B - Pixel4Quadrant.B)));
8921 if (MAX(u16Diff1_2, u16Diff3_4) < PATTERN_THRESLD)
8922 {
8923 bRet = TRUE;
8924 }
8925 else
8926 {
8927 bRet = FALSE;
8928 }
8929 }
8930 else
8931 {
8932 MS_U16 u16Diff2_3 = ((abs( Pixel3Quadrant.R - Pixel2Quadrant.R) + abs( Pixel3Quadrant.G - Pixel2Quadrant.G) + abs( Pixel3Quadrant.B - Pixel2Quadrant.B)));
8933 MS_U16 u16Diff4_1 = ((abs( Pixel1Quadrant.R - Pixel4Quadrant.R) + abs( Pixel1Quadrant.G - Pixel4Quadrant.G) + abs( Pixel1Quadrant.B - Pixel4Quadrant.B)));
8934 if (MAX(u16Diff2_3, u16Diff4_1) < PATTERN_THRESLD)
8935 {
8936 bRet = TRUE;
8937 }
8938 else
8939 {
8940 bRet = FALSE;
8941 }
8942 }
8943 return bRet;
8944 }
8945
8946 PIXEL stblockStatusEven[NBLK_DD_V_MAX][NBLK_DD_H_MAX]; // avg color value for even lines
8947 PIXEL stblockStatusOdd[NBLK_DD_V_MAX][NBLK_DD_H_MAX]; // avg color value for odd lines
_MDrv_SC_3D_SourceDetection(void * pInstance)8948 static void _MDrv_SC_3D_SourceDetection(void *pInstance)
8949 {
8950 MS_U16 x = 0, y = 0;
8951 PIXEL Pixel1;
8952 PIXEL Pixel10, Pixel11, Pixel12, Pixel13, Pixel14, Pixel15, Pixel16;
8953 MS_U16 u16YDiff0 = 0, u16YDiff1 = 0, u16YDiff2 = 0, u16YDiff3 = 0;
8954 MS_U16 u16YDiff4 = 0, u16YDiff5 = 0, u16YDiff6 = 0;
8955 EN_3D_FORMAT enFormat = E_3D_FORMAT_2D;
8956 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8957 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8958 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8959 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8960 if(pXCResourcePrivate->stdrvXC_3D._bResetFrameCount)
8961 {
8962 pXCResourcePrivate->stdrvXC_3D._u16SBSCount = 0;
8963 pXCResourcePrivate->stdrvXC_3D._u16TBCount = 0;
8964 pXCResourcePrivate->stdrvXC_3D._u162DCount = 0;
8965 pXCResourcePrivate->stdrvXC_3D._u16TotalCount = 0;
8966 pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = FALSE;
8967 }
8968
8969 if((IS_INPUT_FRAME_PACKING(MAIN_WINDOW)
8970 || IS_INPUT_TOP_BOTTOM(MAIN_WINDOW)
8971 || IS_INPUT_SIDE_BY_SIDE_HALF(MAIN_WINDOW))
8972 && IS_OUTPUT_LINE_ALTERNATIVE())
8973 {
8974 #if defined (__aarch64__)
8975 MS_U64 i = 0, j = 0, i_dummy = 0, j_dummy = 0;
8976 #else
8977 MS_S32 i = 0, j = 0, i_dummy = 0, j_dummy = 0;
8978 #endif
8979 MS_U8 u8R_Cr_Avg = 0;
8980 MS_U8 u8G_Y_Avg = 0;
8981 MS_U8 u8B_Cb_Avg = 0;
8982 MS_VIRT u32DDBase = MsOS_PA2KSEG1(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf);
8983 if(0 == u32DDBase)
8984 {
8985 printf("%s :u32DDBase = 0!,error!!!\n", __FUNCTION__);
8986 assert(u32DDBase != 0);
8987 }
8988 MS_U16 u16DDBlock_DramSize = DDBYTENUM;
8989 MS_U32 u32DDBlockLinePitch = (NBLK_DD_PITCH*DDBYTENUM);
8990 MS_U16 u16MinDiff = 0;
8991 MS_U16 u16MaxDiff = 0;
8992 MS_U32 u32MatchCount = 0;
8993
8994 for (i = 0; i < NBLK_DD_V; i++)
8995 {
8996 i_dummy = i * u32DDBlockLinePitch;
8997 for (j = 0; j < NBLK_DD_H; j++)
8998 {
8999 j_dummy = j* u16DDBlock_DramSize;
9000
9001 u8G_Y_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 6) + u32DDBase));
9002 u8B_Cb_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 7) + u32DDBase));
9003 u8R_Cr_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 8) + u32DDBase));
9004
9005 u8R_Cr_Avg = MINMAX((((u8R_Cr_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
9006 u8G_Y_Avg = MINMAX((((u8G_Y_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
9007 u8B_Cb_Avg = MINMAX((((u8B_Cb_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
9008
9009 stblockStatusEven[i][j].R = u8R_Cr_Avg; // avg color value
9010 stblockStatusEven[i][j].G = u8G_Y_Avg; // avg color value
9011 stblockStatusEven[i][j].B = u8B_Cb_Avg; // avg color value
9012
9013 u8G_Y_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 22) + u32DDBase));
9014 u8B_Cb_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 23) + u32DDBase));
9015 u8R_Cr_Avg = *((volatile MS_U8*)(( i_dummy + j_dummy + 24) + u32DDBase));
9016
9017 u8R_Cr_Avg = MINMAX((((u8R_Cr_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
9018 u8G_Y_Avg = MINMAX((((u8G_Y_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
9019 u8B_Cb_Avg = MINMAX((((u8B_Cb_Avg-16)*MAXVALUE)/219), 0, MAXVALUE);
9020
9021 stblockStatusOdd[i][j].R = u8R_Cr_Avg; // avg color value
9022 stblockStatusOdd[i][j].G = u8G_Y_Avg; // avg color value
9023 stblockStatusOdd[i][j].B = u8B_Cb_Avg; // avg color value
9024 }
9025 }
9026
9027 for(y = 0; y < NBLK_DD_V; y ++)
9028 {
9029 for(x = 3; x < NBLK_DD_H - 3; x ++)
9030 {
9031 //even target pixel
9032 Pixel1 = stblockStatusEven[y][x];
9033 //odd pixels
9034 Pixel10 = stblockStatusOdd[y][x];
9035 Pixel11 = stblockStatusOdd[y][x+1];
9036 Pixel12 = stblockStatusOdd[y][x+2];
9037 Pixel13 = stblockStatusOdd[y][x+3];
9038 Pixel14 = stblockStatusOdd[y][x-1];
9039 Pixel15 = stblockStatusOdd[y][x-2];
9040 Pixel16 = stblockStatusOdd[y][x-3];
9041
9042 //check s32Diff
9043 u16YDiff0 = ((abs( Pixel1.R - Pixel10.R) + abs( Pixel1.G - Pixel10.G) + abs( Pixel1.B - Pixel10.B)));
9044 u16YDiff1 = ((abs( Pixel1.R - Pixel11.R) + abs( Pixel1.G - Pixel11.G) + abs( Pixel1.B - Pixel11.B)));
9045 u16YDiff2 = ((abs( Pixel1.R - Pixel12.R) + abs( Pixel1.G - Pixel12.G) + abs( Pixel1.B - Pixel12.B)));
9046 u16YDiff3 = ((abs( Pixel1.R - Pixel13.R) + abs( Pixel1.G - Pixel13.G) + abs( Pixel1.B - Pixel13.B)));
9047 u16YDiff4 = ((abs( Pixel1.R - Pixel14.R) + abs( Pixel1.G - Pixel14.G) + abs( Pixel1.B - Pixel14.B)));
9048 u16YDiff5 = ((abs( Pixel1.R - Pixel15.R) + abs( Pixel1.G - Pixel15.G) + abs( Pixel1.B - Pixel15.B)));
9049 u16YDiff6 = ((abs( Pixel1.R - Pixel16.R) + abs( Pixel1.G - Pixel16.G) + abs( Pixel1.B - Pixel16.B)));
9050
9051 u16MinDiff = MIN(MIN3(u16YDiff0, u16YDiff1, u16YDiff2), MIN(u16YDiff4, u16YDiff5));
9052 u16MaxDiff = MAX(MAX3(u16YDiff0, u16YDiff1, u16YDiff2), MAX(u16YDiff4, u16YDiff5));
9053
9054 #if 0
9055 if(x == 20)
9056 {
9057 printf("u16MinDiff=%u, u16MaxDiff=%u\n", u16MinDiff, u16MaxDiff);
9058 }
9059 #endif
9060
9061 if (u16MinDiff <= HW_2DTO3D_3DDetect_THRESHOLD)
9062 {
9063 u32MatchCount++;
9064 }
9065 }
9066
9067 if(u32MatchCount < (NBLK_DD_V * (NBLK_DD_H - 6) * HW_2DTO3D_3DDetect_PERCENTAGE / 100))
9068 {
9069 enFormat = E_3D_FORMAT_2D;
9070 }
9071 else
9072 {
9073 //keep pre detect 3d result
9074 if(IS_INPUT_SIDE_BY_SIDE_HALF(MAIN_WINDOW))
9075 {
9076 enFormat = E_3D_FORMAT_SS;
9077 }
9078 else if(IS_INPUT_TOP_BOTTOM(MAIN_WINDOW))
9079 {
9080 enFormat = E_3D_FORMAT_TB;
9081 }
9082 else
9083 {
9084 enFormat = E_3D_FORMAT_2D;
9085 }
9086 }
9087 }
9088 #if PRINTINFO
9089 printf("u32MatchCount=%lu, treshold s32Count=%u, enFormat=%u\n", u32MatchCount, (NBLK_DD_V * (NBLK_DD_H - 6) * HW_2DTO3D_3DDetect_PERCENTAGE / 100), enFormat);
9090 #endif
9091 }
9092 else
9093 {
9094 PIXEL Pixel3;
9095 PIXEL Pixel30, Pixel31, Pixel32, Pixel33, Pixel34, Pixel35, Pixel36;
9096 PIXEL Pixel2_0, Pixel2_1, Pixel2_2, Pixel2_3, Pixel2_4, Pixel2_5, Pixel2_6;
9097 PIXEL Pixel3_0, Pixel3_1, Pixel3_2, Pixel3_3, Pixel3_4, Pixel3_5, Pixel3_6;
9098 MS_U16 u16YDiff7 = 0, u16YDiff8 = 0, u16YDiff9 = 0, u16YDiff10 = 0, u16YDiff11 = 0;
9099 MS_U16 u16YDiff12 = 0, u16YDiff13 = 0;
9100 MS_U16 u16YDiff30 = 0, u16YDiff31 = 0, u16YDiff32 = 0, u16YDiff33 = 0;
9101 MS_U16 u16YDiff34 = 0, u16YDiff35 = 0, u16YDiff36 = 0, u16YDiff37 = 0;
9102 MS_U16 u16YDiff38 = 0, u16YDiff39 = 0, u16YDiff310 = 0, u16YDiff311 = 0;
9103 MS_U16 u16YDiff312 = 0, u16YDiff313 = 0;
9104 MS_U16 u16YDiff2_0 = 0, u16YDiff2_1 = 0, u16YDiff2_2 = 0, u16YDiff2_3 = 0;
9105 MS_U16 u16YDiff2_4 = 0, u16YDiff2_5 = 0, u16YDiff2_6 = 0, u16YDiff2_7 = 0;
9106 MS_U16 u16YDiff2_8 = 0, u16YDiff2_9 = 0, u16YDiff2_10 = 0, u16YDiff2_11 = 0;
9107 MS_U16 u16YDiff2_12 = 0, u16YDiff2_13 = 0;
9108 MS_U16 u16MinTB = 0, u16MinSS = 0, u16MinTB2 = 0, u16MinSS2 = 0;
9109 MS_U16 u16MaxTB_1 = 0, u16MaxSS_1 = 0, u16MaxTB = 0, u16MaxSS = 0, u16MaxTB2 = 0, u16MaxSS2 = 0;
9110 MS_U16 u16SSCount = 0, u16TBCount = 0, u162DCount = 0, u16HLinesymmetryCount = 0, u16VLinesymmetryCount = 0;
9111 MS_U16 u16HBlockShift = 0;
9112 PIXEL Pixel4;
9113 MS_U16 u16YDiff4_0 = 0, u16YDiff4_1 = 0, u16YDiff4_2 = 0, u16YDiff4_3 = 0;
9114 MS_U16 u16YDiff4_4 = 0, u16YDiff4_5 = 0, u16YDiff4_6 = 0, u16YDiff4_7 = 0;
9115 MS_U16 u16YDiff4_8 = 0, u16YDiff4_9 = 0, u16YDiff4_10 = 0, u16YDiff4_11 = 0;
9116 MS_U16 u16YDiff4_12 = 0, u16YDiff4_13 = 0;
9117 MS_U16 u16MaxTB_2 = 0, u16MaxSS_2 = 0;
9118 MS_U16 u16MinTB_1 = 0;
9119 MS_U16 u16MinTB_2 = 0;
9120 MS_U16 u16MinSS_1 = 0;
9121 MS_U16 u16MinSS_2 = 0;
9122
9123 if(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.bEnableOverscan)
9124 {
9125 if(gSrcInfo[MAIN_WINDOW].u16HCusScalingSrc > 0)
9126 {
9127 u16HBlockShift = (MS_U32)gSrcInfo[MAIN_WINDOW].ScaledCropWin.x
9128 * gSrcInfo[MAIN_WINDOW].u16HCusScalingDst
9129 / gSrcInfo[MAIN_WINDOW].u16HCusScalingSrc / PIXELNUMOFBLOCK;
9130 }
9131 }
9132
9133 if(u16HBlockShift > 3)
9134 {
9135 u16HBlockShift = 3;
9136 }
9137 #if (HW_2DTO3D_VER == 3)
9138 _MDrv_SC_3D_2DTo3D_HWInfo_Read(pInstance);
9139 #elif (HW_2DTO3D_VER == 4)
9140 _MDrv_SC_3D_2DTo3D_HWInfo_Read_U9(pInstance);
9141 #endif
9142 for(y = 0; y < NBLK_DD_V/2; y ++)
9143 {
9144 for(x = 3-u16HBlockShift; x < NBLK_DD_H/2-3-u16HBlockShift; x ++)
9145 {
9146 MS_BOOL bIsPattern = FALSE;
9147 Pixel1 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x];
9148 Pixel3 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x+(NBLK_DD_H/2)+u16HBlockShift];
9149 Pixel4 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][NBLK_DD_H-x];
9150
9151 //horizontal postion pixels
9152 Pixel10 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x+(NBLK_DD_H/2)+u16HBlockShift];
9153 Pixel11 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x+(NBLK_DD_H/2)+1+u16HBlockShift];
9154 Pixel12 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x+(NBLK_DD_H/2)+2+u16HBlockShift];
9155 Pixel13 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x+(NBLK_DD_H/2)+3+u16HBlockShift];
9156 Pixel14 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x+(NBLK_DD_H/2)-1+u16HBlockShift];
9157 Pixel15 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x+(NBLK_DD_H/2)-2+u16HBlockShift];
9158 Pixel16 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][x+(NBLK_DD_H/2)-3+u16HBlockShift];
9159
9160 //horizontal opposite position pixels
9161 Pixel2_0 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H-x];
9162 Pixel2_1 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H-x+1];
9163 Pixel2_2 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H-x+2];
9164 Pixel2_3 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H-x+3];
9165 Pixel2_4 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H-x-1];
9166 Pixel2_5 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H-x-2];
9167 Pixel2_6 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y][NBLK_DD_H-x-3];
9168
9169 //vertical postion pixels
9170 Pixel30 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x+u16HBlockShift];
9171 Pixel31 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x+1+u16HBlockShift];
9172 Pixel32 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x+2+u16HBlockShift];
9173 Pixel33 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x+3+u16HBlockShift];
9174 Pixel34 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x-1+u16HBlockShift];
9175 Pixel35 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x-2+u16HBlockShift];
9176 Pixel36 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[y+(NBLK_DD_V/2)][x-3+u16HBlockShift];
9177
9178 // vertical opposite position pixels
9179 Pixel3_0 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][x];
9180 Pixel3_1 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][x+1];
9181 Pixel3_2 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][x+2];
9182 Pixel3_3 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][x+3];
9183 Pixel3_4 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][x-1];
9184 Pixel3_5 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][x-2];
9185 Pixel3_6 = pXCResourcePrivate->stdrvXC_3D._stBlockStatus_Avg[NBLK_DD_V- y][x-3];
9186
9187 //SS
9188 u16YDiff0 = ((abs( Pixel1.R - Pixel10.R) + abs( Pixel1.G - Pixel10.G) + abs( Pixel1.B - Pixel10.B)));
9189 u16YDiff1 = ((abs( Pixel1.R - Pixel11.R) + abs( Pixel1.G - Pixel11.G) + abs( Pixel1.B - Pixel11.B)));
9190 u16YDiff2 = ((abs( Pixel1.R - Pixel12.R) + abs( Pixel1.G - Pixel12.G) + abs( Pixel1.B - Pixel12.B)));
9191 u16YDiff3 = ((abs( Pixel1.R - Pixel13.R) + abs( Pixel1.G - Pixel13.G) + abs( Pixel1.B - Pixel13.B)));
9192 u16YDiff4 = ((abs( Pixel1.R - Pixel14.R) + abs( Pixel1.G - Pixel14.G) + abs( Pixel1.B - Pixel14.B)));
9193 u16YDiff5 = ((abs( Pixel1.R - Pixel15.R) + abs( Pixel1.G - Pixel15.G) + abs( Pixel1.B - Pixel15.B)));
9194 u16YDiff6 = ((abs( Pixel1.R - Pixel16.R) + abs( Pixel1.G - Pixel16.G) + abs( Pixel1.B - Pixel16.B)));
9195
9196 //TB
9197 u16YDiff7 = ((abs( Pixel1.R - Pixel30.R) + abs( Pixel1.G - Pixel30.G) + abs( Pixel1.B - Pixel30.B)));
9198 u16YDiff8 = ((abs( Pixel1.R - Pixel31.R) + abs( Pixel1.G - Pixel31.G) + abs( Pixel1.B - Pixel31.B)));
9199 u16YDiff9 = ((abs( Pixel1.R - Pixel32.R) + abs( Pixel1.G - Pixel32.G) + abs( Pixel1.B - Pixel32.B)));
9200 u16YDiff10 = ((abs( Pixel1.R - Pixel33.R) + abs( Pixel1.G - Pixel33.G) + abs( Pixel1.B - Pixel33.B)));
9201 u16YDiff11 = ((abs( Pixel1.R - Pixel34.R) + abs( Pixel1.G - Pixel34.G) + abs( Pixel1.B - Pixel34.B)));
9202 u16YDiff12 = ((abs( Pixel1.R - Pixel35.R) + abs( Pixel1.G - Pixel35.G) + abs( Pixel1.B - Pixel35.B)));
9203 u16YDiff13 = ((abs( Pixel1.R - Pixel36.R) + abs( Pixel1.G - Pixel36.G) + abs( Pixel1.B - Pixel36.B)));
9204
9205
9206 //TB
9207 u16YDiff30 = ((abs( Pixel3.R - Pixel10.R) + abs( Pixel3.G - Pixel10.G) + abs( Pixel3.B - Pixel10.B)));
9208 u16YDiff31 = ((abs( Pixel3.R - Pixel11.R) + abs( Pixel3.G - Pixel11.G) + abs( Pixel3.B - Pixel11.B)));
9209 u16YDiff32 = ((abs( Pixel3.R - Pixel12.R) + abs( Pixel3.G - Pixel12.G) + abs( Pixel3.B - Pixel12.B)));
9210 u16YDiff33 = ((abs( Pixel3.R - Pixel13.R) + abs( Pixel3.G - Pixel13.G) + abs( Pixel3.B - Pixel13.B)));
9211 u16YDiff34 = ((abs( Pixel3.R - Pixel14.R) + abs( Pixel3.G - Pixel14.G) + abs( Pixel3.B - Pixel14.B)));
9212 u16YDiff35 = ((abs( Pixel3.R - Pixel15.R) + abs( Pixel3.G - Pixel15.G) + abs( Pixel3.B - Pixel15.B)));
9213 u16YDiff36 = ((abs( Pixel3.R - Pixel16.R) + abs( Pixel3.G - Pixel16.G) + abs( Pixel3.B - Pixel16.B)));
9214
9215 //SS
9216 u16YDiff37 = ((abs( Pixel3.R - Pixel30.R) + abs( Pixel3.G - Pixel30.G) + abs( Pixel3.B - Pixel30.B)));
9217 u16YDiff38 = ((abs( Pixel3.R - Pixel31.R) + abs( Pixel3.G - Pixel31.G) + abs( Pixel3.B - Pixel31.B)));
9218 u16YDiff39 = ((abs( Pixel3.R - Pixel32.R) + abs( Pixel3.G - Pixel32.G) + abs( Pixel3.B - Pixel32.B)));
9219 u16YDiff310 = ((abs( Pixel3.R - Pixel33.R) + abs( Pixel3.G - Pixel33.G) + abs( Pixel3.B - Pixel33.B)));
9220 u16YDiff311 = ((abs( Pixel3.R - Pixel34.R) + abs( Pixel3.G - Pixel34.G) + abs( Pixel3.B - Pixel34.B)));
9221 u16YDiff312 = ((abs( Pixel3.R - Pixel35.R) + abs( Pixel3.G - Pixel35.G) + abs( Pixel3.B - Pixel35.B)));
9222 u16YDiff313 = ((abs( Pixel3.R - Pixel36.R) + abs( Pixel3.G - Pixel36.G) + abs( Pixel3.B - Pixel36.B)));
9223
9224 // opposite position difference
9225 //SS
9226 u16YDiff2_0 = ((abs( Pixel1.R - Pixel2_0.R) + abs( Pixel1.G - Pixel2_0.G) + abs( Pixel1.B - Pixel2_0.B)));
9227 u16YDiff2_1 = ((abs( Pixel1.R - Pixel2_1.R) + abs( Pixel1.G - Pixel2_1.G) + abs( Pixel1.B - Pixel2_1.B)));
9228 u16YDiff2_2 = ((abs( Pixel1.R - Pixel2_2.R) + abs( Pixel1.G - Pixel2_2.G) + abs( Pixel1.B - Pixel2_2.B)));
9229 u16YDiff2_3 = ((abs( Pixel1.R - Pixel2_3.R) + abs( Pixel1.G - Pixel2_3.G) + abs( Pixel1.B - Pixel2_3.B)));
9230 u16YDiff2_4 = ((abs( Pixel1.R - Pixel2_4.R) + abs( Pixel1.G - Pixel2_4.G) + abs( Pixel1.B - Pixel2_4.B)));
9231 u16YDiff2_5 = ((abs( Pixel1.R - Pixel2_5.R) + abs( Pixel1.G - Pixel2_5.G) + abs( Pixel1.B - Pixel2_5.B)));
9232 u16YDiff2_6 = ((abs( Pixel1.R - Pixel2_6.R) + abs( Pixel1.G - Pixel2_6.G) + abs( Pixel1.B - Pixel2_6.B)));
9233
9234 //TB
9235 u16YDiff2_7 = ((abs( Pixel1.R - Pixel3_0.R) + abs( Pixel1.G - Pixel3_0.G) + abs( Pixel1.B - Pixel3_0.B)));
9236 u16YDiff2_8 = ((abs( Pixel1.R - Pixel3_1.R) + abs( Pixel1.G - Pixel3_1.G) + abs( Pixel1.B - Pixel3_1.B)));
9237 u16YDiff2_9 = ((abs( Pixel1.R - Pixel3_2.R) + abs( Pixel1.G - Pixel3_2.G) + abs( Pixel1.B - Pixel3_2.B)));
9238 u16YDiff2_10 = ((abs( Pixel1.R - Pixel3_3.R) + abs( Pixel1.G - Pixel3_3.G) + abs( Pixel1.B - Pixel3_3.B)));
9239 u16YDiff2_11 = ((abs( Pixel1.R - Pixel3_4.R) + abs( Pixel1.G - Pixel3_4.G) + abs( Pixel1.B - Pixel3_4.B)));
9240 u16YDiff2_12 = ((abs( Pixel1.R - Pixel3_5.R) + abs( Pixel1.G - Pixel3_5.G) + abs( Pixel1.B - Pixel3_5.B)));
9241 u16YDiff2_13 = ((abs( Pixel1.R - Pixel3_6.R) + abs( Pixel1.G - Pixel3_6.G) + abs( Pixel1.B - Pixel3_6.B)));
9242
9243 //SS
9244 u16YDiff4_0 = ((abs( Pixel4.R - Pixel3_0.R) + abs( Pixel4.G - Pixel3_0.G) + abs( Pixel4.B - Pixel3_0.B)));
9245 u16YDiff4_1 = ((abs( Pixel4.R - Pixel3_1.R) + abs( Pixel4.G - Pixel3_1.G) + abs( Pixel4.B - Pixel3_1.B)));
9246 u16YDiff4_2 = ((abs( Pixel4.R - Pixel3_2.R) + abs( Pixel4.G - Pixel3_2.G) + abs( Pixel4.B - Pixel3_2.B)));
9247 u16YDiff4_3 = ((abs( Pixel4.R - Pixel3_3.R) + abs( Pixel4.G - Pixel3_3.G) + abs( Pixel4.B - Pixel3_3.B)));
9248 u16YDiff4_4 = ((abs( Pixel4.R - Pixel3_4.R) + abs( Pixel4.G - Pixel3_4.G) + abs( Pixel4.B - Pixel3_4.B)));
9249 u16YDiff4_5 = ((abs( Pixel4.R - Pixel3_5.R) + abs( Pixel4.G - Pixel3_5.G) + abs( Pixel4.B - Pixel3_5.B)));
9250 u16YDiff4_6 = ((abs( Pixel4.R - Pixel3_6.R) + abs( Pixel4.G - Pixel3_6.G) + abs( Pixel4.B - Pixel3_6.B)));
9251
9252 //TB
9253 u16YDiff4_7 = ((abs( Pixel4.R - Pixel2_0.R) + abs( Pixel4.G - Pixel2_0.G) + abs( Pixel4.B - Pixel2_0.B)));
9254 u16YDiff4_8 = ((abs( Pixel4.R - Pixel2_1.R) + abs( Pixel4.G - Pixel2_1.G) + abs( Pixel4.B - Pixel2_1.B)));
9255 u16YDiff4_9 = ((abs( Pixel4.R - Pixel2_2.R) + abs( Pixel4.G - Pixel2_2.G) + abs( Pixel4.B - Pixel2_2.B)));
9256 u16YDiff4_10 = ((abs( Pixel4.R - Pixel2_3.R) + abs( Pixel4.G - Pixel2_3.G) + abs( Pixel4.B - Pixel2_3.B)));
9257 u16YDiff4_11 = ((abs( Pixel4.R - Pixel2_4.R) + abs( Pixel4.G - Pixel2_4.G) + abs( Pixel4.B - Pixel2_4.B)));
9258 u16YDiff4_12 = ((abs( Pixel4.R - Pixel2_5.R) + abs( Pixel4.G - Pixel2_5.G) + abs( Pixel4.B - Pixel2_5.B)));
9259 u16YDiff4_13 = ((abs( Pixel4.R - Pixel2_6.R) + abs( Pixel4.G - Pixel2_6.G) + abs( Pixel4.B - Pixel2_6.B)));
9260
9261 u16MaxTB = MAX3(MAX3(u16YDiff7, u16YDiff8, u16YDiff9), MAX3(u16YDiff10, u16YDiff11, u16YDiff12), u16YDiff13);
9262 u16MaxSS = MAX(MAX3(u16YDiff0, u16YDiff1, u16YDiff2), MAX(u16YDiff4, u16YDiff5));
9263 u16MaxTB2 = MAX3(MAX3( u16YDiff30, u16YDiff31, u16YDiff32), MAX3(u16YDiff33, u16YDiff34, u16YDiff35), u16YDiff36);
9264 u16MaxSS2 = MAX(MAX3(u16YDiff37, u16YDiff38, u16YDiff39), MAX(u16YDiff311, u16YDiff312));
9265
9266 u16MaxTB = (u16MaxTB + u16MaxTB2)/2;
9267 u16MaxSS = (u16MaxSS + u16MaxSS2)/2;
9268
9269 u16MinTB = MIN3(MIN3(u16YDiff7, u16YDiff8, u16YDiff9), MIN3(u16YDiff10, u16YDiff11, u16YDiff12), u16YDiff13);
9270 u16MinSS = MIN(MIN3(u16YDiff0, u16YDiff1, u16YDiff2), MIN(u16YDiff4, u16YDiff5));
9271 u16MinTB2 = MIN3(MIN3( u16YDiff30, u16YDiff31, u16YDiff32), MIN3(u16YDiff33, u16YDiff34, u16YDiff35), u16YDiff36);
9272 u16MinSS2 = MIN(MIN3(u16YDiff37, u16YDiff38, u16YDiff39), MIN(u16YDiff311, u16YDiff312));
9273
9274 u16MinTB = u16MinTB + u16MinTB2;
9275 u16MinSS = u16MinSS + u16MinSS2;
9276
9277 u16MaxTB_1 = MAX3(MAX3(u16YDiff2_7, u16YDiff2_8, u16YDiff2_9), MAX3(u16YDiff2_10, u16YDiff2_11, u16YDiff2_12), u16YDiff2_13);
9278 u16MaxSS_1 = MAX3(MAX3(u16YDiff2_0, u16YDiff2_1, u16YDiff2_2), MAX3(u16YDiff2_3, u16YDiff2_4, u16YDiff2_5), u16YDiff2_6);
9279 u16MaxTB_2 = MAX3(MAX3(u16YDiff4_7, u16YDiff4_8, u16YDiff4_9), MAX3(u16YDiff4_10, u16YDiff4_11, u16YDiff4_12), u16YDiff4_13);
9280 u16MaxSS_2 = MAX3(MAX3(u16YDiff4_0, u16YDiff4_1, u16YDiff4_2), MAX3(u16YDiff4_3, u16YDiff4_4, u16YDiff4_5), u16YDiff4_6);
9281
9282
9283 u16MaxTB_1 = (u16MaxTB_1 + u16MaxTB_2)/2;
9284 u16MaxSS_1 = (u16MaxSS_1 + u16MaxSS_2)/2;
9285
9286
9287 u16MinTB_1 = MIN3(MIN3(u16YDiff2_7, u16YDiff2_8, u16YDiff2_9), MIN3(u16YDiff2_10, u16YDiff2_11, u16YDiff2_12), u16YDiff2_13);
9288 u16MinSS_1 = MIN3(MIN3(u16YDiff2_0, u16YDiff2_1, u16YDiff2_2), MIN3(u16YDiff2_3, u16YDiff2_4, u16YDiff2_5), u16YDiff2_6);
9289 u16MinTB_2 = MIN3(MIN3(u16YDiff4_7, u16YDiff4_8, u16YDiff4_9), MIN3(u16YDiff4_10, u16YDiff4_11, u16YDiff4_12), u16YDiff4_13);
9290 u16MinSS_2 = MIN3(MIN3(u16YDiff4_0, u16YDiff4_1, u16YDiff4_2), MIN3(u16YDiff4_3, u16YDiff4_4, u16YDiff4_5), u16YDiff4_6);
9291
9292 u16MinTB_1 = u16MinTB_1 + u16MinTB_2;
9293 u16MinSS_1 = u16MinSS_1 + u16MinSS_2;
9294
9295
9296 if (_MDrv_SC_3D_IsPattern(pInstance, x, y, TRUE))
9297 {
9298 u16HLinesymmetryCount++;
9299 bIsPattern = TRUE;
9300 }
9301
9302
9303 if (_MDrv_SC_3D_IsPattern(pInstance, x, y, FALSE))
9304 {
9305 u16VLinesymmetryCount++;
9306 bIsPattern = TRUE;
9307 }
9308
9309 if (!bIsPattern)
9310 {
9311 if ( MAX(u16MinSS, u16MinTB) <= 20 )
9312 {
9313 //may consider special pattern in future
9314 #if 0
9315 if( u16MaxTB < MIN3((4*u16MaxSS/5), u16MaxTB_1, 140) && (u16MinTB!= u16MinSS) && (u16MaxTB!= u16MaxSS))
9316 {
9317 #if 1
9318 if(x == 10)
9319 {
9320 printf("tb\n");
9321 }
9322 #endif
9323 u16TBCount = u16TBCount+1;
9324 }
9325 else if( u16MaxSS < MIN3((3*u16MaxTB/4), u16MaxSS_1, 60) && (u16MinTB!= u16MinSS) && (u16MaxTB!= u16MaxSS))
9326 {
9327 #if 1
9328 if(x == 10)
9329 {
9330 printf("ss\n");
9331 }
9332 #endif
9333 u16SSCount = u16SSCount+1;
9334 }
9335
9336 if(x == 10)
9337 {
9338 printf("eeemaxTB %u, u16MaxSS %u, u16MinTB %u, u16MinSS %u, max1TB %u, max1SS %u\n", u16MaxTB, u16MaxSS, u16MinTB, u16MinSS, u16MaxTB_1, u16MaxSS_1);
9339 }
9340 #endif
9341 }
9342 else if (( MIN(u16MaxTB_1, u16MaxSS_1) > 25 ) && (u16MinTB!= u16MinSS))
9343 {
9344 if( u16MinTB < MIN3((4*u16MinSS/5), u16MaxTB_1, 140) && (u16MinTB < u16MaxTB))
9345 {
9346 #if 0
9347 if(x == 10)
9348 {
9349 printf("tb\n");
9350 }
9351 #endif
9352 u16TBCount = u16TBCount+1;
9353 }
9354 else if( u16MinSS < MIN3((3*u16MinTB/4), u16MaxSS_1, 80) && (u16MinSS < u16MaxSS))
9355 {
9356 #if 0
9357 if(x == 10)
9358 {
9359 printf("ss\n");
9360 }
9361 #endif
9362 u16SSCount = u16SSCount+1;
9363 }
9364 else if( MIN(u16MinTB, u16MinSS)!=0 )
9365 {
9366 #if 0
9367 if(x == 10)
9368 {
9369 printf("2d\n");
9370 }
9371 #endif
9372 u162DCount = u162DCount+1;
9373 }
9374 #if 0
9375 if(x == 10)
9376 {
9377 printf("fffmaxTB %u, u16MaxSS %u, u16MinTB %u, u16MinSS %u, max1TB %u, max1SS %u, u16MinTB_1 %u, u16MinSS_1 %u\n", u16MaxTB, u16MaxSS, u16MinTB, u16MinSS, u16MaxTB_1, u16MaxSS_1, u16MinTB_1, u16MinSS_1);
9378 }
9379 #endif
9380 }
9381 }
9382 }
9383 }
9384 if (u16HLinesymmetryCount < NBLK_DD_V*(NBLK_DD_H/4-4))
9385 {
9386 if (u16VLinesymmetryCount <= (NBLK_DD_H - 12)*(NBLK_DD_V-4)/4)
9387 {
9388 if(u16HBlockShift > 0)//overscan case
9389 {
9390 if ( MAX3(u16TBCount, u16SSCount, u162DCount)<= 15)//pure image handle
9391 {
9392 enFormat = E_3D_FORMAT_2D;
9393 }
9394 else if((u16SSCount > u16TBCount) && (u16SSCount > u162DCount))//ss predict
9395 {
9396 if(u16SSCount < 50)//small image case
9397 {
9398 if(u16SSCount>6*u162DCount)
9399 {
9400 enFormat = E_3D_FORMAT_SS;
9401 }
9402 if((u16SSCount>3*u162DCount) && (u16SSCount>6*u16TBCount))
9403 {
9404 enFormat = E_3D_FORMAT_SS;
9405 }
9406 else
9407 {
9408 enFormat = E_3D_FORMAT_2D;
9409 }
9410 }
9411 #if (HW_2DTO3D_VER == 4)
9412 else if(2*u16SSCount>5*u162DCount)//general case
9413 #else
9414 else if(u16SSCount>4*u162DCount)//general case
9415 #endif
9416 {
9417 enFormat = E_3D_FORMAT_SS;
9418 }
9419 //else if((u16SSCount>2*u162DCount) && (u16SSCount>4*u16TBCount))
9420 else if((u16SSCount>5*u162DCount/2) && (u16SSCount>4*u16TBCount))
9421 {
9422 enFormat = E_3D_FORMAT_SS;
9423 }
9424 else
9425 {
9426 enFormat = E_3D_FORMAT_2D;
9427 }
9428 }
9429 else if((u16TBCount > u16SSCount) && (u16TBCount > u162DCount))//tb predict
9430 {
9431 if(u16TBCount < 50)//small image case
9432 {
9433 if(u16TBCount > 6*u162DCount)
9434 {
9435 enFormat = E_3D_FORMAT_TB;
9436 }
9437 else if((u16TBCount > 3*u162DCount) && (u16TBCount > 6*u16SSCount))
9438 {
9439 enFormat = E_3D_FORMAT_TB;
9440 }
9441 else
9442 {
9443 enFormat = E_3D_FORMAT_2D;
9444 }
9445 }
9446 else if(u16TBCount > 3*u162DCount)//general case
9447 {
9448 enFormat = E_3D_FORMAT_TB;
9449 }
9450 //else if((u16TBCount>2*u162DCount) && (u16TBCount>4*u16SSCount))
9451 //else if((u16TBCount > 100) && (u16TBCount>9*u162DCount/5) && (u16TBCount>13*u16SSCount/2))
9452 else if((u16TBCount>5*u162DCount/2) && (u16TBCount>4*u16SSCount))
9453 {
9454 enFormat = E_3D_FORMAT_TB;
9455 }
9456 else
9457 {
9458 enFormat = E_3D_FORMAT_2D;
9459 }
9460 }
9461 else//2d predict
9462 {
9463 enFormat = E_3D_FORMAT_2D;
9464 }
9465 }
9466 else
9467 {
9468 if ( MAX3(u16TBCount, u16SSCount, u162DCount)< 6)//pure image handle
9469 {
9470 enFormat = E_3D_FORMAT_2D;
9471 }
9472 else if((u16SSCount > u16TBCount) && (u16SSCount > u162DCount))//ss predict
9473 {
9474 if(u16SSCount < 50)//small image case
9475 {
9476 if(u16SSCount>7*u162DCount)
9477 {
9478 enFormat = E_3D_FORMAT_SS;
9479 }
9480 else
9481 {
9482 enFormat = E_3D_FORMAT_2D;
9483 }
9484 }
9485 #if (HW_2DTO3D_VER == 4)
9486 else if(2*u16SSCount>5*u162DCount)//general case
9487 #else
9488 else if(u16SSCount>4*u162DCount)//general case
9489 #endif
9490 {
9491 enFormat = E_3D_FORMAT_SS;
9492 }
9493 else
9494 {
9495 enFormat = E_3D_FORMAT_2D;
9496 }
9497 }
9498 else if((u16TBCount > u16SSCount) && (u16TBCount > u162DCount))//tb predict
9499 {
9500 if(u16TBCount < 50)//small image case
9501 {
9502 if(u16TBCount > 7*u162DCount)
9503 {
9504 enFormat = E_3D_FORMAT_TB;
9505 }
9506 else
9507 {
9508 enFormat = E_3D_FORMAT_2D;
9509 }
9510 }
9511 else if(u16TBCount > 4*u162DCount)//general case
9512 {
9513 enFormat = E_3D_FORMAT_TB;
9514 }
9515 else
9516 {
9517 enFormat = E_3D_FORMAT_2D;
9518 }
9519 }
9520 else//2d predict
9521 {
9522 enFormat = E_3D_FORMAT_2D;
9523 }
9524 }
9525 }
9526 else
9527 {
9528 enFormat = E_3D_FORMAT_TB_PATTERN;
9529 }
9530 }
9531 else
9532 {
9533 enFormat = E_3D_FORMAT_SS_PATTERN;
9534 }
9535 #if PRINTINFO
9536 printf("u16TBCount=%u, u16SSCount=%u, u162DCount=%u, u16HLinesymmetryCount=%u, u16VLinesymmetryCount=%u, u8Format=%u\n", u16TBCount, u16SSCount, u162DCount, u16HLinesymmetryCount, u16VLinesymmetryCount, enFormat);
9537 #endif
9538 }
9539
9540
9541 ///frame statistics
9542 pXCResourcePrivate->stdrvXC_3D._u16TotalCount++;
9543 if(enFormat == E_3D_FORMAT_SS)
9544 {
9545 pXCResourcePrivate->stdrvXC_3D._u16SBSCount++;
9546 }
9547 else if(enFormat == E_3D_FORMAT_TB)
9548 {
9549 pXCResourcePrivate->stdrvXC_3D._u16TBCount++;
9550 }
9551 else if(enFormat == E_3D_FORMAT_2D || enFormat == E_3D_FORMAT_SS_PATTERN || enFormat == E_3D_FORMAT_TB_PATTERN)
9552 {
9553 pXCResourcePrivate->stdrvXC_3D._u162DCount++;
9554 }
9555
9556 if(E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
9557 {
9558 if(pXCResourcePrivate->stdrvXC_3D._u16TotalCount >= MAXFRAME_3DDETECT)
9559 {
9560 pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
9561 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d_cnt=%u,ss_cnt=%u,tb_cnt=%u\n"
9562 , pXCResourcePrivate->stdrvXC_3D._u162DCount
9563 , pXCResourcePrivate->stdrvXC_3D._u16SBSCount
9564 , pXCResourcePrivate->stdrvXC_3D._u16TBCount);
9565 if((pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u16TBCount)
9566 && (pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
9567 {
9568 if(pXCResourcePrivate->stdrvXC_3D._u16SBSCount >= PERCENTAGE_3DDETECT * pXCResourcePrivate->stdrvXC_3D._u16TotalCount / 100)
9569 {
9570 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "side by side\n");
9571 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_SIDE_BY_SIDE_HALF;
9572 MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
9573 }
9574 else
9575 {
9576 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
9577 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
9578 }
9579 }
9580 else if((pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u16SBSCount)
9581 && (pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
9582 {
9583 if(pXCResourcePrivate->stdrvXC_3D._u16TBCount >= PERCENTAGE_3DDETECT * pXCResourcePrivate->stdrvXC_3D._u16TotalCount / 100)
9584 {
9585 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "top bottom\n");
9586 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_TOP_BOTTOM;
9587 MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
9588 }
9589 else
9590 {
9591 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
9592 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
9593 }
9594 }
9595 else
9596 {
9597 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
9598 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
9599 }
9600 }
9601 }
9602 else if(E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
9603 {
9604 if(pXCResourcePrivate->stdrvXC_3D._u16TotalCount >= MAXFRAME_3DDETECT_COMPATIBLE)
9605 {
9606 pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
9607 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d_cnt=%u,ss_cnt=%u,tb_cnt=%u\n"
9608 , pXCResourcePrivate->stdrvXC_3D._u162DCount
9609 , pXCResourcePrivate->stdrvXC_3D._u16SBSCount
9610 , pXCResourcePrivate->stdrvXC_3D._u16TBCount);
9611 if((pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u16TBCount)
9612 && (pXCResourcePrivate->stdrvXC_3D._u16SBSCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
9613 {
9614 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "side by side\n");
9615 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_SIDE_BY_SIDE_HALF;
9616 }
9617 else if((pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u16SBSCount)
9618 && (pXCResourcePrivate->stdrvXC_3D._u16TBCount > pXCResourcePrivate->stdrvXC_3D._u162DCount))
9619 {
9620 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "top bottom\n");
9621 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_TOP_BOTTOM;
9622 }
9623 else
9624 {
9625 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "2d image\n");
9626 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
9627 }
9628 pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount++;
9629 }
9630 }
9631 }
9632 #if (HW_2DTO3D_VER == 3)
_MDrv_SC_3D_2DTo3D_DepthRefine(SC_INT_SRC eIntNum,void * pParam)9633 static void _MDrv_SC_3D_2DTo3D_DepthRefine(SC_INT_SRC eIntNum, void *pParam)
9634 {
9635 void *pInstance = pu32XCInst_private;
9636 eIntNum = eIntNum;
9637 pParam = pParam;
9638 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9639 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9640 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9641 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9642
9643 if(IS_INPUT_NORMAL_2D_HW(MAIN_WINDOW))
9644 {
9645 _MDrv_SC_3D_2DTo3D_UpdateRGB3DLUT(pInstance);
9646 _MDrv_SC_3D_2DTo3D_HWInfo_Read(pInstance);
9647 _MDrv_SC_3D_2DTo3D_DepthDetectionPIX(pInstance);
9648 _MDrv_SC_3D_2DTo3D_DepthDetectionBLK(pInstance);
9649 _MDrv_SC_3D_2DTo3D_HW_Info_Write(pInstance);
9650 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//left depth offset
9651 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//right depth offset
9652 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//left depth gain:7bits
9653 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//right depth gain:7bits
9654 }
9655
9656 if(((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D)
9657 || ((E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D))
9658 {
9659 _MDrv_SC_3D_SourceDetection(pInstance);
9660 }
9661 }
9662 #elif (HW_2DTO3D_VER == 4)
_MDrv_SC_3D_2DTo3D_DepthRefine(SC_INT_SRC eIntNum,void * pParam)9663 static void _MDrv_SC_3D_2DTo3D_DepthRefine(SC_INT_SRC eIntNum, void *pParam)
9664 {
9665 void *pInstance = pu32XCInst_private;
9666 eIntNum = eIntNum;
9667 pParam = pParam;
9668 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9669 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9670 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9671 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9672
9673
9674
9675 if(IS_INPUT_NORMAL_2D_HW(MAIN_WINDOW))
9676 {
9677 #if ENABLE_T3D_DEBUG
9678 pXCResourcePrivate->stdrvXC_3D.u8DBG_En = (SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x0F00)>>8;
9679 #else
9680 pXCResourcePrivate->stdrvXC_3D.u8DBG_En = 0;
9681 #endif
9682
9683 _MDrv_SC_3D_2DTo3D_PreSetting(pInstance);
9684 //if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x0001)==0)
9685 {
9686 //startTime = MsOS_GetSystemTime();
9687 //if(period_too_short == 0)
9688 _MDrv_SC_3D_2DTo3D_UpdateRGB3DLUT_U9(pInstance);
9689 //_MDrv_SC_3D_2DTo3D_UpdateRGB3DLUT(); //INTERRUPT
9690 }
9691 #if ENABLE_T3D_DEBUG
9692 if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x0001)==0)
9693 #endif
9694 {
9695 _MDrv_SC_3D_2DTo3D_HWInfo_Read_U9(pInstance);
9696 }
9697 _MDrv_SC_3D_2DTo3D_TrendDetection(pInstance);
9698 _MDrv_SC_3D_2DTo3D_BGColorDetection_U9(pInstance); //New, move out
9699 _MDrv_SC_3D_2DTo3D_DepthDetectionPIX_U9(pInstance); //New
9700
9701
9702 //if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x0010)==0)
9703 {
9704 _MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT2_U9(pInstance);
9705 _MDrv_SC_3D_2DTo3D_PrepareRGB3DLUT_IIR(pInstance);
9706 }
9707
9708 _MDrv_SC_3D_2DTo3D_DepthDetectionBLK_TEST(pInstance);
9709
9710 if(pXCResourcePrivate->stdrvXC_3D.u8DBG_En!=0x00)
9711 {
9712 _MDrv_SC_3D_2DTo3D_DepthDetectionTmp(pInstance);
9713 }
9714 #if ENABLE_T3D_DEBUG
9715 if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK23_58_L)&0x1000)==0)
9716 #endif
9717 {
9718 _MDrv_SC_3D_2DTo3D_HW_Info_Write(pInstance);
9719 }
9720
9721
9722
9723 //Global and Local depth gain tuning
9724 #if 0//DUMYGAINCTRL
9725 MS_U8 u8tmpval_FE = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5B_L,0xff));//0EB8
9726 MS_U8 u8tmpval_FF = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5C_L,0xff00))>>8;//0EB9
9727 MS_BOOL LR_SWAP = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L,0x8000))>>15;
9728 MS_U16 Ggain, Pgain, Genable, Penable;
9729 Ggain = u8tmpval_FE&0x7F;
9730 Genable = (u8tmpval_FE&0x80)>>7;
9731 Pgain = u8tmpval_FF&0x7F;
9732 Penable = (u8tmpval_FF&0x80)>>7;
9733
9734 if(Genable==1)
9735 {
9736 Ggain = MINMAX(Ggain,0,0x7F);
9737 if(LR_SWAP)
9738 {
9739 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, Ggain<<8 ,0xff00);
9740 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, (Ggain+0x80)<<8,0xff00);
9741
9742 }
9743 else
9744 {
9745 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, Ggain<<8 ,0xff00);
9746 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, (Ggain+0x80)<<8,0xff00);
9747 //MFC_WriteByte(REG_13B1D,Ggain);
9748 //MFC_WriteByte(REG_13B0D,Ggain+0x80);
9749 }
9750 }
9751 else
9752 {
9753 if(E_XC_3D_OUTPUT_TOP_BOTTOM_HW != MDrv_XC_Get_3D_Output_Mode(pInstance))
9754 {
9755 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//left depth offset
9756 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//right depth offset
9757 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//left depth gain:7bits
9758 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//right depth gain:7bits
9759 }
9760 }
9761
9762 if(Penable==1)
9763 {
9764 if(E_XC_3D_OUTPUT_LINE_ALTERNATIVE_HW != MDrv_XC_Get_3D_Output_Mode(pInstance))
9765 {
9766 Pgain = MINMAX(Pgain*8,0,0xFF);
9767
9768 if (LR_SWAP)
9769 {
9770 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_65_L, (~Pgain)+1 ,0x01ff);
9771 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_66_L, Pgain, 0x01ff);
9772 }
9773 else
9774 {
9775 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_66_L, (~Pgain)+1 ,0x01ff);
9776 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_65_L, Pgain, 0x01ff);
9777 //MFC_Write2BytesMask(REG_13BCC,(~Pgain)+1,0x01FF);
9778 //MFC_Write2BytesMask(REG_13BCA,Pgain,0x01FF);
9779 }
9780 }
9781 }
9782 #else
9783
9784 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//left depth offset
9785 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//right depth offset
9786 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<9, 0x7F00);//left depth gain:7bits
9787 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<9, 0x7F00);//right depth gain:7bits
9788
9789 MS_U16 Pgain_L = pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain <<2;
9790 if((SC_R2BYTE(psXCInstPri->u32DeviceID,REG_SC_BK62_06_L)&0x8000) == 0)
9791 {
9792 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_65_L, (~Pgain_L) + 1, 0x01FF);
9793 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_66_L, Pgain_L, 0x01FF);
9794 }
9795 else
9796 {
9797 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_65_L, Pgain_L, 0x01FF);
9798 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_66_L, (~Pgain_L) + 1, 0x01FF);
9799 }
9800 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_67_L, 0x80, 0x00FF);//left depth gain:7bits
9801 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_67_L, 0x8000, 0xFF00);//right depth gain:7bits
9802
9803 #if ENABLE_T3D_DEBUG
9804 //enable black edge
9805 Hal_SC_3D_enable_black_edge(pInstance, TRUE);
9806 #endif
9807
9808 #endif
9809 }
9810
9811 if(((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D)
9812 || ((E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D))
9813 {
9814 _MDrv_SC_3D_SourceDetection(pInstance);
9815 }
9816 }
9817 #endif //(HW_2DTO3D_VER == 3)
9818 #endif //(HW_2DTO3D_VER < 3)
9819 #endif //HW_2DTO3D_SUPPORT
9820 #endif //DISABLE_3D_FUNCTION
9821 //------------------------------------------------------------------------------
9822 //--------HW 2D to 3D CPU Depth Refine Part End---------------------------------
9823 //------------------------------------------------------------------------------
9824 //------------------------------------------------------------------------------
9825
9826
9827
9828 //----------------------------------------
9829 //--------3D external interface-----------
9830 //----------------------------------------
9831 //-------------------------------------------------------------------------------------------------
9832 /// get 3D hw version
9833 /// @return MS_U16 \b OUT: 3d hw version
9834 //-------------------------------------------------------------------------------------------------
MDrv_XC_Get_3D_HW_Version(void)9835 MS_U16 MDrv_XC_Get_3D_HW_Version(void)
9836 {
9837 // Note: HW_DESIGN_3D_VER
9838 // 0: T3, Janus. non 3d chip, use opm, madi etc to make 3d
9839 // 1: T12, T13, A1: it has some 3d type specific registers. It can send out LR flag by hw
9840 // Yet A1 has hw 2d-->3d, but we use HW_2DTO3D_SUPPORT to indicate it.
9841 // 2: M10, J2: based on version 1, it has all the 3d type registers. input and output 3d registers are independent.
9842 // 3: A6: based on version 2, it removes black space before reading into memory.
9843 // 4: A3, A5, A5P: based on version3, main sub window can both use 1920+960 line buffer, so no H prescaling is needed.
9844 // It has FRC-inside feature also, but we use FRC_INSIDE to indicate this feature.
9845 return HW_DESIGN_3D_VER;
9846 }
9847
MApi_XC_Get_3D_HW_Version_U2(void * pInstance)9848 MS_U16 MApi_XC_Get_3D_HW_Version_U2(void* pInstance)
9849 {
9850 MS_U16 u16Return = 0;
9851 u16Return = MDrv_XC_Get_3D_HW_Version();
9852 return u16Return;
9853 }
9854
MApi_XC_Get_3D_HW_Version(void)9855 MS_U16 MApi_XC_Get_3D_HW_Version(void)
9856 {
9857 if (pu32XCInst == NULL)
9858 {
9859 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9860 return 0;
9861 }
9862
9863 stXC_GET_3D_HWVERSION XCArgs;
9864 XCArgs.u16ReturnValue = 0;
9865
9866 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_HWVERSION, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9867 {
9868 printf("Obtain XC engine fail\n");
9869 return 0;
9870 }
9871 else
9872 {
9873 return XCArgs.u16ReturnValue;
9874 }
9875 }
9876
9877 //-------------------------------------------------------------------------------------------------
9878 /// Is Supported HW 2D To 3D
9879 /// @return MS_BOOL \b OUT: TRUE: HW 2D to 3D FALSE: SW 2D to 3D
9880 //-------------------------------------------------------------------------------------------------
9881
MDrv_XC_Get_3D_IsSupportedHW2DTo3D(void)9882 MS_BOOL MDrv_XC_Get_3D_IsSupportedHW2DTo3D(void)
9883 {
9884 return HW_2DTO3D_SUPPORT;
9885 }
9886
MApi_XC_Get_3D_IsSupportedHW2DTo3D_U2(void * pInstance)9887 MS_BOOL MApi_XC_Get_3D_IsSupportedHW2DTo3D_U2(void* pInstance)
9888 {
9889 return MDrv_XC_Get_3D_IsSupportedHW2DTo3D();
9890 }
9891
MApi_XC_Get_3D_IsSupportedHW2DTo3D(void)9892 MS_BOOL MApi_XC_Get_3D_IsSupportedHW2DTo3D(void)
9893 {
9894 if (pu32XCInst == NULL)
9895 {
9896 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9897 return FALSE;
9898 }
9899
9900 stXC_CHECK_3D_SUPPORT_HW2DTO3D XCArgs;
9901 XCArgs.bReturnValue = FALSE;
9902
9903 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_3D_SUPPORT_HW2DTO3D, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9904 {
9905 printf("Obtain XC engine fail\n");
9906 return FALSE;
9907 }
9908 else
9909 {
9910 return XCArgs.bReturnValue;
9911 }
9912 }
9913
9914 //-------------------------------------------------------------------------------------------------
9915 /// set 3D convert format type
9916 /// @param e3dInputMode \b IN: the input format
9917 /// @param e3dOutputMode \b IN: the format we want to convert to
9918 /// @param e3dPanelType \b IN: the panel type.
9919 /// @param eWindow \b IN: which window we are going to set
9920 /// @return MS_BOOL \b OUT: TRUE:Success FALSE:Fail
9921 //-------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_Mode_U2(void * pInstance,E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode,E_XC_3D_PANEL_TYPE e3dPanelType,SCALER_WIN eWindow)9922 MS_BOOL MApi_XC_Set_3D_Mode_U2(void* pInstance,
9923 E_XC_3D_INPUT_MODE e3dInputMode,
9924 E_XC_3D_OUTPUT_MODE e3dOutputMode,
9925 E_XC_3D_PANEL_TYPE e3dPanelType,
9926 SCALER_WIN eWindow)
9927 {
9928 #ifndef DISABLE_3D_FUNCTION
9929 MS_ASSERT(eWindow < MAX_WINDOW);
9930 MS_BOOL bRet = TRUE;
9931 E_XC_3D_INPUT_MODE eMain_3dInputMode = E_XC_3D_INPUT_MODE_NONE;
9932 E_XC_3D_OUTPUT_MODE eMain_3dOutputMode = E_XC_3D_OUTPUT_MODE_NONE;
9933
9934 if(eWindow >= MAX_WINDOW)
9935 {
9936 return FALSE;
9937 }
9938 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9939 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9940 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
9941 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9942 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9943 Hal_SC_3D_InvertMemsyncInterlaceMode(pInstance);
9944
9945 #if((HW_DESIGN_3D_VER >= 5) || (HW_DESIGN_3D_VER == 3)) //manhattan and muji mode
9946 if(E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR == e3dOutputMode)
9947 {
9948 pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA = TRUE;
9949 e3dOutputMode = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE;
9950 }
9951 else if(E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR_HW == e3dOutputMode)
9952 {
9953 pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA = TRUE;
9954 e3dOutputMode = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_HW;
9955 }
9956 else
9957 {
9958 pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA = FALSE;
9959 }
9960 #endif
9961
9962 #if FRC_INSIDE
9963 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC &&
9964 (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultHTotal> 3000) &&
9965 (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVTotal> 2000) &&
9966 (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq > 500) && // 4K2K panel
9967 (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_4K1K_120HZ) &&
9968 (E_XC_3D_OUTPUT_FRAME_ALTERNATIVE == e3dOutputMode))
9969 {
9970 // For FRC inside chip, ex.Einstein/Napoli
9971 // 4K1K FA output case, FRC only can handle TB in to FA out
9972 // so SC need to convert 3D output as TB mode
9973 e3dOutputMode = E_XC_3D_OUTPUT_TOP_BOTTOM;
9974 }
9975
9976 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6)) //maserati 3D use FRC
9977 if (MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW)
9978 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
9979 ||((e3dInputMode == E_XC_3D_INPUT_MODE_NONE) // add dual view type
9980 &&((e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE)
9981 ||(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)))
9982 #endif
9983 )
9984 {
9985 switch(e3dOutputMode)
9986 {
9987 case E_XC_3D_OUTPUT_FRAME_L:
9988 case E_XC_3D_OUTPUT_FRAME_R:
9989 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
9990 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
9991 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = FALSE;
9992 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_MODE_NONE;
9993 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
9994 break;
9995 case E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF:
9996 case E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF_HW:
9997 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
9998 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
9999 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = FALSE;
10000 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_MODE_NONE;
10001 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
10002 break;
10003 case E_XC_3D_OUTPUT_TOP_BOTTOM:
10004 case E_XC_3D_OUTPUT_TOP_BOTTOM_HW:
10005 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
10006 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
10007 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = FALSE;
10008 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_MODE_NONE;
10009 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
10010 break;
10011 case E_XC_3D_OUTPUT_LINE_ALTERNATIVE:
10012 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
10013 pXCResourcePrivate->stdrvXC_3D._bLAToTB = TRUE;
10014 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = TRUE;
10015 e3dOutputMode = E_XC_3D_OUTPUT_TOP_BOTTOM;
10016 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_TOP_BOTTOM;
10017 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_LINE_ALTERNATIVE;
10018 break;
10019 case E_XC_3D_OUTPUT_LINE_ALTERNATIVE_HW:
10020 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
10021 pXCResourcePrivate->stdrvXC_3D._bLAToTB = TRUE;
10022 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = TRUE;
10023 e3dOutputMode = E_XC_3D_OUTPUT_TOP_BOTTOM_HW;
10024 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_TOP_BOTTOM;
10025 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_LINE_ALTERNATIVE;
10026 break;
10027 case E_XC_3D_OUTPUT_FRAME_ALTERNATIVE:
10028 pXCResourcePrivate->stdrvXC_3D._bFAToTB = TRUE;
10029 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
10030 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = TRUE;
10031 e3dOutputMode = E_XC_3D_OUTPUT_TOP_BOTTOM;
10032 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_TOP_BOTTOM;
10033 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE;
10034 break;
10035 case E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_HW:
10036 pXCResourcePrivate->stdrvXC_3D._bFAToTB = TRUE;
10037 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
10038 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = TRUE;
10039 e3dOutputMode = E_XC_3D_OUTPUT_TOP_BOTTOM_HW;
10040 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_TOP_BOTTOM;
10041 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE;
10042 break;
10043 default:
10044 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
10045 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
10046 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = FALSE;
10047 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_MODE_NONE;
10048 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
10049 break;
10050 }
10051 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "e3dOutputMode = %d, FRC Input 3D Type = %d, FRC output 3D Type = %d\n", e3dOutputMode,\
10052 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode, pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode);
10053 }
10054 else
10055 {
10056 pXCResourcePrivate->stdrvXC_3D._bFAToTB = FALSE;
10057 pXCResourcePrivate->stdrvXC_3D._bLAToTB = FALSE;
10058 pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled = FALSE;
10059 pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode = E_XC_3D_INPUT_MODE_NONE;
10060 pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
10061 }
10062 #endif
10063 #endif
10064
10065 #if (!(HW_2DTO3D_SUPPORT && (HW_2DTO3D_VER >= 3)))
10066 if(E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
10067 {
10068 if((e3dInputMode != E_XC_3D_INPUT_MODE_NONE) && (e3dOutputMode != E_XC_3D_OUTPUT_MODE_NONE))
10069 {
10070 pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D = FALSE;
10071 }
10072 else
10073 {
10074 pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D = pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D;
10075 }
10076 }
10077 #endif
10078
10079 pXCResourcePrivate->stdrvXC_3D._ePreUsedInput3DMode[eWindow] = E_XC_3D_INPUT_MODE_NONE;
10080 pXCResourcePrivate->stdrvXC_3D._ePreUsedOutput3DMode = E_XC_3D_OUTPUT_MODE_NONE;
10081 pXCResourcePrivate->stdrvXC_3D._bNeedRestore3DFormat = FALSE;
10082
10083 if(eWindow == MAIN_WINDOW)
10084 {
10085 bRet = MDrv_XC_Is3DFormatSupported(pInstance, e3dInputMode, e3dOutputMode);
10086 }
10087 else
10088 {
10089 /// When 3D output is FI, the VOP window don't need to enable Sub
10090 if(e3dOutputMode != E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
10091 {
10092 eMain_3dInputMode = MDrv_XC_Get_3D_Input_Mode(pInstance, MAIN_WINDOW);
10093 eMain_3dOutputMode = MDrv_XC_Get_3D_Output_Mode(pInstance);
10094 if((eMain_3dInputMode != e3dInputMode)||(eMain_3dOutputMode != e3dOutputMode))
10095 {
10096 printf("Please check the 3D combination of sub's\n");
10097 bRet = FALSE;
10098 }
10099 }
10100 }
10101
10102 if(bRet == TRUE)
10103 {
10104 pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] = e3dInputMode;
10105 pXCResourcePrivate->stdrvXC_3D._eOutput3DMode = e3dOutputMode;
10106 pXCResourcePrivate->stdrvXC_3D._e3DPanelType = e3dPanelType;
10107 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "e3dInputMode=%u, e3dOutputMode=%u\n", e3dInputMode, e3dOutputMode);
10108 }
10109 else //if not supported, display as 2D
10110 {
10111 printf("MApi_XC_Set_3D_Mode(): invalid format, set to 3d_none\n");
10112 _XC_ENTRY(pInstance);
10113 Hal_SC_subwindow_disable(pInstance);
10114 _XC_RETURN(pInstance);
10115 pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] = E_XC_3D_INPUT_MODE_NONE;
10116 gSrcInfo[eWindow].stDispWin.x = 0;
10117 gSrcInfo[eWindow].stDispWin.y = 0;
10118 gSrcInfo[eWindow].stDispWin.width = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width;
10119 gSrcInfo[eWindow].stDispWin.height = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
10120 }
10121
10122 #if (HW_DESIGN_3D_VER == 4)
10123 if(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
10124 {
10125 if(e3dPanelType == E_XC_3D_PANEL_PELLICLE)
10126 {
10127 if((e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
10128 ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD))
10129 {
10130 #ifdef FA_1920X540_OUTPUT
10131 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x540;
10132 #else
10133 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_960x1080;
10134 #endif
10135 }
10136 else if((e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
10137 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_FULL)
10138 ||(e3dInputMode == E_XC_3D_INPUT_FIELD_ALTERNATIVE))
10139 {
10140 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x540;
10141 }
10142 else
10143 {
10144 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x1080;
10145 }
10146 }
10147 else if(e3dPanelType == E_XC_3D_PANEL_SHUTTER)
10148 {
10149 if((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING))
10150 {
10151 if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
10152 {
10153 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
10154 {
10155 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x540;
10156 }
10157 else
10158 {
10159 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x1080;
10160 }
10161 }
10162 else if(gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_720X2P_VSIZE)
10163 {
10164 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
10165 {
10166 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x540;
10167 }
10168 else
10169 {
10170 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1280x720;
10171 }
10172 }
10173 }
10174 }
10175 }
10176 else
10177 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_MODE_NONE;
10178
10179 if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC && (IS_INPUT_NORMAL_2D_HW(eWindow)))
10180 {
10181 // Enable CLK_ICLK_FRC
10182 W2BYTEMSK(L_CLKGEN1(0x35), 0x0004, 0x0004); // clk_idclk_frc
10183 W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0002); // Not Invert
10184 W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0001); // Enable clock
10185 }
10186 else
10187 {
10188 // Enable CLK_ICLK_FRC
10189 W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0004); // clk_fdclk_frc
10190 W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0002); // Not Invert
10191 W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0001); // Enable clock
10192 }
10193
10194 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u83D_FI_out=%x\n",pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out);
10195 #endif
10196 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10197 #else
10198 MS_BOOL bRet = FALSE;
10199 UNUSED(e3dInputMode);
10200 UNUSED(e3dOutputMode);
10201 UNUSED(e3dPanelType);
10202 UNUSED(eWindow);
10203
10204 printf("Not support!!");
10205 #endif
10206 return bRet;
10207 }
10208
MApi_XC_Set_3D_Mode(E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode,E_XC_3D_PANEL_TYPE e3dPanelType,SCALER_WIN eWindow)10209 MS_BOOL MApi_XC_Set_3D_Mode(E_XC_3D_INPUT_MODE e3dInputMode,
10210 E_XC_3D_OUTPUT_MODE e3dOutputMode,
10211 E_XC_3D_PANEL_TYPE e3dPanelType,
10212 SCALER_WIN eWindow)
10213 {
10214 if (pu32XCInst == NULL)
10215 {
10216 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10217 return FALSE;
10218 }
10219
10220 stXC_SET_3D_MODE XCArgs;
10221 XCArgs.e3dInputMode = e3dInputMode;
10222 XCArgs.e3dOutputMode = e3dOutputMode;
10223 XCArgs.e3dPanelType = e3dPanelType;
10224 XCArgs.eWindow = eWindow;
10225 XCArgs.bReturnValue = FALSE;
10226
10227 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_MODE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10228 {
10229 printf("Obtain XC engine fail\n");
10230 return FALSE;
10231 }
10232 else
10233 {
10234 return XCArgs.bReturnValue;
10235 }
10236 }
10237
10238 //-------------------------------------------------------------------------------------------------
10239 /// This API return 3D input format
10240 /// @param eWindow \b IN: which window we are going to set
10241 //-------------------------------------------------------------------------------------------------
MDrv_XC_Get_3D_Input_Mode(void * pInstance,SCALER_WIN eWindow)10242 E_XC_3D_INPUT_MODE MDrv_XC_Get_3D_Input_Mode(void *pInstance, SCALER_WIN eWindow)
10243 {
10244 #ifndef DISABLE_3D_FUNCTION
10245 MS_ASSERT(eWindow < MAX_WINDOW);
10246 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10247 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10248 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10249 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10250 if(eWindow >= MAX_WINDOW)
10251 {
10252 return E_XC_3D_INPUT_MODE_NONE;
10253 }
10254 return pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow];
10255 #else
10256 UNUSED(eWindow);
10257 return E_XC_3D_INPUT_MODE_NONE;
10258 #endif
10259 }
10260
MApi_XC_Get_3D_Input_Mode_U2(void * pInstance,SCALER_WIN eWindow)10261 E_XC_3D_INPUT_MODE MApi_XC_Get_3D_Input_Mode_U2(void* pInstance, SCALER_WIN eWindow)
10262 {
10263 E_XC_3D_INPUT_MODE eInputMode = E_XC_3D_INPUT_MODE_NONE;
10264 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10265 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10266 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10267 eInputMode = MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow);
10268 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10269 return eInputMode;
10270 }
10271
MApi_XC_Get_3D_Input_Mode(SCALER_WIN eWindow)10272 E_XC_3D_INPUT_MODE MApi_XC_Get_3D_Input_Mode(SCALER_WIN eWindow)
10273 {
10274 if (pu32XCInst == NULL)
10275 {
10276 if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, NULL) != UTOPIA_STATUS_SUCCESS)
10277 {
10278 printf("UtopiaOpen XC failed\n");
10279 return E_XC_3D_INPUT_MODE_NONE;
10280 }
10281 }
10282
10283 stXC_GET_3D_INPUT_MODE XCArgs;
10284 XCArgs.eWindow = eWindow;
10285 XCArgs.eReturnValue = E_XC_3D_INPUT_MODE_NONE;
10286
10287 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_INPUT_MODE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10288 {
10289 printf("Obtain XC engine fail\n");
10290 return E_XC_3D_INPUT_MODE_NONE;
10291 }
10292 else
10293 {
10294 return XCArgs.eReturnValue;
10295 }
10296 }
10297
10298 //-------------------------------------------------------------------------------------------------
10299 /// This API return 3D output format
10300 //-------------------------------------------------------------------------------------------------
MDrv_XC_Get_3D_Output_Mode(void * pInstance)10301 E_XC_3D_OUTPUT_MODE MDrv_XC_Get_3D_Output_Mode(void *pInstance)
10302 {
10303 #ifndef DISABLE_3D_FUNCTION
10304 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10305 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10306 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10307 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10308 return pXCResourcePrivate->stdrvXC_3D._eOutput3DMode;
10309 #else
10310 return E_XC_3D_OUTPUT_MODE_NONE;
10311 #endif
10312 }
10313
MApi_XC_Get_3D_Output_Mode_U2(void * pInstance)10314 E_XC_3D_OUTPUT_MODE MApi_XC_Get_3D_Output_Mode_U2(void* pInstance)
10315 {
10316 E_XC_3D_OUTPUT_MODE eOutputMode = E_XC_3D_OUTPUT_MODE_NONE;
10317 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10318 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10319 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10320 eOutputMode = MDrv_XC_Get_3D_Output_Mode(pInstance);
10321 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10322 return eOutputMode;
10323 }
10324
MApi_XC_Get_3D_Output_Mode(void)10325 E_XC_3D_OUTPUT_MODE MApi_XC_Get_3D_Output_Mode(void)
10326 {
10327 if (pu32XCInst == NULL)
10328 {
10329 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10330 return E_XC_3D_OUTPUT_MODE_NONE;
10331 }
10332
10333 stXC_GET_3D_OUTPUT_MODE XCArgs;
10334 XCArgs.eReturnValue = E_XC_3D_OUTPUT_MODE_NONE;
10335
10336 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_OUTPUT_MODE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10337 {
10338 printf("Obtain XC engine fail\n");
10339 return E_XC_3D_OUTPUT_MODE_NONE;
10340 }
10341 else
10342 {
10343 return XCArgs.eReturnValue;
10344 }
10345 }
10346
10347 #ifdef UFO_XC_GET_3D_FORMAT
MDrv_XC_Get3DFormat(void * pInstance,E_XC_3D_ATTRIBUTE_TYPE e3DAttrType,void * para,void * p3DFormat)10348 MS_BOOL MDrv_XC_Get3DFormat(void* pInstance, E_XC_3D_ATTRIBUTE_TYPE e3DAttrType, void* para, void* p3DFormat)
10349 {
10350 MS_BOOL bRet = FALSE;
10351 #ifndef DISABLE_3D_FUNCTION
10352 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10353 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10354 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10355 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10356
10357 if((NULL == para) || (NULL == p3DFormat))
10358 {
10359 printf(" \n Attention %s : %d, ERROR : (NULL == para) || (NULL == p3DFormat). \n ",__FUNCTION__,__LINE__);
10360 return FALSE;
10361 }
10362
10363 E_XC_3D_OSD_BLENDING_POINT eOSDBlendingPoint = E_XC_3D_OSD_BLENDING_NUM;
10364 if(E_XC_3D_ATTRIBUTE_OSD == e3DAttrType)
10365 {
10366 eOSDBlendingPoint = *((E_XC_3D_OSD_BLENDING_POINT*)(para));
10367 if(E_XC_3D_OSD_BLENDING_SC_IP == eOSDBlendingPoint)
10368 {
10369 *((E_XC_3D_INPUT_MODE*)p3DFormat) = pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW];
10370 bRet = TRUE;
10371 }
10372 else if(E_XC_3D_OSD_BLENDING_SC_OP == eOSDBlendingPoint)
10373 {
10374 if(pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA && !pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled)
10375 {
10376 if(E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_HW == pXCResourcePrivate->stdrvXC_3D._eOutput3DMode)
10377 {
10378 *((E_XC_3D_OUTPUT_MODE*)p3DFormat) = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR_HW;
10379 }
10380 else
10381 {
10382 *((E_XC_3D_OUTPUT_MODE*)p3DFormat) = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR;
10383 }
10384 }
10385 else
10386 {
10387 *((E_XC_3D_OUTPUT_MODE*)p3DFormat) = pXCResourcePrivate->stdrvXC_3D._eOutput3DMode;
10388 }
10389 bRet = TRUE;
10390 }
10391 else if(E_XC_3D_OSD_BLENDING_FRC_IP == eOSDBlendingPoint)
10392 {
10393 *((E_XC_3D_INPUT_MODE*)p3DFormat) = pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode;
10394 bRet = TRUE;
10395 }
10396 else if(E_XC_3D_OSD_BLENDING_FRC_OP == eOSDBlendingPoint)
10397 {
10398 if(pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA && pXCResourcePrivate->stdrvXC_3D._bFAToTB)
10399 {
10400 if(E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_HW == pXCResourcePrivate->stdrvXC_3D._eOutput3DMode)
10401 {
10402 *((E_XC_3D_OUTPUT_MODE*)p3DFormat) = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR_HW;
10403 }
10404 else
10405 {
10406 *((E_XC_3D_OUTPUT_MODE*)p3DFormat) = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR;
10407 }
10408 }
10409 else
10410 {
10411 *((E_XC_3D_OUTPUT_MODE*)p3DFormat) = pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode;
10412 }
10413 bRet = TRUE;
10414 }
10415 else
10416 {
10417 *((E_XC_3D_OUTPUT_MODE*)p3DFormat) = E_XC_3D_OUTPUT_MODE_NONE;
10418 bRet = FALSE;
10419 }
10420 }
10421 #endif
10422 return bRet;
10423 }
10424
MApi_XC_Get3DFormat_U2(void * pInstance,E_XC_3D_ATTRIBUTE_TYPE e3DAttrType,void * para,void * p3DFormat)10425 MS_BOOL MApi_XC_Get3DFormat_U2(void* pInstance, E_XC_3D_ATTRIBUTE_TYPE e3DAttrType, void* para, void* p3DFormat)
10426 {
10427 MS_BOOL bRet = FALSE;
10428 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10429 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10430 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10431 bRet = MDrv_XC_Get3DFormat(pInstance, e3DAttrType, para, p3DFormat);
10432 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10433 return bRet;
10434 }
10435
MApi_XC_Get3DFormat(E_XC_3D_ATTRIBUTE_TYPE e3DAttrType,void * para,void * p3DFormat)10436 MS_BOOL MApi_XC_Get3DFormat(E_XC_3D_ATTRIBUTE_TYPE e3DAttrType, void* para, void* p3DFormat)
10437 {
10438 if (pu32XCInst == NULL)
10439 {
10440 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10441 return FALSE;
10442 }
10443
10444 stXC_GET3DFORMAT XCArgs;
10445 XCArgs.e3DAttrType = e3DAttrType;
10446 XCArgs.para = para;
10447 XCArgs.p3DFormat = p3DFormat;
10448 XCArgs.bReturnValue = FALSE;
10449
10450 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET3DFORMAT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10451 {
10452 printf("\n %s : %d, Obtain XC engine fail \n ",__FUNCTION__,__LINE__);
10453 return E_XC_3D_OUTPUT_MODE_NONE;
10454 }
10455 else
10456 {
10457 return XCArgs.bReturnValue;
10458 }
10459
10460 }
10461 #endif
10462 //-------------------------------------------------------------------------------------------------
10463 /// This API return 3D panel type
10464 //-------------------------------------------------------------------------------------------------
MDrv_XC_Get_3D_Panel_Type(void * pInstance)10465 E_XC_3D_PANEL_TYPE MDrv_XC_Get_3D_Panel_Type(void *pInstance)
10466 {
10467 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10468 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10469 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10470 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10471 return pXCResourcePrivate->stdrvXC_3D._e3DPanelType;
10472 }
10473
MApi_XC_Get_3D_Panel_Type_U2(void * pInstance)10474 E_XC_3D_PANEL_TYPE MApi_XC_Get_3D_Panel_Type_U2(void* pInstance)
10475 {
10476 #ifndef DISABLE_3D_FUNCTION
10477 E_XC_3D_PANEL_TYPE eType = E_XC_3D_PANEL_NONE;
10478 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10479 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10480 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10481 eType = MDrv_XC_Get_3D_Panel_Type(pInstance);
10482 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10483 return eType;
10484 #else
10485 return E_XC_3D_PANEL_NONE;
10486 #endif
10487 }
10488
MApi_XC_Get_3D_Panel_Type(void)10489 E_XC_3D_PANEL_TYPE MApi_XC_Get_3D_Panel_Type(void)
10490 {
10491 if (pu32XCInst == NULL)
10492 {
10493 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10494 return E_XC_3D_PANEL_MAX;
10495 }
10496
10497 stXC_GET_3D_PANELTYPE XCArgs;
10498 XCArgs.eReturnValue = E_XC_3D_PANEL_MAX;
10499
10500 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_PANELTYPE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10501 {
10502 printf("Obtain XC engine fail\n");
10503 return E_XC_3D_PANEL_MAX;
10504 }
10505 else
10506 {
10507 return XCArgs.eReturnValue;
10508 }
10509 }
10510
10511 //-------------------------------------------------------------------------------------------------
10512 /// do Ip Sync to make main and sub window same relation to OP, thus framelock could be applied to
10513 /// both main and sub window
10514 /// @return MS_BOOL \b OUT: TRUE:Success FALSE:Fail
10515 //-------------------------------------------------------------------------------------------------
MApi_XC_3DMainSub_IPSync_U2(void * pInstance)10516 MS_BOOL MApi_XC_3DMainSub_IPSync_U2(void* pInstance)
10517 {
10518 #ifndef DISABLE_3D_FUNCTION
10519 _XC_ENTRY(pInstance);
10520 HAL_SC_ip_3DMainSub_IPSync(pInstance);
10521 _XC_RETURN(pInstance);
10522 return TRUE;
10523 #else
10524 return FALSE;
10525 #endif
10526 }
10527
MApi_XC_3DMainSub_IPSync(void)10528 MS_BOOL MApi_XC_3DMainSub_IPSync(void)
10529 {
10530 if (pu32XCInst == NULL)
10531 {
10532 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10533 return FALSE;
10534 }
10535
10536 stXC_CHECK_3D_MAINSUB_IPSYNC XCArgs;
10537 XCArgs.bReturnValue = FALSE;
10538
10539 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_3D_MAINSUB_IPSYNC, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10540 {
10541 printf("Obtain XC engine fail\n");
10542 return FALSE;
10543 }
10544 else
10545 {
10546 return XCArgs.bReturnValue;
10547 }
10548 }
10549
10550 //-------------------------------------------------------------------------------------------------
10551 /// When we do output: line_alter, we can decide the odd line coming from which part of the input
10552 /// (left or right, up or down, first frame or second frame, etc)
10553 /// @param bMainFirst \b IN: True: Main first; False: Sub first
10554 /// @return MS_BOOL \b OUT: TRUE:Success FALSE:Fail
10555 //-------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_MainWin_FirstMode_U2(void * pInstance,MS_BOOL bMainFirst)10556 MS_BOOL MApi_XC_Set_3D_MainWin_FirstMode_U2(void* pInstance, MS_BOOL bMainFirst)
10557 {
10558 #ifndef DISABLE_3D_FUNCTION
10559 //True: Main first; False: Sub first
10560 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10561 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10562 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10563
10564 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10565 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10566 pXCResourcePrivate->stdrvXC_3D._b3DMainFirst = bMainFirst;
10567 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10568 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange main-sub win sequence! (%u)\n", bMainFirst);
10569 return TRUE;
10570 #else
10571 UNUSED(bMainFirst);
10572 return FALSE;
10573 #endif
10574 }
10575
MApi_XC_Set_3D_MainWin_FirstMode(MS_BOOL bMainFirst)10576 MS_BOOL MApi_XC_Set_3D_MainWin_FirstMode(MS_BOOL bMainFirst)
10577 {
10578 if (pu32XCInst == NULL)
10579 {
10580 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10581 return FALSE;
10582 }
10583
10584 stXC_SET_3D_MAINWIN_FIRST XCArgs;
10585 XCArgs.bMainFirst = bMainFirst;
10586 XCArgs.bReturnValue = FALSE;
10587
10588 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_MAINWIN_FIRST, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10589 {
10590 printf("Obtain XC engine fail\n");
10591 return FALSE;
10592 }
10593 else
10594 {
10595 return XCArgs.bReturnValue;
10596 }
10597 }
10598 //-------------------------------------------------------------------------------------------------
10599 /// the API return the relation that odd line is coming from which part of the input content.
10600 /// @param bMainFirst \b IN: True: Main first; False: Sub first
10601 /// @return MS_BOOL \b OUT: TRUE:Success FALSE:Fail
10602 //-------------------------------------------------------------------------------------------------
MApi_XC_Get_3D_MainWin_First_U2(void * pInstance)10603 MS_BOOL MApi_XC_Get_3D_MainWin_First_U2(void* pInstance)
10604 {
10605 #ifndef DISABLE_3D_FUNCTION
10606 MS_BOOL bReturn = FALSE;
10607 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10608 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10609 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10610
10611 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10612 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10613 bReturn = pXCResourcePrivate->stdrvXC_3D._b3DMainFirst;
10614 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10615 return bReturn;
10616 #else
10617 return FALSE;
10618 #endif
10619 }
10620
MApi_XC_Get_3D_MainWin_First(void)10621 MS_BOOL MApi_XC_Get_3D_MainWin_First(void)
10622 {
10623 if (pu32XCInst == NULL)
10624 {
10625 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10626 return FALSE;
10627 }
10628
10629 stXC_GET_3D_MAINWIN_FIRST XCArgs;
10630 XCArgs.bReturnValue = FALSE;
10631
10632 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_MAINWIN_FIRST, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10633 {
10634 printf("Obtain XC engine fail\n");
10635 return FALSE;
10636 }
10637 else
10638 {
10639 return XCArgs.bReturnValue;
10640 }
10641 }
10642
10643 //-------------------------------------------------------------------------------------------------
10644 /// Some mm file maybe have unofficial format,
10645 /// eg.
10646 /// --------------------------
10647 /// | black_L |
10648 /// --------------------------
10649 /// | |
10650 /// | L |
10651 /// | |
10652 /// --------------------------
10653 /// | |
10654 /// | R |
10655 /// | |
10656 /// --------------------------
10657 /// | black+R |
10658 /// --------------------------
10659 /// this format cannot direct convert to 3D output. Because black_L will cover with R
10660 /// so we define the black area height, then handle it in 3D process.
10661 /// But the height must be told by AP layer
10662 /// @param bMainFirst \b IN: True: Main first; False: Sub first
10663 /// @return MS_BOOL \b OUT: TRUE:Success FALSE:Fail
10664 //-------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_VerVideoOffset_U2(void * pInstance,MS_U16 u163DVerVideoOffset)10665 MS_BOOL MApi_XC_Set_3D_VerVideoOffset_U2(void* pInstance, MS_U16 u163DVerVideoOffset)
10666 {
10667 printf("MApi_XC_Set_3D_VerVideoOffset:this function is obsolete\n");
10668 return TRUE;
10669 }
10670
MApi_XC_Set_3D_VerVideoOffset(MS_U16 u163DVerVideoOffset)10671 MS_BOOL MApi_XC_Set_3D_VerVideoOffset(MS_U16 u163DVerVideoOffset)
10672 {
10673 if (pu32XCInst == NULL)
10674 {
10675 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10676 return FALSE;
10677 }
10678
10679 stXC_SET_3D_VERTICALVIDEO_OFFSET XCArgs;
10680 XCArgs.u163DVerVideoOffset = u163DVerVideoOffset;
10681 XCArgs.bReturnValue = FALSE;
10682
10683 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_VERTICALVIDEO_OFFSET, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10684 {
10685 printf("Obtain XC engine fail\n");
10686 return FALSE;
10687 }
10688 else
10689 {
10690 return XCArgs.bReturnValue;
10691 }
10692 }
10693
10694 //-------------------------------------------------------------------------------------------------
10695 /// This API return Top Bottom's black area height
10696 //-------------------------------------------------------------------------------------------------
MApi_XC_Get_3D_VerVideoOffset_U2(void * pInstance)10697 MS_U16 MApi_XC_Get_3D_VerVideoOffset_U2(void* pInstance)
10698 {
10699 printf("MApi_XC_Get_3D_VerVideoOffset:this function is obsolete\n");
10700 return 0;
10701 }
10702
MApi_XC_Get_3D_VerVideoOffset(void)10703 MS_U16 MApi_XC_Get_3D_VerVideoOffset(void)
10704 {
10705 if (pu32XCInst == NULL)
10706 {
10707 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10708 return FALSE;
10709 }
10710
10711 stXC_GET_3D_VERTICALVIDEO_OFFSET XCArgs;
10712 XCArgs.u16ReturnValue = FALSE;
10713
10714 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_VERTICALVIDEO_OFFSET, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10715 {
10716 printf("Obtain XC engine fail\n");
10717 return FALSE;
10718 }
10719 else
10720 {
10721 return XCArgs.u16ReturnValue;
10722 }
10723 }
10724
10725 #ifndef DISABLE_3D_FUNCTION
10726
MDrv_XC_Set_3D_LR_Frame_Exchg_burst(void * pInstance,SCALER_WIN eWindow)10727 MS_BOOL MDrv_XC_Set_3D_LR_Frame_Exchg_burst(void *pInstance, SCALER_WIN eWindow)
10728 {
10729 MS_BOOL bRet = FALSE;
10730 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10731 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10732 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10733 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10734 MS_ASSERT(eWindow < MAX_WINDOW);
10735
10736 if(eWindow >= MAX_WINDOW)
10737 {
10738 return FALSE;
10739 }
10740
10741 #if (HW_DESIGN_3D_VER < 2)
10742
10743 if((IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10744 #if (HW_DESIGN_3D_VER == 0)
10745 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
10746 #endif
10747 )
10748 {
10749 MS_PHY u32Temp1 = 0, u32Temp2 = 0;
10750 //exchange the ipm base0 and ipm base1
10751
10752 _MLOAD_ENTRY(pInstance);
10753 u32Temp1 = Hal_SC_Get_DNRBase0(pInstance, MAIN_WINDOW);
10754 u32Temp2 = Hal_SC_Get_DNRBase1(pInstance, MAIN_WINDOW);
10755 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_08_L, (MS_U16)(u32Temp2>>00), 0xFFFF);
10756 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_09_L, (MS_U16)(u32Temp2>>16), 0xFFFF);
10757 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_0A_L, (MS_U16)(u32Temp1>>00), 0xFFFF);
10758 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_0B_L, (MS_U16)(u32Temp1>>16), 0xFFFF);
10759 MDrv_XC_MLoad_Fire(pInstance, TRUE);
10760 _MLOAD_RETURN(pInstance);
10761 bRet = TRUE;
10762 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange dnr base\n");
10763 }
10764 else if(((IS_INPUT_TOP_BOTTOM(eWindow) || IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
10765 || IS_INPUT_LINE_ALTERNATIVE(eWindow))
10766 && IS_OUTPUT_LINE_ALTERNATIVE())
10767 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
10768 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10769 || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
10770 || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())//old way
10771 || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()) //old way
10772 || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
10773 || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
10774 || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
10775 || (IS_INPUT_FIELD_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10776 || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10777 || (IS_INPUT_NORMAL_2D_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10778 || (IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10779 || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10780 || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
10781 )
10782 {
10783 MS_PHY u32Temp1 = 0, u32Temp2 = 0;
10784 //exchange the dnr base0 of main & sub
10785
10786 _MLOAD_ENTRY(pInstance);
10787 u32Temp1 = Hal_SC_Get_OPMBase0(MAIN_WINDOW);
10788 u32Temp2 = Hal_SC_Get_OPMBase1(MAIN_WINDOW);
10789 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_10_L, (MS_U16)(u32Temp2>>00), 0xFFFF);
10790 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_11_L, (MS_U16)(u32Temp2>>16), 0xFFFF);
10791 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_12_L, (MS_U16)(u32Temp1>>00), 0xFFFF);
10792 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_13_L, (MS_U16)(u32Temp1>>16), 0xFFFF);
10793 MDrv_XC_MLoad_Fire(pInstance, TRUE);
10794 _MLOAD_RETURN(pInstance);
10795 bRet = TRUE;
10796 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange opm base\n");
10797 }
10798 else if((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
10799 || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
10800 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
10801 || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()))
10802 {
10803 MS_U16 u16Temp = MOD_R2BYTE(REG_MOD_BK01_78_L);
10804 u16Temp = u16Temp^BIT(15);
10805 #ifdef SUPPORT_MOD_ADBANK_SEPARATE
10806
10807 #else
10808 MOD_W2BYTEMSK(REG_MOD_BK01_78_L, u16Temp, BIT(15));
10809 #endif
10810 bRet = TRUE;
10811 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange 3d ver1's L/R flag\n");
10812 }
10813 else if(IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_TOP_BOTTOM())
10814 {
10815 MS_PHY u32Temp1 = 0, u32Temp2 = 0;
10816 //exchange the dnr base0 of main & sub
10817
10818 _MLOAD_ENTRY(pInstance);
10819 u32Temp1 = Hal_SC_Get_DNRBase0(pInstance, MAIN_WINDOW);
10820 u32Temp2 = Hal_SC_Get_DNRBase0(pInstance, SUB_WINDOW);
10821 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_08_L, (MS_U16)(u32Temp2>>00), 0xFFFF);
10822 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_09_L, (MS_U16)(u32Temp2>>16), 0xFFFF);
10823 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_48_L, (MS_U16)(u32Temp1>>00), 0xFFFF);
10824 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_49_L, (MS_U16)(u32Temp1>>16), 0xFFFF);
10825 MDrv_XC_MLoad_Fire(pInstance, TRUE);
10826 _MLOAD_RETURN(pInstance);
10827 bRet = TRUE;
10828 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange main/sub dnr base0\n");
10829 }
10830 else if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
10831 || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
10832 {
10833 MS_PHY u32Temp1 = 0, u32Temp2 = 0;
10834 MS_U16 u16Temp = 0;
10835 //exchange the opm base0/base1 of main & sub
10836
10837 _MLOAD_ENTRY(pInstance);
10838 u32Temp1 = Hal_SC_Get_OPMBase0(MAIN_WINDOW);
10839 u32Temp2 = Hal_SC_Get_OPMBase0(SUB_WINDOW);
10840 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_10_L, (MS_U16)(u32Temp2>>00), 0xFFFF);
10841 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_11_L, (MS_U16)(u32Temp2>>16), 0xFFFF);
10842 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_50_L, (MS_U16)(u32Temp1>>00), 0xFFFF);
10843 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_51_L, (MS_U16)(u32Temp1>>16), 0xFFFF);
10844
10845 u32Temp1 = Hal_SC_Get_OPMBase1(MAIN_WINDOW);
10846 u32Temp2 = Hal_SC_Get_OPMBase1(SUB_WINDOW);
10847 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_12_L, (MS_U16)(u32Temp2>>00), 0xFFFF);
10848 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_13_L, (MS_U16)(u32Temp2>>16), 0xFFFF);
10849 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_52_L, (MS_U16)(u32Temp1>>00), 0xFFFF);
10850 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_53_L, (MS_U16)(u32Temp1>>16), 0xFFFF);
10851
10852 u32Temp1 = Hal_SC_Get_OPMBase2(MAIN_WINDOW);
10853 u32Temp2 = Hal_SC_Get_OPMBase2(SUB_WINDOW);
10854 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_14_L, (MS_U16)(u32Temp2>>00), 0xFFFF);
10855 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_15_L, (MS_U16)(u32Temp2>>16), 0xFFFF);
10856 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_54_L, (MS_U16)(u32Temp1>>00), 0xFFFF);
10857 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_55_L, (MS_U16)(u32Temp1>>16), 0xFFFF);
10858
10859 u16Temp = Hal_SC_get_opm_fetch(MAIN_WINDOW);
10860 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_17_L, Hal_SC_get_opm_fetch(SUB_WINDOW), 0x1FFF);
10861 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_57_L, u16Temp, 0x1FFF);
10862
10863 u16Temp = (Hal_SC_Get_LBOffset(MAIN_WINDOW)<<8)|(Hal_SC_Get_LBOffset(SUB_WINDOW));
10864 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_1D_L, u16Temp , 0xFFFF);
10865
10866 if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
10867 {
10868 MS_U16 u16MainRWBank, u16SubRWBank;
10869 u16MainRWBank = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L);
10870 u16SubRWBank = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L);
10871
10872 u16MainRWBank = u16MainRWBank^BIT(14);
10873 u16SubRWBank = u16SubRWBank^BIT(14);
10874 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_07_L, u16MainRWBank, BIT(14));
10875 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_47_L, u16SubRWBank, BIT(14));
10876 }
10877
10878 MDrv_XC_MLoad_Fire(pInstance, TRUE);
10879 _MLOAD_RETURN(pInstance);
10880 bRet = TRUE;
10881 }
10882 #elif (HW_DESIGN_3D_VER >= 2)
10883 if((IS_INPUT_NORMAL_2D(eWindow) || IS_INPUT_NORMAL_2D_INTERLACE(eWindow)) &&
10884 IS_OUTPUT_LINE_ALTERNATIVE())
10885 {
10886 if(pXCResourcePrivate->stdrvXC_3D._u163DHShift & 0xFF)
10887 {
10888 pXCResourcePrivate->stdrvXC_3D._u163DHShift <<= 8; //Switch shift to sub window
10889 }
10890 else
10891 {
10892 pXCResourcePrivate->stdrvXC_3D._u163DHShift >>= 8; //Switch shift to Main window
10893 }
10894 _MLOAD_ENTRY(pInstance);
10895 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_1C_L, pXCResourcePrivate->stdrvXC_3D._u163DHShift, 0xFFFF);//Main/sub display window offset in right direction
10896 MDrv_XC_MLoad_Fire(pInstance, TRUE);
10897 _MLOAD_RETURN(pInstance);
10898 bRet = TRUE;
10899 }
10900 else if(!(IS_INPUT_MODE_NONE(eWindow) || IS_OUTPUT_MODE_NONE())
10901 && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE_HW()))
10902 && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW()))
10903 #if(HW_DESIGN_3D_VER >= 4)
10904 && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()))
10905 && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_TOP_BOTTOM_HW()))
10906 && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_PACKING))
10907 #endif
10908 )
10909 {
10910 #if(HW_DESIGN_3D_VER >= 5)
10911 MS_U16 u16FRCM_W,u16FRCM_R;
10912 u16FRCM_W = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L);
10913 u16FRCM_R = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L);
10914 if(u16FRCM_R & BIT(7))
10915 {
10916 //Recommend to use OP L/R switch as designer's advice
10917 u16FRCM_R = u16FRCM_R^BIT(8);
10918 _MLOAD_ENTRY(pInstance);
10919 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK32_33_L, u16FRCM_R, BIT(8));//F2 OPM 3D LR invert
10920 MDrv_XC_MLoad_Fire(pInstance, TRUE);
10921 _MLOAD_RETURN(pInstance);
10922 bRet = TRUE;
10923 }
10924 else if(u16FRCM_W & BIT(0))
10925 {
10926 u16FRCM_W = u16FRCM_W^BIT(4);
10927 _MLOAD_ENTRY(pInstance);
10928 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK32_30_L, u16FRCM_R, BIT(4));//F2 IPM 3D LR invert
10929 MDrv_XC_MLoad_Fire(pInstance, TRUE);
10930 _MLOAD_RETURN(pInstance);
10931 bRet = TRUE;
10932 }
10933 else
10934 {
10935 printf("----------------3D L/R switch: UnSupported format I: %u->O: %u\n", pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow], pXCResourcePrivate->stdrvXC_3D._eOutput3DMode);
10936 }
10937 #else
10938 MS_U16 u16IPM, u16OPM;
10939 u16IPM = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L);
10940 u16OPM = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L);
10941 if(u16OPM & BIT(7))
10942 {
10943 //Recommend to use OP L/R switch as designer's advice
10944 u16OPM = u16OPM^BIT(8);
10945 _MLOAD_ENTRY(pInstance);
10946
10947 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_33_L, u16OPM, BIT(8));//F2 OPM 3D LR invert
10948
10949 MDrv_XC_MLoad_Fire(pInstance, TRUE);
10950 _MLOAD_RETURN(pInstance);
10951 bRet = TRUE;
10952 }
10953 else if(u16IPM & BIT(0))
10954 {
10955 u16IPM = u16IPM^BIT(4);
10956 _MLOAD_ENTRY(pInstance);
10957 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_30_L, u16IPM, BIT(4));//F2 IPM 3D LR invert
10958 MDrv_XC_MLoad_Fire(pInstance, TRUE);
10959 _MLOAD_RETURN(pInstance);
10960 bRet = TRUE;
10961 }
10962 else
10963 {
10964 printf("----------------3D L/R switch: UnSupported format I: %u->O: %u\n", pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow], pXCResourcePrivate->stdrvXC_3D._eOutput3DMode);
10965 }
10966 #endif
10967 }
10968 #endif
10969
10970 #if HW_2DTO3D_SUPPORT
10971 if((IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE_HW())
10972 #if (HW_2DTO3D_VER >= 4)
10973 ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW())
10974 ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_TOP_BOTTOM_HW())
10975 ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
10976 ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_PACKING())
10977 #endif
10978 )
10979 {
10980 #if (HW_2DTO3D_VER >= 3)
10981 MS_U16 u16LeftGain = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L);
10982 MS_U16 u16RightGain = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L);
10983 u16LeftGain = u16LeftGain^BIT(15);
10984 u16RightGain = u16RightGain^BIT(15);
10985 _MLOAD_ENTRY(pInstance);
10986 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK62_06_L, u16LeftGain, BIT(15));
10987 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK62_0E_L, u16RightGain, BIT(15));
10988 MDrv_XC_MLoad_Fire(pInstance, TRUE);
10989 _MLOAD_RETURN(pInstance);
10990 bRet = TRUE;
10991 #else
10992 MS_U16 u16OutputFormat = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0007);
10993 if(0x0001 == u16OutputFormat)
10994 {
10995 _MLOAD_ENTRY(pInstance);
10996 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK15_67_L, 0x0004, 0x0007);
10997 MDrv_XC_MLoad_Fire(pInstance, TRUE);
10998 _MLOAD_RETURN(pInstance);
10999 bRet = TRUE;
11000 }
11001 else if(0x0004 == u16OutputFormat)
11002 {
11003 _MLOAD_ENTRY(pInstance);
11004 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK15_67_L, 0x0001, 0x0007);
11005 MDrv_XC_MLoad_Fire(pInstance, TRUE);
11006 _MLOAD_RETURN(pInstance);
11007 bRet = TRUE;
11008 }
11009 else
11010 {
11011 printf("----------------3D L/R switch: UnSupported hw 2d to 3d output format\n");
11012 }
11013 #endif
11014 }
11015 else if(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW())
11016 {
11017 #ifdef SUPPORT_MOD_ADBANK_SEPARATE
11018
11019 #else
11020 MS_U16 u16Temp = MOD_R2BYTE(REG_MOD_BK01_78_L);
11021 u16Temp = u16Temp^BIT(15);
11022 MOD_W2BYTEMSK(REG_MOD_BK01_78_L, u16Temp, BIT(15));
11023 #endif
11024 bRet = TRUE;
11025 }
11026 #endif
11027 return bRet;
11028 }
11029
MDrv_XC_Set_3D_LR_Frame_Exchg(void * pInstance,SCALER_WIN eWindow)11030 MS_BOOL MDrv_XC_Set_3D_LR_Frame_Exchg(void *pInstance, SCALER_WIN eWindow)
11031 {
11032 MS_BOOL bRet = FALSE;
11033 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11034 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11035 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11036 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11037 MS_ASSERT(eWindow < MAX_WINDOW);
11038
11039 if(eWindow >= MAX_WINDOW)
11040 {
11041 return FALSE;
11042 }
11043
11044 #if (HW_DESIGN_3D_VER < 2)
11045
11046 if((IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11047 #if (HW_DESIGN_3D_VER == 0)
11048 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
11049 #endif
11050 )
11051 {
11052 MS_PHY u32Temp = 0;
11053 //exchange the ipm base0 and ipm base1
11054 u32Temp = Hal_SC_Get_DNRBase0(pInstance, MAIN_WINDOW) * BYTE_PER_WORD;
11055 Hal_SC_set_DNRBase0(pInstance, Hal_SC_Get_DNRBase1(pInstance, MAIN_WINDOW) * BYTE_PER_WORD, MAIN_WINDOW);
11056 Hal_SC_set_DNRBase1(pInstance, u32Temp, MAIN_WINDOW);
11057 bRet = TRUE;
11058 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange dnr base\n");
11059 }
11060 else if(((IS_INPUT_TOP_BOTTOM(eWindow) || IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
11061 || IS_INPUT_LINE_ALTERNATIVE(eWindow))
11062 && IS_OUTPUT_LINE_ALTERNATIVE())
11063 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11064 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11065 || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11066 || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())//old way
11067 || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()) //old way
11068 || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11069 || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11070 || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11071 || (IS_INPUT_FIELD_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11072 || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11073 || (IS_INPUT_NORMAL_2D_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11074 || (IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11075 || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11076 || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11077 )
11078 {
11079 MS_PHY u32Temp = 0;
11080 u32Temp = Hal_SC_Get_OPMBase0(MAIN_WINDOW) * BYTE_PER_WORD;
11081 Hal_SC_set_OPMBase0(pInstance, Hal_SC_Get_OPMBase1(pInstance, MAIN_WINDOW) * BYTE_PER_WORD, MAIN_WINDOW);
11082 Hal_SC_set_OPMBase1(pInstance, u32Temp, MAIN_WINDOW);
11083 bRet = TRUE;
11084 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange opm base\n");
11085 }
11086 else if((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
11087 || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
11088 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
11089 || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()))
11090 {
11091 #ifdef SUPPORT_MOD_ADBANK_SEPARATE
11092
11093 #else
11094 MS_U16 u16Temp = MOD_R2BYTE(REG_MOD_BK01_78_L);
11095 u16Temp = u16Temp^BIT(15);
11096 MOD_W2BYTEMSK(REG_MOD_BK01_78_L, u16Temp, BIT(15));
11097 #endif
11098 bRet = TRUE;
11099 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange 3d ver1's L/R flag\n");
11100 }
11101 else if(IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_TOP_BOTTOM())
11102 {
11103 MS_U32 u32Temp = 0;
11104 //exchange the dnr base0 of main & sub
11105 u32Temp = Hal_SC_Get_DNRBase0(pInstance, MAIN_WINDOW) * BYTE_PER_WORD;
11106 Hal_SC_set_DNRBase0(pInstance, Hal_SC_Get_DNRBase0(pInstance, SUB_WINDOW) * BYTE_PER_WORD, MAIN_WINDOW);
11107 Hal_SC_set_DNRBase0(pInstance, u32Temp, SUB_WINDOW);
11108 bRet = TRUE;
11109 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange main/sub dnr base0\n");
11110
11111 }
11112 else if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
11113 || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
11114 {
11115 MS_PHY u32Temp = 0;
11116 //exchange the opm base0/base1 of main & sub
11117 u32Temp = Hal_SC_Get_OPMBase0(pInstance, MAIN_WINDOW) * BYTE_PER_WORD;
11118 Hal_SC_set_OPMBase0(pInstance, Hal_SC_Get_OPMBase0(pInstance, SUB_WINDOW) * BYTE_PER_WORD, MAIN_WINDOW);
11119 Hal_SC_set_OPMBase0(pInstance, u32Temp, SUB_WINDOW);
11120
11121 u32Temp = Hal_SC_Get_OPMBase1(pInstance, MAIN_WINDOW) * BYTE_PER_WORD;
11122 Hal_SC_set_OPMBase1(pInstance, Hal_SC_Get_OPMBase1(pInstance, SUB_WINDOW) * BYTE_PER_WORD, MAIN_WINDOW);
11123 Hal_SC_set_OPMBase1(pInstance, u32Temp, SUB_WINDOW);
11124
11125 u32Temp = Hal_SC_Get_OPMBase2(pInstance, MAIN_WINDOW) * BYTE_PER_WORD;
11126 Hal_SC_set_OPMBase2(pInstance, Hal_SC_Get_OPMBase2(pInstance, SUB_WINDOW) * BYTE_PER_WORD, MAIN_WINDOW);
11127 Hal_SC_set_OPMBase2(pInstance, u32Temp, SUB_WINDOW);
11128
11129 u32Temp = Hal_SC_get_opm_fetch(pInstance, MAIN_WINDOW);
11130 Hal_SC_set_opm_fetch(pInstance, MAIN_WINDOW, Hal_SC_get_opm_fetch(pInstance, SUB_WINDOW));
11131 Hal_SC_set_opm_fetch(pInstance, SUB_WINDOW, u32Temp);
11132
11133 u32Temp = Hal_SC_Get_LBOffset(pInstance, MAIN_WINDOW);
11134 Hal_SC_Set_LBOffset(pInstance, Hal_SC_Get_LBOffset(pInstance, SUB_WINDOW), MAIN_WINDOW);
11135 Hal_SC_Set_LBOffset(pInstance, u32Temp, SUB_WINDOW);
11136
11137 if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
11138 {
11139 MS_U16 u16MainRWBank, u16SubRWBank;
11140 u16MainRWBank = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L);
11141 u16SubRWBank = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L);
11142
11143 u16MainRWBank = u16MainRWBank^BIT(14);
11144 u16SubRWBank = u16SubRWBank^BIT(14);
11145 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, u16MainRWBank, BIT(14));
11146 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, u16SubRWBank, BIT(14));
11147 }
11148
11149 bRet = TRUE;
11150 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D: exchange main/sub opm base\n");
11151 }
11152 #elif (HW_DESIGN_3D_VER >= 2)
11153 if((IS_INPUT_NORMAL_2D(eWindow) || IS_INPUT_NORMAL_2D_INTERLACE(eWindow)) &&
11154 (!IS_OUTPUT_FRAME_ALTERNATIVE()))
11155 {
11156 if(pXCResourcePrivate->stdrvXC_3D._u163DHShift & 0xFF)
11157 {
11158 pXCResourcePrivate->stdrvXC_3D._u163DHShift <<= 8; //Switch shift to sub window
11159 }
11160 else
11161 {
11162 pXCResourcePrivate->stdrvXC_3D._u163DHShift >>= 8; //Switch shift to Main window
11163 }
11164 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_1C_L, pXCResourcePrivate->stdrvXC_3D._u163DHShift);//Main/sub display window offset in right direction
11165 bRet = TRUE;
11166 }
11167 else if(!(IS_INPUT_MODE_NONE(eWindow) || IS_OUTPUT_MODE_NONE())
11168 && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE_HW()))
11169 && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW()))
11170 #if(HW_DESIGN_3D_VER >= 4)
11171 && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()))
11172 && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_TOP_BOTTOM_HW()))
11173 && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_PACKING()))
11174 #endif
11175 )
11176 {
11177 #if(HW_DESIGN_3D_VER >= 5)
11178 MS_U16 u16FRCM_W,u16FRCM_R;
11179 u16FRCM_W = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L);
11180 u16FRCM_R = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L);
11181 if(u16FRCM_R & BIT(7))
11182 {
11183 //Recommend to use OP L/R switch as designer's advice
11184 u16FRCM_R = u16FRCM_R^BIT(8);
11185 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L, u16FRCM_R, BIT(8));//F2 OPM 3D LR invert
11186 bRet = TRUE;
11187 }
11188 else if(u16FRCM_W & BIT(0))
11189 {
11190 u16FRCM_W = u16FRCM_W^BIT(4);
11191 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L, u16FRCM_R, BIT(4));//F2 IPM 3D LR invert
11192 bRet = TRUE;
11193 }
11194 else
11195 {
11196 printf("----------------3D L/R switch: UnSupported format I: %u->O: %u\n"
11197 , pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow]
11198 , pXCResourcePrivate->stdrvXC_3D._eOutput3DMode);
11199 }
11200 #else
11201 MS_U16 u16IPM, u16OPM;
11202 u16IPM = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L);
11203 u16OPM = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L);
11204 if(u16OPM & BIT(7))
11205 {
11206 //Recommend to use OP L/R switch as designer's advice
11207 u16OPM = u16OPM^BIT(8);
11208 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, u16OPM, BIT(8));//F2 OPM 3D LR invert
11209 bRet = TRUE;
11210 }
11211 else if(u16IPM & BIT(0))
11212 {
11213 u16IPM = u16IPM^BIT(4);
11214 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, u16IPM, BIT(4));//F2 IPM 3D LR invert
11215 bRet = TRUE;
11216 }
11217 else
11218 {
11219 printf("----------------3D L/R switch: UnSupported format I: %u->O: %u\n"
11220 , pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow]
11221 , pXCResourcePrivate->stdrvXC_3D._eOutput3DMode);
11222 }
11223 #endif
11224 }
11225 #endif
11226
11227 #if HW_2DTO3D_SUPPORT
11228 if((IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE_HW())
11229 #if (HW_2DTO3D_VER >= 4)
11230 ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW())
11231 ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_TOP_BOTTOM_HW())
11232 ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
11233 ||(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_PACKING())
11234 #endif
11235 )
11236 {
11237 #if (HW_2DTO3D_VER >= 3)
11238 MS_U16 u16LeftGain = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L);
11239 MS_U16 u16RightGain = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L);
11240 u16LeftGain = u16LeftGain^BIT(15);
11241 u16RightGain = u16RightGain^BIT(15);
11242 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, u16LeftGain, BIT(15));
11243 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, u16RightGain, BIT(15));
11244 bRet = TRUE;
11245 #else
11246 MS_U16 u16OutputFormat = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0007);
11247 if(0x0001 == u16OutputFormat)
11248 {
11249 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0004, 0x0007);
11250 bRet = TRUE;
11251 }
11252 else if(0x0004 == u16OutputFormat)
11253 {
11254 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0001, 0x0007);
11255 bRet = TRUE;
11256 }
11257 else
11258 {
11259 printf("----------------3D L/R switch: UnSupported hw 2d to 3d output format\n");
11260 }
11261 #endif
11262 }
11263 else if(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW())
11264 {
11265 #ifdef SUPPORT_MOD_ADBANK_SEPARATE
11266
11267 #else
11268 MS_U16 u16Temp = MOD_R2BYTE(REG_MOD_BK01_78_L);
11269 u16Temp = u16Temp^BIT(15);
11270 MOD_W2BYTEMSK(REG_MOD_BK01_78_L, u16Temp, BIT(15));
11271 #endif
11272 bRet = TRUE;
11273 }
11274 #endif
11275
11276 return bRet;
11277 }
11278
MDrv_XC_3D_Is_LR_Frame_Exchged(void * pInstance,SCALER_WIN eWindow)11279 MS_BOOL MDrv_XC_3D_Is_LR_Frame_Exchged(void *pInstance, SCALER_WIN eWindow)
11280 {
11281 MS_BOOL bRet = FALSE;
11282
11283 MS_ASSERT(eWindow < MAX_WINDOW);
11284 if(eWindow >= MAX_WINDOW)
11285 {
11286 return FALSE;
11287 }
11288 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11289 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11290 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11291 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11292 #if (HW_DESIGN_3D_VER < 2)
11293 if((IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11294 #if (HW_DESIGN_3D_VER == 0)
11295 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_SIDE_BY_SIDE_HALF())
11296 #endif
11297 )
11298 {
11299 bRet = (Hal_SC_Get_DNRBase0(pInstance, MAIN_WINDOW) > Hal_SC_Get_DNRBase1(pInstance, MAIN_WINDOW));
11300 bRet ^= IsVMirrorMode(eWindow);
11301 }
11302 else if(((IS_INPUT_TOP_BOTTOM(eWindow) || IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
11303 || IS_INPUT_LINE_ALTERNATIVE(eWindow))
11304 && IS_OUTPUT_LINE_ALTERNATIVE())
11305 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11306 || (IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11307 || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11308 || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())//old way
11309 || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()) //old way
11310 || (IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11311 || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11312 || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_NOFRC())
11313 || (IS_INPUT_FIELD_ALTERNATIVE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11314 || (IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11315 || (IS_INPUT_NORMAL_2D_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11316 || (IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11317 || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11318 || (IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
11319 )
11320 {
11321 bRet = (Hal_SC_Get_OPMBase0(MAIN_WINDOW) > Hal_SC_Get_OPMBase1(MAIN_WINDOW));
11322 bRet ^= IsVMirrorMode(eWindow);
11323 }
11324 else if((IS_INPUT_FRAME_PACKING(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
11325 || (IS_INPUT_LINE_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
11326 || (IS_INPUT_FRAME_ALTERNATIVE(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE())
11327 || (IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE()))
11328 {
11329 #if ENABLE_REGISTER_SPREAD
11330 bRet = (PWM_R2BYTEMSK(REG_MOD_BK01_78_L, BIT(15)) == BIT(15));
11331 #else
11332 bRet = (MOD_R2BYTEMSK(REG_MOD_BK01_78_L, BIT(15)) == BIT(15));
11333 #endif
11334 bRet ^= IsVMirrorMode(eWindow);
11335 }
11336 else if(IS_INPUT_FRAME_PACKING_OPT(eWindow) && IS_OUTPUT_TOP_BOTTOM())
11337 {
11338 bRet = (Hal_SC_Get_DNRBase0(pInstance, MAIN_WINDOW) > Hal_SC_Get_DNRBase0(pInstance, SUB_WINDOW));
11339 bRet ^= IsVMirrorMode(eWindow);
11340 }
11341 else if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_SIDE_BY_SIDE_HALF()
11342 || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
11343 {
11344 bRet = (Hal_SC_Get_OPMBase0(MAIN_WINDOW) > Hal_SC_Get_OPMBase0(SUB_WINDOW));
11345 bRet ^= IsVMirrorMode(eWindow);
11346 }
11347 #elif (HW_DESIGN_3D_VER >= 2)
11348 if((IS_INPUT_NORMAL_2D(eWindow) || IS_INPUT_NORMAL_2D_INTERLACE(eWindow)) &&
11349 (!IS_OUTPUT_FRAME_ALTERNATIVE()))
11350 {
11351 bRet = ((SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1C_L, 0xFF00) >> 8) > 0);
11352 }
11353 else if(!(IS_INPUT_MODE_NONE(eWindow) || IS_OUTPUT_MODE_NONE())
11354 && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE_HW()))
11355 && (!(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW()))
11356 )
11357 {
11358 #if(HW_DESIGN_3D_VER >= 5)
11359 MS_U16 u16FRCM_W,u16FRCM_R;
11360 u16FRCM_W = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L);
11361 u16FRCM_R = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L);
11362 if(u16FRCM_R & BIT(7))
11363 {
11364 bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L, BIT(8)) == BIT(8));
11365 }
11366 else if(u16FRCM_W & BIT(0))
11367 {
11368 bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L, BIT(4)) == BIT(4));
11369 }
11370 #else
11371 MS_U16 u16IPM, u16OPM;
11372 u16IPM = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L);
11373 u16OPM = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L);
11374 if(u16OPM & BIT(7))
11375 {
11376 bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(8)) == BIT(8));
11377 }
11378 else if(u16IPM & BIT(0))
11379 {
11380 bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(4)) == BIT(4));
11381 }
11382 #endif
11383 // if mvop mirror, main/sub window will get switched frame, so need do LR exchange
11384 // 1 field alternative and frame alternative input don't need do this, since main/sub
11385 // window still get the original frame;
11386 // 2 side by side/top bottom outpu also don't need do this, because main/sub window
11387 // will assign the specified display window
11388 if(IS_OUTPUT_LINE_ALTERNATIVE()
11389 && (!IS_INPUT_FIELD_ALTERNATIVE(eWindow))
11390 && (!IS_INPUT_FRAME_ALTERNATIVE(eWindow)))
11391 {
11392 bRet ^= (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1)));
11393 }
11394 }
11395 #endif
11396
11397 #if HW_2DTO3D_SUPPORT
11398 if((IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE_HW())
11399 #if(HW_2DTO3D_VER >= 4)
11400 || (IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_TOP_BOTTOM_HW())
11401 #endif
11402 )
11403 {
11404 #if (HW_2DTO3D_VER >= 3)
11405 bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, BIT(15)) == BIT(15));
11406 bRet ^= (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))));
11407 #else
11408 bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0007) == 0x0001);
11409 bRet ^= (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))));
11410 #endif
11411 }
11412 else if(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_ALTERNATIVE_HW())
11413 {
11414 #if ENABLE_REGISTER_SPREAD
11415 bRet = (PWM_R2BYTEMSK(REG_MOD_BK01_78_L, BIT(15)) == BIT(15));
11416 #else
11417 bRet = (MOD_R2BYTEMSK(REG_MOD_BK01_78_L, BIT(15)) == BIT(15));
11418 #endif
11419 }
11420 #endif
11421
11422 return bRet;
11423 }
11424
11425 //-------------------------------------------------------------------------------------------------
11426 /// Is Support HW Depth Adjustment For Real 3d Or Not
11427 /// @param e3dInputMode \b IN: input 3d format
11428 /// @param e3dOutputMode \b IN: output 3d format
11429 /// @param eWindow \b IN: which window
11430 /// @return MS_BOOL \b OUT: TRUE: support FALSE: not support
11431 //-------------------------------------------------------------------------------------------------
MDrv_XC_3D_IsHWDepthAdjSupported(void * pInstance,E_XC_3D_INPUT_MODE en3dInputMode,E_XC_3D_OUTPUT_MODE en3dOutputMode,SCALER_WIN enWindow)11432 MS_BOOL MDrv_XC_3D_IsHWDepthAdjSupported(void *pInstance, E_XC_3D_INPUT_MODE en3dInputMode,
11433 E_XC_3D_OUTPUT_MODE en3dOutputMode,
11434 SCALER_WIN enWindow)
11435 {
11436 MS_ASSERT(enWindow < MAX_WINDOW);
11437
11438 if(enWindow >= MAX_WINDOW)
11439 {
11440 return FALSE;
11441 }
11442
11443 #if 0 //may support when top bottom/side by side output later
11444 return (MDrv_XC_Get_3D_IsSupportedHW2DTo3D()
11445 && (E_XC_3D_INPUT_MODE_NONE != en3dInputMode)
11446 && (E_XC_3D_INPUT_NORMAL_2D != en3dInputMode)
11447 && ((E_XC_3D_OUTPUT_LINE_ALTERNATIVE == en3dOutputMode)
11448 || (E_XC_3D_OUTPUT_FRAME_ALTERNATIVE == en3dOutputMode)
11449 || (E_XC_3D_OUTPUT_TOP_BOTTOM == en3dOutputMode)
11450 || (E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF == en3dOutputMode)));
11451 #else
11452 return (MDrv_XC_Get_3D_IsSupportedHW2DTo3D()
11453 && (E_XC_3D_INPUT_MODE_NONE != en3dInputMode)
11454 && (E_XC_3D_INPUT_NORMAL_2D != en3dInputMode)
11455 && ((E_XC_3D_OUTPUT_LINE_ALTERNATIVE == en3dOutputMode)
11456 #if(HW_2DTO3D_VER >= 4)
11457 || (E_XC_3D_OUTPUT_TOP_BOTTOM == en3dOutputMode)
11458 || (E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF == en3dOutputMode)
11459 || (E_XC_3D_OUTPUT_FRAME_PACKING== en3dOutputMode)
11460 #endif
11461 || ((E_XC_3D_OUTPUT_TOP_BOTTOM == en3dOutputMode) && MDrv_SC_3D_Is_LR_Sbs2Line(pInstance))//3d ver1 line alternative output
11462 || (E_XC_3D_OUTPUT_FRAME_ALTERNATIVE == en3dOutputMode)));
11463 #endif
11464 }
11465
11466 #if HW_2DTO3D_SUPPORT
11467 #if (HW_2DTO3D_VER >= 4)
_MDrv_SC_3D_HWDepthAdj_TBOut(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)11468 static void _MDrv_SC_3D_HWDepthAdj_TBOut(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
11469 {
11470
11471 MS_ASSERT(eWindow < MAX_WINDOW);
11472 MS_ASSERT(pSrcInfo);
11473 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11474 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11475 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11476 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11477
11478 if(pSrcInfo == NULL)
11479 {
11480 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
11481 return;
11482 }
11483
11484 if(eWindow >= MAX_WINDOW)
11485 {
11486 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
11487 return;
11488 }
11489
11490 //Load T3d setting (same as 2d3d, in regardless of DD, and RGBLUT SRAM)
11491 //Get panel size output width
11492 MS_U32 u32OutputWidth = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_04_L) + 1;
11493 MS_U32 PanelHeight= SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L) + 1;
11494 if(u32OutputWidth==0)
11495 {
11496 u32OutputWidth = 0xf00;
11497 }
11498 if(PanelHeight==0)
11499 {
11500 PanelHeight = 0x870;
11501 }
11502
11503 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4A_L, BIT(10), BIT(10)); //disable YUV to RGB
11504 MDrv_XC_wait_output_vsync(pInstance, 1, 100, eWindow);
11505
11506 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_49_L, (u32OutputWidth+31)/32, 0x00FF);//horizontal number of 32x32 block
11507 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_49_L, BIT(8), BIT(8));//eco en
11508 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_57_L, BIT(1), BIT(1));//dr miu eco en
11509 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_42_L, BIT(7), BIT(7));//reg_clrmiurdy_n
11510 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_48_L, BIT(2), BIT(2)|BIT(3)|BIT(4)|BIT(5)|BIT(6));//reg_blk_dpthptr_en,reg_blk_dpthptr_sel
11511
11512 if(u32OutputWidth==0xf00)
11513 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK63_50_L, 0x0808); //reg_dpcach_req_ctr,reg_dpcach_last_ctr
11514 else
11515 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK63_50_L, 0x0404); //reg_dpcach_req_ctr,reg_dpcach_last_ctr
11516
11517 //fill sram
11518 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0xFFFF);//reg_fill_in
11519 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, BIT(7), BIT(7));//reg_fill_w
11520
11521 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0000, 0x0F00);//reg_fill_add 0
11522 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11523
11524 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0100, 0x0F00);//reg_fill_add 1
11525 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11526
11527 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0200, 0x0F00);//reg_fill_add 2
11528 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11529
11530 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0300, 0x0F00);//reg_fill_add 3
11531 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11532
11533 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0400, 0x0F00);//reg_fill_add 4
11534 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11535
11536 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0500, 0x0F00);//reg_fill_add 5
11537 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11538
11539 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0600, 0x0F00);//reg_fill_add 6
11540 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11541
11542 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0700, 0x0F00);//reg_fill_add 7
11543 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11544
11545 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0800, 0x0F00);//reg_fill_add 8
11546 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11547
11548 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0900, 0x0F00);//reg_fill_add 9
11549 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11550
11551 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0A00, 0x0F00);//reg_fill_add 10
11552 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11553
11554 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0B00, 0x0F00);//reg_fill_add 11
11555 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11556
11557 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0C00, 0x0F00);//reg_fill_add 12
11558 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11559
11560 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0D00, 0x0F00);//reg_fill_add 13
11561 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11562
11563 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0E00, 0x0F00);//reg_fill_add 14
11564 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11565
11566 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0F00, 0x0F00);//reg_fill_add 15
11567 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x80808080);//reg_fill_sram_1,reg_fill_sram_2
11568
11569 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x0000);//reg_fill_in
11570 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x00, BIT(7));//reg_fill_w
11571
11572 //dr pixel
11573 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_60_L, 0x07, 0x3FFF);//reg_pipe_guard_cycle_pb
11574 if((pSrcInfo->stDispWin.width > (WIDTH_4K2KTIMING - OFFSET_4K2KTIMING))
11575 && (pSrcInfo->stDispWin.width < (WIDTH_4K2KTIMING + OFFSET_4K2KTIMING)))
11576 {
11577 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_6B_L, BIT(4)|BIT(5), BIT(4)|BIT(5));//dd h 2:1 scaling down
11578 }
11579 if((pSrcInfo->stDispWin.height > (HEIGHT_4K2KTIMING - OFFSET_4K2KTIMING))
11580 && (pSrcInfo->stDispWin.height < (HEIGHT_4K2KTIMING + OFFSET_4K2KTIMING)))
11581 {
11582 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_6B_L, BIT(0), BIT(0));//dd v 2:1 scaling down
11583 }
11584 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_68_L, BIT(0)|BIT(2), BIT(0)|BIT(1)|BIT(2));//reg_render_control,reg_lr_control_l,reg_lr_control_r
11585 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_08_L, BIT(5), BIT(5));//rgb_to_y
11586 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_67_L, 0x8080);//reg_pixelsub_l,reg_pixelsub_r
11587 if(u32OutputWidth==0xf00)
11588 {
11589 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(4), BIT(4));//DD v-sacling dn mode
11590 }
11591
11592 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(7), BIT(7));//TB mode
11593 }
11594
_MDrv_SC_3D_DD_setting(void * pInstance,SCALER_WIN eWindow)11595 static void _MDrv_SC_3D_DD_setting(void *pInstance, SCALER_WIN eWindow)
11596 {
11597 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11598 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11599 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11600 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11601
11602 MS_U16 u16DDHSize = 0; //DD H size
11603 MS_U16 u16DDVSize = 0; //DD V size
11604 MS_U16 u16PanelWidth = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width;
11605 MS_U16 u16PanelHeight = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
11606 MS_BOOL bT3DDE_Use_MainDisplayWindow = _MDrv_Is_T3DDE_UseMainDisplayWindow(pInstance);
11607 //T3D 2P engine, get two piexl a time,start must be even,end must be odd
11608 MS_U16 u16MainDispWidth = _MDrv_SC_3D_GetDispWinWidthForT3D(pInstance);
11609 MS_U16 u16MainDispHeight = gSrcInfo[eWindow].stDispWin.height;
11610 MS_WINDOW_TYPE stDispWin;
11611 memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
11612 MDrv_XC_get_dispwin_from_reg(pInstance, eWindow, &stDispWin);
11613 if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] == E_XC_3D_INPUT_MODE_NONE)
11614 {
11615 u16MainDispHeight = stDispWin.height;
11616 }
11617
11618 if(bT3DDE_Use_MainDisplayWindow)
11619 {
11620 u16DDHSize = MIN(u16MainDispWidth>>1, 1920);
11621 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, u16DDHSize, 0x07FF);//src width
11622 if(u16MainDispHeight >= 1080)
11623 {
11624 u16DDVSize = MIN(u16MainDispHeight>>1, 1080);
11625 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(4), BIT(4));//DD v-sacling dn mode
11626 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, u16DDVSize, 0x0FFF);//src height
11627 }
11628 else
11629 {
11630 u16DDVSize = MIN(u16MainDispHeight, 1080);
11631 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, 0, BIT(4));//DD v-sacling dn mode
11632 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, u16DDVSize, 0x0FFF);//src height
11633 }
11634 }
11635 else
11636 {
11637 u16DDHSize = MIN(u16PanelWidth>>1, 1920);
11638 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, u16DDHSize, 0x07FF);//src width
11639 if(u16PanelHeight >= HEIGHT_4K2KTIMING)
11640 {
11641 u16DDVSize = u16PanelHeight>>1;
11642 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(4), BIT(4));//DD v-sacling dn mode
11643 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, u16DDVSize, 0x0FFF);//src height
11644 }
11645 else
11646 {
11647 u16DDVSize = MIN(u16PanelHeight, 1080);
11648 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, 0, BIT(4));//DD v-sacling dn mode
11649 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, u16DDVSize, 0x0FFF);//src height
11650 }
11651 }
11652
11653 //save DD size
11654 pXCResourcePrivate->stdrvXC_3D._u16DDHSize = u16DDHSize;
11655 pXCResourcePrivate->stdrvXC_3D._u16DDVSize = u16DDVSize;
11656 }
11657 #endif
11658
_MDrv_SC_3D_DR_setting(void * pInstance,SCALER_WIN eWindow)11659 static void _MDrv_SC_3D_DR_setting(void *pInstance, SCALER_WIN eWindow)
11660 {
11661 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11662 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11663 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11664 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11665
11666 //T3D 2P engine, get two piexl a time,start must be even,end must be odd
11667 MS_U16 u16MainDispWidth = _MDrv_SC_3D_GetDispWinWidthForT3D(pInstance);
11668 MS_U16 u16MainDispHeight = gSrcInfo[MAIN_WINDOW].stDispWin.height;
11669 MS_U16 u16PanelWidth = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width;
11670 MS_U16 u16PanelHeight = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
11671 MS_BOOL bT3DDE_Use_MainDisplayWindow = _MDrv_Is_T3DDE_UseMainDisplayWindow(pInstance);
11672 MS_WINDOW_TYPE stDispWin;
11673 memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
11674 MDrv_XC_get_dispwin_from_reg(pInstance, eWindow, &stDispWin);
11675 if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] == E_XC_3D_INPUT_MODE_NONE)
11676 {
11677 u16MainDispHeight = stDispWin.height;
11678 }
11679
11680 if(bT3DDE_Use_MainDisplayWindow)
11681 {
11682 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_58_L, BIT(0), BIT(0));//Use MainDE
11683 if(IS_OUTPUT_SIDE_BY_SIDE_HALF() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
11684 {
11685 //DR V size needs be 4-align.
11686 u16MainDispHeight = (u16MainDispHeight + 1) & ~0x01;
11687
11688 //dr bilinear size
11689 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_51_L, u16MainDispWidth / 2, 0x1FFF);//reg_ln_width
11690 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_52_L, u16MainDispHeight * 2, 0x1FFF);//reg_col_height
11691 //dr pixel size
11692 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_61_L, u16MainDispWidth / 2, 0x3FFF);//reg_ln_width
11693 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_62_L, u16MainDispHeight * 2, 0x1FFF);//reg_col_height
11694 //dr block size
11695 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_55_L, u16MainDispWidth / 2, 0x1FFF);//pixel width
11696 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_66_L, u16MainDispHeight * 2, 0x1FFF);//reg_col_height
11697 }
11698 else
11699 {
11700 //DR V size needs be 4-align.
11701 u16MainDispHeight = (u16MainDispHeight + 3) & ~0x03;
11702
11703 //dr bilinear size
11704 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_51_L, u16MainDispWidth, 0x1FFF);//reg_ln_width
11705 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_52_L, u16MainDispHeight, 0x1FFF);//reg_col_height
11706 //dr pixel size
11707 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_61_L, u16MainDispWidth, 0x3FFF);//reg_ln_width
11708 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_62_L, u16MainDispHeight, 0x1FFF);//reg_col_height
11709 //dr block size
11710 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_55_L, u16MainDispWidth, 0x1FFF);//pixel width
11711 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_66_L, u16MainDispHeight, 0x1FFF);//reg_col_height
11712 }
11713 }
11714 else
11715 {
11716 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_58_L, 0x0, BIT(0));//Full-frame use Full-dispDE
11717 if(IS_OUTPUT_SIDE_BY_SIDE_HALF() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
11718 {
11719 //DR V size needs be 4-align.
11720 u16PanelHeight = (u16PanelHeight + 1) & ~0x01;
11721
11722 //dr bilinear size
11723 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_51_L, u16PanelWidth / 2, 0x1FFF);//reg_ln_width
11724 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_52_L, u16PanelHeight * 2, 0x1FFF);//reg_col_height
11725 //dr pixel size
11726 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_61_L, u16PanelWidth / 2, 0x3FFF);//reg_ln_width
11727 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_62_L, u16PanelHeight * 2, 0x1FFF);//reg_col_height
11728 //dr block size
11729 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_55_L, u16PanelWidth / 2, 0x1FFF);//pixel width
11730 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_66_L, u16PanelHeight * 2, 0x1FFF);//reg_col_height
11731 }
11732 else
11733 {
11734 //DR V size needs be 4-align.
11735 u16PanelHeight = (u16PanelHeight + 3) & ~0x03;
11736
11737 //dr bilinear size
11738 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_51_L, u16PanelWidth, 0x1FFF);//reg_ln_width
11739 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_52_L, u16PanelHeight, 0x1FFF);//reg_col_height
11740 //dr pixel size
11741 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_61_L, u16PanelWidth, 0x3FFF);//reg_ln_width
11742 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_62_L, u16PanelHeight, 0x1FFF);//reg_col_height
11743 //dr block size
11744 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_55_L, u16PanelWidth, 0x1FFF);//pixel width
11745 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_66_L, u16PanelHeight, 0x1FFF);//reg_col_height
11746 }
11747 }
11748 }
11749
11750 #if (HW_2DTO3D_VER >= 3)
_MDrv_SC_3D_Load2DTo3DReg(void * pInstance,MS_BOOL bEnable,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)11751 static void _MDrv_SC_3D_Load2DTo3DReg(void *pInstance, MS_BOOL bEnable, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
11752 {
11753
11754 MS_ASSERT(eWindow < MAX_WINDOW);
11755 MS_ASSERT(pSrcInfo);
11756 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11757 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11758 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11759 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11760 MS_U16 u16DRWidth = 0;
11761 MS_U16 u16DRBlockNumber = 0;
11762 MS_U16 u16DRRequestNumber = 0;
11763 MS_U8 u8T3DMIUSel = 0;
11764 MS_WINDOW_TYPE stDispWin;
11765 memset(&stDispWin, 0, sizeof(MS_WINDOW_TYPE));
11766 MDrv_XC_get_dispwin_from_reg(pInstance, eWindow, &stDispWin);
11767
11768 if(pSrcInfo == NULL)
11769 {
11770 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: pSrcInfo is null pointer!\n");
11771 return;
11772 }
11773
11774 if(eWindow >= MAX_WINDOW)
11775 {
11776 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: eWindow is wrong!\n");
11777 return;
11778 }
11779
11780 if(bEnable)
11781 {
11782 MS_PHY u32HW2DTO3D_DD_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf;
11783 MS_PHY u32HW2DTO3D_DR_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf;
11784
11785 #ifdef HAL_MIU2_BASE
11786 if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf >= HAL_MIU2_BASE)
11787 {
11788 u32HW2DTO3D_DD_Buf -= HAL_MIU2_BASE;
11789 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, 0x2000, 0x3000);//DD and DR both use miu2
11790 u8T3DMIUSel = 2;
11791 }
11792 else
11793 #endif
11794 if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf >= HAL_MIU1_BASE)
11795 {
11796 u32HW2DTO3D_DD_Buf -= HAL_MIU1_BASE;
11797 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, 0x1000, 0x3000);//DD and DR both use miu1
11798 u8T3DMIUSel = 1;
11799 }
11800 else
11801 {
11802 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, 0x0000, 0x3000);//DD and DR both use miu0
11803 u8T3DMIUSel = 0;
11804 }
11805 Hal_SC_Set_T3D_MiuSelectExternal(pInstance, u8T3DMIUSel);
11806 #ifdef HAL_MIU2_BASE
11807 if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf >= HAL_MIU2_BASE)
11808 {
11809 u32HW2DTO3D_DR_Buf -= HAL_MIU2_BASE;
11810 }
11811 else
11812 #endif
11813 if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf >= HAL_MIU1_BASE)
11814 {
11815 u32HW2DTO3D_DR_Buf -= HAL_MIU1_BASE;
11816 }
11817
11818 //=======================================================//
11819 //=====2015.04.24 patch for 2d3d under not full-screen by Ace.Chang //
11820 //== Issue: Left-side has data from right-side (repeated data) ==//
11821 //== Solution:T3d DE use MainDE instead of Frame-DE ==//
11822 //== Note: DD & DR input size use corresponding ratio instead ==//
11823 //=======================================================//
11824 MS_BOOL bT3DDE_Use_MainDisplayWindow = _MDrv_Is_T3DDE_UseMainDisplayWindow(pInstance);
11825
11826 //Get panel size output width
11827 MS_U32 u32OutputWidth = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_04_L) + 1;
11828 MS_U32 PanelHeight= SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L) + 1;
11829 if(u32OutputWidth==0)
11830 u32OutputWidth = 0xf00;
11831 if(PanelHeight==0)
11832 PanelHeight = 0x870;
11833 //clk
11834 MDrv_WriteRegBit(REG_CKG_FICLK_F1, ENABLE, BIT(6)); //reg_ckg_ficlk_3d
11835 //dd
11836 //y/cb/cr mim/max initialize
11837 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_09_L, 0x3f00);
11838 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_0A_L, 0x5f00);
11839 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_0B_L, 0x7f00);
11840 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_0C_L, 0x9f00);
11841 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_0D_L, 0xbf00);
11842 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_0E_L, 0x5a1e);
11843 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_0F_L, 0xff00);
11844 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_11_L, 0x3f00);
11845 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_12_L, 0x5f00);
11846 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_13_L, 0x7f00);
11847 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_14_L, 0x9f00);
11848 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_15_L, 0xbf00);
11849 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_16_L, 0x2800);
11850 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_17_L, 0xc0a0);
11851 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_19_L, 0x3f00);
11852 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_1A_L, 0x5f00);
11853 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_1B_L, 0x7f00);
11854 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_1C_L, 0x9f00);
11855 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_1D_L, 0xbf00);
11856 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_1E_L, 0xfa78);
11857 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_1F_L, 0x6040);
11858 //coef
11859 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_20_L, 0x4d34);
11860 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_21_L, 0x540f);
11861 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_22_L, 0x5133);
11862 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_23_L, 0x171f);
11863 //mode select
11864 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, 0x00fc, 0x00FF);
11865 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, 0x9f00, 0xDF00);
11866 //filter program
11867 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_25_L, 0x8888);
11868 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_26_L, 0x10ff);
11869 //color quality initialize
11870 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_38_L, 0xffa4);
11871 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_39_L, 0x0210);
11872 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_3A_L, 0x1210);
11873 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_3B_L, 0x1002);
11874 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_3C_L, 0x0108);
11875 #if (HW_2DTO3D_VER == 3)
11876 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, MIN(u32OutputWidth, 1920), 0x07FF);//src width
11877 if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] != E_XC_3D_INPUT_MODE_NONE)
11878 {
11879 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, MIN(pSrcInfo->stDispWin.height, 1080), 0x0FFF);//src height
11880 }
11881 else
11882 {
11883 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, MIN(stDispWin.height, 1080), 0x0FFF);//src height
11884 }
11885 #elif (HW_2DTO3D_VER == 4)
11886 _MDrv_SC_3D_DD_setting(pInstance, eWindow);
11887 #endif
11888 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, 0x7000, 0xF000);//dd shift enable ext
11889 #if(HW_2DTO3D_BYTE_PER_WORD == 16)
11890 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_05_L, 0x7878, 0x7F7F);//dram request number
11891 #else
11892 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_05_L, 0x3c3c/*0x7878*/, 0x7F7F);//dram request number
11893 #endif
11894 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, (u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD)>>16, 0x07FF);//dd buffer high 11bit
11895 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_07_L, u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD);//dd buffer low 2 bytes
11896 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK63_44_L, (u32HW2DTO3D_DR_Buf + HW_2DTO3D_BLOCK_DR_BUF_SIZE)/HW_2DTO3D_BYTE_PER_WORD);//dr buffer:block base address
11897 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK63_46_L, u32HW2DTO3D_DR_Buf/HW_2DTO3D_BYTE_PER_WORD);//dr buffer:pixel base address
11898 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4A_L, BIT(10), BIT(10)); //disable YUV to RGB
11899 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_40_L, BIT(6)|BIT(4), BIT(6)|BIT(4)); // DD force bank enable,high priorty threshold
11900 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_41_L, 0x0000, 0x000F); // DD force bank0
11901 //after DD address setted,should wait 2 vsync for pix counter finished
11902 MDrv_XC_wait_output_vsync(pInstance, 2, 100, eWindow);
11903 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, BIT(15), BIT(13)|BIT(15));//src domain select&start to write miu
11904
11905 //DR setting
11906 _MDrv_SC_3D_DR_setting(pInstance, eWindow);
11907 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_49_L, (u32OutputWidth+31)/32, 0x00FF);//horizontal number of 32x32 block
11908 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_49_L, BIT(8), BIT(8));//eco en
11909 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_57_L, BIT(1), BIT(1));//dr miu eco en
11910 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_42_L, BIT(7), BIT(7));//reg_clrmiurdy_n
11911 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_48_L, BIT(2), BIT(2)|BIT(3)|BIT(4)|BIT(5)|BIT(6));//reg_blk_dpthptr_en,reg_blk_dpthptr_sel
11912 //SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK63_50_L, 0x3C3C); //reg_dpcach_req_ctr,reg_dpcach_last_ctr
11913 //u16DRRequestNumber = _MDrv_SC_3D_2DTo3D_DRRequestNumber(pInstance);
11914 if(bT3DDE_Use_MainDisplayWindow)
11915 {
11916 u16DRWidth = _MDrv_SC_3D_GetDispWinWidthForT3D(pInstance);
11917 }
11918 else
11919 {
11920 u16DRWidth = u32OutputWidth;
11921 }
11922 u16DRBlockNumber = (u16DRWidth + 31)/32;
11923 u16DRRequestNumber = (u16DRBlockNumber + HW_2DTO3D_BYTE_PER_WORD - 1) / HW_2DTO3D_BYTE_PER_WORD;
11924 if(u16DRRequestNumber<4)
11925 {
11926 u16DRRequestNumber = 4; //always set req >=4, has problem when 1/2/3, HW limitation. Ace note
11927 }
11928 u16DRRequestNumber |= (u16DRRequestNumber<<8);
11929 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_50_L, u16DRRequestNumber,0xFFFF); //reg_dpcach_req_ctr,reg_dpcach_last_ctr
11930 //fill sram
11931 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0xFFFF);//reg_fill_in
11932 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, BIT(7), BIT(7));//reg_fill_w
11933
11934 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0000, 0x0F00);//reg_fill_add 0
11935 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x5BFE5BFE);//reg_fill_sram_1,reg_fill_sram_2
11936
11937 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0100, 0x0F00);//reg_fill_add 1
11938 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0xA884A884);//reg_fill_sram_1,reg_fill_sram_2
11939
11940 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0200, 0x0F00);//reg_fill_add 2
11941 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x38543854);//reg_fill_sram_1,reg_fill_sram_2
11942
11943 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0300, 0x0F00);//reg_fill_add 3
11944 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0xA487A487);//reg_fill_sram_1,reg_fill_sram_2
11945
11946 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0400, 0x0F00);//reg_fill_add 4
11947 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x32123212);//reg_fill_sram_1,reg_fill_sram_2
11948
11949 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0500, 0x0F00);//reg_fill_add 5
11950 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x57265726);//reg_fill_sram_1,reg_fill_sram_2
11951
11952 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0600, 0x0F00);//reg_fill_add 6
11953 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0xA823A823);//reg_fill_sram_1,reg_fill_sram_2
11954
11955 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0700, 0x0F00);//reg_fill_add 7
11956 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0xA878A878);//reg_fill_sram_1,reg_fill_sram_2
11957
11958 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0800, 0x0F00);//reg_fill_add 8
11959 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0xA826A826);//reg_fill_sram_1,reg_fill_sram_2
11960
11961 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0900, 0x0F00);//reg_fill_add 9
11962 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x12841284);//reg_fill_sram_1,reg_fill_sram_2
11963
11964 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0A00, 0x0F00);//reg_fill_add 10
11965 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x48484848);//reg_fill_sram_1,reg_fill_sram_2
11966
11967 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0B00, 0x0F00);//reg_fill_add 11
11968 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x79237923);//reg_fill_sram_1,reg_fill_sram_2
11969
11970 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0C00, 0x0F00);//reg_fill_add 12
11971 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x8A428A42);//reg_fill_sram_1,reg_fill_sram_2
11972
11973 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0D00, 0x0F00);//reg_fill_add 13
11974 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0x38423842);//reg_fill_sram_1,reg_fill_sram_2
11975
11976 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0E00, 0x0F00);//reg_fill_add 14
11977 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0xFF22FF22);//reg_fill_sram_1,reg_fill_sram_2
11978
11979 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x0F00, 0x0F00);//reg_fill_add 15
11980 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_74_L, 0xAA88AA88);//reg_fill_sram_1,reg_fill_sram_2
11981
11982 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_73_L, 0x0000);//reg_fill_in
11983 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_71_L, 0x00, BIT(7));//reg_fill_w
11984
11985 //dr pixel
11986 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_60_L, 0x07, 0x3FFF);//reg_pipe_guard_cycle_pb
11987 if(pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] != E_XC_3D_INPUT_MODE_NONE)
11988 {
11989 if((pSrcInfo->stDispWin.width > (WIDTH_4K2KTIMING - OFFSET_4K2KTIMING))
11990 && (pSrcInfo->stDispWin.width < (WIDTH_4K2KTIMING + OFFSET_4K2KTIMING)))
11991 {
11992 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_6B_L, BIT(4)|BIT(5), BIT(4)|BIT(5));//dd h 2:1 scaling down
11993 }
11994 if((pSrcInfo->stDispWin.height > (HEIGHT_4K2KTIMING - OFFSET_4K2KTIMING))
11995 && (pSrcInfo->stDispWin.height < (HEIGHT_4K2KTIMING + OFFSET_4K2KTIMING)))
11996 {
11997 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_6B_L, BIT(0), BIT(0));//dd v 2:1 scaling down
11998 }
11999 }
12000 else
12001 {
12002 if((stDispWin.width > (WIDTH_4K2KTIMING - OFFSET_4K2KTIMING))
12003 && (stDispWin.width < (WIDTH_4K2KTIMING + OFFSET_4K2KTIMING)))
12004 {
12005 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_6B_L, BIT(4)|BIT(5), BIT(4)|BIT(5));//dd h 2:1 scaling down
12006 }
12007 if((stDispWin.height > (HEIGHT_4K2KTIMING - OFFSET_4K2KTIMING))
12008 && (stDispWin.height < (HEIGHT_4K2KTIMING + OFFSET_4K2KTIMING)))
12009 {
12010 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_6B_L, BIT(0), BIT(0));//dd v 2:1 scaling down
12011 }
12012 }
12013 #if (HW_2DTO3D_VER >= 4)
12014 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_63_L, 0x00, BIT(0)|BIT(1));//reg_srclb_en,reg_depthlb_en
12015 #else
12016 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_63_L, BIT(0)|BIT(1), BIT(0)|BIT(1));//reg_srclb_en,reg_depthlb_en
12017 #endif
12018 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_68_L, BIT(0)|BIT(2), BIT(0)|BIT(1)|BIT(2));//reg_render_control,reg_lr_control_l,reg_lr_control_r
12019 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_08_L, BIT(5), BIT(5));//rgb_to_y
12020 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_67_L, 0x8080);//reg_pixelsub_l,reg_pixelsub_r
12021 #if (HW_2DTO3D_VER == 4)
12022 //Tuning initial value
12023 #if ENABLE_T3D_DEBUG
12024 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5B_L, 0x0010, 0x00ff);
12025 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5C_L, 0x8630, 0xffff);
12026 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5D_L, 0x0710, 0xffff);
12027 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5E_L, 0x1000, 0xffff);
12028 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5F_L, 0x2000, 0xff00);
12029 #endif
12030 #endif
12031 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_50_L, BIT(3), BIT(3));
12032 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_62_L, (u32HW2DTO3D_DD_Buf + HW_2DTO3D_DD_BUF_SIZE) * 4 / HW_2DTO3D_BYTE_PER_WORD, 0xFFFF);
12033 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_63_L, ((u32HW2DTO3D_DD_Buf + HW_2DTO3D_DD_BUF_SIZE) * 4 /HW_2DTO3D_BYTE_PER_WORD) >> 16, 0x0FFF);
12034 }
12035 else
12036 {
12037 #if (HW_2DTO3D_VER == 4)
12038 //=======================================================//
12039 //=====2017.01.17 patch for 3d under not full-screen by Ace.Chang //
12040 //== Issue: Left-side has datadistortion ==//
12041 //== Solution:T3d DE use MainDE instead of Frame-DE ==//
12042 //== Note: DD & DR input size use corresponding ratio instead ==//
12043 //=======================================================//
12044 _MDrv_SC_3D_DR_setting(pInstance, eWindow);
12045 _MDrv_SC_3D_DD_setting(pInstance, eWindow);
12046 #endif
12047 MS_U32 u32OutputWidth = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width;
12048
12049 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, 0x0000, BIT(13)|BIT(15));//src domain select&start to write miu
12050 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, 0x0780, 0x07FF);//src width
12051 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, 0x0438, 0x0FFF);//src height
12052 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_55_L, u32OutputWidth, 0x1FFF);//pixel width
12053 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_66_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height, 0x1FFF);//reg_col_height
12054 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_51_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width, 0x1FFF);//reg_ln_width
12055 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_52_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height, 0x1FFF);//reg_col_height
12056 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_49_L, 0x0000, 0x00FF);//horizontal number of 32x32 block
12057 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_49_L, 0x0000, BIT(8));//eco en
12058 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_57_L, 0x0000, BIT(1));//dr miu eco en
12059 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4A_L, 0x0000, BIT(10));//enable YUV to RGB
12060 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK63_50_L, 0x8080); //reg_dpcach_req_ctr,reg_dpcach_last_ctr
12061 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_61_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width, 0x3FFF);//reg_ln_width
12062 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_62_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height, 0x1FFF);//reg_col_height
12063 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_68_L, 0x0000, BIT(0)|BIT(1)|BIT(2));//reg_render_control,reg_lr_control_l,reg_lr_control_r
12064 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_67_L, 0x0000);//reg_pixelsub_l,reg_pixelsub_r
12065 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_6B_L, 0x0000, BIT(0)|BIT(4)|BIT(5));//dd h/v 2:1 scaling down
12066 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_63_L, 0x0000, BIT(0));// disable T3D SRAM
12067 #if (HW_2DTO3D_VER >= 4)
12068 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, 0x0000, BIT(7));
12069 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_63_L, 0x0000, BIT(1));// disable T3D SRAM
12070 //muji, monaco
12071 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK33_30_L, 0x00, BIT(14));
12072 #endif
12073 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_50_L, 0, BIT(3));
12074 }
12075 }
12076 #endif
12077 #endif
12078
12079 #endif
12080 //-------------------------------------------------------------------------------------------------
12081 /// When we do PIP 3D output, maybe users want to adjust the main and wub window for 3D effect.
12082 /// We call this api to exchange once, and call it again to return to original status.
12083 /// @param eWindow \b IN: which window we are going to set
12084 /// @return MS_BOOL \b OUT: TRUE:Success FALSE:Fail
12085 //-------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_LR_Frame_Exchg_U2(void * pInstance,SCALER_WIN eWindow)12086 MS_BOOL MApi_XC_Set_3D_LR_Frame_Exchg_U2(void* pInstance, SCALER_WIN eWindow)
12087 {
12088 MS_BOOL bRet = FALSE;
12089 #ifndef DISABLE_3D_FUNCTION
12090 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12091 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12092 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12093 _XC_ENTRY(pInstance);
12094 if (MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
12095 {
12096 bRet = MDrv_XC_Set_3D_LR_Frame_Exchg_burst(pInstance, eWindow);
12097 }
12098 else
12099 {
12100 MDrv_XC_wait_output_vsync(pInstance, 2, 100, eWindow);
12101 bRet = MDrv_XC_Set_3D_LR_Frame_Exchg(pInstance, eWindow);
12102 }
12103 _XC_RETURN(pInstance);
12104 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12105 #else
12106 UNUSED(eWindow);
12107 #endif
12108 return bRet;
12109 }
12110
MApi_XC_Set_3D_LR_Frame_Exchg(SCALER_WIN eWindow)12111 MS_BOOL MApi_XC_Set_3D_LR_Frame_Exchg(SCALER_WIN eWindow)
12112 {
12113 if (pu32XCInst == NULL)
12114 {
12115 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12116 return FALSE;
12117 }
12118
12119 stXC_SET_3D_LR_EXCHANGE XCArgs;
12120 XCArgs.eWindow = eWindow;
12121 XCArgs.bReturnValue = FALSE;
12122
12123 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_LR_EXCHANGE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12124 {
12125 printf("Obtain XC engine fail\n");
12126 return FALSE;
12127 }
12128 else
12129 {
12130 return XCArgs.bReturnValue;
12131 }
12132 }
12133
12134 //-------------------------------------------------------------------------------------------------
12135 /// Is L/R flag Exchanged or not
12136 /// @param eWindow \b IN: which window we are going to set
12137 /// @return MS_BOOL \b OUT: TRUE:L/R exchanged FALSE:L/R not exchanged
12138 //-------------------------------------------------------------------------------------------------
MApi_XC_3D_Is_LR_Frame_Exchged_U2(void * pInstance,SCALER_WIN eWindow)12139 MS_BOOL MApi_XC_3D_Is_LR_Frame_Exchged_U2(void* pInstance, SCALER_WIN eWindow)
12140 {
12141 MS_BOOL bRet = FALSE;
12142 #ifndef DISABLE_3D_FUNCTION
12143 _XC_ENTRY(pInstance);
12144 bRet = MDrv_XC_3D_Is_LR_Frame_Exchged(pInstance, eWindow);
12145 _XC_RETURN(pInstance);
12146 #else
12147 UNUSED(eWindow);
12148 #endif
12149 return bRet;
12150 }
12151
MApi_XC_3D_Is_LR_Frame_Exchged(SCALER_WIN eWindow)12152 MS_BOOL MApi_XC_3D_Is_LR_Frame_Exchged(SCALER_WIN eWindow)
12153 {
12154 if (pu32XCInst == NULL)
12155 {
12156 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12157 return FALSE;
12158 }
12159
12160 stXC_CHECK_3D_LR_EXCHANGED XCArgs;
12161 XCArgs.eWindow = eWindow;
12162 XCArgs.bReturnValue = FALSE;
12163
12164 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_3D_LR_EXCHANGED, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12165 {
12166 printf("Obtain XC engine fail\n");
12167 return FALSE;
12168 }
12169 else
12170 {
12171 return XCArgs.bReturnValue;
12172 }
12173 }
12174
MDrv_XC_Set_3D_HShift(void * pInstance,MS_U16 u16HShift)12175 MS_BOOL MDrv_XC_Set_3D_HShift(void* pInstance, MS_U16 u16HShift)
12176 {
12177 MS_BOOL bRet = FALSE;
12178 #ifndef DISABLE_3D_FUNCTION
12179 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12180 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12181 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12182
12183 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12184 if(MDrv_XC_3D_IsHWDepthAdjSupported(pInstance, pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW]
12185 , pXCResourcePrivate->stdrvXC_3D._eOutput3DMode, MAIN_WINDOW))
12186 {
12187 bRet = TRUE;
12188 pXCResourcePrivate->stdrvXC_3D._u163DHShift = u16HShift&0xff;
12189
12190 #if (HW_2DTO3D_SUPPORT && (HW_2DTO3D_VER >= 3))
12191 MS_U16 u16ABSLevel = ((u16HShift > 0x80)?(u16HShift - 0x80):(0x80 - u16HShift));
12192 {
12193 if((u16HShift == 0x80) || (u16HShift == 0x00))
12194 {
12195 //original 3d depth
12196 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_07_L, 0x0000); //2 // 2nd offset L
12197 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0F_L, 0x0000); //2 // 2nd offset R
12198 }
12199 else if(u16HShift > 0x80)
12200 {
12201 // |L--> <--R|
12202 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_07_L, (0xFF - (u16ABSLevel-1))<<8); //2 // 2nd offset L
12203 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0F_L, (u16ABSLevel)<<8); //2 // 2nd offset R
12204 }
12205 else
12206 {
12207 // |L<-- -->R|
12208 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_07_L, (u16ABSLevel)<<8); //2 // 2nd offset L
12209 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0F_L, (0xFF - (u16ABSLevel-1))<<8); //2 // 2nd offset R
12210 }
12211 }
12212 #if ENABLE_T3D_DEBUG
12213 //enable black edge
12214 Hal_SC_3D_enable_black_edge(pInstance, FALSE);
12215 #endif
12216 #else
12217 if((u16HShift == 0x80) || (u16HShift == 0x00))
12218 {
12219 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_5D_L, 0x0000, 0x8000); //2 // 2nd offset enable
12220 }
12221 else if(u16HShift > 0x80)
12222 {
12223 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_5D_L, 0x8000, 0x8000); //2 // 2nd offset enable
12224 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5E_L, 0x0000); //2 // 2nd offset L
12225 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5F_L, (u16HShift-0x80)<<8); //2 // 2nd offset R
12226 }
12227 else
12228 {
12229 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_5D_L, 0x8000, 0x8000); //2 // 2nd offset enable
12230 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5E_L, (0x80-u16HShift)<<8); //2 // 2nd offset L
12231 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5F_L, 0x0000); //2 // 2nd offset R
12232 }
12233 #endif
12234 }
12235 else if(MApi_XC_Get_3D_HW_Version() < 2)
12236 {
12237 if(u16HShift & 0x01)
12238 {
12239 pXCResourcePrivate->stdrvXC_3D._u163DHShift = u16HShift + 1;
12240 printf("horizontal shift pixel should be even: adjust to %u\n", pXCResourcePrivate->stdrvXC_3D._u163DHShift);
12241 }
12242 else
12243 {
12244 bRet = TRUE;
12245 pXCResourcePrivate->stdrvXC_3D._u163DHShift = u16HShift;
12246 }
12247 }
12248 else
12249 {
12250 bRet = TRUE;
12251 //if 2P mode is enabled, the shift must be even.
12252 #if (XC_SUPPORT_2P_MODE == TRUE)
12253 pXCResourcePrivate->stdrvXC_3D._u163DHShift = u16HShift*2 & 0xFF; //Offset is 8 bit
12254 #else
12255 pXCResourcePrivate->stdrvXC_3D._u163DHShift = u16HShift & 0xFF; //Offset is 8 bit
12256 #endif
12257 }
12258 #else
12259 UNUSED(u16HShift);
12260 #endif
12261 return bRet;
12262 }
12263
12264 //------------------------------------------------------------------------------------------------------
12265 /// Set 3D horizontal shift pixel
12266 /// @param u16HShift \b IN: input horizontal shift pixel
12267 /// @return MS_BOOL \b OUT: TRUE: set is ok FALSE: set value is odd, need align to even
12268 //------------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_HShift_U2(void * pInstance,MS_U16 u16HShift)12269 MS_BOOL MApi_XC_Set_3D_HShift_U2(void* pInstance, MS_U16 u16HShift)
12270 {
12271 MS_BOOL bRet = FALSE;
12272 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12273 _XC_ENTRY(pInstance);
12274
12275 bRet = MDrv_XC_Set_3D_HShift(pInstance, u16HShift);
12276
12277 _XC_RETURN(pInstance);
12278 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12279 return bRet;
12280 }
12281
MApi_XC_Set_3D_HShift(MS_U16 u16HShift)12282 MS_BOOL MApi_XC_Set_3D_HShift(MS_U16 u16HShift)
12283 {
12284 if (pu32XCInst == NULL)
12285 {
12286 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12287 return FALSE;
12288 }
12289
12290 stXC_SET_3D_HORIZONTAL_SHIFT XCArgs;
12291 XCArgs.u16HShift = u16HShift;
12292 XCArgs.bReturnValue = FALSE;
12293
12294 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_HORIZONTAL_SHIFT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12295 {
12296 printf("Obtain XC engine fail\n");
12297 return FALSE;
12298 }
12299 else
12300 {
12301 return XCArgs.bReturnValue;
12302 }
12303 }
12304
12305 //------------------------------------------------------------------------------------------------------
12306 /// Set 3D reg_3dlr_side2line_en, for line_alternative full screen output
12307 /// @param u16HShift \b IN: input horizontal shift pixel
12308 /// @return MS_BOOL \b OUT: TRUE: set is ok FALSE: set value is odd, need align to even
12309 //------------------------------------------------------------------------------------------------------
MDrv_XC_Enable_3D_LR_Sbs2Line(void * pInstance,MS_BOOL bEnable)12310 MS_BOOL MDrv_XC_Enable_3D_LR_Sbs2Line(void *pInstance, MS_BOOL bEnable)
12311 {
12312 MS_BOOL bRet = FALSE;
12313 #ifndef DISABLE_3D_FUNCTION
12314 #if (HW_DESIGN_3D_VER >= 1)
12315 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12316 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12317 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12318
12319 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12320 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12321 _XC_ENTRY(pInstance);
12322 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_53_L, (bEnable << 15), 0x8000);//dnr offset
12323 pXCResourcePrivate->stdrvXC_3D._bIsLR_Sbs2Line = bEnable;
12324 bRet = TRUE;
12325 _XC_RETURN(pInstance);
12326 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12327 #endif
12328 #else
12329 UNUSED(bEnable);
12330 #endif
12331 return bRet;
12332 }
12333
MApi_XC_Enable_3D_LR_Sbs2Line_U2(void * pInstance,MS_BOOL bEnable)12334 MS_BOOL MApi_XC_Enable_3D_LR_Sbs2Line_U2(void* pInstance, MS_BOOL bEnable)
12335 {
12336 MS_BOOL bReturn = FALSE;
12337 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
12338 if(!Hal_SC_3D_IsDualViewMode(pInstance,MAIN_WINDOW))
12339 #endif
12340 {
12341 bReturn = MDrv_XC_Enable_3D_LR_Sbs2Line(pInstance, bEnable);
12342 }
12343 return bReturn;
12344 }
12345
MApi_XC_Enable_3D_LR_Sbs2Line(MS_BOOL bEnable)12346 MS_BOOL MApi_XC_Enable_3D_LR_Sbs2Line(MS_BOOL bEnable)
12347 {
12348 if (pu32XCInst == NULL)
12349 {
12350 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12351 return FALSE;
12352 }
12353
12354 stXC_SET_3D_LR_SBS2LINE XCArgs;
12355 XCArgs.bEnable = bEnable;
12356 XCArgs.bReturnValue = FALSE;
12357
12358 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_LR_SBS2LINE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12359 {
12360 printf("Obtain XC engine fail\n");
12361 return FALSE;
12362 }
12363 else
12364 {
12365 return XCArgs.bReturnValue;
12366 }
12367 }
12368
12369 //------------------------------------------------------------------------------------------------------
12370 /// Is 3D reg_3dlr_side2line_en enabled or not
12371 /// @return MS_BOOL \b OUT: TRUE: enabled FALSE: is not enabled
12372 //------------------------------------------------------------------------------------------------------
MApi_XC_3D_Is_LR_Sbs2Line_U2(void * pInstance)12373 MS_BOOL MApi_XC_3D_Is_LR_Sbs2Line_U2(void* pInstance)
12374 {
12375 MS_BOOL bRet = FALSE;
12376 #ifndef DISABLE_3D_FUNCTION
12377 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12378 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12379 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12380 _XC_ENTRY(pInstance);
12381 bRet = MDrv_SC_3D_Is_LR_Sbs2Line(pInstance);
12382 _XC_RETURN(pInstance);
12383 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12384 #endif
12385 return bRet;
12386 }
12387
MApi_XC_3D_Is_LR_Sbs2Line(void)12388 MS_BOOL MApi_XC_3D_Is_LR_Sbs2Line(void)
12389 {
12390 if (pu32XCInst == NULL)
12391 {
12392 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12393 return FALSE;
12394 }
12395
12396 stXC_CHECK_3D_LR_SBS2LINE XCArgs;
12397 XCArgs.bReturnValue = FALSE;
12398
12399 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_3D_LR_SBS2LINE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12400 {
12401 printf("Obtain XC engine fail\n");
12402 return FALSE;
12403 }
12404 else
12405 {
12406 return XCArgs.bReturnValue;
12407 }
12408 }
12409 //-------------------------------------------------------------------------------------------------
12410 /// Get 3D horizontal shift pixel
12411 /// @param void
12412 /// @return MS_U16 \b OUT: need horizontal shift pixel value
12413 //-------------------------------------------------------------------------------------------------
MDrv_XC_Get_3D_HShift(void * pInstance)12414 MS_U16 MDrv_XC_Get_3D_HShift(void *pInstance)
12415 {
12416 #ifndef DISABLE_3D_FUNCTION
12417 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12418 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12419 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12420 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12421
12422 return pXCResourcePrivate->stdrvXC_3D._u163DHShift;
12423 #else
12424 return 0;
12425 #endif
12426 }
12427
MApi_XC_Get_3D_HShift_U2(void * pInstance)12428 MS_U16 MApi_XC_Get_3D_HShift_U2(void* pInstance)
12429 {
12430 MS_U16 u16Return = 0;
12431 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12432 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12433 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12434 u16Return = MDrv_XC_Get_3D_HShift(pInstance);
12435 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12436 return u16Return;
12437 }
12438
MApi_XC_Get_3D_HShift(void)12439 MS_U16 MApi_XC_Get_3D_HShift(void)
12440 {
12441 if (pu32XCInst == NULL)
12442 {
12443 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12444 return 0;
12445 }
12446
12447 stXC_GET_3D_HORIZONTAL_SHIFT XCArgs;
12448 XCArgs.u16ReturnValue = 0;
12449
12450 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_HORIZONTAL_SHIFT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12451 {
12452 printf("Obtain XC engine fail\n");
12453 return 0;
12454 }
12455 else
12456 {
12457 return XCArgs.u16ReturnValue;
12458 }
12459 }
12460
12461 //------------------------------------------------------------------------------------------------------
12462 /// Set HW 2D to 3D para
12463 /// @param st3DHw2DTo3DPara \b IN: parameters
12464 /// @return MS_BOOL \b OUT: TRUE: set is ok FALSE: set value is wrong
12465 //------------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_HW2DTo3D_Parameters_U2(void * pInstance,MS_XC_3D_HW2DTO3D_PARA st3DHw2DTo3DPara)12466 MS_BOOL MApi_XC_Set_3D_HW2DTo3D_Parameters_U2(void* pInstance, MS_XC_3D_HW2DTO3D_PARA st3DHw2DTo3DPara)
12467 {
12468 #ifndef DISABLE_3D_FUNCTION
12469 MS_BOOL bRet = TRUE;
12470 #if HW_2DTO3D_SUPPORT
12471 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12472 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12473 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12474
12475 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12476 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12477 if(st3DHw2DTo3DPara.u16Concave > 15)
12478 {
12479 printf("u16Concave only have 4 bits\n");
12480 bRet = FALSE;
12481 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Concave = HW_2DTO3D_DEFAULT_CONCAVE;
12482 }
12483 else
12484 {
12485 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Concave = st3DHw2DTo3DPara.u16Concave;
12486 }
12487
12488 if(st3DHw2DTo3DPara.u16ArtificialGain > 15)
12489 {
12490 printf("u16ArtificialGain only have 4 bits\n");
12491 bRet = FALSE;
12492 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ArtificialGain = HW_2DTO3D_DEFAULT_ARTIFICIALGAIN;
12493 }
12494 else
12495 {
12496 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ArtificialGain = st3DHw2DTo3DPara.u16ArtificialGain;
12497 }
12498 #if (HW_2DTO3D_VER < 2)
12499 if(st3DHw2DTo3DPara.u16Gain > 63)
12500 {
12501 printf("u16Gain only have 6 bits\n");
12502 bRet = FALSE;
12503 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain = HW_2DTO3D_DEFAULT_GAIN;
12504 }
12505 #else
12506 if(st3DHw2DTo3DPara.u16Gain > 127)
12507 {
12508 printf("u16Gain only have 7 bits\n");
12509 bRet = FALSE;
12510 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain = HW_2DTO3D_DEFAULT_GAIN;
12511 }
12512 #endif
12513 else
12514 {
12515 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain = st3DHw2DTo3DPara.u16Gain;
12516 }
12517
12518 if(st3DHw2DTo3DPara.u16Offset > 255)
12519 {
12520 printf("u16Offset only have 8 bits\n");
12521 bRet = FALSE;
12522 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset = HW_2DTO3D_DEFAULT_OFFSET;
12523 }
12524 else
12525 {
12526 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset = st3DHw2DTo3DPara.u16Offset;
12527 }
12528
12529 if(st3DHw2DTo3DPara.u16EleSel > 3)
12530 {
12531 printf("u16Offset only have 2 bits\n");
12532 bRet = FALSE;
12533 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel = HW_2DTO3D_DEFAULT_ELESEL;
12534 }
12535 else
12536 {
12537 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EleSel = st3DHw2DTo3DPara.u16EleSel;
12538 }
12539
12540 if(st3DHw2DTo3DPara.u16ModSel > 3)
12541 {
12542 printf("u16Offset only have 2 bits\n");
12543 bRet = FALSE;
12544 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ModSel = HW_2DTO3D_DEFAULT_MODSEL;
12545 }
12546 else
12547 {
12548 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ModSel = st3DHw2DTo3DPara.u16ModSel;
12549 }
12550
12551 if(st3DHw2DTo3DPara.u32Hw2dTo3dPara_Version < 2)
12552 {
12553 st3DHw2DTo3DPara.u16EdgeBlackWidth = 0;
12554 }
12555 else
12556 {
12557 if(st3DHw2DTo3DPara.u16EdgeBlackWidth > 127)
12558 {
12559 printf("u16EdgeBlackWidth only have 7 bits\n");
12560 bRet = FALSE;
12561 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16ModSel = HW_2DTO3D_DEFAULT_EDGEBLACKWIDTH;
12562 }
12563 else
12564 {
12565 pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EdgeBlackWidth = st3DHw2DTo3DPara.u16EdgeBlackWidth;
12566 }
12567 }
12568 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12569 #else
12570 printf("this function is only supported by HW_2DTO3D_SUPPORT=TRUE\n");
12571 bRet = FALSE;
12572 #endif
12573 return bRet;
12574 #else
12575 MS_BOOL bRet = FALSE;
12576 UNUSED(st3DHw2DTo3DPara);
12577 printf("Not support!!");
12578 return bRet;
12579 #endif
12580 }
12581
MApi_XC_Set_3D_HW2DTo3D_Parameters(MS_XC_3D_HW2DTO3D_PARA st3DHw2DTo3DPara)12582 MS_BOOL MApi_XC_Set_3D_HW2DTo3D_Parameters(MS_XC_3D_HW2DTO3D_PARA st3DHw2DTo3DPara)
12583 {
12584 if (pu32XCInst == NULL)
12585 {
12586 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12587 return FALSE;
12588 }
12589
12590 stXC_SET_3D_HW2DTO3D_PARAMETERS XCArgs;
12591 XCArgs.st3DHw2DTo3DPara = st3DHw2DTo3DPara;
12592 XCArgs.bReturnValue = FALSE;
12593
12594 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_HW2DTO3D_PARAMETERS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12595 {
12596 printf("Obtain XC engine fail\n");
12597 return FALSE;
12598 }
12599 else
12600 {
12601 return XCArgs.bReturnValue;
12602 }
12603 }
12604
12605 //------------------------------------------------------------------------------------------------------
12606 /// Get HW 2D to 3D para
12607 /// @param pst3DHw2DTo3DPara \b IN: pointer to parameters
12608 /// @return MS_BOOL \b OUT: TRUE: set is ok FALSE: set value is wrong
12609 //------------------------------------------------------------------------------------------------------
MApi_XC_Get_3D_HW2DTo3D_Parameters_U2(void * pInstance,MS_XC_3D_HW2DTO3D_PARA * pst3DHw2DTo3DPara)12610 MS_BOOL MApi_XC_Get_3D_HW2DTo3D_Parameters_U2(void* pInstance, MS_XC_3D_HW2DTO3D_PARA *pst3DHw2DTo3DPara)
12611 {
12612 #ifndef DISABLE_3D_FUNCTION
12613 MS_BOOL bRet = TRUE;
12614
12615 MS_ASSERT(pst3DHw2DTo3DPara);
12616 if(pst3DHw2DTo3DPara == NULL)
12617 {
12618 printf("3D: pst3DHw2DTo3DPara is null pointer!\n");
12619 return FALSE;
12620 }
12621
12622 #if HW_2DTO3D_SUPPORT
12623 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12624 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12625 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12626
12627 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12628 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12629 MS_U16 u16CopiedLength = sizeof(MS_XC_3D_HW2DTO3D_PARA);
12630 //new AP + old lib, only the length corresponding to old lib has meaning.
12631 if(pst3DHw2DTo3DPara->u32Hw2dTo3dPara_Version > HW2DTO3DPARA_VERSION)
12632 {
12633 //We cosider compatible operation from version1 , so reject the info init when version invalid
12634 #if defined (__aarch64__)
12635 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MApi_XC_Get_3D_HW2DTo3D_Parameters: this old version XC lib has only length:%lu !!\n",
12636 sizeof(MS_XC_3D_HW2DTO3D_PARA))
12637 #else
12638 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MApi_XC_Get_3D_HW2DTo3D_Parameters: this old version XC lib has only length:%u !!\n",
12639 sizeof(MS_XC_3D_HW2DTO3D_PARA))
12640 #endif
12641 //we still copy the min size of both structure, but AP should take care of it.
12642 u16CopiedLength = sizeof(MS_XC_3D_HW2DTO3D_PARA);
12643 }
12644
12645 //old AP + new lib, driver shouldn't access to the space which doesn't exist in old structure
12646 if(pst3DHw2DTo3DPara->u32Hw2dTo3dPara_Version == 1)
12647 {
12648 //We cosider compatible operation form version1 , so reject the info init when version invalid
12649 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MApi_XC_Get_3D_HW2DTo3D_Parameters: new version XC lib shouldn't access to the space which doesn't exist in old structure!!\n")
12650 u16CopiedLength = sizeof(MS_XC_3D_HW2DTO3D_PARA) - sizeof(pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16EdgeBlackWidth);
12651 }
12652
12653 memcpy(pst3DHw2DTo3DPara, &(pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara), u16CopiedLength);
12654 bRet = TRUE;
12655 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12656 #else
12657 printf("this function is only supported by HW_2DTO3D_SUPPORT=TRUE\n");
12658 memset(pst3DHw2DTo3DPara, 0, sizeof(MS_XC_3D_HW2DTO3D_PARA));
12659 bRet = FALSE;
12660 #endif
12661 return bRet;
12662 #else
12663 MS_BOOL bRet = FALSE;
12664 UNUSED(pst3DHw2DTo3DPara);
12665 return bRet;
12666 #endif
12667 }
12668
MApi_XC_Get_3D_HW2DTo3D_Parameters(MS_XC_3D_HW2DTO3D_PARA * pst3DHw2DTo3DPara)12669 MS_BOOL MApi_XC_Get_3D_HW2DTo3D_Parameters(MS_XC_3D_HW2DTO3D_PARA *pst3DHw2DTo3DPara)
12670 {
12671 if (pu32XCInst == NULL)
12672 {
12673 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12674 return FALSE;
12675 }
12676
12677 stXC_GET_3D_HW2DTO3D_PARAMETERS XCArgs;
12678 XCArgs.pst3DHw2DTo3DPara = pst3DHw2DTo3DPara;
12679 XCArgs.bReturnValue = FALSE;
12680
12681 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_HW2DTO3D_PARAMETERS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12682 {
12683 printf("Obtain XC engine fail\n");
12684 return FALSE;
12685 }
12686 else
12687 {
12688 return XCArgs.bReturnValue;
12689 }
12690 }
12691
12692 //------------------------------------------------------------------------------------------------------
12693 /// Set HW 2D to 3D dd buffer&dr buffer
12694 /// @param MS_PHYADDR \b IN: dd buffer address
12695 /// @param MS_PHYADDR \b IN: dr buffer address
12696 /// @return MS_BOOL \b OUT: TRUE: set is ok FALSE: set value is wrong
12697 //------------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_HW2DTo3D_Buffer_U2(void * pInstance,MS_PHY u32HW2DTO3D_DD_Buf,MS_PHY u32HW2DTO3D_DR_Buf)12698 MS_BOOL MApi_XC_Set_3D_HW2DTo3D_Buffer_U2(void* pInstance, MS_PHY u32HW2DTO3D_DD_Buf, MS_PHY u32HW2DTO3D_DR_Buf)
12699 {
12700 #ifndef DISABLE_3D_FUNCTION
12701 #if HW_2DTO3D_SUPPORT
12702 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12703 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12704 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12705
12706 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12707 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12708 pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf = u32HW2DTO3D_DD_Buf;
12709 pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf = u32HW2DTO3D_DR_Buf;
12710
12711 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12712 return TRUE;
12713 #else
12714 printf("this function is only supported by HW_2DTO3D_SUPPORT=TRUE\n");
12715 return FALSE;
12716 #endif
12717 #else
12718 UNUSED(u32HW2DTO3D_DD_Buf);
12719 UNUSED(u32HW2DTO3D_DR_Buf);
12720 return FALSE;
12721 #endif
12722 }
12723
MApi_XC_Set_3D_HW2DTo3D_Buffer(MS_PHY u32HW2DTO3D_DD_Buf,MS_PHY u32HW2DTO3D_DR_Buf)12724 MS_BOOL MApi_XC_Set_3D_HW2DTo3D_Buffer(MS_PHY u32HW2DTO3D_DD_Buf, MS_PHY u32HW2DTO3D_DR_Buf)
12725 {
12726 if (pu32XCInst == NULL)
12727 {
12728 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12729 return FALSE;
12730 }
12731
12732 stXC_SET_3D_HW2DTO3D_BUFFER XCArgs;
12733 XCArgs.u32HW2DTO3D_DD_Buf = u32HW2DTO3D_DD_Buf;
12734 XCArgs.u32HW2DTO3D_DR_Buf = u32HW2DTO3D_DR_Buf;
12735 XCArgs.bReturnValue = FALSE;
12736
12737 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_HW2DTO3D_BUFFER, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12738 {
12739 printf("Obtain XC engine fail\n");
12740 return FALSE;
12741 }
12742 else
12743 {
12744 return XCArgs.bReturnValue;
12745 }
12746 }
12747
12748 //------------------------------------------------------------------------------------------------------
12749 /// Set Color Registers after PQ
12750 /// @param eWindow \b IN: which window to do post pq setting
12751 /// @return MS_BOOL \b OUT: TRUE: set is ok FALSE: set value is wrong
12752 //------------------------------------------------------------------------------------------------------
MApi_XC_3D_PostPQSetting_U2(void * pInstance,SCALER_WIN eWindow)12753 MS_BOOL MApi_XC_3D_PostPQSetting_U2(void* pInstance, SCALER_WIN eWindow)
12754 {
12755 MS_BOOL bRet = FALSE;
12756 #ifndef DISABLE_3D_FUNCTION
12757 MS_ASSERT(eWindow < MAX_WINDOW);
12758 if(eWindow >= MAX_WINDOW)
12759 {
12760 return FALSE;
12761 }
12762 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12763 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12764 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12765 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12766 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12767 _XC_ENTRY(pInstance);
12768 bRet = MDrv_SC_3D_PostPQSetting(pInstance, &gSrcInfo[eWindow], eWindow);
12769 _XC_RETURN(pInstance);
12770 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12771 #else
12772 UNUSED(eWindow);
12773 #endif
12774
12775 return bRet;
12776 }
12777
MApi_XC_3D_PostPQSetting(SCALER_WIN eWindow)12778 MS_BOOL MApi_XC_3D_PostPQSetting(SCALER_WIN eWindow)
12779 {
12780 if (pu32XCInst == NULL)
12781 {
12782 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12783 return FALSE;
12784 }
12785
12786 stXC_SET_3D_POST_PQSETTING XCArgs;
12787 XCArgs.eWindow = eWindow;
12788 XCArgs.bReturnValue = FALSE;
12789
12790 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_POST_PQSETTING, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12791 {
12792 printf("Obtain XC engine fail\n");
12793 return FALSE;
12794 }
12795 else
12796 {
12797 return XCArgs.bReturnValue;
12798 }
12799 }
12800
12801 //------------------------------------------------------------------------------------------------------
12802 /// Set Detect 3D Format Para
12803 /// @param pstDetect3DFormatPara \b IN: pointer to parameters
12804 /// @return MS_BOOL \b OUT: TRUE: set is ok FALSE: set value is wrong
12805 //------------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_Detect3DFormat_Parameters_U2(void * pInstance,MS_XC_3D_DETECT3DFORMAT_PARA * pstDetect3DFormatPara)12806 MS_BOOL MApi_XC_Set_3D_Detect3DFormat_Parameters_U2(void* pInstance, MS_XC_3D_DETECT3DFORMAT_PARA *pstDetect3DFormatPara)
12807 {
12808 #ifndef DISABLE_3D_FUNCTION
12809
12810 MS_ASSERT(pstDetect3DFormatPara);
12811 if(pstDetect3DFormatPara == NULL)
12812 {
12813 printf("3D: pstDetect3DFormatPara is null pointer!\n");
12814 return FALSE;
12815 }
12816 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12817 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12818 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12819
12820 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12821 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12822 memcpy(&(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara), pstDetect3DFormatPara, sizeof(MS_XC_3D_DETECT3DFORMAT_PARA));
12823 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12824 return TRUE;
12825 #else
12826 UNUSED(pstDetect3DFormatPara);
12827 return FALSE;
12828 #endif
12829 }
12830
MApi_XC_Set_3D_Detect3DFormat_Parameters(MS_XC_3D_DETECT3DFORMAT_PARA * pstDetect3DFormatPara)12831 MS_BOOL MApi_XC_Set_3D_Detect3DFormat_Parameters(MS_XC_3D_DETECT3DFORMAT_PARA *pstDetect3DFormatPara)
12832 {
12833 if (pu32XCInst == NULL)
12834 {
12835 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12836 return FALSE;
12837 }
12838
12839 stXC_SET_3D_DETECT_3DFORMAT_PARAMETERS XCArgs;
12840 XCArgs.pstDetect3DFormatPara = pstDetect3DFormatPara;
12841 XCArgs.bReturnValue = FALSE;
12842
12843 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_DETECT_3DFORMAT_PARAMETERS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12844 {
12845 printf("Obtain XC engine fail\n");
12846 return FALSE;
12847 }
12848 else
12849 {
12850 return XCArgs.bReturnValue;
12851 }
12852 }
12853
12854 //------------------------------------------------------------------------------------------------------
12855 /// Get Detect 3D Format Para
12856 /// @param pstDetect3DFormatPara \b IN: pointer to parameters
12857 /// @return MS_BOOL \b OUT: TRUE: set is ok FALSE: set value is wrong
12858 //------------------------------------------------------------------------------------------------------
MApi_XC_Get_3D_Detect3DFormat_Parameters_U2(void * pInstance,MS_XC_3D_DETECT3DFORMAT_PARA * pstDetect3DFormatPara)12859 MS_BOOL MApi_XC_Get_3D_Detect3DFormat_Parameters_U2(void* pInstance, MS_XC_3D_DETECT3DFORMAT_PARA *pstDetect3DFormatPara)
12860 {
12861 #ifndef DISABLE_3D_FUNCTION
12862 MS_ASSERT(pstDetect3DFormatPara);
12863 if(pstDetect3DFormatPara == NULL)
12864 {
12865 printf("3D: pstDetect3DFormatPara is null pointer!\n");
12866 return FALSE;
12867 }
12868 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12869 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12870 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12871
12872 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12873 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12874 memcpy(pstDetect3DFormatPara, &(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara), sizeof(MS_XC_3D_DETECT3DFORMAT_PARA));
12875 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12876 return TRUE;
12877 #else
12878 UNUSED(pstDetect3DFormatPara);
12879 return FALSE;
12880 #endif
12881 }
12882
MApi_XC_Get_3D_Detect3DFormat_Parameters(MS_XC_3D_DETECT3DFORMAT_PARA * pstDetect3DFormatPara)12883 MS_BOOL MApi_XC_Get_3D_Detect3DFormat_Parameters(MS_XC_3D_DETECT3DFORMAT_PARA *pstDetect3DFormatPara)
12884 {
12885 if (pu32XCInst == NULL)
12886 {
12887 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12888 return FALSE;
12889 }
12890 static MS_XC_3D_DETECT3DFORMAT_PARA tmp_para;
12891 memcpy(&tmp_para,pstDetect3DFormatPara,sizeof(MS_XC_3D_DETECT3DFORMAT_PARA));
12892 stXC_GET_3D_DETECT_3DFORMAT_PARAMETERS XCArgs;
12893 XCArgs.pstDetect3DFormatPara = &tmp_para;
12894 XCArgs.bReturnValue = FALSE;
12895
12896 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_DETECT_3DFORMAT_PARAMETERS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12897 {
12898 printf("Obtain XC engine fail\n");
12899 return FALSE;
12900 }
12901 else
12902 {
12903 memcpy(pstDetect3DFormatPara,&tmp_para,sizeof(MS_XC_3D_DETECT3DFORMAT_PARA));
12904 return XCArgs.bReturnValue;
12905 }
12906 }
12907
MApi_XC_EnableAutoDetect3D_U2(void * pInstance,MS_BOOL bEnable,E_XC_3D_AUTODETECT_METHOD enDetectMethod)12908 MS_BOOL MApi_XC_EnableAutoDetect3D_U2(void* pInstance, MS_BOOL bEnable, E_XC_3D_AUTODETECT_METHOD enDetectMethod)
12909 {
12910 #ifndef DISABLE_3D_FUNCTION
12911 MS_BOOL bRet = TRUE;
12912
12913 MS_ASSERT(enDetectMethod < E_XC_3D_AUTODETECT_MAX);
12914 if(enDetectMethod >= E_XC_3D_AUTODETECT_MAX)
12915 {
12916 return FALSE;
12917 }
12918 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12919 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12920 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12921
12922 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12923 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12924 pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod = enDetectMethod;
12925 pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D = bEnable;
12926 if(pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod == E_XC_3D_AUTODETECT_HW)
12927 {
12928 pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D = pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D;
12929 }
12930 else
12931 {
12932 pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D = FALSE;
12933 }
12934
12935 #if (HW_2DTO3D_SUPPORT == FALSE)
12936 if((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
12937 || (E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod))
12938 {
12939 printf("Attention, not support hw auto detect 3d, change to sw method!\n");
12940 pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod = E_XC_3D_AUTODETECT_SW;
12941 bRet = FALSE;
12942 }
12943 #endif
12944
12945 #if HW_2DTO3D_SUPPORT
12946 if((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
12947 && (!pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D))//if disable hw auto detect 3d
12948 {
12949 _XC_ENTRY(pInstance);
12950 //detach vsync interrupt
12951 if(TRUE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
12952 {
12953 MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
12954 }
12955 _XC_RETURN(pInstance);
12956 }
12957 #endif
12958 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12959 #else
12960 MS_BOOL bRet = FALSE;
12961 UNUSED(bEnable);
12962 UNUSED(enDetectMethod);
12963 #endif
12964 return bRet;
12965 }
12966
MApi_XC_EnableAutoDetect3D(MS_BOOL bEnable,E_XC_3D_AUTODETECT_METHOD enDetectMethod)12967 MS_BOOL MApi_XC_EnableAutoDetect3D(MS_BOOL bEnable, E_XC_3D_AUTODETECT_METHOD enDetectMethod)
12968 {
12969 if (pu32XCInst == NULL)
12970 {
12971 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12972 return FALSE;
12973 }
12974
12975 stXC_SET_3D_AUTODETECT XCArgs;
12976 XCArgs.bEnable = bEnable;
12977 XCArgs.enDetectMethod = enDetectMethod;
12978 XCArgs.bReturnValue = FALSE;
12979
12980 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_AUTODETECT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12981 {
12982 printf("Obtain XC engine fail\n");
12983 return FALSE;
12984 }
12985 else
12986 {
12987 return XCArgs.bReturnValue;
12988 }
12989 }
12990
MApi_XC_GetAutoDetect3DFlag_U2(void * pInstance,E_XC_3D_AUTODETECT_METHOD * penDetectMethod,MS_BOOL * pbEnable)12991 MS_BOOL MApi_XC_GetAutoDetect3DFlag_U2(void* pInstance, E_XC_3D_AUTODETECT_METHOD *penDetectMethod, MS_BOOL *pbEnable)
12992 {
12993 #ifndef DISABLE_3D_FUNCTION
12994 if((penDetectMethod == NULL) || (pbEnable == NULL))
12995 {
12996 printf("3D: penDetectMethod or pbEnable is null pointer!\n");
12997 return FALSE;
12998 }
12999 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13000 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13001 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13002
13003 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13004 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13005 *penDetectMethod = pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod;
13006 if(pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod == E_XC_3D_AUTODETECT_HW)
13007 {
13008 *pbEnable = pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D;
13009 }
13010 else
13011 {
13012 *pbEnable = pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D;
13013 }
13014 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13015 return TRUE;
13016 #else
13017 UNUSED(penDetectMethod);
13018 UNUSED(pbEnable);
13019 return FALSE;
13020 #endif
13021 }
13022
MApi_XC_GetAutoDetect3DFlag(E_XC_3D_AUTODETECT_METHOD * penDetectMethod,MS_BOOL * pbEnable)13023 MS_BOOL MApi_XC_GetAutoDetect3DFlag(E_XC_3D_AUTODETECT_METHOD *penDetectMethod, MS_BOOL *pbEnable)
13024 {
13025 if (pu32XCInst == NULL)
13026 {
13027 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13028 return FALSE;
13029 }
13030
13031 stXC_GET_3D_AUTODETECT_3DFLAG XCArgs;
13032 XCArgs.penDetectMethod = penDetectMethod;
13033 XCArgs.pbEnable = pbEnable;
13034 XCArgs.bReturnValue = FALSE;
13035
13036 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_AUTODETECT_3DFLAG, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13037 {
13038 printf("Obtain XC engine fail\n");
13039 return FALSE;
13040 }
13041 else
13042 {
13043 return XCArgs.bReturnValue;
13044 }
13045 }
13046
13047 //------------------------------------------------------------------------------------------------------
13048 /// Detect Nine Lattice By Content
13049 /// @param eWindow \b IN: which window view we are going to detect
13050 /// @param pstDetectNLatticePara \b IN: parameters for detecting
13051 /// @return MS_BOOL \b OUT: true->detect nine lattice succeed; false->detect fail
13052 //------------------------------------------------------------------------------------------------------
MApi_XC_DetectNL_U2(void * pInstance,SCALER_WIN eWindow,ST_DETECTNL_PARA * pstDetectNLatticePara)13053 MS_BOOL MApi_XC_DetectNL_U2(void* pInstance, SCALER_WIN eWindow, ST_DETECTNL_PARA* pstDetectNLatticePara)
13054 {
13055 #ifndef DISABLE_3D_FUNCTION
13056 MS_U16 u16LatticeIdx = 0;
13057 MS_U16 u16H_PixelIdx = 0;
13058 MS_U16 u16V_PixelIdx = 0;
13059 MS_U16 i = 0;
13060 MS_WINDOW_TYPE stSrcRect = {0,0,0,0};
13061 MS_PIXEL_24BIT* pstSource = NULL;
13062 MS_PIXEL_24BIT* pstCurrentPoint = NULL;
13063 MS_U8* pu8Buf = NULL;
13064 MS_U8 u8FieldNum = 0;
13065 MS_U8* pu8BufReg = NULL;
13066 MS_BOOL bRet = TRUE;
13067 MS_U16 u16HCenterIdx[DETECTNL_LATTICE_NUM] = {0,0,0,0,0,0,0,0,0};
13068 MS_U16 u16VCenterIdx[DETECTNL_LATTICE_NUM] = {0,0,0,0,0,0,0,0,0};
13069 MS_U8 u8TryTimes = 0;
13070 MS_U16 u16PixelStep = DETECTNL_PIXEL_STEP;
13071 MS_U8 u8ColorThreshold = DETECTNL_COLORTHRESHOLD;
13072 MS_U8 u8MaxTryTimes = DETECTNL_TRY_TIMES;
13073 #if 0 // no need
13074 MS_U16 u16LinearDiff = DETECTNL_LINEAR_DIFF;
13075 #endif
13076 #if DETECTNL_COMPUTE_TIME
13077 MS_U32 u32StartTime=0;
13078 u32StartTime = MsOS_GetSystemTime();
13079 #endif
13080 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13081 if (NULL != pstDetectNLatticePara)
13082 {
13083 u16PixelStep = pstDetectNLatticePara->u16PixelStep;
13084 u8ColorThreshold = pstDetectNLatticePara->u8ColorThreshold;
13085 u8MaxTryTimes = pstDetectNLatticePara->u8TryTimes;
13086 #if 0 // no need
13087 u16LinearDiff = pstDetectNLatticePara->u16LinearDiff;
13088 #endif
13089 }
13090 if (0 == u8MaxTryTimes || eWindow >= MAX_WINDOW)
13091 {
13092 return FALSE;
13093 }
13094 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13095 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13096 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13097 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13098 stSrcRect.width = gSrcInfo[eWindow].u16H_SizeAfterPreScaling/3;
13099 stSrcRect.height = gSrcInfo[eWindow].u16V_SizeAfterPreScaling/3;
13100 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13101 pstSource = (MS_PIXEL_24BIT*)malloc(stSrcRect.width * stSrcRect.height * sizeof(MS_PIXEL_24BIT));
13102 if (pstSource == NULL)
13103 {
13104 return FALSE;
13105 }
13106
13107 pu8BufReg = (MS_U8*)malloc(stSrcRect.width/u16PixelStep * (stSrcRect.height/u16PixelStep) * sizeof(MS_U8));
13108 if (pu8BufReg == NULL)
13109 {
13110 free(pstSource);
13111 pstSource = NULL;
13112 return FALSE;
13113 }
13114
13115 for (u16LatticeIdx = 0; u16LatticeIdx < DETECTNL_LATTICE_NUM; u16LatticeIdx++) //check 9 lattices
13116 {
13117 MS_U16 u16LatticeLeft = 0; //record the lattice rect
13118 MS_U16 u16LatticeRight = 0;
13119 MS_U16 u16LatticeTop = 0;
13120 MS_U16 u16LatticeBottom = 0;
13121 MS_BOOL bForceHCheck = FALSE;
13122
13123 bRet = TRUE;
13124
13125 //locate the lattice
13126 stSrcRect.x = (u16LatticeIdx%3) * stSrcRect.width;
13127 stSrcRect.y = (u16LatticeIdx/3) * stSrcRect.height;
13128
13129 //get the lattice rect
13130 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13131 MApi_XC_Get_BufferData_WithoutMutex(pInstance, E_XC_OUTPUTDATA_RGB8BITS, &stSrcRect, (MS_U8 *)pstSource, eWindow);
13132 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13133 //For edge effect, we have to multi-times, every time has a shift.
13134 for (u8TryTimes = 0; u8TryTimes < u8MaxTryTimes; u8TryTimes++)
13135 {
13136 bRet = TRUE;
13137 pu8Buf = pu8BufReg;
13138 *pu8Buf = 0;
13139 u8FieldNum = 0;
13140 //V direction scan
13141 for (u16V_PixelIdx = (u16PixelStep/u8MaxTryTimes) * u8TryTimes; u16V_PixelIdx < stSrcRect.height - u16PixelStep; u16V_PixelIdx += u16PixelStep)
13142 {
13143 //H direction scan
13144 for (u16H_PixelIdx = (u16PixelStep/u8MaxTryTimes) * u8TryTimes; u16H_PixelIdx < stSrcRect.width - u16PixelStep; u16H_PixelIdx += u16PixelStep)
13145 {
13146 //locate source point
13147 pstCurrentPoint = pstSource + u16V_PixelIdx * stSrcRect.width + u16H_PixelIdx;
13148 //locate tag of source point
13149 pu8Buf = pu8BufReg + (u16V_PixelIdx/u16PixelStep)* (stSrcRect.width/u16PixelStep) + u16H_PixelIdx/u16PixelStep;
13150 //check whether current point is similar to the point in last line in same column
13151 if (u16V_PixelIdx != ((u16PixelStep/u8MaxTryTimes) * u8TryTimes)) //not first line
13152 {
13153 MS_PIXEL_24BIT* pstLastLinePoint = NULL;
13154 //Y comparing with last line
13155 pstLastLinePoint = pstCurrentPoint - stSrcRect.width*u16PixelStep;
13156 if (abs(pstLastLinePoint->G_Y - pstCurrentPoint->G_Y) < u8ColorThreshold)
13157 {
13158 *pu8Buf = *(pu8Buf - stSrcRect.width/u16PixelStep);
13159 if (1 == *pu8Buf)
13160 {
13161 if (u16H_PixelIdx == u16LatticeLeft)
13162 {
13163 u16LatticeBottom = u16V_PixelIdx;
13164 continue;
13165 }
13166 else
13167 {
13168 bForceHCheck = TRUE;
13169 }
13170 }
13171 else
13172 {
13173 continue;
13174 }
13175 }
13176 else
13177 {
13178 *pu8Buf = DETECTNL_NON_VALUE;
13179 }
13180 }
13181 //check whether current point is simaler to the point in last column with same line
13182 if (u16H_PixelIdx != ((u16PixelStep/u8MaxTryTimes) * u8TryTimes))
13183 {
13184 MS_PIXEL_24BIT* pstLastColumnPoint = NULL;
13185 //Y comparing with last column
13186 pstLastColumnPoint = pstCurrentPoint - u16PixelStep;
13187 if (abs(pstLastColumnPoint->G_Y - pstCurrentPoint->G_Y) < u8ColorThreshold)
13188 {
13189 *pu8Buf = *(pu8Buf - 1);
13190 if (1 == *pu8Buf)
13191 {
13192 if (u16V_PixelIdx == u16LatticeTop)
13193 {
13194 u16LatticeRight = u16H_PixelIdx;
13195 continue;
13196 }
13197 else
13198 {
13199 if ((FALSE == bForceHCheck)
13200 && (u16V_PixelIdx != u16LatticeTop - u16PixelStep) //ignore some points near top/right edge
13201 && (u16V_PixelIdx != u16LatticeTop + u16PixelStep)
13202 && (u16V_PixelIdx != u16LatticeTop + u16PixelStep)
13203 && (u16H_PixelIdx != u16LatticeRight - u16PixelStep)
13204 && (u16H_PixelIdx != u16LatticeRight + u16PixelStep))
13205 {
13206 bRet = FALSE;
13207 break;
13208 }
13209 }
13210 }
13211 if (TRUE == bForceHCheck)
13212 {
13213 bForceHCheck = FALSE;
13214 if ((1 != *pu8Buf)
13215 && (u16H_PixelIdx != u16LatticeLeft) //ignore some points near left edge
13216 && (u16H_PixelIdx != u16LatticeLeft - u16PixelStep)
13217 && (u16H_PixelIdx != u16LatticeLeft + u16PixelStep)
13218 && (u16V_PixelIdx != u16LatticeBottom)
13219 && (u16V_PixelIdx != u16LatticeBottom - u16PixelStep)
13220 && (u16V_PixelIdx != u16LatticeBottom + u16PixelStep)
13221 && (u16H_PixelIdx != u16LatticeRight)
13222 && (u16H_PixelIdx != u16LatticeRight + u16PixelStep)
13223 && (u16H_PixelIdx != u16LatticeRight - u16PixelStep))
13224 {
13225 bRet = FALSE;
13226 break;
13227 }
13228 }
13229 continue;
13230 }
13231 else
13232 {
13233 *pu8Buf = DETECTNL_NON_VALUE;
13234 }
13235 bForceHCheck = FALSE;
13236 }
13237 if (DETECTNL_NON_VALUE == *pu8Buf)
13238 {
13239 if ((1 == u8FieldNum)
13240 && ((u16H_PixelIdx == u16LatticeLeft - u16PixelStep) //ignore some points near left/right/bottom edge
13241 || (u16H_PixelIdx == u16LatticeRight - u16PixelStep)
13242 || (u16H_PixelIdx == u16LatticeRight + u16PixelStep)
13243 || (u16V_PixelIdx == u16LatticeBottom - u16PixelStep)
13244 || (u16V_PixelIdx == u16LatticeBottom + u16PixelStep)))
13245 {
13246 *pu8Buf = 1;
13247 }
13248 else
13249 {
13250 u8FieldNum++;
13251 *pu8Buf = u8FieldNum;
13252 if (1 == *pu8Buf) // catch first "1" field position
13253 {
13254 u16LatticeLeft = u16H_PixelIdx;
13255 u16LatticeRight = u16H_PixelIdx;
13256 u16LatticeTop = u16V_PixelIdx;
13257 u16LatticeBottom = u16V_PixelIdx;
13258 }
13259
13260 if (u8FieldNum > 1)
13261 {
13262 break;
13263 }
13264 }
13265 }
13266 }
13267 if (u8FieldNum > 1) // 3 fields
13268 {
13269 break;
13270 }
13271 }
13272
13273 if (u8FieldNum != 1) // 0 and 1 fields
13274 {
13275 bRet = FALSE;
13276 }
13277 if (TRUE == bRet)
13278 {
13279 u16HCenterIdx[u16LatticeIdx] = (u16LatticeLeft + u16LatticeRight) / 2;
13280 u16VCenterIdx[u16LatticeIdx] = (u16LatticeTop + u16LatticeBottom) / 2;
13281 break;
13282 }
13283 }
13284 if (FALSE == bRet)
13285 {
13286 break;
13287 }
13288 }
13289 if (TRUE == bRet) //check linear
13290 {
13291 for (i = 0; i < DETECTNL_LATTICE_NUM/3; i++)
13292 {
13293 if ((abs(u16VCenterIdx[i*3]-u16VCenterIdx[i*3+1]) > u8MaxTryTimes + u16PixelStep/2)
13294 || (abs(u16VCenterIdx[i*3+1]-u16VCenterIdx[i*3+2]) > 32+u16PixelStep/2))
13295 {
13296 bRet = FALSE;
13297 break;
13298 }
13299 if ((abs(u16HCenterIdx[i]-u16HCenterIdx[i+3]) > u8MaxTryTimes + u16PixelStep/2)
13300 || (abs(u16HCenterIdx[i+3]-u16HCenterIdx[i+6]) > 32+u16PixelStep/2))
13301 {
13302 bRet = FALSE;
13303 break;
13304 }
13305 }
13306 }
13307 free(pu8BufReg);
13308 free(pstSource);
13309 pstSource = NULL;
13310 pu8BufReg = NULL;
13311 #if DETECTNL_COMPUTE_TIME
13312 printf("*time*%ld\n",MsOS_GetSystemTime()-u32StartTime);
13313 #endif
13314 return bRet;
13315 #else
13316 MS_BOOL bRet = FALSE;
13317 UNUSED(pstDetectNLatticePara);
13318 UNUSED(eWindow);
13319 printf("Not support!!");
13320 return bRet;
13321 #endif
13322
13323 }
13324
MApi_XC_DetectNL(SCALER_WIN eWindow,ST_DETECTNL_PARA * pstDetectNLatticePara)13325 MS_BOOL MApi_XC_DetectNL(SCALER_WIN eWindow, ST_DETECTNL_PARA* pstDetectNLatticePara)
13326 {
13327 if (pu32XCInst == NULL)
13328 {
13329 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13330 return FALSE;
13331 }
13332
13333 stXC_SET_NINELATTICE XCArgs;
13334 XCArgs.eWindow = eWindow;
13335 XCArgs.pstDetectNLatticePara = pstDetectNLatticePara;
13336 XCArgs.bReturnValue = FALSE;
13337
13338 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_NINELATTICE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13339 {
13340 printf("Obtain XC engine fail\n");
13341 return FALSE;
13342 }
13343 else
13344 {
13345 return XCArgs.bReturnValue;
13346 }
13347 }
13348
13349 //------------------------------------------------------------------------------------------------------
13350 /// Detect 3D Format By Content
13351 /// @param eWindow \b IN: which window view we are going to detect
13352 /// @return E_XC_3D_INPUT_MODE \b OUT: detected 3d format
13353 //------------------------------------------------------------------------------------------------------
MApi_XC_Detect3DFormatByContent_U2(void * pInstance,SCALER_WIN eWindow)13354 E_XC_3D_INPUT_MODE MApi_XC_Detect3DFormatByContent_U2(void* pInstance, SCALER_WIN eWindow)
13355 {
13356 E_XC_3D_INPUT_MODE e3DInput = E_XC_3D_INPUT_MODE_NONE;
13357 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13358 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13359 #ifndef DISABLE_3D_FUNCTION
13360 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13361 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13362 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13363
13364 if(MDrv_XC_IsInputSourceDisabled(pInstance, eWindow))
13365 {
13366 printf("Attention! Should enable input source when do auto detect 3d\n");
13367 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13368 return E_XC_3D_INPUT_MODE_NONE;
13369 }
13370
13371 #if (HW_2DTO3D_SUPPORT && (HW_2DTO3D_VER >= 3))
13372 if((IS_INPUT_FRAME_PACKING(MAIN_WINDOW)
13373 || IS_INPUT_TOP_BOTTOM(MAIN_WINDOW)
13374 || IS_INPUT_SIDE_BY_SIDE_HALF(MAIN_WINDOW))
13375 && IS_OUTPUT_LINE_ALTERNATIVE())
13376 {
13377 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, BIT(13), BIT(13));//reg_det3d_la_en
13378 }
13379 else
13380 {
13381 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, 0x00, BIT(13));//reg_det3d_la_en
13382 }
13383 #else
13384 if((MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow) != E_XC_3D_INPUT_MODE_NONE)
13385 || (MDrv_XC_Get_3D_Output_Mode(pInstance) != E_XC_3D_OUTPUT_MODE_NONE))
13386 {
13387 printf("Attention! Should disable 3d when do auto detect 3d\n");
13388 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13389 return E_XC_3D_INPUT_MODE_NONE;
13390 }
13391 #endif
13392
13393 if((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D)
13394 {
13395 #if (HW_2DTO3D_SUPPORT == FALSE)
13396 printf("Attention! hw auto detect mode is not supported by this chip!\n");
13397 #endif
13398 e3DInput = pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes;
13399 }
13400 else if((E_XC_3D_AUTODETECT_HW_COMPATIBLE == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D)
13401 {
13402 #if HW_2DTO3D_SUPPORT
13403 MS_U32 u32Time = 0;
13404 pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D = TRUE;
13405
13406 _XC_ENTRY(pInstance);
13407
13408 #if (HW_2DTO3D_VER < 3)
13409
13410 MDrv_XC_get_dispwin_from_reg(pInstance, eWindow, &gSrcInfo[eWindow].stDispWin);
13411 MS_PHY u32HW2DTO3D_DD_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf;
13412 MS_PHY u32HW2DTO3D_DR_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf;
13413
13414 if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf >= HAL_MIU1_BASE)
13415 {
13416 u32HW2DTO3D_DD_Buf -= HAL_MIU1_BASE;
13417 }
13418
13419 if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf >= HAL_MIU1_BASE)
13420 {
13421 u32HW2DTO3D_DR_Buf -= HAL_MIU1_BASE;
13422 }
13423
13424 //clk
13425 MDrv_WriteRegBit(REG_CKG_FICLK_F1, ENABLE, BIT(6)); //reg_ckg_ficlk_3d
13426 //dd
13427 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, gSrcInfo[eWindow].stDispWin.width, 0x07FF);//src width
13428 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, gSrcInfo[eWindow].stDispWin.height, 0x07FF);//src height
13429 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_05_L, 0x7878, 0x7F7F);//dram request number
13430 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, (u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD)>>16, 0x07FF);//dd buffer high 9bit
13431 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_07_L, u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD);//dd buffer low 2 bytes
13432 MDrv_XC_wait_output_vsync(pInstance, 1, 100, eWindow);
13433 #if (HW_2DTO3D_VER < 2)
13434 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, BIT(13)|BIT(15), BIT(13)|BIT(15));//src domain select&start to write miu
13435 #else
13436 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, BIT(15), BIT(13)|BIT(15));//src domain select&start to write miu
13437 #endif
13438 #if (HW_2DTO3D_VER > 0)
13439 MDrv_WriteByteMask(REG_MIU0_BASE+0x2B, BIT(6), BIT(6)); //enable memory write
13440 #endif
13441 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_21_L, 0x540f);
13442 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, 0x0430);
13443 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_40_L, BIT(6), BIT(6)); // DD force bank enable
13444 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_41_L, 0x0000, 0x000F); // DD force bank0
13445 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_03_L, 0, BIT(12)); //disable dynamic gating
13446 #else
13447 _MDrv_SC_3D_Load2DTo3DReg(pInstance, TRUE, &gSrcInfo[eWindow], eWindow);
13448 #endif
13449
13450 pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank = TRUE;
13451 pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
13452 pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount = 0;
13453 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
13454 if(FALSE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
13455 {
13456 MDrv_XC_InterruptAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
13457 }
13458 _XC_RETURN(pInstance);
13459
13460
13461 u32Time = MsOS_GetSystemTime();
13462 while((E_XC_3D_INPUT_MODE_NONE == pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes)
13463 && (pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount)
13464 && ((MsOS_GetSystemTime() - u32Time) < 4000))
13465 {
13466 // because other thread wiill update _enCurDetectedRes, _u16CheckedFrameCount, u16MaxCheckingFrameCount
13467 // so we need to unlock first so that other thread(a.k.a ISR) can retrieve semaphore and update variables
13468 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13469 MsOS_DelayTask(100);
13470 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13471 }
13472
13473 _XC_ENTRY(pInstance);
13474 //detach vsync interrupt
13475 if(TRUE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
13476 {
13477 MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
13478 }
13479
13480 #if (HW_2DTO3D_VER < 3)
13481 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, 0x0000, BIT(13)|BIT(15));//src domain select&start to write miu
13482 //dd
13483 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, 0x0780, 0x07FF);//src width
13484 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, 0x0438, 0x07FF);//src height
13485 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_05_L, 0x7878, 0x7F7F);//dram request number
13486 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_21_L, 0x0000);
13487 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, 0x0000);
13488 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_03_L, BIT(12), BIT(12)); //enable dynamic gating
13489 #else
13490 _MDrv_SC_3D_Load2DTo3DReg(pInstance, FALSE, &gSrcInfo[eWindow], eWindow);
13491 #endif
13492 _XC_RETURN(pInstance);
13493 pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D = FALSE;
13494 #else
13495 printf("Attention! hw auto detect compatible mode is not supported by this chip!\n");
13496 #endif
13497 e3DInput = pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes;
13498 }
13499 else if((E_XC_3D_AUTODETECT_SW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bEnableAutoDetect3D)
13500 {
13501 e3DInput = E_XC_3D_INPUT_MODE_NONE;
13502 printf("\n Attention! SW auto detect mode is not supported. return value 3D_INPUT_MODE_NONE !\n");
13503 #if 0
13504 MS_PIXEL_24BIT stSource = {0,0,0};
13505 MS_U16 u16SBSMatchedPixelCount = 0;
13506 MS_U16 u16TBMatchedPixelCount = 0;
13507 MS_PIXEL_24BIT stDest[pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange*pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSearchRange];
13508 MS_WINDOW_TYPE stSrcRect;
13509 MS_WINDOW_TYPE stDestRect;
13510 MS_U16 i = 0;
13511 MS_U16 j = 0;
13512 MS_U16 k = 0;
13513 MS_U16 m = 0;
13514 MS_U16 u16Temp = 0;
13515 MS_U16 u16SBSMatchedFrameCount = 0;
13516 MS_U16 u16TBMatchedFrameCount = 0;
13517 MS_BOOL bExit = FALSE;
13518 MS_U16 u16FrameCount = 0;
13519 MS_U16 u16Array[3][32];
13520 MS_U16 u16MaxSimCount[3];
13521 MS_U16 u16PurePixel = 0;
13522 MS_U16 u16PureFrameCount = 0;
13523
13524 MS_ASSERT(eWindow < MAX_WINDOW);
13525
13526 if(eWindow >= MAX_WINDOW)
13527 {
13528 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13529 return E_XC_3D_INPUT_MODE_NONE;
13530 }
13531
13532 if(gSrcInfo[eWindow].bFBL
13533 || gSrcInfo[eWindow].bR_FBL
13534 || (gSrcInfo[eWindow].u16H_SizeAfterPreScaling == 0)
13535 || (gSrcInfo[eWindow].u16V_SizeAfterPreScaling == 0)
13536 )
13537 {
13538 printf("Attention: invalid case of MApi_XC_Detect3DFormatByContent!\n");
13539 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13540 return E_XC_3D_INPUT_MODE_NONE;
13541 }
13542
13543 memset(&stDest, 0 , sizeof(stDest));
13544
13545 _XC_ENTRY(pInstance);
13546
13547 do
13548 {
13549 u16SBSMatchedPixelCount = 0;
13550 u16TBMatchedPixelCount = 0;
13551 MDrv_XC_wait_input_vsync(pInstance, 1, 100, eWindow);
13552 Hal_SC_set_freezeimg(pInstance, ENABLE, eWindow);
13553
13554 ///skip pure frame
13555 u16PurePixel = 0;
13556 memset(u16Array, 0, sizeof(u16Array));
13557 memset(u16MaxSimCount, 0, sizeof(u16MaxSimCount));
13558 for(j = 0; j < DETECT3DFORMAT_DEFAULT_VERPUREPIXEL; j++)
13559 {
13560 for(i = 0; i < DETECT3DFORMAT_DEFAULT_HORPUREPIXEL; i++)
13561 {
13562 stSrcRect.x = gSrcInfo[eWindow].u16H_SizeAfterPreScaling*(i+1)/(DETECT3DFORMAT_DEFAULT_HORPUREPIXEL+1);
13563 stSrcRect.y = gSrcInfo[eWindow].u16V_SizeAfterPreScaling*(j+1)/(DETECT3DFORMAT_DEFAULT_VERPUREPIXEL+1);
13564 stSrcRect.width = 1;
13565 stSrcRect.height = 1;
13566
13567 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "====================pure frame check Attention! i=%u, j=%u=======================================================\n", i, j);
13568 MApi_XC_Get_BufferData_WithoutMutex(pInstance, E_XC_OUTPUTDATA_RGB8BITS, &stSrcRect, (MS_U8 *)&stSource, eWindow);
13569 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "===================x=%u, y=%u==============================\n", stSrcRect.x, stSrcRect.y);
13570 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "y=%x, cb=%x, cr=%x\n", stSource.G_Y, stSource.B_Cb, stSource.R_Cr);
13571
13572 u16Array[0][stSource.G_Y / pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16GYPixelThreshold]++;
13573 u16Array[1][stSource.B_Cb / pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16BCbPixelThreshold]++;
13574 u16Array[2][stSource.R_Cr / pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16RCrPixelThreshold]++;
13575 }
13576 }
13577
13578 u16MaxSimCount[0] = u16Array[0][0] + u16Array[0][1];
13579 u16MaxSimCount[1] = u16Array[1][0] + u16Array[1][1];
13580 u16MaxSimCount[2] = u16Array[2][0] + u16Array[2][1];
13581 for(j = 0; j < 3; j++)
13582 {
13583 for(i = 1; i < 31; i++)
13584 {
13585 MS_U16 u16Temp = u16Array[j][i] + u16Array[j][i + 1];
13586 if(u16Temp > u16MaxSimCount[j])
13587 {
13588 u16MaxSimCount[j] = u16Temp;
13589 }
13590 }
13591 }
13592
13593 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u16MaxSimCount[0]=%u, u16MaxSimCount[1]=%u, u16MaxSimCount[2]=%u\n", u16MaxSimCount[0], u16MaxSimCount[1], u16MaxSimCount[2]);
13594
13595 u16PurePixel = MIN(MIN(u16MaxSimCount[0], u16MaxSimCount[1]), u16MaxSimCount[2]);
13596
13597 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u16PurePixel=%u\n", u16PurePixel);
13598
13599 if(u16PurePixel >= (DETECT3DFORMAT_DEFAULT_HORPUREPIXEL*DETECT3DFORMAT_DEFAULT_VERPUREPIXEL*DETECT3DFORMAT_DEFAULT_PUREPIXELPERCENTAGE/100))
13600 {
13601 u16PureFrameCount++;
13602 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "pure frame detected!\n");
13603 Hal_SC_set_freezeimg(pInstance, DISABLE, eWindow);
13604 continue;
13605 }
13606
13607 ///sbs check
13608 for(j = 0; j < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSampleCount; j++)
13609 {
13610 for(i = 0; i < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSampleCount; i++)
13611 {
13612 stSrcRect.x = gSrcInfo[eWindow].u16H_SizeAfterPreScaling*(i+1)/2/(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSampleCount+1);
13613 stSrcRect.y = gSrcInfo[eWindow].u16V_SizeAfterPreScaling*(j+1)/(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSampleCount+1);
13614 stSrcRect.width = 1;
13615 stSrcRect.height = 1;
13616
13617 stDestRect.x = stSrcRect.x + gSrcInfo[eWindow].u16H_SizeAfterPreScaling/2 - pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange/2;
13618 stDestRect.y = stSrcRect.y;
13619 stDestRect.width = pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange;
13620 stDestRect.height = pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSearchRange;
13621
13622 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "====================SBS Attention! i=%u, j=%u=======================================================\n", i, j);
13623 MApi_XC_Get_BufferData_WithoutMutex(pInstance, E_XC_OUTPUTDATA_RGB8BITS, &stSrcRect, (MS_U8 *)&stSource, eWindow);
13624 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "===================x=%u, y=%u==============================\n", stSrcRect.x, stSrcRect.y);
13625 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "y=%x, cb=%x, cr=%x\n", stSource.G_Y, stSource.B_Cb, stSource.R_Cr);
13626 MApi_XC_Get_BufferData_WithoutMutex(pInstance, E_XC_OUTPUTDATA_RGB8BITS, &stDestRect, (MS_U8 *)stDest, eWindow);
13627 bExit = FALSE;
13628 for(m = 0; (!bExit) && (m < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSearchRange); m++)
13629 {
13630 for(k = 0; k < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange; k++)
13631 {
13632 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "===================x=%u, y=%u==============================\n", stDestRect.x+k, stDestRect.y);
13633 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "y=%x, cb=%x, cr=%x\n", stDest[i].G_Y, stDest[i].B_Cb, stDest[i].R_Cr);
13634 u16Temp = k + m * pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange;
13635 if((abs((MS_S16)stDest[u16Temp].G_Y-stSource.G_Y) < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16GYPixelThreshold) //find the matched pixel
13636 && (abs((MS_S16)stDest[u16Temp].B_Cb-stSource.B_Cb) < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16BCbPixelThreshold)
13637 && (abs((MS_S16)stDest[u16Temp].R_Cr-stSource.R_Cr) < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16RCrPixelThreshold)
13638 )
13639 {
13640 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "SBS hit: i=%u, j=%u\n", i, j);
13641 u16SBSMatchedPixelCount++;
13642 bExit = TRUE;
13643 break;
13644 }
13645 }
13646 }
13647 }
13648 }
13649
13650 ///tb check
13651 for(j = 0; j < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSampleCount; j++)
13652 {
13653 for(i = 0; i < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSampleCount; i++)
13654 {
13655 stSrcRect.x = gSrcInfo[eWindow].u16H_SizeAfterPreScaling*(i+1)/(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSampleCount+1);
13656 stSrcRect.y = gSrcInfo[eWindow].u16V_SizeAfterPreScaling*(j+1)/2/(pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSampleCount+1);
13657 stSrcRect.width = 1;
13658 stSrcRect.height = 1;
13659
13660 stDestRect.x = stSrcRect.x - pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange/2;
13661 stDestRect.y = stSrcRect.y + gSrcInfo[eWindow].u16V_SizeAfterPreScaling/2;
13662 stDestRect.width = pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange;
13663 stDestRect.height = pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSearchRange;
13664
13665 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "====================TB Attention! i=%u, j=%u=======================================================\n", i, j);
13666 MApi_XC_Get_BufferData_WithoutMutex(pInstance, E_XC_OUTPUTDATA_RGB8BITS, &stSrcRect, (MS_U8 *)&stSource, eWindow);
13667 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "===================x=%u, y=%u==============================\n", stSrcRect.x, stSrcRect.y);
13668 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "y=%x, cb=%x, cr=%x\n", stSource.G_Y, stSource.B_Cb, stSource.R_Cr);
13669 MApi_XC_Get_BufferData_WithoutMutex(pInstance, E_XC_OUTPUTDATA_RGB8BITS, &stDestRect, (MS_U8 *)stDest, eWindow);
13670 bExit = FALSE;
13671 for(m = 0; (!bExit) && (m < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSearchRange); m++)
13672 {
13673 for(k = 0; k < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange; k++)
13674 {
13675 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "===================x=%u, y=%u==============================\n", stDestRect.x+k, stDestRect.y);
13676 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "y=%x, cb=%x, cr=%x\n", stDest[i].G_Y, stDest[i].B_Cb, stDest[i].R_Cr);
13677 u16Temp = k + m * pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSearchRange;
13678 if((abs((MS_S16)stDest[u16Temp].G_Y-stSource.G_Y) < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16GYPixelThreshold) //find the matched pixel
13679 && (abs((MS_S16)stDest[u16Temp].B_Cb-stSource.B_Cb) < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16BCbPixelThreshold)
13680 && (abs((MS_S16)stDest[u16Temp].R_Cr-stSource.R_Cr) < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16RCrPixelThreshold)
13681 )
13682 {
13683 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "TB hit: i=%u, j=%u\n", i, j);
13684 u16TBMatchedPixelCount++;
13685 bExit = TRUE;
13686 break;
13687 }
13688 }
13689 }
13690 }
13691 }
13692
13693 Hal_SC_set_freezeimg(pInstance, DISABLE, eWindow);
13694
13695 if(u16SBSMatchedPixelCount >=
13696 (pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSampleCount*pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSampleCount*pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HitPixelPercentage/100))
13697 {
13698 u16SBSMatchedFrameCount++;
13699 }
13700
13701 if(u16TBMatchedPixelCount >=
13702 (pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HorSampleCount*pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16VerSampleCount*pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16HitPixelPercentage/100))
13703 {
13704 u16TBMatchedFrameCount++;
13705 }
13706
13707 u16FrameCount++;
13708
13709 MsOS_DelayTask(100);
13710
13711 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u16SBSMatchedPixelCount=%u, u16TBMatchedPixelCount=%u\n", u16SBSMatchedPixelCount, u16TBMatchedPixelCount);
13712 }while((u16FrameCount < pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount) && (u16PureFrameCount < 256));
13713
13714 _XC_RETURN(pInstance);
13715
13716 if((u16SBSMatchedFrameCount > pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount*DETECT3DFORMAT_DEFAULT_HITFRAMEPERCENTAGE/10)
13717 && (u16TBMatchedFrameCount > pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount*DETECT3DFORMAT_DEFAULT_HITFRAMEPERCENTAGE/10)
13718 )
13719 {
13720 e3DInput = E_XC_3D_INPUT_MODE_NONE;
13721 }
13722 else if(u16SBSMatchedFrameCount > pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount*DETECT3DFORMAT_DEFAULT_HITFRAMEPERCENTAGE/10)
13723 {
13724 e3DInput = E_XC_3D_INPUT_SIDE_BY_SIDE_HALF;
13725 }
13726 else if(u16TBMatchedFrameCount > pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount*DETECT3DFORMAT_DEFAULT_HITFRAMEPERCENTAGE/10)
13727 {
13728 e3DInput = E_XC_3D_INPUT_TOP_BOTTOM;
13729 }
13730 else
13731 {
13732 e3DInput = E_XC_3D_INPUT_MODE_NONE;
13733 }
13734 #endif
13735 }
13736 else
13737 {
13738 printf("Attention, not enable auto detect 3d!\n");
13739 }
13740 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13741 #else
13742 UNUSED(eWindow);
13743 #endif
13744 return e3DInput;
13745 }
13746
MApi_XC_Detect3DFormatByContent(SCALER_WIN eWindow)13747 E_XC_3D_INPUT_MODE MApi_XC_Detect3DFormatByContent(SCALER_WIN eWindow)
13748 {
13749 if (pu32XCInst == NULL)
13750 {
13751 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13752 return FALSE;
13753 }
13754
13755 stXC_GET_3D_FORMAT_DETECTED_BY_CONTENT XCArgs;
13756 XCArgs.eWindow = eWindow;
13757 XCArgs.eReturnValue = FALSE;
13758
13759 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_3D_FORMAT_DETECTED_BY_CONTENT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13760 {
13761 printf("Obtain XC engine fail\n");
13762 return FALSE;
13763 }
13764 else
13765 {
13766 return XCArgs.eReturnValue;
13767 }
13768 }
13769
13770 //------------------------------------------------------------------------------------------------------
13771 /// Set 3D Frame Packing Info
13772 /// @param pstFPInfoPara \b IN: pointer to struct MS_XC_3D_FPINFO_PARA
13773 /// @return MS_BOOL \b OUT: TRUE: set is ok FALSE: set value is wrong
13774 //------------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_FPInfo_U2(void * pInstance,MS_XC_3D_FPINFO_PARA * pstFPInfoPara)13775 MS_BOOL MApi_XC_Set_3D_FPInfo_U2(void* pInstance, MS_XC_3D_FPINFO_PARA *pstFPInfoPara)
13776 {
13777 #ifndef DISABLE_3D_FUNCTION
13778
13779 MS_ASSERT(pstFPInfoPara);
13780 if(pstFPInfoPara == NULL)
13781 {
13782 printf("3D: pstFPInfoPara is null pointer!\n");
13783 return FALSE;
13784 }
13785 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13786 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13787 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13788
13789 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13790 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13791 memcpy(&(pXCResourcePrivate->stdrvXC_3D._stFPInfoPara), pstFPInfoPara, sizeof(MS_XC_3D_FPINFO_PARA));
13792 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13793 return TRUE;
13794 #else
13795 UNUSED(pstFPInfoPara);
13796 return FALSE;
13797 #endif
13798 }
13799
MApi_XC_Set_3D_FPInfo(MS_XC_3D_FPINFO_PARA * pstFPInfoPara)13800 MS_BOOL MApi_XC_Set_3D_FPInfo(MS_XC_3D_FPINFO_PARA *pstFPInfoPara)
13801 {
13802 if (pu32XCInst == NULL)
13803 {
13804 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13805 return FALSE;
13806 }
13807
13808 stXC_SET_3D_FRAMEPACKING_INFO XCArgs;
13809 XCArgs.pstFPInfoPara = pstFPInfoPara;
13810 XCArgs.bReturnValue = FALSE;
13811
13812 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_FRAMEPACKING_INFO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13813 {
13814 printf("Obtain XC engine fail\n");
13815 return FALSE;
13816 }
13817 else
13818 {
13819 return XCArgs.bReturnValue;
13820 }
13821 }
13822
13823 //------------------------------------------------------------------------------------------------------
13824 /// Enable Sub Window Clock
13825 /// @return MS_BOOL \b OUT: TRUE: set is ok FALSE: set is wrong
13826 //------------------------------------------------------------------------------------------------------
MApi_XC_Set_3D_SubWinClk_U2(void * pInstance)13827 MS_BOOL MApi_XC_Set_3D_SubWinClk_U2(void* pInstance)
13828 {
13829 #ifndef DISABLE_3D_FUNCTION
13830 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13831 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13832 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13833
13834 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13835 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13836 MDrv_SC_3D_CloneMainSettings(pInstance, &gSrcInfo[SUB_WINDOW], SUB_WINDOW);
13837 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13838 return TRUE;
13839 #else
13840 return FALSE;
13841 #endif
13842 }
13843
MApi_XC_Set_3D_SubWinClk(void)13844 MS_BOOL MApi_XC_Set_3D_SubWinClk(void)
13845 {
13846 if (pu32XCInst == NULL)
13847 {
13848 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13849 return FALSE;
13850 }
13851
13852 stXC_SET_3D_SUBWINCLOCK XCArgs;
13853 XCArgs.bReturnValue = FALSE;
13854
13855 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_3D_SUBWINCLOCK, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13856 {
13857 printf("Obtain XC engine fail\n");
13858 return FALSE;
13859 }
13860 else
13861 {
13862 return XCArgs.bReturnValue;
13863 }
13864 }
13865
13866 //-------------------------------------------------------------------------------------------------
13867 /// Query the input 3D format is supported or not
13868 /// @param E_XC_3D_INPUT_MODE \b IN: input 3d format
13869 /// @param E_XC_3D_INPUT_MODE \b IN: output 3d format
13870 /// @return MS_BOOL \b OUT: TRUE:Supported FALSE:NotSupported
13871 //-------------------------------------------------------------------------------------------------
MDrv_XC_Is3DFormatSupported(void * pInstance,E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode)13872 MS_BOOL MDrv_XC_Is3DFormatSupported(void *pInstance, E_XC_3D_INPUT_MODE e3dInputMode,
13873 E_XC_3D_OUTPUT_MODE e3dOutputMode)
13874 {
13875 MS_BOOL bRet = FALSE;
13876 #ifndef DISABLE_3D_FUNCTION
13877
13878 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "==============================================================\n");
13879 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "3D:this 3D format is e3dInputMode:0x%x;e3dOutputMode:%x\n",
13880 e3dInputMode, e3dOutputMode);
13881 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "==============================================================\n");
13882
13883 //-------------------------------------------------------------------------------------------------
13884 /// special case
13885 //-------------------------------------------------------------------------------------------------
13886 if(((e3dInputMode == E_XC_3D_INPUT_MODE_NONE) &&
13887 (e3dOutputMode == E_XC_3D_OUTPUT_MODE_NONE))
13888 ||
13889 //-------------------------------------------------------------------------------------------------
13890 ///obsolete case
13891 //-------------------------------------------------------------------------------------------------
13892 (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
13893 ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
13894 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
13895 ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
13896 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF_INTERLACE)
13897 ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D))
13898 &&(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_NOFRC))
13899 ||
13900 (((e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF_INTERLACE_OPT)
13901 ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_INTERLACE)
13902 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF_INTERLACE)
13903 ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_INTERLACE_PTP))
13904 &&(e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE))
13905 ||
13906 ((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING_OPT) &&
13907 (e3dOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
13908 ||
13909 (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING_OPT)
13910 ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM_OPT))
13911 &&(e3dOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF))
13912 ||
13913 //-------------------------------------------------------------------------------------------------
13914 ///frame alternative output case
13915 //-------------------------------------------------------------------------------------------------
13916 (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
13917 ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
13918 ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
13919 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
13920 ||(e3dInputMode == E_XC_3D_INPUT_FRAME_ALTERNATIVE)
13921 #if (HW_DESIGN_3D_VER == 4)
13922 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_FULL)
13923 #endif
13924 #if (HW_DESIGN_3D_VER >= 2)
13925 ||(e3dInputMode == E_XC_3D_INPUT_FIELD_ALTERNATIVE)
13926 ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD)
13927 ||(e3dInputMode == E_XC_3D_INPUT_PIXEL_ALTERNATIVE)
13928 #endif
13929 ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D))
13930 &&((e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
13931 ||(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR)))
13932 #if HW_2DTO3D_SUPPORT
13933 #if ((HW_2DTO3D_VER != 3))
13934 ||
13935 ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
13936 (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_HW))
13937 ||
13938 ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
13939 (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_LLRR_HW))
13940 #endif
13941 #endif
13942 ||
13943 //-------------------------------------------------------------------------------------------------
13944 ///line alternative output case
13945 //-------------------------------------------------------------------------------------------------
13946 (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
13947 ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
13948 ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
13949 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
13950 ||(e3dInputMode == E_XC_3D_INPUT_FRAME_ALTERNATIVE)
13951 ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D)
13952 #if (HW_DESIGN_3D_VER >= 2)
13953 ||(e3dInputMode == E_XC_3D_INPUT_FIELD_ALTERNATIVE)
13954 ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD)
13955 ||(e3dInputMode == E_XC_3D_INPUT_PIXEL_ALTERNATIVE)
13956 #endif
13957 )
13958 &&(e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE))
13959 #if (HW_2DTO3D_SUPPORT || (HW_DESIGN_3D_VER == 4))
13960 ||
13961 ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
13962 (e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE_HW))
13963 #endif
13964 ||
13965 //-------------------------------------------------------------------------------------------------
13966 /// top bottom output case
13967 //-------------------------------------------------------------------------------------------------
13968 (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
13969 ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
13970 ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
13971 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
13972 ||(e3dInputMode == E_XC_3D_INPUT_FRAME_ALTERNATIVE)
13973 ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D)
13974 #if (HW_DESIGN_3D_VER >= 2)
13975 ||(e3dInputMode == E_XC_3D_INPUT_FIELD_ALTERNATIVE)
13976 ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD)
13977 ||(e3dInputMode == E_XC_3D_INPUT_PIXEL_ALTERNATIVE)
13978 #endif
13979 #if (HW_DESIGN_3D_VER == 4)
13980 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_FULL)
13981 #endif
13982 )
13983 &&(e3dOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
13984 #if HW_2DTO3D_SUPPORT
13985 #if (HW_2DTO3D_VER >= 4)
13986 ||
13987 ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
13988 (e3dOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM_HW))
13989 #endif
13990 #endif
13991 ||
13992 //-------------------------------------------------------------------------------------------------
13993 /// side by side output case
13994 //-------------------------------------------------------------------------------------------------
13995 (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
13996 ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
13997 ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
13998 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
13999 ||(e3dInputMode == E_XC_3D_INPUT_FRAME_ALTERNATIVE)
14000 ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D)
14001 #if (HW_DESIGN_3D_VER >= 2)
14002 ||(e3dInputMode == E_XC_3D_INPUT_FIELD_ALTERNATIVE)
14003 ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD)
14004 ||(e3dInputMode == E_XC_3D_INPUT_PIXEL_ALTERNATIVE)
14005 #endif
14006 )
14007 &&(e3dOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF))
14008 #if HW_2DTO3D_SUPPORT
14009 #if (HW_2DTO3D_VER >= 4)
14010 ||
14011 ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
14012 (e3dOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF_HW))
14013 #endif
14014 #endif
14015 ||
14016 //-------------------------------------------------------------------------------------------------
14017 /// LL RR TT BB output case
14018 //-------------------------------------------------------------------------------------------------
14019 (((e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
14020 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
14021 )
14022 &&((e3dOutputMode == E_XC_3D_OUTPUT_TOP_TOP)
14023 ||(e3dOutputMode == E_XC_3D_OUTPUT_BOTTOM_BOTTOM)
14024 ||(e3dOutputMode == E_XC_3D_OUTPUT_LEFT_LEFT)
14025 ||(e3dOutputMode == E_XC_3D_OUTPUT_RIGHT_RIGHT)))
14026 ||
14027 //-------------------------------------------------------------------------------------------------
14028 /// framepacking output case
14029 //-------------------------------------------------------------------------------------------------
14030 (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
14031 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_FULL)
14032 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
14033 ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
14034 ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
14035 #if ( HW_SUPPORT_3D_CB_AND_PA == TRUE)
14036 ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD)
14037 ||(e3dInputMode == E_XC_3D_INPUT_PIXEL_ALTERNATIVE)
14038 #endif
14039 ||(e3dInputMode == E_XC_3D_INPUT_FRAME_ALTERNATIVE)
14040 ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW)
14041 ||(e3dInputMode == E_XC_3D_INPUT_NORMAL_2D)
14042 )
14043 &&(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_PACKING))
14044 #if HW_2DTO3D_SUPPORT
14045 #if (HW_2DTO3D_VER >= 4)
14046 ||
14047 ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
14048 (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_PACKING))
14049 #endif
14050 #endif
14051 ||
14052 //-------------------------------------------------------------------------------------------------
14053 /// 3d to 2d Lonly output case
14054 //-------------------------------------------------------------------------------------------------
14055 (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
14056 ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
14057 ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
14058 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
14059 ||(e3dInputMode == E_XC_3D_INPUT_FRAME_ALTERNATIVE)
14060 #if (HW_DESIGN_3D_VER >= 2)
14061 ||(e3dInputMode == E_XC_3D_INPUT_FIELD_ALTERNATIVE)
14062 ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD)
14063 ||(e3dInputMode == E_XC_3D_INPUT_PIXEL_ALTERNATIVE)
14064 #endif
14065 )
14066 &&(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_L))
14067 #if (HW_2DTO3D_SUPPORT || (HW_DESIGN_3D_VER == 4))
14068 ||
14069 ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
14070 (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_L_HW))
14071 #endif
14072 ||
14073 //-------------------------------------------------------------------------------------------------
14074 /// 3d to 2d Ronly output case
14075 //-------------------------------------------------------------------------------------------------
14076 (((e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
14077 ||(e3dInputMode == E_XC_3D_INPUT_LINE_ALTERNATIVE)
14078 ||(e3dInputMode == E_XC_3D_INPUT_TOP_BOTTOM)
14079 ||(e3dInputMode == E_XC_3D_INPUT_SIDE_BY_SIDE_HALF)
14080 ||(e3dInputMode == E_XC_3D_INPUT_FRAME_ALTERNATIVE)
14081 #if (HW_DESIGN_3D_VER >= 2)
14082 ||(e3dInputMode == E_XC_3D_INPUT_FIELD_ALTERNATIVE)
14083 ||(e3dInputMode == E_XC_3D_INPUT_CHECK_BORAD)
14084 ||(e3dInputMode == E_XC_3D_INPUT_PIXEL_ALTERNATIVE)
14085 #endif
14086 )
14087 &&(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_R))
14088 #if (HW_2DTO3D_SUPPORT || (HW_DESIGN_3D_VER == 4))
14089 ||
14090 ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
14091 (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_R_HW))
14092 #endif
14093 //-------------------------------------------------------------------------------------------------
14094 /// pixel alternative output case
14095 //-------------------------------------------------------------------------------------------------
14096 #if (HW_2DTO3D_SUPPORT || (HW_DESIGN_3D_VER == 4))
14097 ||
14098 ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
14099 (e3dOutputMode == E_XC_3D_OUTPUT_PIXEL_ALTERNATIVE_HW))
14100 #endif
14101 //-------------------------------------------------------------------------------------------------
14102 /// check board alternative output case
14103 //-------------------------------------------------------------------------------------------------
14104 #if (HW_2DTO3D_SUPPORT || (HW_DESIGN_3D_VER == 4))
14105 ||
14106 ((e3dInputMode == E_XC_3D_INPUT_NORMAL_2D_HW) &&
14107 (e3dOutputMode == E_XC_3D_OUTPUT_CHECKBOARD_HW))
14108 #endif
14109 //-------------------------------------------------------------------------------------------------
14110 /// 3d dual view
14111 //-------------------------------------------------------------------------------------------------
14112 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
14113 ||
14114 ((e3dInputMode == E_XC_3D_INPUT_MODE_NONE) &&
14115 ((e3dOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE)
14116 || (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
14117 || (e3dOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM)))
14118 #endif
14119 )
14120 {
14121 bRet = TRUE;
14122 }
14123 else
14124 {
14125 bRet = FALSE;
14126 }
14127 #else
14128 UNUSED(e3dInputMode);
14129 UNUSED(e3dOutputMode);
14130 #endif
14131 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "is3dformatsupported = %d ,e3dInputMode:%u;e3dOutputMode:%u\n",
14132 bRet,e3dInputMode, e3dOutputMode);
14133 return bRet;
14134 }
14135
MApi_XC_Is3DFormatSupported_U2(void * pInstance,E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode)14136 MS_BOOL MApi_XC_Is3DFormatSupported_U2(void* pInstance,
14137 E_XC_3D_INPUT_MODE e3dInputMode,
14138 E_XC_3D_OUTPUT_MODE e3dOutputMode)
14139 {
14140 MS_BOOL bReturn = FALSE;
14141 bReturn = MDrv_XC_Is3DFormatSupported(pInstance, e3dInputMode, e3dOutputMode);
14142
14143 return bReturn;
14144 }
14145
MApi_XC_Is3DFormatSupported(E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode)14146 MS_BOOL MApi_XC_Is3DFormatSupported(E_XC_3D_INPUT_MODE e3dInputMode,
14147 E_XC_3D_OUTPUT_MODE e3dOutputMode)
14148 {
14149 if (pu32XCInst == NULL)
14150 {
14151 printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
14152 return FALSE;
14153 }
14154
14155 stXC_CHECK_3D_FORMAT_SUPPORTED XCArgs;
14156 XCArgs.e3dInputMode = e3dInputMode;
14157 XCArgs.e3dOutputMode = e3dOutputMode;
14158 XCArgs.bReturnValue = FALSE;
14159
14160 if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_3D_FORMAT_SUPPORTED, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
14161 {
14162 printf("Obtain XC engine fail\n");
14163 return FALSE;
14164 }
14165 else
14166 {
14167 return XCArgs.bReturnValue;
14168 }
14169 }
14170
14171 #ifndef DISABLE_3D_FUNCTION
MDrv_SC_3D_GetFP_Info(void * pInstance,XC_InternalStatus * pSrcInfo,MS_U16 * pu16VactVideo,MS_U16 * pu16VactSpace,MS_BOOL bPreVscalingEna)14172 void MDrv_SC_3D_GetFP_Info(void *pInstance, XC_InternalStatus *pSrcInfo, MS_U16 *pu16VactVideo, MS_U16 *pu16VactSpace, MS_BOOL bPreVscalingEna)
14173 {
14174 if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
14175 {
14176 *pu16VactVideo = DOUBLEHD_1080X2P_FRAME_VSIZE;
14177 *pu16VactSpace = DOUBLEHD_1080X2P_GARBAGE_VSIZE;
14178 }
14179 else if(pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)
14180 {
14181 *pu16VactVideo = DOUBLEHD_720X2P_FRAME_VSIZE;
14182 *pu16VactSpace = DOUBLEHD_720X2P_GARBAGE_VSIZE;
14183 }
14184 else if(pSrcInfo->stCapWin.height == DOUBLEHD_576X2P_VSIZE)
14185 {
14186 *pu16VactVideo = DOUBLEHD_576X2P_FRAME_VSIZE;
14187 *pu16VactSpace = DOUBLEHD_576X2P_GARBAGE_VSIZE;
14188 }
14189 else if((pSrcInfo->stCapWin.height == DOUBLEHD_480X2P_VSIZE) && (pSrcInfo->stCapWin.width == DOUBLEHD_480X2P_HSIZE))
14190 {
14191 *pu16VactVideo = DOUBLEHD_480X2P_FRAME_VSIZE;
14192 *pu16VactSpace = DOUBLEHD_480X2P_GARBAGE_VSIZE;
14193 }
14194 else if((pSrcInfo->stCapWin.height == DOUBLEHD_640_480X2P_VSIZE) && (pSrcInfo->stCapWin.width== DOUBLEHD_640_480X2P_HSIZE))
14195 {
14196 *pu16VactVideo = DOUBLEHD_640_480X2P_FRAME_VSIZE;
14197 *pu16VactSpace = DOUBLEHD_640_480X2P_GARBAGE_VSIZE;
14198 }
14199 else if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
14200 {
14201 *pu16VactVideo = DOUBLEHD_1080X2I_FIELD_VSIZE;
14202 *pu16VactSpace = (DOUBLEHD_1080X2I_VACT_SPACE1*2+DOUBLEHD_1080X2I_VACT_SPACE2);
14203 }
14204 else if(pSrcInfo->stCapWin.height == FIELD_INTERLEAVE_1080X2I_VISZE)
14205 {
14206 *pu16VactVideo = FIELD_INTERLEAVE_1080X2I_FIELD_VISZE;
14207 *pu16VactSpace = FIELD_INTERLEAVE_1080X2I_VACT_SPACE;
14208 }
14209 else
14210 {
14211 printf("MDrv_SC_3D_GetFP_Info: it's not regular framepacking!\n");
14212 *pu16VactVideo = 0;
14213 *pu16VactSpace = 0;
14214 }
14215 //Because the u16VactSpace is took off first at BK2 <New design!!>
14216 #if ((HW_DESIGN_3D_VER < 3) || (HW_DESIGN_3D_VER == 4))
14217 if(bPreVscalingEna)
14218 {
14219 MS_U8 u8Ratio;
14220 if(pSrcInfo->stCapWin.height > pSrcInfo->u16V_SizeAfterPreScaling)//Avoid divide overflow
14221 {
14222 u8Ratio = pSrcInfo->stCapWin.height/pSrcInfo->u16V_SizeAfterPreScaling;
14223 *pu16VactVideo /= u8Ratio;
14224 *pu16VactSpace /= u8Ratio;
14225 }
14226 }
14227 #endif
14228 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "FP_Info: bPreVEna=%u, VactVideo=%u, VactSpace=%u, Vsrc=%u, Vdst=%u\n",
14229 bPreVscalingEna, *pu16VactVideo, *pu16VactSpace, pSrcInfo->stCapWin.height, pSrcInfo->u16V_SizeAfterPreScaling);
14230 }
14231
14232 #if (HW_DESIGN_3D_VER >= 2)
14233 // This function is used to calculate exact pre V scaling dst, to let u16VactSpace can be totally divided
MDrv_SC_3D_Adjust_FP_PreVerDstSize(void * pInstance,E_XC_3D_INPUT_MODE eInputMode,E_XC_3D_OUTPUT_MODE eOutputMode,XC_InternalStatus * pSrcInfo,MS_U16 * pu16ScaleDst,SCALER_WIN eWindow)14234 void MDrv_SC_3D_Adjust_FP_PreVerDstSize(void *pInstance, E_XC_3D_INPUT_MODE eInputMode,
14235 E_XC_3D_OUTPUT_MODE eOutputMode,
14236 XC_InternalStatus *pSrcInfo,
14237 MS_U16 *pu16ScaleDst,
14238 SCALER_WIN eWindow)
14239 {
14240 #define MAX_ACCEPTABLE_VRATIO 5 //Notes: 10 means scaling down to 1/5 of Vsrc
14241 MS_U16 u16VactVideo, u16VactSpace;
14242 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
14243 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
14244 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
14245 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
14246 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, FALSE);//Get the original frame packing V act info
14247 //A5: the u16VactSpace is took off first at BK2 <New design!!>
14248 #if (HW_DESIGN_3D_VER > 3)
14249
14250 if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)&&(pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)&&
14251 (eOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE))
14252 {
14253 if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_PELLICLE)
14254 ||(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_NONE))
14255 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x540;
14256 else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_SHUTTER)
14257 {
14258 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
14259 {
14260 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1920x540;
14261 }
14262 else
14263 {
14264 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out = E_XC_3D_OUTPUT_FI_1280x720;
14265 }
14266 }
14267 }
14268
14269 if(pSrcInfo->Status2.bPreVCusScaling == FALSE)
14270 {
14271 if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R())
14272 {
14273 *pu16ScaleDst = pSrcInfo->stDispWin.height/2;
14274 }
14275 else if(IS_OUTPUT_SIDE_BY_SIDE_HALF())
14276 {
14277 *pu16ScaleDst = pSrcInfo->stDispWin.height;
14278 }
14279 else if(IS_OUTPUT_FRAME_ALTERNATIVE())
14280 {
14281 if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)&&(pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE))
14282 {
14283
14284 if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_PELLICLE)
14285 ||(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_NONE))
14286 //FPI input, no prescaling down
14287 *pu16ScaleDst = pSrcInfo->stDispWin.height/2; // target for output 1920x540
14288 else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_SHUTTER)
14289 {
14290 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
14291 {
14292 *pu16ScaleDst = pSrcInfo->stDispWin.height/2;
14293 }
14294 else
14295 {
14296 *pu16ScaleDst = pSrcInfo->stDispWin.height;
14297 }
14298 }
14299 }
14300 else if ((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)&&(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE))
14301 {
14302 if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_SHUTTER)
14303 *pu16ScaleDst = pSrcInfo->stDispWin.height/2;
14304 else
14305 *pu16ScaleDst = pSrcInfo->stDispWin.height;
14306 }
14307 else
14308 {
14309 *pu16ScaleDst = pSrcInfo->stDispWin.height;
14310 }
14311 }
14312 else
14313 {
14314 //Default disable prescaling
14315 *pu16ScaleDst = pSrcInfo->stCapWin.height-u16VactSpace;
14316 }
14317 *pu16ScaleDst = *pu16ScaleDst & (~0x01);
14318 }
14319 else
14320 {
14321 *pu16ScaleDst = pSrcInfo->Status2.u16PreVCusScalingDst & (~0x01);
14322 }
14323 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "Adjust_FP_PreVerDstSize:bPreVCusScaling=%s, dst=%u, eOutputMode=%u\n",
14324 (pSrcInfo->Status2.bPreVCusScaling?"Yes":"No"),*pu16ScaleDst, eOutputMode);
14325 #elif (HW_DESIGN_3D_VER < 3)
14326 MS_U8 i = 0;
14327
14328 if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
14329 {
14330 //FPI input, no prescaling down
14331 *pu16ScaleDst = pSrcInfo->stCapWin.height;
14332 return;
14333 }
14334 else if(pSrcInfo->Status2.bPreVCusScaling == TRUE)
14335 {
14336 //check if can use AP assigned pre V Customer scaling
14337 if((pSrcInfo->Status2.u16PreVCusScalingSrc % pSrcInfo->Status2.u16PreVCusScalingDst) == 0)
14338 {
14339 i = pSrcInfo->Status2.u16PreVCusScalingSrc/pSrcInfo->Status2.u16PreVCusScalingDst;
14340 if((u16VactSpace%i) == 0)
14341 {
14342 //Vact space can be divided with no remainder, so this customer pre V scaling is ok.
14343 return;
14344 }
14345 }
14346 }
14347
14348 for(i=1; i<=MAX_ACCEPTABLE_VRATIO; i++)
14349 {
14350 if((u16VactSpace%i) != 0)
14351 {
14352 // The u16VactSpace must be divisible by the prescaling ratio
14353 continue;
14354 }
14355 if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R())
14356 {
14357 if((pSrcInfo->stCapWin.height-u16VactSpace)/i <= pSrcInfo->stDispWin.height)
14358 {
14359 *pu16ScaleDst = pSrcInfo->stCapWin.height/i;
14360 break;
14361 }
14362 else
14363 {
14364 continue;
14365 }
14366 }
14367 else if(IS_OUTPUT_SIDE_BY_SIDE_HALF())
14368 {
14369 if((pSrcInfo->stCapWin.height-u16VactSpace)/2/i <= pSrcInfo->stDispWin.height)
14370 {
14371 *pu16ScaleDst = pSrcInfo->stCapWin.height/i;
14372 break;
14373 }
14374 else
14375 {
14376 continue;
14377 }
14378 }
14379 else if(IS_OUTPUT_FRAME_ALTERNATIVE())
14380 {
14381 if((pSrcInfo->stCapWin.height-u16VactSpace)/2/i <= pSrcInfo->stDispWin.height)
14382 {
14383 *pu16ScaleDst = pSrcInfo->stCapWin.height/i;
14384 break;
14385 }
14386 else
14387 {
14388 continue;
14389 }
14390 }
14391 else
14392 {
14393 //Default disable prescaling
14394 *pu16ScaleDst = pSrcInfo->stCapWin.height;
14395 break;
14396 }
14397 }
14398 if(i > MAX_ACCEPTABLE_VRATIO)
14399 {
14400 *pu16ScaleDst = pSrcInfo->stCapWin.height; //Disable prescaling
14401 }
14402 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "Adjust_FP_PreVerDstSize:i=%u, dst=%u, eOutputMode=%u\n",
14403 i, *pu16ScaleDst, eOutputMode);
14404 #else
14405 if(pSrcInfo->Status2.bPreVCusScaling == FALSE)
14406 {
14407 if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R())
14408 {
14409 *pu16ScaleDst = pSrcInfo->stDispWin.height;
14410 }
14411 else if(IS_OUTPUT_SIDE_BY_SIDE_HALF() || (IS_OUTPUT_FRAME_ALTERNATIVE()))
14412 {
14413 *pu16ScaleDst = pSrcInfo->stDispWin.height<<1;
14414 }
14415 else
14416 {
14417 //Default disable prescaling
14418 *pu16ScaleDst = pSrcInfo->stCapWin.height-u16VactSpace;
14419 }
14420 *pu16ScaleDst = *pu16ScaleDst & (~0x01);
14421 }
14422 else
14423 {
14424 if(pSrcInfo->Status2.u16PreVCusScalingDst & BIT(0))
14425 {
14426 *pu16ScaleDst = pSrcInfo->Status2.u16PreVCusScalingDst & (~0x01);
14427 }
14428 else
14429 {
14430 *pu16ScaleDst = pSrcInfo->Status2.u16PreVCusScalingDst;
14431 }
14432 }
14433 #endif
14434 }
14435
MDrv_SC_3D_Adjust_PreScaling(void * pInstance,E_XC_3D_INPUT_MODE eInputMode,E_XC_3D_OUTPUT_MODE eOutputMode,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)14436 void MDrv_SC_3D_Adjust_PreScaling(void *pInstance, E_XC_3D_INPUT_MODE eInputMode,
14437 E_XC_3D_OUTPUT_MODE eOutputMode,
14438 XC_InternalStatus *pSrcInfo,
14439 SCALER_WIN eWindow)
14440 {
14441 MS_BOOL b3DPreVScaling=FALSE, b3DPreHScaling=FALSE;
14442 MS_U32 u32H_PreScalingRatio, u32V_PreScalingRatio, u32TempWidth;
14443 MS_BOOL bForcePreVScalingDown = FALSE;
14444 MS_BOOL bForcePreHScalingDown = FALSE;
14445 MS_U8 u8FrameNum = 0;
14446 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
14447 MS_U16 u16PreHCusScalingDstAlign = 0;
14448 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
14449 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
14450 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
14451 #if (HW_DESIGN_3D_VER != 4)
14452 if(IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R())
14453 {
14454 //for best quality, don't do prescaling when not necessary
14455 if(pSrcInfo->Status2.bPreVCusScaling == FALSE)
14456 {
14457 b3DPreVScaling=TRUE;
14458 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14459 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height;
14460 }
14461
14462 if(pSrcInfo->Status2.bPreHCusScaling == FALSE)
14463 {
14464 b3DPreHScaling=TRUE;
14465 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14466 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14467 }
14468 }
14469 #endif
14470
14471 if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow))
14472 {
14473 if(IS_OUTPUT_TOP_BOTTOM())
14474 {
14475 if(pSrcInfo->bInterlace)
14476 {
14477 if(pSrcInfo->Status2.bPreVCusScaling == FALSE)
14478 {
14479 b3DPreVScaling=TRUE;
14480 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14481 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height;
14482 }
14483 }
14484 else
14485 {
14486 if(pSrcInfo->Status2.bPreVCusScaling == FALSE)
14487 {
14488 b3DPreVScaling=TRUE;
14489 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14490 #if(HW_DESIGN_3D_VER == 5) //monaco mode
14491 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14492 #else
14493 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14494 #endif
14495 }
14496 }
14497 }
14498 #ifdef FA_1920X540_OUTPUT
14499 else if(IS_OUTPUT_FRAME_ALTERNATIVE()&&(!pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC))
14500 {
14501 b3DPreHScaling=TRUE;
14502 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14503 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14504
14505 b3DPreVScaling=TRUE;
14506 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14507 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height/2;
14508 }
14509 #endif
14510 else if(IS_OUTPUT_FRAME_PACKING())
14511 {
14512 b3DPreHScaling = TRUE;
14513 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14514 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14515
14516 b3DPreVScaling=TRUE;
14517 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14518 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height;
14519 }
14520 }
14521 else if(IS_OUTPUT_SIDE_BY_SIDE_HALF()
14522 && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ))
14523 {
14524 b3DPreHScaling=TRUE;
14525 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14526 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14527
14528 b3DPreVScaling=TRUE;
14529 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14530 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14531 }
14532 else if(IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
14533 {
14534 b3DPreHScaling=TRUE;
14535 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width/2;
14536 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->Status2.u16PreHCusScalingSrc;
14537
14538 b3DPreVScaling=TRUE;
14539 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14540 }
14541 else if(IS_INPUT_FRAME_PACKING(eWindow))
14542 {
14543 MS_U16 u16VactVideo, u16VactSpace, u16ScaleDst = 0xFFFF;
14544 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, FALSE);//Get the original frame packing V act info
14545 MDrv_SC_3D_Adjust_FP_PreVerDstSize(pInstance, eInputMode, eOutputMode, pSrcInfo, &u16ScaleDst, eWindow);//calculate exact pre V scaling dst, to let u16VactSpace can be totally divided
14546
14547 if(pSrcInfo->Status2.bPreHCusScaling == FALSE)
14548 {
14549 if(IS_OUTPUT_SIDE_BY_SIDE_HALF() && (pSrcInfo->Status2.u16PreHCusScalingDst > pSrcInfo->stDispWin.width/2))
14550 {
14551 b3DPreHScaling=TRUE;
14552 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14553 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14554 }
14555 }
14556
14557 if(u16ScaleDst != 0xFFFF)
14558 {
14559 #if (HW_DESIGN_3D_VER == 4)
14560 if(1)//((g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_PELLICLE)||(g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_NONE))
14561 {
14562 if((pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)&&
14563 (eOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE))
14564 {
14565 b3DPreVScaling=TRUE;
14566 pSrcInfo->Status2.u16PreVCusScalingSrc = u16VactVideo; //pSrcInfo->stCapWin.height - u16VactSpace;
14567 pSrcInfo->Status2.u16PreVCusScalingDst = u16ScaleDst;
14568 }
14569 else if((pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)&&
14570 (eOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
14571 {
14572 b3DPreVScaling=TRUE;
14573 pSrcInfo->Status2.u16PreVCusScalingSrc = u16VactVideo; //pSrcInfo->stCapWin.height - u16VactSpace;
14574 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14575 }
14576 else if((pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)&&
14577 (eOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF))
14578 {
14579 b3DPreVScaling=TRUE;
14580 pSrcInfo->Status2.u16PreVCusScalingSrc = u16VactVideo; //pSrcInfo->stCapWin.height - u16VactSpace;
14581 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height;
14582 }
14583 #ifdef TBP_1920X2160_OUTPUT
14584 else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)&&
14585 (eOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
14586 {
14587 b3DPreVScaling=TRUE;
14588 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14589 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height - u16VactSpace;
14590 }
14591 else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)&&
14592 (eOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
14593 {
14594 b3DPreVScaling=TRUE;
14595 pSrcInfo->Status2.u16PreVCusScalingSrc = (pSrcInfo->stCapWin.height - u16VactSpace);
14596 pSrcInfo->Status2.u16PreVCusScalingDst = (pSrcInfo->stCapWin.height - u16VactSpace);
14597 }
14598 else
14599 {
14600 b3DPreVScaling=TRUE;
14601 //pSrcInfo->Status2.u16PreVCusScalingSrc = u16ScaleDst;
14602 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14603 }
14604 #else
14605 else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)&&
14606 ((eOutputMode == E_XC_3D_OUTPUT_FRAME_L)||(eOutputMode == E_XC_3D_OUTPUT_FRAME_R)))
14607 {
14608 b3DPreVScaling=TRUE;
14609 pSrcInfo->Status2.u16PreVCusScalingSrc = (pSrcInfo->stCapWin.height - u16VactSpace);
14610 pSrcInfo->Status2.u16PreVCusScalingDst = (pSrcInfo->stCapWin.height - u16VactSpace)/2;
14611 }
14612 else if((pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)&&
14613 ((eOutputMode == E_XC_3D_OUTPUT_FRAME_L)||(eOutputMode == E_XC_3D_OUTPUT_FRAME_R)))
14614 {
14615 b3DPreVScaling=TRUE;
14616 pSrcInfo->Status2.u16PreVCusScalingSrc = (pSrcInfo->stCapWin.height - u16VactSpace);
14617 pSrcInfo->Status2.u16PreVCusScalingDst = (pSrcInfo->stCapWin.height - u16VactSpace);
14618 }
14619 else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)&&
14620 ((eOutputMode == E_XC_3D_OUTPUT_FRAME_L)||(eOutputMode == E_XC_3D_OUTPUT_FRAME_R)))
14621 {
14622 b3DPreVScaling=TRUE;
14623 pSrcInfo->Status2.u16PreVCusScalingSrc = (pSrcInfo->stCapWin.height - u16VactSpace);
14624 pSrcInfo->Status2.u16PreVCusScalingDst = (pSrcInfo->stCapWin.height - u16VactSpace)/2;
14625 }
14626 else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)&&
14627 (eOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF))
14628 {
14629 b3DPreVScaling = TRUE;
14630 pSrcInfo->Status2.u16PreVCusScalingSrc = (pSrcInfo->stCapWin.height - u16VactSpace);
14631 pSrcInfo->Status2.u16PreVCusScalingDst = (pSrcInfo->stCapWin.height - u16VactSpace);
14632 }
14633 else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)&&
14634 (eOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE))
14635 {
14636 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
14637 {
14638 b3DPreVScaling=TRUE;
14639 pSrcInfo->Status2.u16PreVCusScalingSrc = u16VactVideo;//pSrcInfo->stCapWin.height - u16VactSpace;
14640 pSrcInfo->Status2.u16PreVCusScalingDst = u16VactVideo/2;
14641 }
14642 else
14643 {
14644 b3DPreVScaling=TRUE;
14645 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14646 pSrcInfo->Status2.u16PreVCusScalingDst = u16VactVideo;
14647 }
14648 }
14649 else
14650 {
14651 b3DPreVScaling=TRUE;
14652 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14653 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14654 }
14655 #endif
14656 }
14657 else
14658 {
14659 if(eOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
14660 {
14661 if(pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)
14662 {
14663 b3DPreVScaling=TRUE;
14664 pSrcInfo->Status2.u16PreVCusScalingSrc = u16VactVideo;
14665 pSrcInfo->Status2.u16PreVCusScalingDst = u16VactVideo;
14666 }
14667 else if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
14668 {
14669 b3DPreVScaling=TRUE;
14670 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14671 pSrcInfo->Status2.u16PreVCusScalingDst = u16VactVideo;
14672 printf("SG FPP-FA 2205\n");
14673 }
14674 }
14675 }
14676 #elif (HW_DESIGN_3D_VER > 2)
14677 b3DPreVScaling = TRUE;
14678
14679 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14680 //don't do v prescaling
14681 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14682 if(IS_INPUT_FRAME_PACKING(eWindow))
14683 {
14684 if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
14685 && (eOutputMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE))
14686 {
14687
14688 b3DPreHScaling=TRUE;
14689 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14690 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14691
14692 b3DPreVScaling = TRUE;
14693 pSrcInfo->Status2.u16PreVCusScalingSrc = (pSrcInfo->stCapWin.height - u16VactSpace);
14694 pSrcInfo->Status2.u16PreVCusScalingDst = (pSrcInfo->stCapWin.height - u16VactSpace);
14695 }
14696 }
14697 #else
14698 b3DPreVScaling=TRUE;
14699
14700 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14701 //don't do v prescaling
14702 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14703 #endif
14704 }
14705 }
14706 else if(IS_INPUT_TOP_BOTTOM(eWindow) || IS_INPUT_LINE_ALTERNATIVE(eWindow))
14707 {
14708 if(pSrcInfo->Status2.bPreHCusScaling == FALSE)
14709 {
14710 if((IS_OUTPUT_SIDE_BY_SIDE_HALF())
14711 ||(IS_INPUT_LINE_ALTERNATIVE(eWindow)
14712 && ((pSrcInfo->stCapWin.height >= 1440)
14713 ||((pSrcInfo->stCapWin.width >= 3840) && (pSrcInfo->stCapWin.height >= 1080)))))
14714 {
14715 b3DPreHScaling=TRUE;
14716 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14717 #if(HW_DESIGN_3D_VER == 5) //monaco mode
14718 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->Status2.u16PreHCusScalingSrc;
14719 #else
14720 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14721 #endif
14722 }
14723 else if (IS_OUTPUT_FRAME_PACKING())
14724 {
14725 b3DPreHScaling = TRUE;
14726 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14727 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14728 }
14729 }
14730 // for better quality src don't use pr scaling down, but post scaling
14731 if(IS_INPUT_LINE_ALTERNATIVE(eWindow))
14732 {
14733 b3DPreVScaling=TRUE;
14734 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14735 }
14736 else if(IS_INPUT_TOP_BOTTOM(eWindow)
14737 && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ))
14738 {
14739 b3DPreHScaling=TRUE;
14740 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14741 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14742
14743 b3DPreVScaling = TRUE;
14744 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14745 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height;
14746 }
14747 }
14748 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
14749 {
14750 if(pSrcInfo->Status2.bPreHCusScaling == FALSE)
14751 {
14752 if(IS_OUTPUT_SIDE_BY_SIDE_HALF())
14753 {
14754 b3DPreHScaling=TRUE;
14755 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14756 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14757 }
14758 else if(IS_OUTPUT_TOP_BOTTOM())
14759 {
14760 b3DPreVScaling=TRUE;
14761 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14762 if(pSrcInfo->stCapWin.height <= pSrcInfo->stDispWin.height/2)
14763 {
14764 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height;
14765 }
14766 else
14767 {
14768 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14769 }
14770 }
14771 else if(IS_OUTPUT_LINE_ALTERNATIVE())
14772 {
14773 if(pSrcInfo->stCapWin.height > pSrcInfo->stDispWin.height)
14774 {
14775 b3DPreVScaling=TRUE;
14776 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14777 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height;
14778 }
14779 }
14780 }
14781 }
14782 else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow))
14783 {
14784 MS_U16 u16VactVideo, u16VactSpace;
14785 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, FALSE);//Get the original frame packing V act info
14786 #if (HW_DESIGN_3D_VER >= 4)
14787 if(IS_OUTPUT_FRAME_ALTERNATIVE())
14788 {
14789 b3DPreVScaling=TRUE;
14790 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14791 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height;
14792 }
14793 else if(IS_OUTPUT_TOP_BOTTOM())
14794 {
14795 b3DPreVScaling=TRUE;
14796 pSrcInfo->Status2.u16PreVCusScalingSrc = (pSrcInfo->stCapWin.height - u16VactSpace)/2;
14797 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14798 }
14799 #elif (HW_DESIGN_3D_VER >= 3)
14800 b3DPreHScaling=TRUE;
14801 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14802 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->Status2.u16PreHCusScalingSrc;
14803
14804 b3DPreVScaling=TRUE;
14805 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height - u16VactSpace;
14806 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14807 #elif (HW_DESIGN_3D_VER >= 2)
14808 b3DPreHScaling=TRUE;
14809 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14810 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->Status2.u16PreHCusScalingSrc;
14811
14812 b3DPreVScaling=TRUE;
14813 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14814 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14815 #endif
14816 }
14817 else if(IS_INPUT_CHECK_BOARD(eWindow) || IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
14818 {
14819 if(IS_OUTPUT_TOP_BOTTOM())
14820 {
14821 b3DPreHScaling=TRUE;
14822 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14823 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->Status2.u16PreHCusScalingSrc;
14824
14825 b3DPreVScaling=TRUE;
14826 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14827 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14828 }
14829 else if(IS_OUTPUT_LINE_ALTERNATIVE())
14830 {
14831 b3DPreHScaling=TRUE;
14832 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14833 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->Status2.u16PreHCusScalingSrc;
14834
14835 b3DPreVScaling=TRUE;
14836 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14837 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14838 }
14839 else if(IS_OUTPUT_SIDE_BY_SIDE_HALF())
14840 {
14841 b3DPreHScaling=TRUE;
14842 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14843 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->Status2.u16PreHCusScalingSrc;
14844
14845 b3DPreVScaling=TRUE;
14846 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14847 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingSrc;
14848 }
14849 }
14850 else if(IS_INPUT_NORMAL_2D(eWindow))
14851 {
14852 b3DPreHScaling=TRUE;
14853 b3DPreVScaling=TRUE;
14854 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14855 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14856
14857 if (IS_OUTPUT_SIDE_BY_SIDE_HALF())
14858 {
14859 if (pSrcInfo->stCapWin.width <= pSrcInfo->stDispWin.width/2)
14860 {
14861 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14862 }
14863 else
14864 {
14865 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14866 }
14867 }
14868 else
14869 {
14870 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14871 if(pSrcInfo->stCapWin.height <= pSrcInfo->stDispWin.height/2)
14872 {
14873 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height;
14874 }
14875 else
14876 {
14877 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14878 }
14879 }
14880 }
14881 else if(IS_INPUT_NORMAL_2D_HW(eWindow))
14882 {
14883 b3DPreHScaling = TRUE;
14884 b3DPreVScaling = TRUE;
14885 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14886 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14887
14888 if (IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
14889 {
14890 if (pSrcInfo->stCapWin.width <= pSrcInfo->stDispWin.width/2)
14891 {
14892 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14893 }
14894 else
14895 {
14896 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14897 }
14898 }
14899 else
14900 {
14901 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stDispWin.width/2;
14902 if(pSrcInfo->stCapWin.height <= pSrcInfo->stDispWin.height/2)
14903 {
14904 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height;
14905 }
14906 else
14907 {
14908 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stDispWin.height/2;
14909 }
14910 }
14911 }
14912 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
14913 else if(IS_INPUT_MODE_NONE(eWindow))
14914 {
14915 if(Hal_SC_3D_IsDualViewMode(pInstance, eWindow))
14916 {
14917 b3DPreHScaling=TRUE;
14918 b3DPreVScaling=TRUE;
14919 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14920 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14921 if(pSrcInfo->stCapWin.width > MS_3D_LINE_BFF_MAX)//line buffer limit for main and sub use same sc0 line buffer under dual view
14922 {
14923 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "[Dual View] Do PreHCusScaling for UHD input\n");
14924 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width/2; //1920;
14925 }
14926 else
14927 {
14928 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->stCapWin.width;
14929 }
14930 if(pSrcInfo->stCapWin.height > XC_FHD_HIGH_MAX)//dual view main and sub height should equal 1k into frc
14931 {
14932 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "[Dual View] Do PreVCusScaling for UHD input\n");
14933 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height/2; //1080;
14934 }
14935 else
14936 {
14937 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->stCapWin.height;
14938 }
14939 }
14940 }
14941 #endif
14942
14943 if(MDrv_SC_GetPQHSDFlag(pInstance) == TRUE)
14944 {
14945 b3DPreHScaling = FALSE;
14946 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14947 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->u16H_SizeAfterPreScaling;
14948 }
14949
14950 //For double HD topbottom, like 1920x2160, 1280x1440
14951 if((IS_INPUT_TOP_BOTTOM(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE()) && (pSrcInfo->stCapWin.height >= 1440))
14952 {
14953 b3DPreVScaling = FALSE;
14954 pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
14955 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->u16V_SizeAfterPreScaling;
14956 }
14957
14958 //handle 3d with small display window,just roughly check
14959 Hal_XC_IsForcePrescaling_3D(pInstance, pSrcInfo, &bForcePreVScalingDown, &bForcePreHScalingDown, eWindow);
14960
14961 //special case:1080i/1080p frame packing have fclk issue
14962 Hal_SC_3D_Adjust_PreHVscaling_SaveBW(pInstance, pSrcInfo, &b3DPreHScaling,&b3DPreVScaling,bForcePreHScalingDown,bForcePreVScalingDown,eWindow);
14963
14964 u16PreHCusScalingDstAlign = (pSrcInfo->Status2.u16PreHCusScalingDst + OFFSET_PIXEL_ALIGNMENT - 1) & ~(OFFSET_PIXEL_ALIGNMENT-1);
14965
14966 //(1)protect HCusscaling size according to the line buffer
14967 if(!(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
14968 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
14969 || IS_INPUT_NORMAL_2D_HW(eWindow)
14970 || IS_INPUT_CHECK_BOARD(eWindow)
14971 || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
14972 || IS_OUTPUT_FRAME_ALTERNATIVE()
14973 #if (HW_DESIGN_3D_VER >= 4)
14974 || IS_OUTPUT_TOP_BOTTOM()
14975 #endif
14976 || MDrv_SC_3D_Is2TapModeSupportedFormat(pInstance, pSrcInfo, eWindow)
14977 )
14978 ||(IS_INPUT_FRAME_ALTERNATIVE(eWindow)&&IS_OUTPUT_TOP_BOTTOM())
14979 ||(IS_INPUT_NORMAL_2D_HW(eWindow)&&IS_OUTPUT_TOP_BOTTOM_HW())
14980 ||(IS_INPUT_NORMAL_2D_HW(eWindow)&&IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
14981 )
14982 {
14983 //These foramts will use subwindow, need check if the linebuff is enough
14984 //MS_3D_LINE_BFF_MAX is DI line buffer max
14985 if(u16PreHCusScalingDstAlign > MS_3D_LINE_BFF_MAX)
14986 {
14987 b3DPreHScaling=TRUE;
14988 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
14989 pSrcInfo->Status2.u16PreHCusScalingDst = MS_3D_LINE_BFF_MAX;
14990 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "For output line buffer limit => H :PreHScaling=%s, src=%u, dst=%u\n",
14991 (b3DPreHScaling?"Yes":"No"), pSrcInfo->Status2.u16PreHCusScalingSrc, pSrcInfo->Status2.u16PreHCusScalingDst);
14992
14993 }
14994 }
14995
14996 //(2)Below will check: if FB is enough or not
14997 if(IS_INPUT_FRAME_ALTERNATIVE(eWindow) &&
14998 (!pSrcInfo->bInterlace))
14999 {
15000 #if (HW_DESIGN_3D_VER == 5)//monaco/muji mode
15001 u8FrameNum = MDrv_XC_TransFrameNumToFactor(pInstance, gSrcInfo[eWindow].Status2.eFRCMFrameStoreNumber, gSrcInfo[eWindow].bLinearMode, _FIELD_PACKING_MODE_SUPPORTED);
15002 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
15003 u8FrameNum,
15004 pSrcInfo->Status2.u16PreVCusScalingDst);
15005 // for input fi, memory store double piece data
15006 if((u16PreHCusScalingDstAlign*2 > u32TempWidth)&&(u32TempWidth!=0))
15007 {
15008 b3DPreHScaling=TRUE;
15009 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
15010 pSrcInfo->Status2.u16PreHCusScalingDst = (u32TempWidth/2) & ~(OFFSET_PIXEL_ALIGNMENT - 1);
15011 }
15012 #elif (HW_DESIGN_3D_VER > 2)
15013 u8FrameNum = MDrv_XC_TransFrameNumToFactor(pInstance, gSrcInfo[eWindow].Status2.eFrameStoreNumber, gSrcInfo[eWindow].bLinearMode, _FIELD_PACKING_MODE_SUPPORTED);
15014 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
15015 u8FrameNum,
15016 pSrcInfo->Status2.u16PreVCusScalingDst);
15017 // for input fi, memory store double piece data
15018 if((u16PreHCusScalingDstAlign*2 > u32TempWidth)&&(u32TempWidth!=0))
15019 {
15020 b3DPreHScaling=TRUE;
15021 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
15022 pSrcInfo->Status2.u16PreHCusScalingDst = (u32TempWidth/2) & ~(OFFSET_PIXEL_ALIGNMENT - 1);
15023 }
15024 #else
15025 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
15026 4 /* 4 frame mode */,
15027 pSrcInfo->Status2.u16PreVCusScalingDst);
15028 // for memory reason, need support 4 frame mode
15029 if((u16PreHCusScalingDstAlign > u32TempWidth)&&(u32TempWidth!=0))
15030 {
15031 b3DPreHScaling=TRUE;
15032 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
15033 pSrcInfo->Status2.u16PreHCusScalingDst = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT - 1);
15034 }
15035 #endif
15036 }
15037 else
15038 {
15039 MS_U8 u8FrameNum = 0;
15040 if(IS_INPUT_FRAME_PACKING(eWindow) && (gSrcInfo[eWindow].stCapWin.height == DOUBLEHD_1080X2I_VSIZE))
15041 {
15042 u8FrameNum = 4;//need 4 frame,pls check MDrv_SC_3D_Adjust_FrameNum
15043 }
15044 #ifdef TBP_1920X2160_OUTPUT
15045 #if (HW_DESIGN_3D_VER > 2)
15046 else if((!pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)
15047 && (gSrcInfo[MAIN_WINDOW].stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
15048 && (MDrv_XC_Get_3D_Input_Mode(pInstance, MAIN_WINDOW) == E_XC_3D_INPUT_FRAME_PACKING)
15049 && (MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_TOP_BOTTOM))
15050 {
15051 u8FrameNum = 4;//need 4 frame,pls check MDrv_SC_3D_Adjust_FrameNum
15052 }
15053 #endif
15054 #endif
15055 else
15056 {
15057 u8FrameNum = 2;
15058 if(IS_INPUT_NORMAL_2D(eWindow))
15059 {
15060 u8FrameNum = 3;
15061 }
15062 }
15063
15064 u32TempWidth = MDrv_XC_GetAvailableSize(pInstance, MAIN_WINDOW,
15065 u8FrameNum,
15066 pSrcInfo->Status2.u16PreVCusScalingDst);
15067 if((u16PreHCusScalingDstAlign > u32TempWidth)&&(u32TempWidth!=0))
15068 {
15069 b3DPreHScaling=TRUE;
15070 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
15071 pSrcInfo->Status2.u16PreHCusScalingDst = u32TempWidth & ~(OFFSET_PIXEL_ALIGNMENT -1);
15072 }
15073 }
15074
15075 //(3)alignment check
15076 if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
15077 || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow)
15078 || IS_INPUT_CHECK_BOARD(eWindow)
15079 || IS_INPUT_PIXEL_ALTERNATIVE(eWindow)
15080 )
15081 {
15082 //For SBS input, should make sure the Hsize/2 is even to avoid the color mismatch issue in 422 mode
15083 if(pSrcInfo->Status2.u16PreHCusScalingDst & (BIT(1)))
15084 {
15085 b3DPreVScaling=TRUE;
15086 pSrcInfo->Status2.u16PreHCusScalingDst = (pSrcInfo->Status2.u16PreHCusScalingDst>>2)<<2;
15087 }
15088 }
15089
15090 if(IS_INPUT_TOP_BOTTOM(eWindow) || IS_INPUT_LINE_ALTERNATIVE(eWindow))
15091 {
15092 //For TPB/LAP input, should make sure the Vsize is even
15093 if(pSrcInfo->Status2.u16PreVCusScalingDst & BIT(0))
15094 {
15095 b3DPreVScaling=TRUE;
15096 pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->Status2.u16PreVCusScalingDst & ~0x01;
15097 }
15098 }
15099
15100 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreScaling for H :PreHScaling=%s, src=%u, dst=%u\n",
15101 (b3DPreHScaling?"Yes":"No"), pSrcInfo->Status2.u16PreHCusScalingSrc, pSrcInfo->Status2.u16PreHCusScalingDst);
15102
15103 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MDrv_SC_3D_Adjust_PreScaling for V :PreVScaling=%s, src=%u, dst=%u\n",
15104 (b3DPreVScaling?"Yes":"No"), pSrcInfo->Status2.u16PreVCusScalingSrc, pSrcInfo->Status2.u16PreVCusScalingDst);
15105
15106 if(b3DPreVScaling || b3DPreHScaling)
15107 {
15108 if(b3DPreHScaling && MDrv_SC_GetPQHSDFlag(pInstance))
15109 {
15110 MDrv_SC_SetPQHSDFlag(pInstance, FALSE);//Scaling is changed, ignore PQ setting
15111 }
15112 pSrcInfo->Status2.bPreHCusScaling = TRUE;//If enable, then need Enable customer scaling both
15113 pSrcInfo->Status2.bPreVCusScaling = TRUE;
15114
15115 // this _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
15116 // and _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
15117 // are unavoidable case under current scaler architecture
15118 // please be awared and do not remove these two unless
15119 // refactor the archiecture
15120 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
15121 MDrv_SC_set_prescaling_ratio(pInstance, pSrcInfo->enInputSourceType, pSrcInfo, eWindow);
15122 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
15123 _XC_ENTRY(pInstance);
15124 if(!pSrcInfo->bPreV_ScalingDown)
15125 {
15126 Hal_SC_set_ficlk(pInstance, FALSE, eWindow );
15127 }
15128 u32H_PreScalingRatio = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_04_L) & 0x40000000;
15129 u32H_PreScalingRatio |= (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PreScalingRatio & ~0x40000000);
15130 u32V_PreScalingRatio = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_08_L) & 0x40000000;
15131 u32V_PreScalingRatio |= (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & ~0x40000000);
15132 if ( pSrcInfo->bPreV_ScalingDown )
15133 {
15134 Hal_SC_set_ficlk(pInstance, TRUE, eWindow );
15135 }
15136
15137 if (eWindow == MAIN_WINDOW)
15138 {
15139 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_04_L, u32H_PreScalingRatio); // H pre-scaling
15140 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_08_L, u32V_PreScalingRatio); // V pre-scaling
15141 }
15142 else // SUB_WINDOW
15143 {
15144 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK04_04_L, u32H_PreScalingRatio); // H pre-scaling
15145 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK04_08_L, u32V_PreScalingRatio); // V pre-scaling
15146 }
15147 _XC_RETURN(pInstance);
15148 }
15149 }
15150
MDrv_SC_3D_Adjust_PstScaling(void * pInstance,E_XC_3D_INPUT_MODE eInputMode,E_XC_3D_OUTPUT_MODE eOutputMode,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)15151 void MDrv_SC_3D_Adjust_PstScaling(void *pInstance, E_XC_3D_INPUT_MODE eInputMode,
15152 E_XC_3D_OUTPUT_MODE eOutputMode,
15153 XC_InternalStatus *pSrcInfo,
15154 SCALER_WIN eWindow)
15155 {
15156 MS_U16 u16VactVideo=0, u16VactSpace=0;
15157 MS_BOOL b3DPstVScaling=FALSE, b3DPstHScaling=FALSE;
15158 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
15159 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
15160 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
15161 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
15162
15163 if(IS_INPUT_FRAME_PACKING(eWindow))
15164 {
15165 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31);
15166 }
15167
15168 if(IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_TOP_BOTTOM() ||
15169 IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R())
15170 {
15171 if(IS_INPUT_FRAME_PACKING(eWindow))
15172 {
15173 b3DPstVScaling=TRUE;
15174 b3DPstHScaling=TRUE;
15175
15176 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15177 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15178
15179 #if (HW_DESIGN_3D_VER >= 3)
15180 #ifdef TBP_1920X2160_OUTPUT
15181 if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)
15182 {
15183 pSrcInfo->u16VCusScalingSrc = u16VactVideo;//pSrcInfo->ScaledCropWin.height;
15184 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15185 }
15186 else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)&&
15187 (eOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
15188 {
15189 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/2;;
15190 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15191 }
15192 #else
15193 if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)&&
15194 (eOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
15195 {
15196 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/2;
15197 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15198 }
15199 else if((pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)&&
15200 (eOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
15201 {
15202 #if (HW_DESIGN_3D_VER == 4)
15203 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height);
15204 #else
15205 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/2;
15206 #endif
15207 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15208 }
15209 else if((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)&&
15210 (eOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM))
15211 {
15212 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/2;
15213 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15214 }
15215 else if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE &&
15216 (IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R()))
15217 {
15218 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/2;
15219 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15220 }
15221 else if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE &&
15222 (IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R()))
15223 {
15224 #if 0
15225 pSrcInfo->u16VCusScalingSrc = u16VactVideo*2;
15226 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15227 #else
15228 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/4;
15229 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/4;
15230 #endif
15231 }
15232 else if(pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE &&
15233 (IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R()))
15234 {
15235 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/2;
15236 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15237 }
15238 else
15239 {
15240 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height)/2;
15241 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15242 }
15243 #endif
15244 #else
15245 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height-u16VactSpace)/2;
15246 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15247 #endif
15248 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "##u16V_SizeAfterPreScaling_%d, u16VCusScalingSrc=%d\n", pSrcInfo->u16V_SizeAfterPreScaling, pSrcInfo->u16VCusScalingSrc);
15249 }
15250 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow))
15251 {
15252 b3DPstHScaling=TRUE;
15253 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15254 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15255
15256 b3DPstVScaling=TRUE;
15257 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15258 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15259 }
15260 else if(IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
15261 {
15262
15263 b3DPstHScaling=TRUE;
15264 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15265 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15266
15267 b3DPstVScaling=TRUE;
15268 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15269 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15270 }
15271 else if(IS_INPUT_TOP_BOTTOM(eWindow))
15272 {
15273 b3DPstVScaling=TRUE;
15274 b3DPstHScaling=TRUE;
15275 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15276 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15277 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15278 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15279 }
15280 else if(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_LINE_ALTERNATIVE())
15281 {
15282 b3DPstVScaling=TRUE;
15283 b3DPstHScaling=TRUE;
15284 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15285 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width + (pXCResourcePrivate->stdrvXC_3D._u163DHShift&0xFF);
15286
15287 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15288 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15289 }
15290 else if(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_TOP_BOTTOM())
15291 {
15292 b3DPstVScaling=TRUE;
15293 b3DPstHScaling=TRUE;
15294 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15295 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width + (pXCResourcePrivate->stdrvXC_3D._u163DHShift&0xFF);
15296
15297 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15298 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15299 }
15300 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
15301 {
15302 b3DPstVScaling=TRUE;
15303 b3DPstHScaling=TRUE;
15304 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15305 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15306
15307 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15308 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15309 }
15310 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow))
15311 {
15312 b3DPstHScaling=TRUE;
15313 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15314 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15315
15316 b3DPstVScaling=TRUE;
15317 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15318 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15319 }
15320 else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow))
15321 {
15322 b3DPstHScaling=TRUE;
15323 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15324 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15325
15326 b3DPstVScaling=TRUE;
15327 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15328 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15329 }
15330 else if(IS_INPUT_CHECK_BOARD(eWindow) || IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
15331 {
15332 b3DPstHScaling=TRUE;
15333 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15334 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15335
15336 b3DPstVScaling=TRUE;
15337 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15338 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15339 }
15340 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
15341 else if(Hal_SC_3D_IsDualViewMode(pInstance,eWindow))
15342 {
15343 b3DPstHScaling=TRUE;
15344 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15345 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15346
15347 b3DPstVScaling=TRUE;
15348 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15349 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15350 }
15351 #endif
15352 if(IS_OUTPUT_FRAME_L() || IS_OUTPUT_FRAME_R())
15353 {
15354 b3DPstVScaling=TRUE;
15355 b3DPstHScaling=TRUE;
15356 pSrcInfo->u16VCusScalingDst <<= 1; //For 3D->2D L/R frame output, set to scaling up twice
15357 }
15358 }
15359 else if(IS_OUTPUT_TOP_BOTTOM_HW())
15360 {
15361 if(IS_INPUT_NORMAL_2D_HW(eWindow))
15362 {
15363 b3DPstVScaling=TRUE;
15364 b3DPstHScaling=TRUE;
15365 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15366 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15367
15368 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15369 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15370 }
15371 }
15372 else if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
15373 {
15374 if(IS_INPUT_NORMAL_2D_HW(eWindow))
15375 {
15376 b3DPstVScaling=TRUE;
15377 b3DPstHScaling=TRUE;
15378 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15379 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width/2;
15380
15381 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15382 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15383 }
15384 }
15385 else if(IS_OUTPUT_SIDE_BY_SIDE_HALF())
15386 {
15387 if(IS_INPUT_FRAME_PACKING(eWindow))
15388 {
15389 b3DPstVScaling=TRUE;
15390 b3DPstHScaling=TRUE;
15391
15392 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15393 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width/2;
15394 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15395 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15396 }
15397 else if(IS_INPUT_TOP_BOTTOM(eWindow) || IS_INPUT_LINE_ALTERNATIVE(eWindow))
15398 {
15399 b3DPstVScaling=TRUE;
15400 b3DPstHScaling=TRUE;
15401 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15402 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width/2;
15403
15404 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15405 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15406 }
15407 else if(IS_INPUT_CHECK_BOARD(eWindow) || IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
15408 {
15409 b3DPstHScaling=TRUE;
15410 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15411 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width/2;
15412
15413 b3DPstVScaling=TRUE;
15414 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15415 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15416 }
15417 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
15418 {
15419 b3DPstVScaling=TRUE;
15420 b3DPstHScaling=TRUE;
15421 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15422 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width/2;
15423 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15424 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15425 }
15426 else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow))
15427 {
15428
15429 b3DPstHScaling=TRUE;
15430 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15431 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width/2;
15432
15433 b3DPstVScaling=TRUE;
15434 #if (HW_DESIGN_3D_VER >= 3)
15435 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15436 #else
15437 MS_U16 u16VactVideo, u16VactSpace;
15438 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, FALSE);
15439 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height-u16VactSpace)/4;
15440 #endif
15441 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15442 }
15443 else if(IS_INPUT_NORMAL_2D(eWindow))
15444 {
15445 b3DPstVScaling=TRUE;
15446 b3DPstHScaling=TRUE;
15447 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15448 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width/2 + (pXCResourcePrivate->stdrvXC_3D._u163DHShift&0xFF);
15449
15450 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15451 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15452 }
15453 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)
15454 && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ))
15455 {
15456 b3DPstVScaling=TRUE;
15457 b3DPstHScaling=TRUE;
15458 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15459 pSrcInfo->u16HCusScalingDst = pSrcInfo->ScaledCropWin.width;
15460
15461 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15462 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15463 }
15464
15465 }
15466 else if(IS_OUTPUT_FRAME_ALTERNATIVE())
15467 {
15468 if(IS_INPUT_FRAME_PACKING(eWindow))
15469 {
15470 #if (HW_DESIGN_3D_VER >= 3)
15471 if((pSrcInfo->stCapWin.height == DOUBLEHD_720X2P_VSIZE)&&
15472 (eOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE))
15473 {
15474 if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_PELLICLE)
15475 ||(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType == E_XC_3D_PANEL_NONE))
15476 {
15477 if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)
15478 {
15479 b3DPstHScaling=TRUE;
15480 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15481 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15482
15483 b3DPstVScaling=TRUE;
15484 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15485 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15486 }
15487 else
15488 {
15489 b3DPstHScaling=TRUE;
15490 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15491 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15492
15493 b3DPstVScaling=TRUE;
15494 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height / 2;
15495 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15496 }
15497 }
15498 else
15499 {
15500 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
15501 {
15502 b3DPstHScaling=TRUE;
15503 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15504 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15505
15506 b3DPstVScaling=TRUE;
15507 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15508 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15509 }
15510 else
15511 {
15512 b3DPstHScaling=TRUE;
15513 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15514 pSrcInfo->u16HCusScalingDst = pSrcInfo->ScaledCropWin.width;
15515
15516 b3DPstVScaling=TRUE;
15517 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15518 pSrcInfo->u16VCusScalingDst = pSrcInfo->ScaledCropWin.height;
15519 }
15520 }
15521 }
15522 else
15523 #endif
15524 {
15525 b3DPstVScaling=TRUE;
15526 b3DPstHScaling=TRUE;
15527 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15528 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15529
15530 #if (HW_DESIGN_3D_VER >= 3)
15531 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
15532 {
15533 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15534 }
15535 else
15536 {
15537 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15538 }
15539 #else
15540
15541 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height-u16VactSpace)/2;
15542 #endif
15543 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
15544 {
15545 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15546 }
15547 else
15548 {
15549 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15550 }
15551 }
15552 }
15553 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow)
15554 #if ((HW_DESIGN_3D_VER <= 3) ||(HW_DESIGN_3D_VER == 5))
15555 || IS_INPUT_TOP_BOTTOM(eWindow)
15556 #endif
15557 )
15558 {
15559 b3DPstVScaling=TRUE;
15560 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15561 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15562 }
15563 else if(IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
15564 {
15565 b3DPstHScaling=TRUE;
15566 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15567 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15568
15569 b3DPstVScaling=TRUE;
15570 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15571 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15572 }
15573 else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow))
15574 {
15575 #if (HW_DESIGN_3D_VER >= 4)
15576 b3DPstHScaling=TRUE;
15577 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15578 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15579
15580 b3DPstVScaling=TRUE;
15581 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15582 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15583 #else
15584 b3DPstHScaling=TRUE;
15585 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15586 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15587
15588 b3DPstVScaling=TRUE;
15589 #if (HW_DESIGN_3D_VER >= 3)
15590 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15591 #else
15592 MS_U16 u16VactVideo, u16VactSpace;
15593 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, FALSE);
15594 pSrcInfo->u16VCusScalingSrc = (pSrcInfo->ScaledCropWin.height-u16VactSpace)/4;
15595 #endif
15596 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15597 #endif
15598 }
15599 else if(IS_INPUT_CHECK_BOARD(eWindow) || IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
15600 {
15601 b3DPstHScaling=TRUE;
15602 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15603 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15604
15605 b3DPstVScaling=TRUE;
15606 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15607 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15608 }
15609 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
15610 {
15611 b3DPstHScaling=TRUE;
15612 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15613 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15614
15615 b3DPstVScaling=TRUE;
15616 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15617 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15618 }
15619 #ifdef FA_1920X540_OUTPUT // for 1920x540x120Hz output
15620 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow)&&(!pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC))
15621 {
15622 b3DPstHScaling=TRUE;
15623 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15624 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15625
15626 b3DPstVScaling=TRUE;
15627 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15628 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height/2;
15629 }
15630 #else
15631 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow))
15632 {
15633 b3DPstHScaling=TRUE;
15634 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15635 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15636
15637 b3DPstVScaling=TRUE;
15638 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15639 pSrcInfo->u16VCusScalingDst = pSrcInfo->stDispWin.height;
15640 }
15641 #endif
15642
15643 }
15644 else if(IS_OUTPUT_FRAME_PACKING())
15645 {
15646 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height == DOUBLEHD_1080X2P_VSIZE)
15647 {
15648 if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow))
15649 {
15650 b3DPstHScaling=TRUE;
15651 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15652 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15653
15654 b3DPstVScaling=TRUE;
15655 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15656 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15657 }
15658 else if(IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
15659 {
15660 b3DPstHScaling=TRUE;
15661 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15662 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15663
15664 b3DPstVScaling=TRUE;
15665 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15666 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15667 }
15668 else if(IS_INPUT_TOP_BOTTOM(eWindow))
15669 {
15670 b3DPstHScaling=TRUE;
15671 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15672 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15673
15674 b3DPstVScaling=TRUE;
15675 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15676 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15677 }
15678 else if(IS_INPUT_FRAME_PACKING(eWindow))
15679 {
15680 b3DPstHScaling=TRUE;
15681 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15682 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15683
15684 b3DPstVScaling=TRUE;
15685 pSrcInfo->u16VCusScalingSrc = u16VactVideo;
15686 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15687 }
15688 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow))
15689 {
15690 b3DPstHScaling=TRUE;
15691 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15692 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15693
15694 b3DPstVScaling=TRUE;
15695 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15696 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15697 }
15698 else if(IS_INPUT_CHECK_BOARD(eWindow) || IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
15699 {
15700 b3DPstHScaling=TRUE;
15701 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15702 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15703
15704 b3DPstVScaling=TRUE;
15705 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15706 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15707 }
15708 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
15709 {
15710 b3DPstHScaling=TRUE;
15711 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15712 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15713
15714 b3DPstVScaling=TRUE;
15715 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15716 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15717 }
15718 else if(IS_INPUT_NORMAL_2D(eWindow) || IS_INPUT_NORMAL_2D_HW(eWindow))
15719 {
15720 b3DPstHScaling=TRUE;
15721 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15722 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15723
15724 b3DPstVScaling=TRUE;
15725 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15726 pSrcInfo->u16VCusScalingDst = DOUBLEHD_1080X2P_FRAME_VSIZE;
15727 }
15728 }
15729 else if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height == DOUBLEHD_720X2P_VSIZE)
15730 {
15731 if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow))
15732 {
15733 b3DPstHScaling=TRUE;
15734 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15735 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15736
15737 b3DPstVScaling=TRUE;
15738 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15739 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_FRAME_VSIZE;
15740 }
15741 else if(IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
15742 {
15743 b3DPstHScaling=TRUE;
15744 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15745 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15746
15747 b3DPstVScaling=TRUE;
15748 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15749 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_FRAME_VSIZE;
15750 }
15751 else if(IS_INPUT_TOP_BOTTOM(eWindow))
15752 {
15753 b3DPstHScaling=TRUE;
15754 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15755 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15756
15757 b3DPstVScaling=TRUE;
15758 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15759 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_FRAME_VSIZE;
15760 }
15761 else if(IS_INPUT_FRAME_PACKING(eWindow))
15762 {
15763 b3DPstHScaling=TRUE;
15764 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15765 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15766
15767 b3DPstVScaling=TRUE;
15768 pSrcInfo->u16VCusScalingSrc = u16VactVideo;
15769 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_FRAME_VSIZE;
15770 }
15771 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow))
15772 {
15773 b3DPstHScaling=TRUE;
15774 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15775 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15776
15777 b3DPstVScaling=TRUE;
15778 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height/2;
15779 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_FRAME_VSIZE;
15780 }
15781 else if(IS_INPUT_CHECK_BOARD(eWindow) || IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
15782 {
15783 b3DPstHScaling=TRUE;
15784 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width/2;
15785 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15786
15787 b3DPstVScaling=TRUE;
15788 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15789 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_FRAME_VSIZE;
15790 }
15791 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
15792 {
15793 b3DPstHScaling=TRUE;
15794 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15795 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15796
15797 b3DPstVScaling=TRUE;
15798 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15799 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_VSIZE;
15800 }
15801 else if(IS_INPUT_NORMAL_2D(eWindow) || IS_INPUT_NORMAL_2D_HW(eWindow))
15802 {
15803 b3DPstHScaling=TRUE;
15804 pSrcInfo->u16HCusScalingSrc = pSrcInfo->ScaledCropWin.width;
15805 pSrcInfo->u16HCusScalingDst = pSrcInfo->stDispWin.width;
15806
15807 b3DPstVScaling=TRUE;
15808 pSrcInfo->u16VCusScalingSrc = pSrcInfo->ScaledCropWin.height;
15809 pSrcInfo->u16VCusScalingDst = DOUBLEHD_720X2P_VSIZE;
15810 }
15811 }
15812
15813 }
15814
15815 if((!MDrv_XC_3D_IsHWDepthAdjSupported(pInstance, eInputMode, eOutputMode, eWindow))
15816 && ((E_XC_3D_OUTPUT_LINE_ALTERNATIVE == eOutputMode)
15817 || (E_XC_3D_OUTPUT_TOP_BOTTOM == eOutputMode)
15818 || (E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF == eOutputMode)
15819 || (E_XC_3D_OUTPUT_FRAME_ALTERNATIVE == eOutputMode)))
15820 {
15821 pSrcInfo->u16HCusScalingDst += (pXCResourcePrivate->stdrvXC_3D._u163DHShift&0xFF);
15822 }
15823
15824 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u16HCusScalingSrc=%d, u16HCusScalingDst=%d\n", pSrcInfo->u16HCusScalingSrc, pSrcInfo->u16HCusScalingDst)
15825 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u16VCusScalingSrc=%d, u16VCusScalingDst=%d\n", pSrcInfo->u16VCusScalingSrc, pSrcInfo->u16VCusScalingDst)
15826
15827 if(b3DPstVScaling || b3DPstHScaling)
15828 {
15829 pSrcInfo->bVCusScaling = TRUE;
15830 pSrcInfo->bHCusScaling = TRUE;
15831
15832 // this _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
15833 // and _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
15834 // are unavoidable case under current scaler architecture
15835 // please be awared and do not remove these two unless
15836 // refactor the archiecture
15837 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
15838 MDrv_SC_set_postscaling_ratio(pInstance, pSrcInfo, eWindow);
15839 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
15840
15841 //HVSP
15842 if(MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
15843 {
15844 _MLOAD_ENTRY(pInstance);
15845 if (eWindow == MAIN_WINDOW)
15846 {
15847 //H post-scaling
15848 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_07_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PostScalingRatio>>00), 0xFFFF);
15849 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_08_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PostScalingRatio>>16), 0xFFFF);
15850 //V post-scaling
15851 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_09_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PostScalingRatio>>00), 0xFFFF);
15852 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_0A_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PostScalingRatio>>16), 0xFFFF);
15853 }
15854 else // SUB_WINDOW
15855 {
15856 //H post-scaling
15857 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_27_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PostScalingRatio>>00), 0xFFFF);
15858 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PostScalingRatio>>16), 0xFFFF);
15859 //V post-scaling
15860 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PostScalingRatio>>00), 0xFFFF);
15861 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_2A_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PostScalingRatio>>16), 0xFFFF);
15862 }
15863 MDrv_XC_MLoad_Fire(pInstance, TRUE);
15864 _MLOAD_RETURN(pInstance);
15865 }
15866 else
15867 {
15868 _XC_ENTRY(pInstance);
15869 if (eWindow == MAIN_WINDOW)
15870 {
15871 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PostScalingRatio); // H pre-scaling
15872 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PostScalingRatio); // V pre-scaling
15873 }
15874 else // SUB_WINDOW
15875 {
15876 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_27_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PostScalingRatio); // H pre-scaling
15877 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_29_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PostScalingRatio); // V pre-scaling
15878 }
15879 _XC_RETURN(pInstance);
15880 }
15881 }
15882 }
15883
15884 //------------------------------------------------------------------------------------------------------
15885 /// config sub win for 3d
15886 /// @param bEn \b IN: input enable sub window or disable
15887 /// @return MS_BOOL \b OUT: TRUE: set is ok FALSE: set value is odd, need align to even
15888 //------------------------------------------------------------------------------------------------------
MDrv_XC_3D_CfgSubWin(void * pInstance,MS_BOOL bEn)15889 MS_BOOL MDrv_XC_3D_CfgSubWin(void *pInstance, MS_BOOL bEn)
15890 {
15891 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
15892 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
15893 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
15894 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
15895 if(ENABLE == bEn)
15896 {
15897 MS_U32 u32tmp;
15898 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x0002, 0x0002);//Enable sub window shown on the screen
15899 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, 0x0002, 0x0002);//Force F1 use F2's register setting
15900 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_02_L, 0x0000, 0x0080);//source sync enable
15901 #ifdef UFO_XC_SUPPORT_DUAL_MIU
15902 if(IsEnableDualMode(MAIN_WINDOW))
15903 {
15904 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L, BIT(2), BIT(2));
15905 }
15906 #endif
15907 //MDrv_ACE_3DClonePQMap(FALSE, FALSE);
15908 MS_U32 u32H_PreScalingRatio, u32V_PreScalingRatio;
15909 u32H_PreScalingRatio = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_04_L) & 0x40000000;
15910 u32H_PreScalingRatio |= (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PreScalingRatio & ~0x40000000);
15911 u32V_PreScalingRatio = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_08_L) & 0x40000000;
15912 u32V_PreScalingRatio |= (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & ~0x40000000);
15913 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK04_04_L, u32H_PreScalingRatio); // H pre-scaling
15914 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK04_08_L, u32V_PreScalingRatio); // V pre-scaling
15915 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_27_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32H_PostScalingRatio); // H post-scaling
15916 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_29_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PostScalingRatio); // V post-scaling
15917
15918 u32tmp = (MS_U32)(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_19_L));
15919 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_59_L, (MS_U16)u32tmp);//frame number and opm/ipm seperate.
15920
15921 u32tmp = (MS_U32)(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_01_L));
15922 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_41_L, (MS_U16)u32tmp);//madi format
15923
15924 u32tmp = (MS_U32)(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_02_L));
15925 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_42_L, (MS_U16)u32tmp);
15926
15927 u32tmp = (MS_U32)(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_03_L));
15928 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_43_L, (MS_U16)u32tmp, 0xCFFF);//don't copy h and v mirror
15929
15930 u32tmp = (MS_U32)(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_04_L));
15931 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_44_L, (MS_U16)u32tmp, 0xBFFF);
15932
15933 u32tmp = (MS_U32)(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L));
15934 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_45_L, (MS_U16)u32tmp, 0xFDEF);
15935 }
15936 else
15937 {
15938 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x0000, 0x0002);//Enable sub window shown on the screen
15939 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, 0x0000, 0x0002);//Force F1 use F2's register setting
15940 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_02_L, 0x0080, 0x0080);//source sync disable
15941 //MDrv_ACE_3DClonePQMap(FALSE, FALSE);
15942 #ifdef UFO_XC_SUPPORT_DUAL_MIU
15943 if(IsEnableDualMode(MAIN_WINDOW))
15944 {
15945 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L, 0, BIT(2));
15946 }
15947 #endif
15948 }
15949
15950 return TRUE;
15951 }
15952 #endif
15953
MDrv_SC_3D_Disable_Crop(void * pInstance,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)15954 void MDrv_SC_3D_Disable_Crop(void *pInstance, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow)
15955 {
15956 #if(HW_DESIGN_3D_VER < 1)
15957 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
15958 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
15959 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
15960 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
15961 //only 2d to 3d can do overscan for all chips
15962 if((!IS_INPUT_MODE_NONE(eWindow)) && (!IS_OUTPUT_MODE_NONE())
15963 && (!IS_INPUT_NORMAL_2D(eWindow)) && (!IS_INPUT_NORMAL_2D_HW(eWindow))
15964 && (!IS_INPUT_NORMAL_2D_INTERLACE(eWindow))
15965 && (!IS_INPUT_NORMAL_2D_INTERLACE_PTP(eWindow)))
15966 {
15967 pSrcInfo->ScaledCropWin.x = 0;
15968 pSrcInfo->ScaledCropWin.y = 0;
15969 pSrcInfo->ScaledCropWin.width = pSrcInfo->u16H_SizeAfterPreScaling;
15970 pSrcInfo->ScaledCropWin.height= pSrcInfo->u16V_SizeAfterPreScaling;
15971 }
15972 #endif
15973 }
15974
_XC_Set_3D_MiuDualModeFetchOffset(XC_RESOURCE_PRIVATE * pXCResourcePrivate,MS_U32 u32DeviceID,SCALER_WIN eWindow)15975 static void _XC_Set_3D_MiuDualModeFetchOffset(XC_RESOURCE_PRIVATE* pXCResourcePrivate, MS_U32 u32DeviceID, SCALER_WIN eWindow)
15976 {
15977 #ifdef UFO_XC_SUPPORT_DUAL_MIU
15978 if (IsEnableDualMode(eWindow))
15979 {
15980 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), 0x1FFF); //F2_1 IPM offset
15981 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), 0x1FFF); //F2_1 IPM fetch number
15982 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset), 0x1FFF); //F2_1 OPM offset
15983 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch), 0x0FFF); //F2_1 OPM fetch number
15984 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset), 0x1FFF); //F2_1 OPM offset
15985 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch), 0x0FFF); //F2_1 OPM fetch number
15986 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), 0x1FFF); //F2 IPM total fetch
15987 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF); //F2 OPM total fetch
15988 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF); //F2 OPM total fetch
15989 }
15990 #endif
15991
15992 }
15993
MDrv_XC_3D_LoadReg(void * pInstance,E_XC_3D_INPUT_MODE eInputMode,E_XC_3D_OUTPUT_MODE eOutputMode,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)15994 MS_BOOL MDrv_XC_3D_LoadReg(void *pInstance, E_XC_3D_INPUT_MODE eInputMode,
15995 E_XC_3D_OUTPUT_MODE eOutputMode,
15996 XC_InternalStatus *pSrcInfo,
15997 SCALER_WIN eWindow)
15998 {
15999 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
16000 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
16001 XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
16002 UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
16003
16004 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16005 // SC1 no 3D
16006 if (psXCInstPri->u32DeviceID == 1)
16007 {
16008 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16009 if (!Hal_SC_3D_IsDualViewMode(pInstance,eWindow)) // dual view mode cannot skip
16010 #endif
16011 {
16012 return TRUE;
16013 }
16014 }
16015 #endif
16016 //Get panel size output width
16017 MS_U32 u32OutputWidth = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_04_L) + 1;
16018 MS_U32 PanelHeight= SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L) - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L) + 1;
16019 if(u32OutputWidth==0)
16020 u32OutputWidth = 0xf00;
16021 if(PanelHeight==0)
16022 PanelHeight = 0x870;
16023
16024 #if ((HW_DESIGN_3D_VER == 1))
16025 _XC_ENTRY(pInstance);
16026 MDrv_SC_3D_Set2TapMode(pInstance, pSrcInfo, eWindow);
16027 _XC_RETURN(pInstance);
16028 #elif (HW_DESIGN_3D_VER >= 2)
16029 MS_BOOL b3Dstate =
16030 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16031 Hal_SC_3D_IsDualViewMode(pInstance,eWindow) ||
16032 #endif
16033 ((!IS_INPUT_MODE_NONE(eWindow))
16034 && (!IS_OUTPUT_MODE_NONE())
16035 && ((!IS_INPUT_NORMAL_2D_HW(eWindow)) || IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW() ||IS_OUTPUT_FRAME_PACKING()));
16036
16037 _XC_ENTRY(pInstance);
16038 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16039 static MS_BOOL _bCopyMainOPBase = FALSE;
16040 static MS_U32 _u32SubBaseAddr1 = 0x00000000;
16041 static MS_U32 _u32SubBaseAddr2 = 0x00000000;
16042 #endif
16043
16044 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
16045 MS_BOOL bChangeDisplaySize = FALSE;
16046 MS_U16 u16VMainDisStart = 0;
16047 MS_U16 u16VMainDisEnd = 0;
16048 MS_U16 u16VSubDisStart = 0;
16049 MS_U16 u16VSubDisEnd = 0;
16050 MS_U16 u16VDispwinOffset = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart - pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart;
16051 #endif
16052
16053 //First init all control register to HW init value
16054 if((pXCResourcePrivate->stdrvXC_3D.ePreOutputMode != E_XC_3D_OUTPUT_MODE_NONE)
16055 && ((eInputMode != pXCResourcePrivate->stdrvXC_3D.ePreInputMode) || (eOutputMode != pXCResourcePrivate->stdrvXC_3D.ePreOutputMode)))
16056 {
16057 #if (HW_DESIGN_3D_VER == 5)
16058 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_29_L, 0x0404, 0xFFFF);//[4:0]reg_ini_max_bot_6tap,[12:8]reg_ini_max_top_6tap,should be 0x0404 in monaco 2D mode
16059 //Hal_SC_set_fmclk(psXCInstPri, DISABLE);
16060 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L, 0x0000, 0x0001);// 3d enable
16061 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L, 0x0000, 0x0082);//HDMI 3D field select toggle enable, OP 3D mode enable
16062 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L, 0x0000, BIT(7));
16063 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L, 0, BIT(4));//F2 IPM 3D LR invert
16064 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L, 0, BIT(11)|BIT(8)|BIT(1)|BIT(0));//[11]opm3d: OPM SBS using PIP
16065
16066 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_19_L, 0x0000, 0x8800);//clear opm/ipm frame number separate control
16067 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L, 0x0, BIT(8));//Enable free run 3D LR flag
16068 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_06_L, 0x0000, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16069
16070 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0000, 0x0003);//Enable free run 3D LR flag
16071 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_22_L, 0x0, BIT(4));//reg_ext_lr_en
16072
16073 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0801, 0x0013);
16074 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_18_L, 0x0000, 0x0002);//Force F1 use F2's register setting
16075 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x0000, 0x8000);//reg_sw_tg_en
16076 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK57_1C_L, 0x00); //Offset main/sub display window in right direction
16077 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0, BIT(5)); //Enable HD side by side line buffer mode
16078 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_18_L, 0x0, BIT(9));//fbl 3d enable
16079 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_64_L, 0x0000, BIT(5)); //pixel base active 3d
16080 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_50_L, 0x0000, BIT(14)); //block base active 3d
16081
16082 if(_bCopyMainOPBase)
16083 {
16084 _bCopyMainOPBase = FALSE;
16085 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_50_L, _u32SubBaseAddr1);
16086 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_52_L, _u32SubBaseAddr2);
16087 }
16088 #endif
16089 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x0000, 0x0002);//Enable sub window shown on the screen
16090 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, 0x0000, 0x0002);//Force F1 use F2's register setting
16091 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0000, 0x0001);// 3d enable
16092 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0000, 0x0082);//HDMI 3D field select toggle enable, OP 3D mode enable
16093 Hal_XC_H3D_LR_Toggle_Enable(pInstance, FALSE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);//HDMI 3D field select toggle disable
16094 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_53_L, 0x0000, 0x8000);// 3D LR side-by-side to line-to-line enable
16095 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_62_L, 0x0000, 0x0130);//external lr signal enable and swap
16096 #if SUPPORT_SEAMLESS_ZAPPING
16097 if(Hal_SC_GetSeamlessZappingStatus(pInstance, eWindow))
16098 {
16099 if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, BIT(0)|BIT(1)) == (BIT(0)|BIT(1)))
16100 {
16101 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0000, 0xFFFC);//hw 3d TYPE, L/R split etc.
16102 }
16103 }
16104 else
16105 #endif
16106 {
16107 //SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0000);//hw 3d TYPE, L/R split etc.
16108 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_OFF);
16109 Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
16110 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16111 }
16112 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0000);//FPP, FPI, FIdA related control
16113 Hal_SC_3D_SetActiveVideoHeight(pInstance, 0x0000);
16114 Hal_SC_3D_SetActiveBlankSize0(pInstance, 0x0000);
16115 Hal_SC_3D_SetActiveBlankSize1(pInstance, 0x0000);
16116
16117 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6B_L, 0x00, BIT(0)|BIT(2)); //[0]pix_sep_en,[2]LR_Alt_line
16118 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6F_L, 0x00, 0x010F); //resample, [8]enable
16119
16120 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0, BIT(4));//F2 IPM 3D LR invert
16121 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(11)|BIT(8)|BIT(1)|BIT(0));//[11]opm3d: OPM SBS using PIP
16122 //[8] F2 OPM 3D LR invert
16123 //[1] bsel_r_toggle_en
16124 #if 1 //[0] bsel_r_inv
16125 ///for 3D film issue
16126 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_14_L, 0x0000);
16127 #endif
16128 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0200, 0x0300);//reg_bk_field_sel_f2
16129
16130 #if((HW_DESIGN_3D_VER == 3) || (HW_DESIGN_3D_VER == 5))//monaco/monet/manhattan mode
16131 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,0x00, BIT(2));//reg_force_fe2_en
16132 #endif
16133
16134 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16135 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_05_L, 0x0200, BIT(9));//Enable OPM F1 register
16136 #endif
16137 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_19_L, 0x0000, 0x8800);//clear opm/ipm frame number separate control
16138 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_1C_L, 0x00); //Offset main/sub display window in right direction
16139 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x0, BIT(5)); //Enable HD side by side line buffer mode
16140 #if HW_2LINEMODE_DEINTERLACE_SUPPORT
16141 if(pSrcInfo->bInterlace)
16142 {
16143 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, 0x0, BIT(5)); //Force DI 2-line mode at sc2lb mode
16144 }
16145 #endif
16146 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0x0000, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16147 Hal_SC_set_ficlk2(pInstance, CKG_FICLK2_F2_FCLK, ENABLE, MAIN_WINDOW);//normal 2D and 3D format except checkboard should enable fclock
16148 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, 0x0, BIT(9));//fbl 3d enable
16149 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_34_L, 0x0, BIT(15));//fbl 3d eco
16150 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0, BIT(8));//Enable free run 3D LR flag
16151 Hal_SC_3D_enable_FALLRR_out(pInstance, FALSE);//disable FA LLRR out for 4k0.5k@240
16152 #if(HW_2DTO3D_VER== 4) //monet
16153 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, 0x0000, BIT(14)|BIT(13)|BIT(7));//TB out 3D depth enable
16154 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, 0x0000, BIT(3));//SBS out 3D depth enable
16155 #endif
16156 #if(SUPPORT_SC0_SUB_WIN == FALSE)
16157 //monet top/bot 3d mode using the same buffer
16158 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_23_L, 0, BIT(11));
16159 //monet has no pip
16160 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, BIT(11), BIT(11));
16161 #endif
16162
16163 #if ENABLE_T3D_DEBUG
16164 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_65_L, 0x0000, 0x8000);//disable principal black-bar
16165 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4D_L, 0x0000, 0x8000);//disable left black-bar
16166 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4B_L, 0x0000, 0x0002);//disable Right black-bar
16167 #endif
16168
16169 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
16170 // restore sub
16171 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_12_L, 0x1FFF, 0x1FFF);
16172 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_13_L, 0x1FFF, 0x1FFF);
16173
16174 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_10_L, 0x3FFF, 0x3FFF);
16175 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_11_L, 0x3FFF, 0x3FFF);
16176 #endif
16177
16178 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16179 Hal_SC_3D_Set_DualView(pInstance,FALSE);
16180 #endif
16181
16182 }
16183 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Windows[%u] eInputMode=%u, eOutputMode=%u, b3Dstate=%u\n", eWindow, eInputMode, eOutputMode, b3Dstate);
16184
16185 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
16186 if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
16187 {
16188 if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
16189 {
16190 // force 4k2k to FSC case, need to make post-scaling to displayV*2 first
16191 gSrcInfo[eWindow].stDispWin.y = gSrcInfo[eWindow].stDispWin.y*2;
16192 gSrcInfo[eWindow].stDispWin.height = gSrcInfo[eWindow].stDispWin.height*2;
16193 bChangeDisplaySize = TRUE;
16194
16195 // for custom scaling case
16196 if(gSrcInfo[eWindow].bVCusScaling)
16197 {
16198 gSrcInfo[eWindow].u16VCusScalingDst = gSrcInfo[eWindow].u16VCusScalingDst*2;
16199 }
16200 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"DispWin x: %4u W: %4u y: %4u H: %4u ,u16VCusScalingDst : %u\n",
16201 gSrcInfo[eWindow].stDispWin.x,
16202 gSrcInfo[eWindow].stDispWin.width,
16203 gSrcInfo[eWindow].stDispWin.y,
16204 gSrcInfo[eWindow].stDispWin.height,
16205 gSrcInfo[eWindow].u16VCusScalingDst);
16206 }
16207 }
16208 #endif
16209
16210 if(IS_INPUT_MODE_NONE(eWindow)
16211 || IS_OUTPUT_MODE_NONE()
16212 || (IS_INPUT_NORMAL_2D_HW(eWindow) && (!IS_OUTPUT_TOP_BOTTOM_HW()) && (!IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()))
16213 )
16214 {
16215 //Close 3d if previous 3d state is enabled
16216 if( (pXCResourcePrivate->stdrvXC_3D.ePreInputMode != E_XC_3D_INPUT_MODE_NONE)
16217 && (pXCResourcePrivate->stdrvXC_3D.ePreOutputMode != E_XC_3D_OUTPUT_MODE_NONE)
16218 && ((pXCResourcePrivate->stdrvXC_3D.ePreInputMode != E_XC_3D_INPUT_NORMAL_2D_HW)
16219 || (pXCResourcePrivate->stdrvXC_3D.ePreOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM_HW)
16220 || (pXCResourcePrivate->stdrvXC_3D.ePreOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF_HW)))
16221 {
16222 MDrv_XC_EnableCLK_for_SUB(pInstance, FALSE); //Disable 3D, so disable sub window clk here
16223 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
16224 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK); // Display H end
16225 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
16226 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
16227
16228
16229 if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out == E_XC_3D_OUTPUT_FI_MODE_NONE)
16230 {
16231 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
16232 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
16233 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width - 1), VOP_DE_HEND_MASK);
16234 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1), VOP_DE_VEND_MASK);
16235 }
16236
16237 // in 3d-->pip case, becuase sub window has hw limit, we cannot disable sub input source, there is some sw patch here.
16238 // make sub window back to init status. copy actions from MApi_XC_Init();
16239 MDrv_XC_init_fbn_win(pInstance, SUB_WINDOW);
16240 MDrv_XC_FilLineBuffer(pInstance, ENABLE, SUB_WINDOW);
16241 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16242 Hal_SC_3D_Set_DualView(pInstance,FALSE);
16243 #endif
16244 }
16245 }
16246 else
16247 {
16248 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16249 if (!Hal_SC_3D_IsDualViewMode(pInstance,eWindow)) // dual view mode need to skip
16250 #endif
16251 {
16252 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0000, BIT(9));//Enable OPM F1 register
16253 }
16254 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16255 if(_bCopyMainOPBase == FALSE)
16256 {
16257 _bCopyMainOPBase = TRUE;
16258 _u32SubBaseAddr1 = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_50_L);
16259 _u32SubBaseAddr2 = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_52_L);
16260
16261 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_50_L,SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_10_L));
16262 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_52_L,SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_12_L));
16263 }
16264 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_05_L, 0x0000, BIT(9));//Enable OPM F1 register
16265 #endif
16266 }
16267 _XC_RETURN(pInstance);
16268
16269 if(b3Dstate)
16270 {
16271 //input part
16272
16273 //because prescaling and postscaling function will use pq functions
16274 //and pq will use mutex protect, so we should release mutex for these two cases.
16275 MDrv_SC_3D_Adjust_PreScaling(pInstance, eInputMode, eOutputMode, pSrcInfo, eWindow);
16276 MDrv_SC_set_crop_window(pInstance, pSrcInfo, eWindow);
16277 //monaco/muji 3D mode need control sub for some output format, or else the edge of object in the image may shake
16278 #if (HW_DESIGN_4K2K_VER == 4)
16279 Hal_SC_set_opm_lcnt_inv(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.bOpmLcntInv_En, eWindow);
16280 if(IS_OUTPUT_LINE_ALTERNATIVE()
16281 || IS_OUTPUT_TOP_BOTTOM_HW()|| IS_OUTPUT_TOP_BOTTOM()
16282 || IS_OUTPUT_SIDE_BY_SIDE_HALF()|| IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()
16283 || IS_OUTPUT_FRAME_PACKING())
16284 {
16285 Hal_SC_set_opm_lcnt_inv(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.bOpmLcntInv_En, SUB_WINDOW);
16286 }
16287 #endif
16288 MDrv_SC_3D_Adjust_PstScaling(pInstance, eInputMode, eOutputMode, pSrcInfo, eWindow);
16289 }
16290
16291 _XC_ENTRY(pInstance);
16292
16293 if(!IS_INPUT_MODE_NONE(eWindow)
16294 || !IS_OUTPUT_MODE_NONE())
16295 {
16296 #if(HW_6TAP_MODE_SUPPORT == FALSE)
16297 // sram bypass for maserati in 3D mode. PQ is 6 tap mode. Line buffer is not enough because 12 line mode is disabled in 3D mode.
16298 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0B_L, 0x303);
16299 #endif
16300 }
16301
16302 //patch of muji U01 HW bug, disable compress mode when input is interlace and 3D output is not none
16303 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16304 if (MDrv_ReadByte(REG_CHIP_REVISION) < 1)//muji U02 fix
16305 {
16306 if((E_XC_3D_OUTPUT_MODE_NONE != MDrv_XC_Get_3D_Output_Mode(pInstance))
16307 && (TRUE == pSrcInfo->bInterlace))
16308 {
16309 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_01_L, 0x03, 0x03);
16310 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK33_01_L, 0x03, 0x03);
16311 }
16312 }
16313 else
16314 {
16315 //ECO bit
16316 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(2), BIT(2));
16317 }
16318
16319 //patch for muji U01, other output mode don't need enable black bar when setting depth
16320 if (MDrv_ReadByte(REG_CHIP_REVISION) < 1)
16321 {
16322 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_65_L, 0x0000, 0x8000);//principal black-bar enable
16323 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4D_L, 0x0000, 0x8000);//Left black-bar enable
16324 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4B_L, 0x0000, 0x0002);//Right black-bar enable
16325 }
16326 #endif
16327
16328 //// The BWS mode need to enabled both Main and Sub
16329 if(IS_INPUT_NORMAL_2D(eWindow) && IS_OUTPUT_TOP_BOTTOM())
16330 {
16331 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_30_L, BIT(14), BIT(14));
16332
16333 if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_01_L, BIT(0)))
16334 {
16335 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_01_L, BIT(1), BIT(1));
16336 }
16337 else
16338 {
16339 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_01_L, 0x00, BIT(1));
16340 }
16341 }
16342 else
16343 {
16344 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_30_L, 0x00, BIT(14));
16345 }
16346
16347 if(b3Dstate)
16348 {
16349 if(pSrcInfo->bHCusScaling || pSrcInfo->bVCusScaling || pSrcInfo->Status2.bPreVCusScaling || pSrcInfo->Status2.bPreHCusScaling)
16350 {
16351 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16352 MDrv_SC_set_frcm_fetch_number_limit(pInstance, pSrcInfo, eWindow);
16353 #else
16354 MDrv_SC_set_fetch_number_limit(pInstance, pSrcInfo, eWindow);
16355 #endif
16356 }
16357
16358 if (eWindow == MAIN_WINDOW)
16359 {
16360 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DNRBase0);//DNR OPM base set the same
16361 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_10_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase0);
16362 #ifdef UFO_XC_SUPPORT_DUAL_MIU
16363 if (IsEnableDualMode(eWindow))
16364 {
16365 Hal_SC_set_Dual_DNRBase0(pInstance, (MS_PHY)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DualDNRBase0*BYTE_PER_WORD), eWindow); //F2_1 IPM base addr
16366 Hal_SC_set_Dual_OPMBase0(pInstance, (MS_PHY)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DualOPMBase0*BYTE_PER_WORD), eWindow); //F2_1 OPM base addr
16367 }
16368 #endif
16369 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16370 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32FRCM_WBase0);//DNR OPM base set the same
16371 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_10_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32FRCM_RBase0);//frcm_rbase0 for main
16372 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32FRCM_RBase0);//frcm_rbase0 for sub
16373 #endif
16374 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_12_L, 0x0000, 0x1FFF);//The starting address of f2 stored at line buffer
16375 }
16376 #if (HW_DESIGN_3D_VER == 4)
16377 if((IS_INPUT_FRAME_PACKING(eWindow)&&IS_OUTPUT_TOP_BOTTOM())||
16378 (IS_INPUT_FRAME_PACKING(eWindow)&&IS_OUTPUT_FRAME_L())||
16379 (IS_INPUT_FRAME_PACKING(eWindow)&&IS_OUTPUT_FRAME_R())||
16380 (IS_INPUT_LINE_ALTERNATIVE(eWindow)&&IS_OUTPUT_TOP_BOTTOM())||
16381 (IS_INPUT_FIELD_ALTERNATIVE(eWindow)&&IS_OUTPUT_TOP_BOTTOM())||
16382 (IS_INPUT_FRAME_ALTERNATIVE(eWindow)&&IS_OUTPUT_TOP_BOTTOM())||
16383 (IS_INPUT_TOP_BOTTOM(eWindow)&&IS_OUTPUT_TOP_BOTTOM()&&(pSrcInfo->u16H_SizeAfterPreScaling > MS_3D_LINE_BFF_MAX))
16384 )
16385 {
16386 //The starting address of f1 stored at line buffer
16387 //in A5, Main and Sub window will use the (1920+960) in 2Tap st the same time
16388 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_13_L, 0x00, 0x1FFF);
16389 // When main and sub is start from 0, it means the sub win don't need Fill the sub windows line buffer in vertical blanking
16390 // in case the bandwidth of sub window is not enough. we will let sub window to work on v blanking area.
16391 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x00, BIT(10)); //[10]reg_vblank_main
16392
16393 if (IsVMirrorMode(eWindow))
16394 {
16395 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, BIT(11), BIT(11)); //[11]reg_vblank_sub
16396 }
16397 else //non mirror
16398 {
16399 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0 , BIT(11)); //[11]reg_vblank_sub
16400 }
16401 }
16402 else
16403 #endif
16404 if(MDrv_SC_3D_Is2TapModeSupportedFormat(pInstance, pSrcInfo, eWindow))
16405 {
16406 MDrv_SC_3D_Set2TapMode(pInstance, pSrcInfo, eWindow);
16407 }
16408 else
16409 {
16410 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x0, BIT(5)); //Disable HD side by side line buffer mode
16411 #if HW_2LINEMODE_DEINTERLACE_SUPPORT
16412 if(pSrcInfo->bInterlace)
16413 {
16414 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, 0x0, BIT(5)); //Force DI 2-line mode at sc2lb mode
16415 }
16416 #endif
16417 HAL_SC_SetSubLineBufferOffset(pInstance, MS_3D_LINE_BFF_MAX);
16418 }
16419 }
16420
16421 if((!MDrv_XC_3D_IsHWDepthAdjSupported(pInstance, eInputMode, eOutputMode, eWindow))
16422 && ((E_XC_3D_OUTPUT_LINE_ALTERNATIVE == eOutputMode)
16423 || (E_XC_3D_OUTPUT_TOP_BOTTOM == eOutputMode)
16424 || (E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF == eOutputMode)
16425 || (E_XC_3D_OUTPUT_FRAME_ALTERNATIVE == eOutputMode)
16426 || (E_XC_3D_OUTPUT_FRAME_PACKING== eOutputMode)))
16427 {
16428 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16429 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_1C_L, pXCResourcePrivate->stdrvXC_3D._u163DHShift & ~0x01);//Main/sub display window offset in right direction
16430 #else
16431 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_1C_L, pXCResourcePrivate->stdrvXC_3D._u163DHShift);//Main/sub display window offset in right direction
16432 #endif
16433 }
16434
16435 //normal 2d or hw 2d to 3d top bottom output or hw 2d to 3d side by side output
16436 if(IS_INPUT_NORMAL_2D(eWindow)
16437 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16438 || Hal_SC_3D_IsDualViewMode(pInstance,eWindow)
16439 #endif
16440 || (IS_INPUT_NORMAL_2D_HW(eWindow) && (IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW() || IS_OUTPUT_FRAME_PACKING())))
16441 {
16442 if(IS_INPUT_NORMAL_2D(eWindow))
16443 {
16444 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is 2D\n");
16445 #if(HW_DESIGN_3D_VER >= 3) //mooney/monet mode
16446 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16447 #endif
16448 }
16449
16450 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16451 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16452 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16453 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16454 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16455 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16456 #ifdef UFO_XC_SUPPORT_3D_DS
16457 if(MDrv_XC_Is_SupportSWDS(pInstance))
16458 {
16459 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
16460 }
16461 #endif
16462 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
16463 if (!Hal_SC_3D_IsDualViewMode(pInstance,eWindow)) // dual view mode need to skip
16464 #endif
16465 {
16466 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0800, 0x0800);//opm3d: OPM SBS using PIP
16467 }
16468 _XC_Set_3D_MiuDualModeFetchOffset(pXCResourcePrivate, psXCInstPri->u32DeviceID, eWindow);
16469 /////------------------
16470 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16471 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16472 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16473 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//OPM offset
16474 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//OPM FETCH
16475 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//F1 OPM OFFSET
16476 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//F1 OPM FETCH
16477 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L, 0x0800, 0x0800);//opm3d: OPM SBS using PIP
16478 #endif
16479 }
16480 else if(IS_INPUT_FRAME_PACKING(eWindow))
16481 {
16482 MS_U16 u16VactVideo, u16VactSpace;
16483 #if (HW_DESIGN_3D_VER >= 3) // for A5
16484 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, DISABLE);
16485 #else
16486 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31);
16487 #endif
16488 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16489 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16490 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16491 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16492 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16493 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16494 #ifdef UFO_XC_SUPPORT_3D_DS
16495 if(MDrv_XC_Is_SupportSWDS(pInstance))
16496 {
16497 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
16498 }
16499 #endif
16500 _XC_Set_3D_MiuDualModeFetchOffset(pXCResourcePrivate, psXCInstPri->u32DeviceID, eWindow);
16501
16502 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16503 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16504 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16505 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//OPM offset
16506 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//OPM FETCH
16507 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//F1 OPM OFFSET
16508 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//F1 OPM FETCH
16509
16510 if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
16511 {
16512 //interlace framepacking
16513
16514 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0002, 0x0113);//reg_lr_chg_mode[1:0],reg_ini_lr[4],reg_split_half[8]
16515 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16516 Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
16517 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16518
16519 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0237, 0xff37);//Blanking number in one vsync,enable gen pseudo vsync in 3d
16520 Hal_SC_3D_SetActiveVideoHeight(pInstance,u16VactVideo);
16521 Hal_SC_3D_SetActiveBlankSize0(pInstance,DOUBLEHD_1080X2I_VACT_SPACE1);
16522 Hal_SC_3D_SetActiveBlankSize1(pInstance, DOUBLEHD_1080X2I_VACT_SPACE2);
16523 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16524 Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, u16VactVideo);
16525 Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling/2);
16526 Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(u16VactVideo*2 - 1));
16527 Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,u16VactVideo*2);
16528 Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(4*u16VactVideo - 1));
16529
16530 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, u16VactVideo*2, 0x0FFF);//active_hight after VSD
16531 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, u16VactVideo*2, 0x0FFF);//active_hight after VSD
16532 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0100, 0x0100);//reg_bk_field_sel_f2
16533 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0x0A00, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16534 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16535 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16536 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0002, 0x0003);//reg_lr_chg_mode
16537 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0000, 0x0010);//reg_lr_chg_mode
16538
16539 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0003, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en,[11]:reg_vblank_sub
16540
16541 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, BIT(15), BIT(15));//reg_vlen_f2
16542 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x0010, 0x3FFF);//reg_htot
16543 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
16544 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x000a, 0x3FFF);//reg_hend_f2
16545 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x0002, 0x3FFF);//reg_hst_f1
16546 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x000a, 0x3FFF);//reg_hend_f1
16547 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
16548
16549 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16550 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
16551 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
16552 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
16553 }
16554 else
16555 {
16556 //progressive framepacking
16557
16558 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0002, 0x0113);//hw 3d TYPE, L/R split
16559 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16560 Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
16561 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16562
16563 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x011, 0x0037);//Blanking number in one vsync,enable gen pseudo vsync in 3d
16564 Hal_SC_3D_SetActiveVideoHeight(pInstance,u16VactVideo);
16565 Hal_SC_3D_SetActiveBlankSize0(pInstance,u16VactSpace);
16566 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16567 Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, u16VactVideo);
16568 Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling/2);
16569 Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(u16VactVideo - 1));
16570 Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,u16VactVideo);
16571 Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(2*u16VactVideo - 1));
16572
16573 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, u16VactVideo, 0x0FFF);//active_hight after VSD
16574 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, u16VactVideo, 0x0FFF);//active_hight after VSD
16575 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16576 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16577
16578 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0002, 0x0013);//[2:0]reg_lr_chg_mode,[4]:reg_ini_lr
16579
16580 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0003, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
16581
16582 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, BIT(15), BIT(15));//reg_vlen_f2
16583 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x0010, 0x3FFF);//reg_htot
16584 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
16585 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x000a, 0x3FFF);//reg_hend_f2
16586 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x0002, 0x3FFF);//reg_hst_f1
16587 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x000a, 0x3FFF);//reg_hend_f1
16588 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
16589
16590 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16591 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
16592 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
16593 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
16594 }
16595 #elif (HW_DESIGN_3D_VER >= 3)
16596 if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
16597 {
16598 //interlace framepacking
16599
16600 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16601 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16602 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31);
16603 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0237, 0xff37);//Blanking number in one vsync,enable gen pseudo vsync in 3d
16604 Hal_SC_3D_SetActiveVideoHeight(pInstance,u16VactVideo);
16605 Hal_SC_3D_SetActiveBlankSize0(pInstance,DOUBLEHD_1080X2I_VACT_SPACE1);
16606 Hal_SC_3D_SetActiveBlankSize1(pInstance, DOUBLEHD_1080X2I_VACT_SPACE2);
16607 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16608 Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, u16VactVideo);
16609
16610 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0100, 0x0100);//reg_bk_field_sel_f2
16611 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16612 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16613 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0x0A00, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16614 #if(HW_DESIGN_3D_VER == 3) //monet mode
16615 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16616 #endif
16617 }
16618 else
16619 {
16620 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is FPP\n");
16621 //progressive framepacking
16622
16623 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0002, 0x0103);//hw 3d TYPE, L/R split
16624 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16625 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16626
16627 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0011, 0x0037);//Blanking number in one vsync
16628 #if (HW_DESIGN_3D_VER < 4)
16629 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31);
16630 #endif
16631 Hal_SC_3D_SetActiveVideoHeight(pInstance,u16VactVideo);
16632 Hal_SC_3D_SetActiveBlankSize0(pInstance,u16VactSpace);
16633 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16634
16635 #if (HW_DESIGN_3D_VER >= 4)
16636 Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen);
16637 #endif
16638 Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, u16VactVideo);
16639
16640 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16641 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16642 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0x0900, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16643 #if(HW_DESIGN_3D_VER == 3) //monet mode
16644 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16645 #endif
16646 }
16647 #else
16648 if(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)
16649 {
16650 //interlace framepacking
16651
16652 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0002, 0x0103);//hw 3d TYPE, L/R split
16653 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16654 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16655
16656 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0237, 0xff37);//Blanking number in one vsync,enable gen pseudo vsync in 3d
16657 Hal_SC_3D_SetActiveVideoHeight(pInstance,DOUBLEHD_1080X2I_FIELD_VSIZE);
16658 Hal_SC_3D_SetActiveBlankSize0(pInstance,DOUBLEHD_1080X2I_VACT_SPACE1);
16659 Hal_SC_3D_SetActiveBlankSize1(pInstance, DOUBLEHD_1080X2I_VACT_SPACE2);
16660
16661 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0100, 0x0100);//reg_bk_field_sel_f2
16662 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16663 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16664 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0x0A00, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16665 }
16666 else
16667 {
16668 //progressive framepacking
16669
16670 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0002, 0x0103);//hw 3d TYPE, L/R split
16671 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16672 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16673
16674 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0011, 0x0037);//Blanking number in one vsync
16675 Hal_SC_3D_SetActiveVideoHeight(pInstance,u16VactVideo);
16676 Hal_SC_3D_SetActiveBlankSize0(pInstance,u16VactSpace);
16677
16678 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16679 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16680 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0x0900, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16681 }
16682 #endif
16683 }
16684 else if(IS_INPUT_FIELD_ALTERNATIVE(eWindow))
16685 {
16686 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is FA\n");
16687 MS_U16 u16VactVideo, u16VactSpace;
16688
16689 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, DISABLE);
16690 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16691 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16692 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16693 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16694 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16695 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16696 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16697 #ifdef UFO_XC_SUPPORT_3D_DS
16698 if(MDrv_XC_Is_SupportSWDS(pInstance))
16699 {
16700 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
16701 }
16702 #endif
16703 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16704 Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
16705 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16706
16707 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0011, 0x0037);//Blanking number in one vsync
16708 Hal_SC_3D_SetActiveVideoHeight(pInstance,u16VactVideo);
16709 Hal_SC_3D_SetActiveBlankSize0(pInstance,u16VactSpace);
16710 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16711 Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen);
16712 Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, u16VactVideo);
16713 Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(u16VactVideo - 1));
16714 Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,u16VactVideo);
16715 Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(2*u16VactVideo - 1));
16716
16717 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, u16VactVideo, 0x0FFF);//active_hight after VSD
16718 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, u16VactVideo, 0x0FFF);//active_hight after VSD
16719
16720 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0000, 0x0100);//reg_local_field
16721 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16722 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16723
16724 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0002, 0x0003);//reg_lr_chg_mode
16725 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0003, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
16726 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, BIT(15), BIT(15));//reg_vlen_f2
16727 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x0010, 0x3FFF);//reg_htot
16728 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
16729 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x000a, 0x3FFF);//reg_hend_f2
16730 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x0002, 0x3FFF);//reg_hst_f1
16731 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x000a, 0x3FFF);//reg_hend_f1
16732 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
16733
16734 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16735 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
16736 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
16737 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
16738 #else
16739 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0002, 0x0103);//hw 3d TYPE, L/R split
16740 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16741 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16742
16743 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x0011, 0x0037);//Blanking number in one vsync
16744 Hal_SC_3D_SetActiveVideoHeight(pInstance,u16VactVideo);
16745 Hal_SC_3D_SetActiveBlankSize0(pInstance,u16VactSpace);
16746 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16747
16748 #if (HW_DESIGN_3D_VER >= 3)
16749 Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen);
16750 #endif
16751
16752 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16753 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16754 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16755 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16756 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16757 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16758 #ifdef UFO_XC_SUPPORT_3D_DS
16759 if(MDrv_XC_Is_SupportSWDS(pInstance))
16760 {
16761 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
16762 }
16763 #endif
16764 _XC_Set_3D_MiuDualModeFetchOffset(pXCResourcePrivate, psXCInstPri->u32DeviceID, eWindow);
16765 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0x0A00, 0x0F00);//[11]Enable, [10:8]F2 IPM user define read
16766 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16767 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16768 #if(HW_DESIGN_3D_VER == 3) //monet mode
16769 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16770 #endif
16771 #endif
16772 }
16773 else if(IS_INPUT_FRAME_ALTERNATIVE(eWindow))
16774 {
16775 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is FA\n");
16776
16777 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16778 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16779 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16780 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16781 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16782 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16783 #ifdef UFO_XC_SUPPORT_3D_DS
16784 if(MDrv_XC_Is_SupportSWDS(pInstance))
16785 {
16786 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
16787 }
16788 #endif
16789 _XC_Set_3D_MiuDualModeFetchOffset(pXCResourcePrivate, psXCInstPri->u32DeviceID, eWindow);
16790 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16791 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_62_L, 0x0030, 0x0030);// input Vsync exist between L and R frame
16792
16793 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0001, 0x0013);// hw 3d TYPE, L/R split=0
16794 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_FRAME);
16795 Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
16796 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16797
16798 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, pSrcInfo->u16V_SizeAfterPreScaling, 0x0FFF);//active_hight after VSD
16799 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, pSrcInfo->u16V_SizeAfterPreScaling, 0x0FFF);//active_hight after VSD
16800
16801 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));//F2 IPM 3D input enable
16802 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));//OP 3D ENABLE
16803 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L, BIT(7), BIT(7));
16804
16805 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_22_L, BIT(4), BIT(4));//reg_ext_lr_en
16806 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0001, 0x0013);//reg_lr_chg_mode
16807
16808 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0001, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
16809 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x0000, 0x1000);//reg_sw_tg_en
16810
16811 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16812
16813 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16814 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16815 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
16816 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
16817 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//OPM offset
16818 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//OPM FETCH
16819 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//F1 OPM OFFSET
16820 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//F1 OPM FETCH
16821 #elif (HW_DESIGN_3D_VER >= 3)
16822 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0));// 3d enable
16823 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7));
16824 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_62_L, 0x0030, 0x0030);// input Vsync exist between L and R frame
16825
16826 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0001, 0x0103);// hw 3d TYPE, L/R split=0
16827 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_FRAME);
16828 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16829 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16830 #if(HW_DESIGN_3D_VER == 3) //monet mode
16831 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16832 #endif
16833 #else
16834 if(pSrcInfo->bInterlace == TRUE)
16835 {
16836 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);// 3d enable
16837 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0083, 0x0080);//[8] F2 OPM 3D LR invert
16838 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_62_L, 0x0010, 0x0010);// input Vsync exist between L and R frame
16839
16840 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0001, 0x0103);// hw 3d TYPE, L/R split=0
16841 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_FRAME);
16842 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16843 }
16844 else
16845 {
16846 //for progressive frame alternative case, we should disable ip 3d, enable op 3d
16847 //to let main,sub engine read opm frame data alternatively
16848 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0083, 0x0080);//[8] F2 OPM 3D LR invert
16849 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_19_L, 0x8804);//input 4 frame, output 2 frame with 3d
16850 }
16851 #endif
16852 }
16853 else if(IS_INPUT_TOP_BOTTOM(eWindow))
16854 {
16855 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is TBP\n");
16856
16857 #if(HW_DESIGN_3D_VER == 5) //monaco mode
16858 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16859 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16860 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16861 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16862 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16863 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16864 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16865 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16866 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//OPM offset
16867 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//OPM FETCH
16868 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//F1 OPM OFFSET
16869 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//F1 OPM FETCH
16870 #ifdef UFO_XC_SUPPORT_3D_DS
16871 if(MDrv_XC_Is_SupportSWDS(pInstance))
16872 {
16873 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
16874 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK32_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
16875 }
16876 #endif
16877 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0002, 0x0113);//hw 3d TYPE, L/R split
16878 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16879 Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
16880 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16881 Hal_SC_3D_SetActiveVideoHeight(pInstance,pSrcInfo->stCapWin.height);
16882 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16883
16884 if(pSrcInfo->bInterlace == FALSE)
16885 {
16886 Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling/2);
16887 }
16888 else
16889 {
16890 Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling/4);
16891 }
16892 Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling/2);
16893 Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling/2 - 1));
16894 Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,pSrcInfo->u16V_SizeAfterPreScaling/2);
16895 Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling - 1));
16896
16897 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, pSrcInfo->u16V_SizeAfterPreScaling/2, 0x0FFF);//active_hight after VSD
16898 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, pSrcInfo->u16V_SizeAfterPreScaling/2, 0x0FFF);//active_hight after VSD
16899
16900 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);// 3d enable
16901 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);
16902
16903 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0002, 0x0013);//reg_lr_chg_mode
16904
16905 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0003, 0x0C03);//reg_hst_f2, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
16906 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x8010, 0xBFFF);//reg_hst_f2
16907 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
16908 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x000a, 0x3FFF);//reg_hend_f2
16909 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x0002, 0x3FFF);//reg_hst_f1
16910 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x000a, 0x3FFF);//reg_hend_f1
16911 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
16912
16913 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16914 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
16915 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
16916 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
16917
16918 #elif (HW_DESIGN_3D_VER >= 3)
16919
16920 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16921 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16922 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16923 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16924 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16925 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16926 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);// 3d enable
16927 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);
16928 #ifdef UFO_XC_SUPPORT_3D_DS
16929 if(MDrv_XC_Is_SupportSWDS(pInstance))
16930 {
16931 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
16932 }
16933 #endif
16934 _XC_Set_3D_MiuDualModeFetchOffset(pXCResourcePrivate, psXCInstPri->u32DeviceID, eWindow);
16935 Hal_SC_3D_SetActiveVideoHeight(pInstance,pSrcInfo->stCapWin.height);
16936 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
16937
16938 if(pSrcInfo->bInterlace == FALSE)
16939 {
16940 Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling/2);
16941 }
16942 else
16943 {
16944 Hal_SC_3D_SetActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling/4);
16945 }
16946
16947 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16948 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16949
16950 if (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, BIT(5)) == BIT(5))
16951 {
16952 // If use 2Tap mode, need to disable PQ scaling filter
16953 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0B_L, 0x303);
16954 }
16955 #if(HW_DESIGN_3D_VER == 3) //monet mode
16956 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
16957 #endif
16958 #else
16959 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16960 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16961 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16962 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16963 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16964 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16965 _XC_Set_3D_MiuDualModeFetchOffset(pXCResourcePrivate, psXCInstPri->u32DeviceID, eWindow);
16966 #ifdef UFO_XC_SUPPORT_3D_DS
16967 if(MDrv_XC_Is_SupportSWDS(pInstance))
16968 {
16969 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
16970 }
16971 #endif
16972 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);// 3d enable
16973 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);
16974
16975 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_BLOCK);
16976 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
16977 if(pSrcInfo->bInterlace == FALSE)
16978 {
16979 Hal_SC_3D_SetActiveVideoHeight(pInstance,pSrcInfo->u16V_SizeAfterPreScaling/2);
16980 }
16981 else
16982 {
16983 Hal_SC_3D_SetActiveVideoHeight(pInstance,pSrcInfo->u16V_SizeAfterPreScaling/4);
16984 }
16985
16986
16987 #endif
16988 }
16989 else if(IS_INPUT_LINE_ALTERNATIVE(eWindow))
16990 {
16991 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is LA\n");
16992 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
16993 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
16994 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
16995 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
16996 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
16997 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
16998 #ifdef UFO_XC_SUPPORT_3D_DS
16999 if(MDrv_XC_Is_SupportSWDS(pInstance))
17000 {
17001 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
17002 }
17003 #endif
17004 _XC_Set_3D_MiuDualModeFetchOffset(pXCResourcePrivate, psXCInstPri->u32DeviceID, eWindow);
17005 #if(HW_DESIGN_3D_VER == 5) //monaco mode
17006
17007 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0003, 0x0113);//hw 3d TYPE, L/R idx
17008 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17009 Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
17010 Hal_SC_3D_SetSplitHalf(pInstance, FALSE);
17011 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
17012 Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling);
17013 Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling/2 - 1));
17014 Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,0x0000);
17015 Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling/2 - 1));
17016
17017 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17018 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, (pSrcInfo->u16V_SizeAfterPreScaling/2), 0x0FFF);//active_hight after VSD
17019 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, (pSrcInfo->u16V_SizeAfterPreScaling/2), 0x0FFF);//active_hight after VSD
17020 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17021 if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17022 {
17023 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17024 }
17025 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);// 3d enable
17026 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);//OP 3D ENABLE
17027 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0003, 0x0013);//reg_lr_chg_mode
17028 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0C03, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
17029 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_29_L, 0x0000, 0xFFFF);//[4:0]reg_ini_max_bot_6tap,[12:8]reg_ini_max_top_6tap,should be 0 in monaco 3D mode
17030 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x8012, 0xBFFF);//reg_hst_f2
17031 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
17032 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x0009, 0x3FFF);//reg_hend_f2
17033 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x000a, 0x3FFF);//reg_hst_f1
17034 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x0011, 0x3FFF);//reg_hend_f1
17035 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
17036
17037 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_02_L,BIT(3), BIT(3));//reg_op1_frcm_cnnet_spthalf_f2
17038 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17039
17040 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17041 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17042 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
17043 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
17044 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
17045 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_18_L, pSrcInfo->stCapWin.height*2, 0x1FFF);
17046 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//OPM offset
17047 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//OPM FETCH
17048 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//F1 OPM OFFSET
17049 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch, 0x1FFF);//F1 OPM FETCH
17050
17051 #else
17052 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);// 3d enable
17053 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);//OP 3D ENABLE
17054
17055 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0003, 0x0013);//hw 3d TYPE, L/R idx
17056 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17057 Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
17058 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width);
17059 #if (HW_DESIGN_3D_VER >= 3)
17060 if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17061 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17062 #if(HW_DESIGN_3D_VER == 3) //monet mode
17063 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17064 #endif
17065 #endif
17066 #endif
17067 }
17068 else if(IS_INPUT_SIDE_BY_SIDE_HALF(eWindow) || IS_INPUT_SIDE_BY_SIDE_HALF_INTERLACE(eWindow))
17069 {
17070 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is SBSH\n");
17071
17072 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17073 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17074 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset/2 + 1) & ~0x1;
17075 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//OPM offset
17076 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//F1 OPM OFFSET
17077 #ifdef UFO_XC_SUPPORT_DUAL_MIU
17078 if(IsEnableDualMode(eWindow))
17079 {
17080 #ifdef UFO_XC_SUPPORT_3D_DS
17081 if(MDrv_XC_Is_SupportSWDS(pInstance))
17082 {
17083 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
17084 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM fetch number
17085 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM offset
17086 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM offset
17087 }
17088 else
17089 #endif
17090 {
17091 SC_W2BYTEMSK(0, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), 0x1FFF); //F2_1 IPM offset
17092 SC_W2BYTEMSK(0, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), 0x1FFF); //F2_1 IPM fetch number
17093 SC_W2BYTEMSK(0, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, 0x1FFF); //F2_1 OPM offset
17094 SC_W2BYTEMSK(0, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, 0x1FFF); //F2_1 OPM offset
17095 }
17096 }
17097 #endif
17098 #if(HW_DESIGN_3D_VER == 5) //monaco mode
17099 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17100 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, 0x1FFF);//OPM FETCH
17101 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pSrcInfo->stCapWin.height*2, 0x1FFF);
17102 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, 0x1FFF);//F1 OPM FETCH
17103 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17104 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17105 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset/2 + 1) & ~0x1, 0x1FFF);//OPM offset
17106 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_18_L, pSrcInfo->stCapWin.height*2, 0x1FFF);
17107 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset/2 + 1) & ~0x1, 0x1FFF);//F1 OPM OFFSET
17108 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch+ 1) & ~0x1, 0x1FFF);//OPM FETCH
17109 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch+ 1) & ~0x1, 0x1FFF);//F1 OPM FETCH
17110 #ifdef UFO_XC_SUPPORT_3D_DS
17111 if(MDrv_XC_Is_SupportSWDS(pInstance))
17112 {
17113 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
17114 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK32_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch+ 1) & ~0x1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
17115 }
17116 #endif
17117 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0103, 0x0113);//hw 3d TYPE
17118 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17119 Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
17120 Hal_SC_3D_SetSplitHalf(pInstance, TRUE);
17121 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width/2);
17122 if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17123 {
17124 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17125 Hal_SC_3D_SetActiveVideoHeight(pInstance,pSrcInfo->stCapWin.height*2);
17126 }
17127 Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling);
17128 Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling - 1));
17129 Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,0x0000);
17130 Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling - 1));
17131
17132 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, (pSrcInfo->u16V_SizeAfterPreScaling), 0x0FFF);//active_hight after VSD
17133 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, (pSrcInfo->u16V_SizeAfterPreScaling), 0x0FFF);//active_hight after VSD
17134
17135 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);//IPM 3D ENABLE
17136 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);//OP 3D ENABLE
17137 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0003, 0x0013);//reg_lr_chg_mode
17138 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0C03, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
17139 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_29_L, 0x0000, 0xFFFF);//[4:0]reg_ini_max_bot_6tap,[12:8]reg_ini_max_top_6tap,should be 0 in monaco 3D mode
17140 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x8012, 0xBFFF);//reg_hst_f2
17141 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
17142 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x0009, 0x3FFF);//reg_hend_f2
17143 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x000a, 0x3FFF);//reg_hst_f1
17144 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x0011, 0x3FFF);//reg_hend_f1
17145 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
17146 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_02_L,BIT(3), BIT(3));//reg_op1_frcm_cnnet_spthalf_f2
17147 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17148 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
17149 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
17150 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
17151 #else
17152
17153 #ifdef UFO_XC_FB_LEVEL
17154 if((pSrcInfo->eFBLevel == E_XC_FB_LEVEL_FBL) || (pSrcInfo->bR_FBL == E_XC_FB_LEVEL_RFBL_DI))
17155 #else
17156 if(pSrcInfo->bFBL || pSrcInfo->bR_FBL)
17157 #endif
17158 {
17159 if(MDrv_SC_3D_IsSupportFBL3D())
17160 {
17161 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = pSrcInfo->u16H_SizeAfterPreScaling / 2;
17162
17163 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pSrcInfo->u16H_SizeAfterPreScaling / 2, 0x1FFF);//OPM FETCH
17164 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pSrcInfo->u16H_SizeAfterPreScaling / 2, 0x1FFF);//F1 OPM FETCH
17165 #ifdef UFO_XC_SUPPORT_3D_DS
17166 if(MDrv_XC_Is_SupportSWDS(pInstance))
17167 {
17168 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(REG_SC_BK12_57_L, pSrcInfo->u16H_SizeAfterPreScaling / 2), DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
17169 }
17170 #endif
17171 #ifdef UFO_XC_SUPPORT_DUAL_MIU
17172 if(IsEnableDualMode(eWindow))
17173 {
17174 #ifdef UFO_XC_SUPPORT_3D_DS
17175 if(MDrv_XC_Is_SupportSWDS(pInstance))
17176 {
17177 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM fetch number
17178 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM fetch number
17179 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2 IPM total fetch
17180 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_29_L, (MS_U16)((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch)/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2 OPM total fetch
17181 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_69_L, (MS_U16)((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch)/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2 Dual sub OPM total fetch
17182
17183 }
17184 else
17185 #endif
17186 {
17187 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch/2 + 1) & ~0x1, 0x0FFF); //F2_1 OPM fetch number
17188 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch/2 + 1) & ~0x1, 0x0FFF); //F2_1 OPM fetch number
17189 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), 0x1FFF); //F2 IPM total fetch
17190 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_29_L, (MS_U16)((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch)/2 + 1) & ~0x1, 0x1FFF); //F2 OPM total fetch
17191 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_69_L, (MS_U16)((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch)/2 + 1) & ~0x1, 0x1FFF); //F2 Dual sub OPM total fetch
17192 }
17193 }
17194 #endif
17195 #ifdef UFO_XC_SUPPORT_3D_DS
17196 if(MDrv_XC_Is_SupportSWDS(pInstance))
17197 {
17198 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK20_13_L, pSrcInfo->u16H_SizeAfterPreScaling/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17199 }
17200 else
17201 #endif
17202 {
17203 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_13_L, pSrcInfo->u16H_SizeAfterPreScaling / 2, 0x1FFF);
17204 }
17205 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, BIT(9), BIT(9));//fbl 3d enable
17206 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_34_L, BIT(15), BIT(15));//fbl 3d eco
17207 }
17208 else
17209 {
17210 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"3D: not support 3d under FBL!\n");
17211 }
17212 }
17213 else
17214 {
17215 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1;
17216
17217 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, 0x1FFF);//OPM FETCH
17218 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, 0x1FFF);//F1 OPM FETCH
17219 #ifdef UFO_XC_SUPPORT_3D_DS
17220 if(MDrv_XC_Is_SupportSWDS(pInstance))
17221 {
17222 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
17223 }
17224 #endif
17225 #ifdef UFO_XC_SUPPORT_DUAL_MIU
17226 if(IsEnableDualMode(eWindow))
17227 {
17228 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF); //F2_1 OPM fetch number
17229 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF); //F2_1 OPM fetch number
17230 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), 0x1FFF); //F2 IPM total fetch
17231 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, 0x1FFF); //F2 OPM total fetch
17232 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, 0x1FFF); //F2 Dual sub OPM total fetch
17233 }
17234 #endif
17235
17236 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0103, 0x0103);//hw 3d TYPE
17237 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17238 Hal_SC_3D_SetSplitHalf(pInstance, TRUE);
17239 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width/2);
17240 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);//IPM 3D ENABLE
17241 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);//OP 3D ENABLE
17242 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, 0x00, BIT(15));
17243 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17244 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17245 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, BIT(15), BIT(15));
17246 #if (HW_DESIGN_3D_VER >= 3)
17247 if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17248 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17249 #endif
17250 }
17251 #if(HW_DESIGN_3D_VER == 3) //monet mode
17252 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17253 #endif
17254 #endif
17255 }
17256 else if(IS_INPUT_SIDE_BY_SIDE_FULL(eWindow))
17257 {
17258 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is SBSF\n");
17259
17260 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17261 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17262 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset + 1) & ~0x1, 0x1FFF);//OPM offset
17263 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, 0x1FFF);//OPM FETCH
17264 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset + 1) & ~0x1, 0x1FFF);//F1 OPM OFFSET
17265 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, 0x1FFF);//F1 OPM FETCH
17266 #ifdef UFO_XC_SUPPORT_3D_DS
17267 if(MDrv_XC_Is_SupportSWDS(pInstance))
17268 {
17269 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
17270 }
17271 #endif
17272 #ifdef UFO_XC_SUPPORT_DUAL_MIU
17273 if(IsEnableDualMode(eWindow))
17274 {
17275 #ifdef UFO_XC_SUPPORT_3D_DS
17276 if(MDrv_XC_Is_SupportSWDS(pInstance))
17277 {
17278 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
17279 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM fetch number
17280 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM offset
17281 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM fetch number
17282 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM offset
17283 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM fetch number
17284 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2 IPM total fetch
17285 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2 OPM total fetch
17286 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2 OPM total fetch
17287
17288 }
17289 else
17290 #endif
17291 {
17292 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), 0x1FFF); //F2_1 IPM offset
17293 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), 0x1FFF); //F2_1 IPM fetch number
17294 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset + 1) & ~0x1, 0x1FFF); //F2_1 OPM offset
17295 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF); //F2_1 OPM fetch number
17296 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMOffset + 1) & ~0x1, 0x1FFF); //F2_1 OPM offset
17297 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF); //F2_1 OPM fetch number
17298 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), 0x1FFF); //F2 IPM total fetch
17299 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF); //F2 OPM total fetch
17300 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF); //F2 OPM total fetch
17301 }
17302 }
17303 #endif
17304
17305 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0103, 0x0103);//hw 3d TYPE
17306 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17307 Hal_SC_3D_SetSplitHalf(pInstance, TRUE);
17308 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width/2);
17309 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x0001, 0x0001);//IPM 3D ENABLE
17310 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x0080, 0x0080);//OP 3D ENABLE
17311 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, 0x00, BIT(15));
17312 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17313 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17314 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, BIT(15), BIT(15));
17315 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
17316 #if (HW_DESIGN_3D_VER >= 3)
17317
17318 if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17319 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17320 #endif
17321 }
17322 else if(IS_INPUT_CHECK_BOARD(eWindow))
17323 {
17324 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is CKB\n");
17325
17326 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset/2 + 1) & ~0x1;
17327 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1;
17328
17329 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17330 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17331 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
17332 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//OPM FETCH
17333 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
17334 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch, 0x1FFF);//F1 OPM FETCH
17335 #ifdef UFO_XC_SUPPORT_3D_DS
17336 if(MDrv_XC_Is_SupportSWDS(pInstance))
17337 {
17338 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
17339 }
17340 #endif
17341 #ifdef UFO_XC_SUPPORT_DUAL_MIU
17342 if(IsEnableDualMode(eWindow))
17343 {
17344 #ifdef UFO_XC_SUPPORT_3D_DS
17345 if(MDrv_XC_Is_SupportSWDS(pInstance))
17346 {
17347 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
17348 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM fetch number
17349 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM offset
17350 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM fetch number
17351 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM offset
17352 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM fetch number
17353 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2 IPM total fetch
17354 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2 OPM total fetch
17355 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2 OPM total fetch
17356
17357 }
17358 else
17359 #endif
17360 {
17361 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), 0x1FFF); //F2_1 IPM offset
17362 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), 0x1FFF); //F2_1 IPM fetch number
17363 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, 0x1FFF); //F2_1 OPM offset
17364 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF); //F2_1 OPM fetch number
17365 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, 0x1FFF); //F2_1 OPM offset
17366 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF); //F2_1 OPM fetch number
17367 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), 0x1FFF); //F2 IPM total fetch
17368 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF); //F2 OPM total fetch
17369 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF); //F2 OPM total fetch
17370 }
17371 }
17372 #endif
17373
17374 #if(HW_DESIGN_3D_VER == 5) //monaco mode
17375 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0103, 0x0113);//hw 3d TYPE
17376 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17377 Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
17378 Hal_SC_3D_SetSplitHalf(pInstance, TRUE);
17379 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width/2);
17380 if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17381 {
17382 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17383 Hal_SC_3D_SetActiveVideoHeight(pInstance,pSrcInfo->stCapWin.height*2);
17384 }
17385 Hal_SC_3D_SetPixelSeparationWidth(pInstance, pSrcInfo->stCapWin.width/2);
17386 Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling);
17387 Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling - 1));
17388 Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,0x0000);
17389 Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling - 1));
17390
17391 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, (pSrcInfo->u16V_SizeAfterPreScaling), 0x0FFF);//active_hight after VSD
17392 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, (pSrcInfo->u16V_SizeAfterPreScaling), 0x0FFF);//active_hight after VSD
17393
17394 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6B_L, 0x0005, 0x0005); //[0]pix_sep_en,[2]LR_Alt_line
17395 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6F_L, 0x0109, 0x010F); //resample line phase, [8]enable
17396 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6D_L, 0x8000, 0xFFFF); //resample phase0 coef0/1
17397 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6E_L, 0x4000, 0xFFFF); //resample phase1 coef0/1
17398
17399 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0)); //IPM 3D ENABLE
17400 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7)); //OP 3D ENABLE
17401 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pSrcInfo->stCapWin.height*2, 0x1FFF);
17402 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17403 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17404 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17405 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset/2 + 1) & ~0x1;
17406 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//OPM offset
17407 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17408 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//F1 OPM OFFSET
17409 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch+ 1) & ~0x1, 0x1FFF);//OPM FETCH
17410 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch+ 1) & ~0x1, 0x1FFF);//F1 OPM FETCH
17411
17412 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0003, 0x0013);//reg_lr_chg_mode
17413
17414 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0C03, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
17415 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_29_L, 0x0000, 0xFFFF);//[4:0]reg_ini_max_bot_6tap,[12:8]reg_ini_max_top_6tap,should be 0 in monaco 3D mode
17416 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x8012, 0xBFFF);//reg_hst_f2
17417 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
17418 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x0009, 0x3FFF);//reg_hend_f2
17419 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x000a, 0x3FFF);//reg_hst_f1
17420 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x0011, 0x3FFF);//reg_hend_f1
17421 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
17422 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_02_L,BIT(3), BIT(3));//reg_force_fe2_en
17423 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17424 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
17425 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
17426 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
17427 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17428 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17429
17430 #else
17431
17432 #if (HW_DESIGN_3D_VER >= 3)
17433 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width/2);
17434 if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17435 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17436 #if(HW_DESIGN_3D_VER == 3) //monet mode
17437 //chcckboard use DI linebuffer, need disable fclock
17438 Hal_SC_set_ficlk2(pInstance, CKG_FICLK2_F2_IDCLK2, ENABLE, MAIN_WINDOW);
17439 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17440 #endif
17441 #endif
17442 Hal_SC_3D_SetPixelSeparationWidth(pInstance, pSrcInfo->stCapWin.width/2);
17443 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17444 Hal_SC_3D_SetSplitHalf(pInstance, TRUE);
17445
17446 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6B_L, BIT(0)|BIT(2), BIT(0)|BIT(2)); //[0]pix_sep_en,[2]LR_Alt_line
17447
17448
17449 // TODO: Need to check how to setup resample
17450 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_6D_L, 0x8000); //resample phase0 coef0/1
17451 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_6E_L, 0x4000); //resample phase1 coef0/1
17452 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6F_L, 0x0109, 0x010F); //resample line phase, [8]enable
17453
17454 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0)); //IPM 3D ENABLE
17455 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7)); //OP 3D ENABLE
17456 Hal_SC_set_ficlk2(pInstance, CKG_FICLK2_F2_IDCLK2, ENABLE, MAIN_WINDOW);//chcckboard use DI linebuffer, need disable fclock
17457 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, 0x00, BIT(15));
17458 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17459 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17460 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, BIT(15), BIT(15));
17461
17462 #endif
17463 }
17464 else if(IS_INPUT_PIXEL_ALTERNATIVE(eWindow))
17465 {
17466 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is pixel alternative\n");
17467
17468 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17469 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17470 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset/2 + 1) & ~0x1;
17471 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//OPM offset
17472 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, 0x1FFF);//OPM FETCH
17473 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMOffset, 0x1FFF);//F1 OPM OFFSET
17474 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, 0x1FFF);//F1 OPM FETCH
17475 #ifdef UFO_XC_SUPPORT_3D_DS
17476 if(MDrv_XC_Is_SupportSWDS(pInstance))
17477 {
17478 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK12_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch + 1) & ~0x1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
17479 }
17480 #endif
17481 #ifdef UFO_XC_SUPPORT_DUAL_MIU
17482 if(IsEnableDualMode(eWindow))
17483 {
17484 #ifdef UFO_XC_SUPPORT_3D_DS
17485 if(MDrv_XC_Is_SupportSWDS(pInstance))
17486 {
17487 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM offset
17488 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 IPM fetch number
17489 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM offset
17490 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM fetch number
17491 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM offset
17492 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2_1 OPM fetch number
17493 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2 IPM total fetch
17494 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2 OPM total fetch
17495 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //F2 OPM total fetch
17496
17497 }
17498 else
17499 #endif
17500 {
17501 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_0E_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset), 0x1FFF); //F2_1 IPM offset
17502 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_0F_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch), 0x1FFF); //F2_1 IPM fetch number
17503 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_16_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, 0x1FFF); //F2_1 OPM offset
17504 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_17_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF); //F2_1 OPM fetch number
17505 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_56_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNROffset/2 + 1) & ~0x1, 0x1FFF); //F2_1 OPM offset
17506 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_57_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + 1) & ~0x1, 0x0FFF); //F2_1 OPM fetch number
17507 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_28_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), 0x1FFF); //F2 IPM total fetch
17508 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_29_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF); //F2 OPM total fetch
17509 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_69_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch), 0x1FFF); //F2 OPM total fetch
17510 }
17511 }
17512 #endif
17513
17514 #if(HW_DESIGN_3D_VER == 5) //monaco mode
17515 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0103, 0x0113);//hw 3d TYPE
17516 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17517 Hal_SC_3D_SetInitialLRIndex(pInstance, FALSE);
17518 Hal_SC_3D_SetSplitHalf(pInstance, TRUE);
17519 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width/2);
17520 if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17521 {
17522 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17523 Hal_SC_3D_SetActiveVideoHeight(pInstance,pSrcInfo->stCapWin.height*2);
17524 }
17525
17526 Hal_SC_3D_SetPixelSeparationWidth(pInstance, pSrcInfo->stCapWin.width/2);
17527 Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(pInstance, pSrcInfo->u16V_SizeAfterPreScaling);
17528 Hal_SC_3D_SetSoftware_F2VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling - 1));
17529 Hal_SC_3D_SetSoftware_F1VBottomStartPosition(pInstance,0x0000);
17530 Hal_SC_3D_SetSoftware_F1VBottomEndPosition(pInstance,(pSrcInfo->u16V_SizeAfterPreScaling - 1));
17531
17532 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, (pSrcInfo->u16V_SizeAfterPreScaling), 0x0FFF);//active_hight after VSD
17533 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_16_L, (pSrcInfo->u16V_SizeAfterPreScaling), 0x0FFF);//active_hight after VSD
17534
17535 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6B_L, 0x0001, 0x0005); //[0]pix_sep_en,[2]LR_Alt_line
17536
17537 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6F_L, 0x0105, 0x010F); //resample line phase, [8]enable
17538 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6D_L, 0x8000, 0xFFFF); //resample phase0 coef0/1
17539 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6E_L, 0x4000, 0xFFFF); //resample phase1 coef0/1
17540
17541 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0)); //IPM 3D ENABLE
17542 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7)); //OP 3D ENABLE
17543 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pSrcInfo->stCapWin.height*2, 0x1FFF);
17544 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17545 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0E_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNROffset, 0x1FFF);//dnr offset
17546 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_0F_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch, 0x1FFF);//dnr fetch
17547 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset = (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset/2 + 1) & ~0x1;
17548 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//OPM offset
17549 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17550 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_56_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_ROffset, 0x1FFF);//F1 OPM OFFSET
17551 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch + 1) & ~0x1, 0x1FFF);//OPM FETCH
17552 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_57_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCM_RFetch+ 1) & ~0x1, 0x1FFF);//F1 OPM FETCH
17553
17554 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_23_L, 0x0003, 0x0013);//reg_lr_chg_mode
17555
17556 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_10_L, 0x0C03, 0x0C03);//[0]:reg_main_en, [1]:reg_sw_sub_en, [11]:reg_vblank_sub
17557 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_29_L, 0x0000, 0xFFFF);//[4:0]reg_ini_max_bot_6tap,[12:8]reg_ini_max_top_6tap,should be 0 in monaco 3D mode
17558
17559 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_47_L, 0x8012, 0xBFFF);//reg_hst_f2
17560 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_48_L, 0x0002, 0x3FFF);//reg_hst_f2
17561 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_49_L, 0x0009, 0x3FFF);//reg_hend_f2
17562 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4A_L, 0x000a, 0x3FFF);//reg_hst_f1
17563 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4B_L, 0x0011, 0x3FFF);//reg_hend_f1
17564 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4C_L, 0x0000, 0x0FFF);//reg_vst_f2
17565 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_02_L,BIT(3), BIT(3));//reg_force_fe2_en
17566 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17567 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_30_L,BIT(0), BIT(0));//reg_ipm_3d_en
17568 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L,BIT(7), BIT(7));//reg_opm_3d_en
17569 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L,BIT(7), BIT(7));
17570 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_18_L, pSrcInfo->stCapWin.height*2, 0x1FFF);
17571
17572 #else
17573 Hal_SC_3D_SetActiveVideoWidth(pInstance, pSrcInfo->stCapWin.width/2);
17574 Hal_SC_3D_SetPixelSeparationWidth(pInstance, pSrcInfo->stCapWin.width/2);
17575 #if (HW_DESIGN_3D_VER >= 3)
17576 if((pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32V_PreScalingRatio & BIT(31))>>31)
17577 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, BIT(12), BIT(12));
17578 #if(HW_DESIGN_3D_VER == 3) //monet mode
17579 //chcckboard use DI linebuffer, need disable fclock
17580 Hal_SC_set_ficlk2(pInstance, CKG_FICLK2_F2_IDCLK2, ENABLE, MAIN_WINDOW);
17581 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
17582 #endif
17583 #endif
17584
17585 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, 0x0103, 0x0103);//hw 3d TYPE
17586 Hal_SC_3D_SetLRChgMode(pInstance, E_HAL_SC_3D_LRCHGMODE_LINE);
17587 Hal_SC_3D_SetSplitHalf(pInstance, TRUE);
17588
17589 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6B_L, BIT(0), BIT(0)|BIT(2)); //[0]pix_sep_en,[2]LR_Alt_line
17590
17591
17592 // TODO: Need to check how to setup resample
17593 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_6D_L, 0x8000); //resample phase0 coef0/1
17594 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_6E_L, 0x4000); //resample phase1 coef0/1
17595 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6F_L, 0x0105, 0x010F); //resample line phase, [8]enable
17596
17597 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(0), BIT(0)); //IPM 3D ENABLE
17598 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(7), BIT(7)); //OP 3D ENABLE
17599
17600 Hal_SC_set_ficlk2(pInstance, CKG_FICLK2_F2_IDCLK2, ENABLE, MAIN_WINDOW);//chcckboard use DI linebuffer, need disable fclock;
17601
17602 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit = pSrcInfo->stCapWin.height*2;
17603 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, 0x00, BIT(15));
17604 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VWritelimit, 0x1FFF);
17605 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, BIT(15), BIT(15));
17606
17607 #endif
17608 }
17609
17610 //below is output part
17611 if(IS_OUTPUT_FRAME_ALTERNATIVE())
17612 {
17613 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is FA\n");
17614 {
17615 #if (HW_DESIGN_3D_VER == 4)
17616 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
17617 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);
17618
17619 if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out == E_XC_3D_OUTPUT_FI_960x1080)
17620 {
17621 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart
17622 +(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd-pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart)/2, VOP_DISPLAY_HEND_MASK); // Display H end
17623 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
17624 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 - 1), VOP_DE_HEND_MASK);
17625 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1), VOP_DE_VEND_MASK);
17626 }
17627 else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out == E_XC_3D_OUTPUT_FI_1920x540)
17628 {
17629 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
17630 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd-pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart)/2, VOP_DISPLAY_VEND_MASK);
17631 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width - 1), VOP_DE_HEND_MASK);
17632 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2 - 1), VOP_DE_VEND_MASK);
17633 }
17634 else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out == E_XC_3D_OUTPUT_FI_1280x720)
17635 {
17636 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width - 1), VOP_DISPLAY_HEND_MASK);
17637 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1), VOP_DISPLAY_VEND_MASK);
17638 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width - 1), VOP_DE_HEND_MASK);
17639 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1), VOP_DE_VEND_MASK);
17640 }
17641 else
17642 {
17643 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
17644 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
17645 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width - 1), VOP_DE_HEND_MASK);
17646 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1), VOP_DE_VEND_MASK);
17647 }
17648 #else
17649 //if output is FP, do not need sub window
17650 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
17651 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK); // Display H end
17652 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);
17653 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
17654 #endif
17655 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(8), BIT(8));//Enable free run 3D LR flag
17656 }
17657 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## stDBreg.u16VLen =%x\n", pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen);
17658 #if (HW_DESIGN_3D_VER == 4)
17659 if(IS_INPUT_TOP_BOTTOM(eWindow))
17660 {
17661 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen/2;
17662 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for second channel
17663 }
17664 else
17665 #endif
17666 {
17667 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for second channel
17668 }
17669 Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, FALSE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);//HDMI 3D field select toggle enable
17670 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
17671 // TODO: need to double check
17672 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, FALSE, BIT(0)); // False: L flag is first, True: R flag is first
17673 //Set SRAM to linear mode
17674 if (IsVMirrorMode(eWindow))
17675 {
17676 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0B_L, 0x303);
17677 }
17678
17679 if(pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA)//output FA_LLRR for 4k0.5k@240Hz
17680 {
17681 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is FA LLRR \n");
17682 Hal_SC_3D_enable_FALLRR_out(pInstance, TRUE);
17683 #if (HW_DESIGN_3D_VER == 3) && (HW_DESIGN_4K2K_VER != 7) //manhattan mode
17684 // 4k2k needs more time to train data so we need to delay the display time
17685 pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = VALUE_AUTO_TUNE_AREA_TRIG_4K540P;
17686 pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_DISP_AREA_TRIG] = VALUE_DISP_AREA_TRIG_4K540P;
17687 pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = TRUE;
17688 pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_DISP_AREA_TRIG] = TRUE;
17689 #endif
17690 }
17691
17692 #if(HW_DESIGN_3D_VER == 5) //monaco mode
17693 Hal_SC_set_fmclk(psXCInstPri, ENABLE);
17694 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(6), BIT(6));//[6]:reg_opm_ext_lr_sel
17695 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, BIT(1), BIT(1));//reg_force_f2
17696 #endif
17697 #if(HW_2DTO3D_VER == 4)
17698 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_64_L, BIT(5), BIT(5)); //pixel base active 3d
17699 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_50_L, BIT(14), BIT(14)); //block base active 3d
17700 #endif
17701
17702 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17703 Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
17704 #endif
17705
17706 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
17707 if (Hal_SC_3D_IsDualViewMode(pInstance,eWindow))
17708 {
17709 Hal_SC_3D_Set_DualView(pInstance,TRUE);
17710 }
17711 #endif
17712 }
17713 else if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_TOP_BOTTOM_HW())
17714 {
17715 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is TBP\n");
17716 MS_U16 u16VactVideo, u16VactSpace;
17717 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, DISABLE);
17718
17719 #ifdef UFO_XC_SUPPORT_3D_DS
17720 if(MDrv_XC_Is_SupportSWDS(pInstance))
17721 {
17722 if (IsVMirrorMode(eWindow))
17723 {
17724 #ifdef TBP_1920X2160_OUTPUT
17725 if((IS_INPUT_FRAME_PACKING(eWindow))&&
17726 ((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)||
17727 (pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)))
17728 {
17729 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
17730 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H end
17731 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
17732 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17733 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
17734 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17735 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17736 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd*2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17737 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17738 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
17739 {
17740 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17741 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height-1, SUB_WINDOW);
17742 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17743 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd*2-1, MAIN_WINDOW);
17744 }
17745 #endif
17746 }
17747 else
17748 #endif
17749 {
17750 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
17751 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H end
17752 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17753 if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
17754 {
17755 if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
17756 {
17757 u16VSubDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + u16VDispwinOffset*2;
17758 u16VSubDisEnd = u16VSubDisStart + pSrcInfo->stDispWin.height/2-1;
17759 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, u16VSubDisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
17760 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, u16VSubDisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17761 }
17762 else
17763 {
17764 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
17765 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17766 }
17767 }
17768 else
17769 #endif
17770 {
17771 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
17772 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17773 }
17774
17775 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
17776 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17777 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart
17778 + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2 + pSrcInfo->stDispWin.height/2) - 1;
17779 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17780 if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
17781 {
17782 if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
17783 {
17784 u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + u16VDispwinOffset*2 \
17785 + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
17786 u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height/2 -1;
17787 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, u16VMainDisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17788 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, u16VMainDisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17789 }
17790 else if(IS_OUTPUT_4K2K_60HZ_PANEL())
17791 {
17792 if(pXCResourcePrivate->stdrvXC_3D._bLAToTB)
17793 {
17794 u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + u16VDispwinOffset*2;
17795 u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height -1;
17796 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, u16VMainDisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17797 if (u16VMainDisStart == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
17798 {
17799 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, u16VMainDisEnd+1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //"+1" is hw bug
17800 }
17801 else
17802 {
17803 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, u16VMainDisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17804 }
17805 }
17806 }
17807 else
17808 {
17809 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17810 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17811 }
17812 }
17813 else
17814 #endif
17815 {
17816 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17817 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17818 }
17819
17820 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17821 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
17822 {
17823 if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
17824 {
17825 if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
17826 {
17827 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17828 MHal_SWDS_AddTGENMdeStartEndY(pInstance, u16VSubDisStart, u16VSubDisEnd, SUB_WINDOW);
17829 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17830 MHal_SWDS_AddTGENMdeStartEndY(pInstance, u16VMainDisStart, u16VMainDisEnd, MAIN_WINDOW);
17831 }
17832 else
17833 {
17834 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17835 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd + pSrcInfo->stDispWin.height/2-1, SUB_WINDOW);
17836 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17837 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
17838 }
17839 }
17840 else
17841 {
17842 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17843 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd + pSrcInfo->stDispWin.height/2-1, SUB_WINDOW);
17844 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17845 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
17846 }
17847 }
17848 #endif
17849 }
17850
17851 }
17852 else
17853 {
17854 #ifdef TBP_1920X2160_OUTPUT
17855 if((IS_INPUT_FRAME_PACKING(eWindow))&&
17856 ((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)||
17857 (pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)))
17858 {
17859 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
17860 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17861 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17862 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd*2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17863 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
17864 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H end
17865 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
17866 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17867 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17868 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
17869 {
17870 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17871 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd*2-1, SUB_WINDOW);
17872 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17873 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height-1, MAIN_WINDOW);
17874 }
17875 #endif
17876 }
17877 else
17878 #endif
17879 {
17880 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
17881 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17882 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart
17883 + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2 + pSrcInfo->stDispWin.height/2) - 1;
17884 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17885 if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
17886 {
17887 if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
17888 {
17889 u16VSubDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + u16VDispwinOffset*2 \
17890 + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height -1;
17891 u16VSubDisEnd = u16VSubDisStart + pSrcInfo->stDispWin.height/2 -1;
17892 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, u16VSubDisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17893 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, u16VSubDisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17894 }
17895 else
17896 {
17897 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17898 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17899 }
17900 }
17901 else
17902 #endif
17903 {
17904 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17905 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17906 }
17907
17908 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
17909 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H end
17910
17911 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17912 if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
17913 {
17914 if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
17915 {
17916 u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + u16VDispwinOffset*2;
17917 u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height/2-1;
17918 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, u16VMainDisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
17919 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, u16VMainDisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17920 }
17921 else if(IS_OUTPUT_4K2K_60HZ_PANEL())
17922 {
17923 if(pXCResourcePrivate->stdrvXC_3D._bLAToTB)
17924 {
17925 u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + u16VDispwinOffset*2;
17926 u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height -1;
17927 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, u16VMainDisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17928 if (u16VMainDisEnd == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
17929 {
17930 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, u16VMainDisEnd+1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //"+1" is hw bug
17931 }
17932 else
17933 {
17934 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, u16VMainDisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17935 }
17936 }
17937 }
17938 else
17939 {
17940 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
17941 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17942 }
17943 }
17944 else
17945 #endif
17946 {
17947 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
17948 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
17949 }
17950
17951 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
17952 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
17953 {
17954 if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
17955 {
17956 if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
17957 {
17958 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17959 MHal_SWDS_AddTGENMdeStartEndY(pInstance, u16VSubDisStart, u16VSubDisEnd, SUB_WINDOW);
17960 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17961 MHal_SWDS_AddTGENMdeStartEndY(pInstance, u16VMainDisStart, u16VMainDisEnd, MAIN_WINDOW);
17962 }
17963 else
17964 {
17965 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17966 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
17967 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17968 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, MAIN_WINDOW);
17969 }
17970 }
17971 else
17972 {
17973 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
17974 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
17975 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
17976 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, MAIN_WINDOW);
17977 }
17978 }
17979 #endif
17980 }
17981 }
17982 }
17983 else
17984 #endif
17985 {
17986 if (IsVMirrorMode(eWindow))
17987 {
17988 #ifdef TBP_1920X2160_OUTPUT
17989 if((IS_INPUT_FRAME_PACKING(eWindow))&&
17990 ((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)||
17991 (pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)))
17992 {
17993 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF); // Display H start
17994 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF); // Display H end
17995 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);//Sub window display window
17996 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height-1, 0x1FFF);
17997 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK);//Main window display window
17998 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
17999 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height, VOP_DISPLAY_VSTART_MASK);
18000 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd*2-1, VOP_DISPLAY_VEND_MASK);
18001 }
18002 else
18003 #endif
18004 {
18005
18006 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF); // Display H start
18007 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF); // Display H end
18008 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18009 if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
18010 {
18011 if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
18012 {
18013 u16VSubDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + u16VDispwinOffset*2;
18014 u16VSubDisEnd = u16VSubDisStart + pSrcInfo->stDispWin.height/2-1;
18015 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, u16VSubDisStart, VOP_DISPLAY_VSTART_MASK);//Sub window display window
18016 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, u16VSubDisEnd, VOP_DISPLAY_VEND_MASK);
18017 }
18018 else
18019 {
18020 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);//Sub window display window
18021 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, 0x1FFF);
18022 }
18023 }
18024 else
18025 #endif
18026 {
18027 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);//Sub window display window
18028 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, 0x1FFF);
18029 }
18030
18031 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK);//Main window display window
18032 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
18033 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart
18034 + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2 + pSrcInfo->stDispWin.height/2) - 1;
18035 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18036 if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
18037 {
18038 if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
18039 {
18040 u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + u16VDispwinOffset*2 \
18041 + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
18042 u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height/2 -1;
18043 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, u16VMainDisStart, 0x1FFF);
18044 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, u16VMainDisEnd, 0x1FFF);
18045 }
18046 else if(IS_OUTPUT_4K2K_60HZ_PANEL())
18047 {
18048 if(pXCResourcePrivate->stdrvXC_3D._bLAToTB)
18049 {
18050 u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + u16VDispwinOffset*2;
18051 u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height -1;
18052 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, u16VMainDisStart, VOP_DISPLAY_VEND_MASK);
18053 if (u16VMainDisEnd == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
18054 {
18055 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, u16VMainDisEnd+1, VOP_DISPLAY_VEND_MASK); //"+1" is hw bug
18056 }
18057 else
18058 {
18059 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, u16VMainDisEnd, VOP_DISPLAY_VEND_MASK);
18060 }
18061 }
18062 }
18063 else
18064 {
18065 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, VOP_DISPLAY_VSTART_MASK);
18066 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18067 }
18068 }
18069 else
18070 #endif
18071 {
18072 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, VOP_DISPLAY_VSTART_MASK);
18073 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18074 }
18075 }
18076
18077 }
18078 else
18079 {
18080 #ifdef TBP_1920X2160_OUTPUT
18081 if((IS_INPUT_FRAME_PACKING(eWindow))&&
18082 ((pSrcInfo->stCapWin.height == DOUBLEHD_1080X2P_VSIZE)||
18083 (pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE)))
18084 {
18085 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);//Sub window display window
18086 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18087 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height, 0x1FFF);
18088 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd*2-1, 0x1FFF);
18089 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
18090 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK); // Display H end
18091 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18092 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height-1, VOP_DISPLAY_VEND_MASK);
18093 }
18094 else
18095 #endif
18096 {
18097 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);//Sub window display window
18098 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18099 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart
18100 + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2 + pSrcInfo->stDispWin.height/2) -1;
18101 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18102 if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
18103 {
18104 if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
18105 {
18106 u16VSubDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + u16VDispwinOffset*2 \
18107 + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
18108 u16VSubDisEnd = u16VSubDisStart + pSrcInfo->stDispWin.height/2 -1;
18109 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, u16VSubDisStart, 0x1FFF);
18110 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, u16VSubDisEnd, 0x1FFF);
18111 }
18112 else
18113 {
18114 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, 0x1FFF);
18115 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18116 }
18117 }
18118 else
18119 #endif
18120 {
18121 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2, 0x1FFF);
18122 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18123 }
18124
18125 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
18126 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK); // Display H end
18127
18128 if(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_TOP_TOP)
18129 {
18130 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(10), BIT(10));
18131 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(8));
18132 }
18133 else if(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_BOTTOM_BOTTOM)
18134 {
18135 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(10), BIT(10));
18136 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(8), BIT(8));
18137 }
18138 else
18139 {
18140 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(10));
18141 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(8));
18142 }
18143
18144 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18145 if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
18146 {
18147 if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
18148 {
18149 u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + u16VDispwinOffset*2;
18150 u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height/2-1;
18151 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, u16VMainDisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18152 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, u16VMainDisEnd, VOP_DISPLAY_VEND_MASK);
18153 }
18154 else if(IS_OUTPUT_4K2K_60HZ_PANEL())
18155 {
18156 if(pXCResourcePrivate->stdrvXC_3D._bLAToTB)
18157 {
18158 u16VMainDisStart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + u16VDispwinOffset*2;
18159 u16VMainDisEnd = u16VMainDisStart + pSrcInfo->stDispWin.height -1;
18160 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, u16VMainDisStart, VOP_DISPLAY_VEND_MASK);
18161 if (u16VMainDisEnd == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
18162 {
18163 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, u16VMainDisEnd+1, VOP_DISPLAY_VEND_MASK); //"+1" is hw bug
18164 }
18165 else
18166 {
18167 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, u16VMainDisEnd, VOP_DISPLAY_VEND_MASK);
18168 }
18169 }
18170 }
18171 else
18172 {
18173 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18174 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, VOP_DISPLAY_VEND_MASK);
18175 }
18176 }
18177 else
18178 #endif
18179 {
18180 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18181 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + pSrcInfo->stDispWin.height/2-1, VOP_DISPLAY_VEND_MASK);
18182 }
18183 }
18184 }
18185 }
18186 #if(HW_DESIGN_3D_VER == 5) //monaco mode
18187 Hal_SC_set_fmclk(psXCInstPri, ENABLE);
18188 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32FRCM_RBase0);
18189 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);
18190 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);
18191 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, BIT(1), BIT(1));//reg_force_f2
18192 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_13_L, BIT(10), BIT(10));//pip
18193 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18194 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18195 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset &= ~0x1;
18196 #else
18197 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18198 if (!Hal_SC_3D_IsDualViewMode(pInstance,eWindow)) // dual view mode need to skip
18199 #endif
18200 {
18201 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(11), BIT(11)); //h3d_opm, sub win follow main's read bank
18202 }
18203 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase0);
18204 #ifdef UFO_XC_SUPPORT_DUAL_MIU
18205 if(IsEnableDualMode(eWindow))
18206 {
18207 Hal_SC_set_Dual_OPMBase0(pInstance, (MS_PHY)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DualOPMBase0*BYTE_PER_WORD), SUB_WINDOW);
18208 }
18209 #endif
18210 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for second channel
18211 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for first channel
18212 #if(HW_DESIGN_3D_VER == 3) //monet mode
18213 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_13_L, BIT(10), BIT(10));//pip
18214 #endif
18215 #endif
18216 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18217 if(Hal_SC_3D_IsDualViewMode(pInstance, eWindow))
18218 {
18219 if(psXCInstPri->u32DeviceID == 0)
18220 {
18221 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18222 }
18223 else
18224 {
18225 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18226 }
18227 }
18228 else
18229 #endif
18230 {
18231 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18232 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18233 }
18234 //Set SRAM to linear mode
18235 if (IsVMirrorMode(eWindow))
18236 {
18237 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0B_L, 0x303);
18238 }
18239
18240 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18241 if(!Hal_SC_3D_IsDualViewMode(pInstance, eWindow))
18242 #endif
18243 {
18244 MDrv_XC_3D_CfgSubWin(pInstance, ENABLE);
18245 }
18246 #if(SUPPORT_SC0_SUB_WIN == FALSE)
18247 MS_U16 u16SubLinebufferStart = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_13_L, 0x1FFF);//The starting address of F1 stored at line buffer
18248 MS_U16 u16MainLinebufferStart = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_12_L, 0x1FFF);//The starting address of F2 stored at line buffer
18249 if(!MDrv_SC_3D_Is2TapModeSupportedFormat(pInstance, pSrcInfo, eWindow) && (u16SubLinebufferStart == u16MainLinebufferStart))
18250 {
18251 //monet top/bot 3d mode using the same buffer
18252 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_23_L, BIT(11), BIT(11));
18253 }
18254 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18255 if(!Hal_SC_3D_IsDualViewMode(pInstance, eWindow))
18256 #endif
18257 {
18258 //monet has no pip
18259 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0, BIT(11));
18260 }
18261 #endif
18262
18263 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18264 Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
18265 Hal_SC_3D_CopyDispWinToSTGEN(pInstance, SUB_WINDOW);
18266
18267 if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
18268 {
18269 if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
18270 {
18271 #if(HW_2DTO3D_VER == 4)
18272 //masearti manhattan mode FRC output FA
18273 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_64_L, BIT(5), BIT(5)); //pixel base active 3d
18274 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_50_L, BIT(14), BIT(14)); //block base active 3d
18275 #endif
18276 if(bChangeDisplaySize)//restore dispwin
18277 {
18278 // force 4k2k to FSC case, but bk10 display window need to be original size 4k1k
18279 gSrcInfo[eWindow].stDispWin.y = gSrcInfo[eWindow].stDispWin.y/2;
18280 gSrcInfo[eWindow].stDispWin.height = gSrcInfo[eWindow].stDispWin.height/2;
18281 bChangeDisplaySize = FALSE;
18282
18283 // for custom scaling case
18284 if(gSrcInfo[eWindow].bVCusScaling)
18285 {
18286 gSrcInfo[eWindow].u16VCusScalingDst = gSrcInfo[eWindow].u16VCusScalingDst/2;
18287 }
18288 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"change DispWin x: %4u W: %4u y: %4u H: %4u ,u16VCusScalingDst : %u\n",
18289 gSrcInfo[eWindow].stDispWin.x,
18290 gSrcInfo[eWindow].stDispWin.width,
18291 gSrcInfo[eWindow].stDispWin.y,
18292 gSrcInfo[eWindow].stDispWin.height,
18293 gSrcInfo[eWindow].u16VCusScalingDst);
18294 }
18295 }
18296 }
18297 #endif
18298 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18299 if (Hal_SC_3D_IsDualViewMode(pInstance,eWindow))
18300 {
18301 Hal_SC_3D_Set_DualView(pInstance,TRUE);
18302 }
18303 #endif
18304 }
18305 else if(IS_OUTPUT_LINE_ALTERNATIVE())
18306 {
18307 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is LA\n");
18308 #ifdef UFO_XC_SUPPORT_3D_DS
18309 if(MDrv_XC_Is_SupportSWDS(pInstance))
18310 {
18311 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
18312 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18313 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18314 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18315
18316 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
18317 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H end
18318 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
18319 if (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
18320 {
18321 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd+1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //"+1" is hw bug
18322 }
18323 else
18324 {
18325 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18326 }
18327 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18328 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18329 {
18330 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18331 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
18332 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18333 if (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
18334 {
18335 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd+1, MAIN_WINDOW);
18336 }
18337 else
18338 {
18339 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
18340 }
18341 }
18342 #endif
18343 }
18344 else
18345 #endif
18346 {
18347 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);//Sub window display window
18348 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18349 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);
18350 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18351
18352 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
18353 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK); // Display H end
18354 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18355 if (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
18356 {
18357 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd+1, VOP_DISPLAY_VEND_MASK); //"+1" is hw bug
18358 }
18359 else
18360 {
18361 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18362 }
18363 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18364 #ifdef UFO_XC_SUPPORT_3D_DS
18365 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18366 {
18367 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18368 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
18369 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18370
18371 if (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd == (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - 1))
18372 {
18373 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd+1, MAIN_WINDOW);
18374 }
18375 else
18376 {
18377 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
18378 }
18379 }
18380 #endif
18381 #endif
18382 }
18383 #if(HW_DESIGN_3D_VER == 5) //monaco mode
18384 Hal_SC_set_fmclk(psXCInstPri, ENABLE);
18385 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, BIT(1), BIT(1));//reg_force_f2
18386 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_13_L, BIT(10), BIT(10));//pip
18387 #endif
18388 #if((HW_DESIGN_3D_VER == 3) || (HW_DESIGN_3D_VER == 5))//monaco/monet/manhattan mode
18389 // 4k2k needs more time to train data so we need to delay the display time
18390 // this is special in line alternative out
18391 if ( (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width > 3800)
18392 && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height > 2100))
18393 {
18394 #if (SUPPORT_3D_DS == 0)
18395 if ( MDrv_XC_GetDynamicScalingStatus(pInstance) == FALSE)
18396 #endif
18397 {
18398 pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = 0x14;
18399 pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_DISP_AREA_TRIG] = 0x18;
18400 pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = TRUE;
18401 pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_DISP_AREA_TRIG] = TRUE;
18402 }
18403 }
18404 #endif
18405 #if(HW_DESIGN_3D_VER == 3) //monet mode
18406 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_13_L, BIT(10), BIT(10));//pip
18407 #endif
18408 #if 0
18409 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(11), BIT(11)); //h3d_opm, sub win follow main's read bank
18410 #else
18411 ///for 3D film issue
18412 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x00, BIT(11)); //h3d_opm, sub win follow main's read bank
18413 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18414 if (!Hal_SC_3D_IsDualViewMode(pInstance,eWindow)) // dual view mode need to skip
18415 #endif
18416 {
18417 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_14_L, 0x8000);
18418 }
18419 //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x00, BIT(11)); // Sub ahead need to disable when memory allocate is SBS
18420 #endif
18421 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase0);//F1 OPM BASE0 sub
18422 #ifdef UFO_XC_SUPPORT_DUAL_MIU
18423 if(IsEnableDualMode(eWindow))
18424 {
18425 Hal_SC_set_Dual_OPMBase0(pInstance, (MS_PHY)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DualOPMBase0*BYTE_PER_WORD), SUB_WINDOW);
18426 }
18427 #endif
18428
18429 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for second channel, added for protect
18430 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for first channel
18431
18432 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_53_L, 0x8000, 0x8000);// 3D LR side-by-side to line-to-line enable
18433 #if(HW_DESIGN_3D_VER == 5) //monaco mode
18434 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset &= ~0x1;
18435 #endif
18436 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18437 if(Hal_SC_3D_IsDualViewMode(pInstance, eWindow))
18438 {
18439 //Main and Sub should load different LB offset at dual view mode
18440 if(psXCInstPri->u32DeviceID == 0)
18441 {
18442 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18443 }
18444 else
18445 {
18446 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18447 }
18448 }
18449 else
18450 #endif
18451 {
18452 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18453 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18454 }
18455 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18456 if(!Hal_SC_3D_IsDualViewMode(pInstance, eWindow))
18457 #endif
18458 {
18459 MDrv_XC_3D_CfgSubWin(pInstance, ENABLE);
18460 }
18461 //if mvop mirror, main/sub window will get switched frame, so need do LR exchange
18462 //field alternative and frame alternative input don't need do this, since main/sub
18463 //window still get the original frame
18464 if((!IS_INPUT_FIELD_ALTERNATIVE(eWindow))
18465 && (!IS_INPUT_FRAME_ALTERNATIVE(eWindow)))
18466 {
18467 if(MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1)))
18468 {
18469 if (MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
18470 {
18471 MDrv_XC_Set_3D_LR_Frame_Exchg_burst(pInstance, eWindow);
18472 }
18473 else
18474 {
18475 MDrv_XC_Set_3D_LR_Frame_Exchg(pInstance, eWindow);
18476 }
18477 }
18478 }
18479
18480 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18481 Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
18482 Hal_SC_3D_CopyDispWinToSTGEN(pInstance, SUB_WINDOW);
18483 #endif
18484
18485 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
18486 if (Hal_SC_3D_IsDualViewMode(pInstance,eWindow))
18487 {
18488 Hal_SC_3D_Set_DualView(pInstance,TRUE);
18489 }
18490 #endif
18491 }
18492 else if(IS_OUTPUT_FRAME_L())
18493 {
18494 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is L\n");
18495 MS_U16 u16VactVideo, u16VactSpace;
18496 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, DISABLE);
18497
18498 MDrv_XC_3D_CfgSubWin(pInstance, DISABLE);
18499 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
18500 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK); // Display H end
18501 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18502 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18503 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height- 1, VOP_DE_VEND_MASK);
18504
18505 if(IS_INPUT_FRAME_PACKING(eWindow)&&(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE))
18506 {
18507 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen*2, 0x0FFF);//Set the maximum request lines for second channel, added for protect
18508 }
18509 else
18510 {
18511 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for second channel, added for protect
18512 }
18513 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18514
18515 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18516 Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
18517 #endif
18518 }
18519 else if(IS_OUTPUT_FRAME_R())
18520 {
18521 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is R\n");
18522 MS_U16 u16VactVideo, u16VactSpace;
18523 MDrv_SC_3D_GetFP_Info(pInstance, pSrcInfo, &u16VactVideo, &u16VactSpace, DISABLE);
18524
18525 #ifdef UFO_XC_SUPPORT_3D_DS
18526 if(MDrv_XC_Is_SupportSWDS(pInstance))
18527 {
18528 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
18529 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18530 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18531 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18532 }
18533 else
18534 #endif
18535 {
18536 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);//Sub window display window
18537 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18538 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);
18539 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18540 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height- 1, VOP_DE_VEND_MASK);
18541 }
18542 #if(HW_DESIGN_3D_VER == 5) //monaco mode
18543 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_33_L, BIT(11), BIT(11)); //h3d_opm, sub win follow main's read bank
18544 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32FRCM_RBase0);//F1 FRCM_R BASE0
18545 #else
18546 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(11), BIT(11)); //h3d_opm, sub win follow main's read bank
18547 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase0);//F1 OPM BASE0
18548 #endif
18549
18550 #ifdef UFO_XC_SUPPORT_DUAL_MIU
18551 if(IsEnableDualMode(eWindow))
18552 {
18553 Hal_SC_set_Dual_OPMBase0(pInstance, (MS_PHY)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DualOPMBase0*BYTE_PER_WORD), SUB_WINDOW);
18554 }
18555 #endif
18556
18557 if(IS_INPUT_FRAME_PACKING(eWindow)&&(pSrcInfo->stCapWin.height == DOUBLEHD_1080X2I_VSIZE))
18558 {
18559 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen*2, 0x0FFF);//Set the maximum request lines for second channel, added for protect
18560 if (IsVMirrorMode(eWindow))
18561 {
18562 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_64_L, 0x00, 0x30); //Patch
18563 }
18564 }
18565 else
18566 {
18567 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for first channel
18568 }
18569 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18570 MDrv_XC_3D_CfgSubWin(pInstance, ENABLE);
18571
18572 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18573 Hal_SC_3D_CopyDispWinToSTGEN(pInstance, SUB_WINDOW);
18574 #endif
18575 }
18576 else if(IS_OUTPUT_SIDE_BY_SIDE_HALF() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
18577 {
18578 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is SBSH\n");
18579 #ifdef UFO_XC_SUPPORT_3D_DS
18580 if(MDrv_XC_Is_SupportSWDS(pInstance))
18581 {
18582 if (IsVMirrorMode(eWindow))
18583 {
18584 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
18585 {
18586 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18587 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18588 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//sub window display window
18589 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18590 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18591 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart
18592 + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 + pSrcInfo->stDispWin.width/2)-1;
18593 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18594 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18595 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18596 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18597 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18598 {
18599 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, SUB_WINDOW);
18600 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, SUB_WINDOW);
18601 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18602 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, MAIN_WINDOW);
18603 }
18604 #endif
18605 }
18606 else
18607 {
18608 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18609 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18610 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//sub window display window
18611 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18612 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18613 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18614 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18615 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18616 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18617 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18618 {
18619 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, SUB_WINDOW);
18620 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
18621 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18622 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
18623 }
18624 #endif
18625 }
18626 }
18627 else
18628 {
18629 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
18630 {
18631 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18632 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd= pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart
18633 + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 + pSrcInfo->stDispWin.width/2)-1;
18634 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18635 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18636 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18637 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18638 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18639 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
18640 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18641 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18642 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18643 {
18644 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18645 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, SUB_WINDOW);
18646 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, MAIN_WINDOW);
18647 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, MAIN_WINDOW);
18648 }
18649 #endif
18650 }
18651 else
18652 {
18653 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18654 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd= pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart
18655 + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 + pSrcInfo->stDispWin.width/2)-1;
18656 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18657 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18658 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18659 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18660 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18661 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
18662 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18663 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18664 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18665 {
18666 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18667 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
18668 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, MAIN_WINDOW);
18669 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
18670 }
18671 #endif
18672 }
18673 }
18674
18675 }
18676 else
18677 #endif
18678 {
18679 if (IsVMirrorMode(eWindow))
18680 {
18681 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
18682 {
18683 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);
18684 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, 0x3FFF);
18685 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);//sub window display window
18686 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, 0x1FFF);
18687 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, VOP_DISPLAY_HSTART_MASK);
18688 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart
18689 + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 + pSrcInfo->stDispWin.width/2)-1;
18690 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
18691 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);
18692 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, VOP_DISPLAY_VEND_MASK);
18693 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2)-1, VOP_DE_VEND_MASK);
18694 }
18695 else
18696 {
18697 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);
18698 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, 0x3FFF);
18699 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);//sub window display window
18700 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18701 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2, VOP_DISPLAY_HSTART_MASK);
18702 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
18703 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);
18704 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18705 }
18706 }
18707 else
18708 {
18709 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
18710 {
18711 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, 0x3FFF);
18712 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd= pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart
18713 + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 + pSrcInfo->stDispWin.width/2)-1;
18714 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18715 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);
18716 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, 0x1FFF);
18717 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK);
18718 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, VOP_DISPLAY_HEND_MASK);
18719 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18720 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart+ pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd)/2, VOP_DISPLAY_VEND_MASK);
18721 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2)-1, VOP_DE_VEND_MASK);
18722 }
18723 else
18724 {
18725 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2, 0x3FFF);
18726 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd= pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart
18727 + (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 + pSrcInfo->stDispWin.width/2)-1;
18728 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18729 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);
18730 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18731 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK);
18732 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + pSrcInfo->stDispWin.width/2-1, VOP_DISPLAY_HEND_MASK);
18733 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18734 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18735 }
18736 }
18737 }
18738
18739 #if 0
18740 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(11), BIT(11)); //h3d_opm, sub win follow main's read bank
18741 #else
18742 ///for 3D film issue
18743 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0x00, BIT(11)); //h3d_opm, sub win follow main's read bank
18744 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_14_L, 0x8000);
18745 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0x00, BIT(11)); // Sub ahead need to disable when memory allocate is SBS
18746 #endif
18747
18748 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase0);
18749 #ifdef UFO_XC_SUPPORT_DUAL_MIU
18750 if(IsEnableDualMode(eWindow))
18751 {
18752 Hal_SC_set_Dual_OPMBase0(pInstance, (MS_PHY)pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DualOPMBase0*(BYTE_PER_WORD), SUB_WINDOW);
18753 }
18754 #endif
18755
18756 #if(HW_DESIGN_3D_VER == 5) //monaco mode
18757 Hal_SC_set_fmclk(psXCInstPri, ENABLE);
18758 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(11), BIT(11)); //h3d_opm, sub win follow main's read bank
18759 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_18_L, BIT(1), BIT(1));//reg_force_f2
18760 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_13_L, BIT(10), BIT(10));//pip
18761 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);
18762 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);
18763 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset &= ~0x1;
18764 #else
18765 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);
18766 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);
18767 #if(HW_DESIGN_3D_VER == 3) //monet mode
18768 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_13_L, BIT(10), BIT(10));//pip
18769 #endif
18770 #endif
18771
18772 if(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_LEFT_LEFT)
18773 {
18774 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(10), BIT(10));
18775 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(8));
18776 }
18777 else if(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_RIGHT_RIGHT)
18778 {
18779 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(10), BIT(10));
18780 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(8), BIT(8));
18781 }
18782 else
18783 {
18784 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(10));
18785 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(8));
18786 }
18787
18788 #if((HW_DESIGN_3D_VER == 3) || (HW_DESIGN_3D_VER == 5))//monaco/monet/manhattan mode
18789 // 4k2k needs more time to train data so we need to delay the display time
18790 // this is special in line alternative out
18791 if ( (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width > 3800)
18792 && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height > 2100))
18793 {
18794 #if (SUPPORT_3D_DS == 0)
18795 if ( MDrv_XC_GetDynamicScalingStatus(pInstance) == FALSE)
18796 #endif
18797 {
18798 pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = 0x14;
18799 pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_DISP_AREA_TRIG] = 0x18;
18800 pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = TRUE;
18801 pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_DISP_AREA_TRIG] = TRUE;
18802 }
18803 }
18804 #endif
18805 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18806 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18807 //Set SRAM to linear mode
18808 if (IsVMirrorMode(eWindow))
18809 {
18810 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0B_L, 0x303);
18811 }
18812
18813 MDrv_XC_3D_CfgSubWin(pInstance, ENABLE);
18814
18815 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18816 Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
18817 Hal_SC_3D_CopyDispWinToSTGEN(pInstance, SUB_WINDOW);
18818 #endif
18819 }
18820 else if (IS_OUTPUT_FRAME_PACKING())
18821 {
18822 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is FPP\n");
18823 #ifdef UFO_XC_SUPPORT_3D_DS
18824 if(MDrv_XC_Is_SupportSWDS(pInstance))
18825 {
18826 if (IsVMirrorMode(eWindow))
18827 {
18828 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_1080X2P_VSIZE)
18829 {
18830 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
18831 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H end
18832 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
18833 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18834 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
18835 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18836 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE + DOUBLEHD_1080X2P_GARBAGE_VSIZE, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18837 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_VSIZE -1;
18838 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18839 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18840 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18841 {
18842 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18843 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE, SUB_WINDOW);
18844 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18845 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE + DOUBLEHD_1080X2P_GARBAGE_VSIZE, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
18846 }
18847 #endif
18848 }
18849 else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_720X2P_VSIZE)
18850 {
18851 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
18852 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H end
18853 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
18854 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18855 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
18856 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18857 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE + DOUBLEHD_720X2P_GARBAGE_VSIZE, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18858 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_VSIZE -1;
18859 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18860 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18861 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18862 {
18863 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18864 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE, SUB_WINDOW);
18865 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18866 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE + DOUBLEHD_720X2P_GARBAGE_VSIZE, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, MAIN_WINDOW);
18867 }
18868 #endif
18869 }
18870
18871 }
18872 else
18873 {
18874 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_1080X2P_VSIZE)
18875 {
18876 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
18877 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18878 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE + DOUBLEHD_1080X2P_GARBAGE_VSIZE, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18879 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_VSIZE -1;
18880 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18881 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
18882 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H end
18883 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
18884 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18885 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18886 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18887 {
18888 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18889 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE + DOUBLEHD_1080X2P_GARBAGE_VSIZE, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
18890 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18891 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE-1, MAIN_WINDOW);
18892 }
18893 #endif
18894 }
18895 else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_720X2P_VSIZE)
18896 {
18897 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Sub window display window
18898 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18899 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE + DOUBLEHD_720X2P_GARBAGE_VSIZE, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18900 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_VSIZE -1;
18901 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18902 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H start
18903 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // Display H end
18904 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//Main window display window
18905 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE-1, DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
18906 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
18907 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
18908 {
18909 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, SUB_WINDOW);
18910 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE + DOUBLEHD_720X2P_GARBAGE_VSIZE, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, SUB_WINDOW);
18911 MHal_SWDS_AddTGENMdeStartEndX(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, MAIN_WINDOW);
18912 MHal_SWDS_AddTGENMdeStartEndY(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE-1, MAIN_WINDOW);
18913 }
18914 #endif
18915 }
18916 }
18917 }
18918 else
18919 #endif
18920 {
18921 if (IsVMirrorMode(eWindow))
18922 {
18923 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_1080X2P_VSIZE)
18924 {
18925 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF); // Display H start
18926 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF); // Display H end
18927 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);//Sub window display window
18928 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE, 0x1FFF);
18929 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK);//Main window display window
18930 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
18931 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE + DOUBLEHD_1080X2P_GARBAGE_VSIZE, VOP_DISPLAY_VSTART_MASK);
18932 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_VSIZE -1;
18933 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18934 }
18935 else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_720X2P_VSIZE)
18936 {
18937 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF); // Display H start
18938 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF); // Display H end
18939 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, 0x1FFF);//Sub window display window
18940 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE, 0x1FFF);
18941 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK);//Main window display window
18942 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK);
18943 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE + DOUBLEHD_720X2P_GARBAGE_VSIZE, VOP_DISPLAY_VSTART_MASK);
18944 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_VSIZE -1;
18945 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
18946 }
18947
18948 }
18949 else
18950 {
18951 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_1080X2P_VSIZE)
18952 {
18953 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);//Sub window display window
18954 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18955 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE + DOUBLEHD_1080X2P_GARBAGE_VSIZE, 0x1FFF);
18956 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_VSIZE -1;
18957 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18958 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
18959 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK); // Display H end
18960 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18961 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_1080X2P_FRAME_VSIZE-1, VOP_DISPLAY_VEND_MASK);
18962 }
18963 else if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height ==DOUBLEHD_720X2P_VSIZE)
18964 {
18965 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, 0x3FFF);//Sub window display window
18966 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, 0x3FFF);
18967 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE + DOUBLEHD_720X2P_GARBAGE_VSIZE, 0x1FFF);
18968 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_VSIZE -1;
18969 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, 0x1FFF);
18970 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
18971 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK); // Display H end
18972 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
18973 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart + DOUBLEHD_720X2P_FRAME_VSIZE-1, VOP_DISPLAY_VEND_MASK);
18974 }
18975
18976 }
18977 }
18978 #if (HW_DESIGN_3D_VER == 5)
18979 Hal_SC_set_fmclk(psXCInstPri, ENABLE);
18980 #endif
18981 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(11), BIT(11)); //h3d_opm, sub win follow main's read bank
18982 SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_50_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32OPMBase0);
18983 #ifdef UFO_XC_SUPPORT_DUAL_MIU
18984 if(IsEnableDualMode(eWindow))
18985 {
18986 Hal_SC_set_Dual_OPMBase0(pInstance, (MS_PHY)(pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DualOPMBase0*BYTE_PER_WORD), SUB_WINDOW);
18987 }
18988 #endif
18989
18990 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for second channel
18991 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen, 0x0FFF);//Set the maximum request lines for first channel
18992 #if(HW_DESIGN_3D_VER == 5) //monaco mode
18993 pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset &= ~0x1;
18994 #endif
18995 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF), 0xFF);
18996 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16LBOffset&0xFF)<<8, 0xFF00);
18997 //Set SRAM to linear mode
18998 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0B_L, 0x303);
18999 MDrv_XC_3D_CfgSubWin(pInstance, ENABLE);
19000
19001 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
19002 Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
19003 Hal_SC_3D_CopyDispWinToSTGEN(pInstance, SUB_WINDOW);
19004 #endif
19005 }
19006
19007 _XC_RETURN(pInstance);
19008 #endif
19009
19010 if(((MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type >= E_XC_PNL_LPLL_VBY1_10BIT_4LANE)
19011 &&((MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type <= E_XC_PNL_LPLL_VBY1_8BIT_8LANE))
19012 {
19013 #ifdef SUPPORT_MOD_ADBANK_SEPARATE
19014
19015 #else
19016 if((E_XC_3D_OUTPUT_FRAME_ALTERNATIVE == eOutputMode)
19017 ||(E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_NOFRC == eOutputMode)
19018 ||(E_XC_3D_OUTPUT_FRAME_ALTERNATIVE_HW == eOutputMode))
19019
19020 {
19021 MOD_W2BYTEMSK(REG_MOD_BK00_5A_L, BIT(15), BIT(15));
19022 }
19023 else
19024 {
19025 MOD_W2BYTEMSK(REG_MOD_BK00_5A_L, 0, BIT(15));
19026 }
19027 #endif
19028 }
19029
19030 #if HW_2DTO3D_SUPPORT
19031 MS_PHY u32HW2DTO3D_DD_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf;
19032 MS_PHY u32HW2DTO3D_DR_Buf = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf;
19033
19034 if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf >= HAL_MIU1_BASE)
19035 {
19036 u32HW2DTO3D_DD_Buf -= HAL_MIU1_BASE;
19037 }
19038
19039 if(pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DR_Buf >= HAL_MIU1_BASE)
19040 {
19041 u32HW2DTO3D_DR_Buf -= HAL_MIU1_BASE;
19042 }
19043 #if (HW_2DTO3D_VER < 3) //old 2d to 3d architecture
19044 _XC_ENTRY(pInstance);
19045 //First init all control register to HW init value
19046 if((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod) && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D)
19047 {
19048 //clk
19049 MDrv_WriteRegBit(REG_CKG_FICLK_F1, ENABLE, BIT(6)); //reg_ckg_ficlk_3d
19050 //dd
19051 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, pSrcInfo->stDispWin.width, 0x07FF);//src width
19052 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, pSrcInfo->stDispWin.height, 0x07FF);//src height
19053 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_05_L, 0x7878, 0x7F7F);//dram request number
19054 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, (u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD)>>16, 0x07FF);//dd buffer high 9bit
19055 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_07_L, u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD);//dd buffer low 2 bytes
19056 MDrv_XC_wait_output_vsync(pInstance, 1, 100, eWindow);
19057 #if (HW_2DTO3D_VER < 2)
19058 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, BIT(13)|BIT(15), BIT(13)|BIT(15));//src domain select&start to write miu
19059 #else
19060 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, BIT(15), BIT(13)|BIT(15));//src domain select&start to write miu
19061 #endif
19062 #if (HW_2DTO3D_VER > 0)
19063 MDrv_WriteByteMask(REG_MIU0_BASE+0x2B, BIT(6), BIT(6)); //enable memory write
19064 #endif
19065 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_21_L, 0x540f);
19066 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, 0x0430);
19067 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_40_L, BIT(6), BIT(6)); // DD force bank enable
19068 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_41_L, 0x0000, 0x000F); // DD force bank0
19069 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_03_L, 0, BIT(12)); //disable dynamic gating
19070 pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank = TRUE;
19071 pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
19072 pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount = 0;
19073 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
19074 if(FALSE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
19075 {
19076 MDrv_XC_InterruptAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
19077 }
19078 }
19079 else
19080 {
19081 //detach vsync interrupt
19082 if(TRUE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
19083 {
19084 MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
19085 }
19086 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, 0x0000, BIT(13)|BIT(15));//src domain select&start to write miu
19087 //dd
19088 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, 0x0780, 0x07FF);//src width
19089 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, 0x0438, 0x07FF);//src height
19090 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_05_L, 0x7878, 0x7F7F);//dram request number
19091 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_21_L, 0x0000);
19092 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_24_L, 0x0000);
19093 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_03_L, BIT(12), BIT(12)); //enable dynamic gating
19094 pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
19095 pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount = pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount;
19096 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
19097 }
19098
19099 if( (pXCResourcePrivate->stdrvXC_3D.ePreInputMode != E_XC_3D_INPUT_MODE_NONE)
19100 && (pXCResourcePrivate->stdrvXC_3D.ePreOutputMode != E_XC_3D_OUTPUT_MODE_NONE)
19101 && ((eInputMode != pXCResourcePrivate->stdrvXC_3D.ePreInputMode) || (eOutputMode != pXCResourcePrivate->stdrvXC_3D.ePreOutputMode)))
19102 {
19103 //dr
19104 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_6C_L, 0x0000, 0x0001);//Enable Depth Render
19105 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_64_L, 0x0000, 0x1FFF);//pixel width
19106 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_60_L, 0x0000, 0x07FF);//MV width
19107 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_62_L, 0x0000, 0x00FF);//horizontal number of 32x32 block
19108 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_61_L, 0x0000, 0x007F);//vertical number of 32x32 block
19109 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_62_L, 0x0F00, 0xFF00);//TOTAL FRAME
19110 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, 0x0000, 0x00FF);//left depth offset
19111 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, 0x0000, 0x00FF);//right depth offset
19112 #if (HW_2DTO3D_VER < 2)
19113 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, 0x0000, 0x3F00);//left depth gain:6bits
19114 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, 0x0000, 0x3F00);//right depth gain:6bits
19115 #else
19116 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, 0x0000, 0x7F00);//left depth gain:7bits
19117 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, 0x0000, 0x7F00);//right depth gain:7bits
19118 #endif
19119 #if (HW_2DTO3D_VER == 0)
19120 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_73_L, 0x8000, 0xBF3F);//dp info software reset, last number,request number
19121 #else
19122 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_73_L, 0x0000); //last number,request number
19123 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_71_L, BIT(11), BIT(11)); //dp info software reset
19124 #endif
19125 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0000, 0xC007);//Active mode, Passive mode Select,1:Line alternative
19126 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_72_L, 0x0000, 0x00FF); //draw left/right black enable, draw left/right black width
19127 if((IS_INPUT_MODE_NONE(eWindow) || IS_OUTPUT_MODE_NONE()))
19128 {
19129 Hal_XC_H3D_LR_Toggle_Enable(pInstance, FALSE, TRUE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);//enable op active 2d to 3d
19130 }
19131 }
19132
19133 if((IS_INPUT_MODE_NONE(eWindow) || IS_OUTPUT_MODE_NONE()))
19134 {
19135 //Close 3D, just need restore Mainwindow here
19136 if( (pXCResourcePrivate->stdrvXC_3D.ePreInputMode != E_XC_3D_INPUT_MODE_NONE)
19137 && (pXCResourcePrivate->stdrvXC_3D.ePreOutputMode != E_XC_3D_OUTPUT_MODE_NONE))
19138 {
19139 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
19140 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK); // Display H end
19141 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
19142 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
19143 }
19144 _XC_RETURN(pInstance);
19145 pXCResourcePrivate->stdrvXC_3D.ePreInputMode = eInputMode;
19146 pXCResourcePrivate->stdrvXC_3D.ePreOutputMode = eOutputMode;
19147 return TRUE;
19148 }
19149
19150 //input
19151 if(IS_INPUT_NORMAL_2D_HW(eWindow))
19152 {
19153 //clk
19154 MDrv_WriteRegBit(REG_CKG_FICLK_F1, ENABLE, BIT(6)); //reg_ckg_ficlk_3d
19155 //dd
19156 if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
19157 {
19158 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, pSrcInfo->stDispWin.width/2, 0x07FF);//src width
19159 }
19160 else
19161 {
19162 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_01_L, pSrcInfo->stDispWin.width, 0x07FF);//src width
19163 }
19164
19165 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_02_L, pSrcInfo->stDispWin.height, 0x07FF);//src height
19166 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_05_L, 0x7878, 0x7F7F);//dram request number
19167 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, (u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD)>>16, 0x07FF);//dd buffer high 9bit
19168 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_07_L, u32HW2DTO3D_DD_Buf/HW_2DTO3D_BYTE_PER_WORD);//dd buffer low 2 bytes
19169 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_74_L, u32HW2DTO3D_DR_Buf/HW_2DTO3D_BYTE_PER_WORD);//dr buffer low 2 bytes
19170 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_75_L, (u32HW2DTO3D_DR_Buf/HW_2DTO3D_BYTE_PER_WORD)>>16, 0x07FF);//dr buffer high 9bit
19171 MDrv_XC_wait_output_vsync(pInstance, 1, 100, eWindow);
19172 #if (HW_2DTO3D_VER < 2)
19173 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, BIT(13)|BIT(15), BIT(13)|BIT(15));//src domain select&start to write miu
19174 #else
19175 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_06_L, BIT(15), BIT(13)|BIT(15));//src domain select&start to write miu
19176 #endif
19177 //dr
19178 if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
19179 {
19180 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_64_L, pSrcInfo->stDispWin.width/2, 0x1FFF);//pixel width
19181 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_60_L, ((pSrcInfo->stDispWin.width+3)/4)/2, 0x07FF);//MV width
19182 }
19183 else
19184 {
19185 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_64_L, pSrcInfo->stDispWin.width, 0x1FFF);//pixel width
19186 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_60_L, (pSrcInfo->stDispWin.width+3)/4, 0x07FF);//MV width
19187 }
19188 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_62_L, (pSrcInfo->stDispWin.width+31)/32, 0x00FF);//horizontal number of 32x32 block
19189 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_61_L, (pSrcInfo->stDispWin.height+31)/32, 0x007F);//vertical number of 32x32 block
19190 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_62_L, 0x0F00, 0xFF00);//TOTAL FRAME
19191 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//left depth offset
19192 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//right depth offset
19193 #if (HW_2DTO3D_VER < 2)
19194 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x3F00);//left depth gain:6bits
19195 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x3F00);//right depth gain:6bits
19196 if(IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
19197 {
19198 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, 0x0000, BIT(14));//sign bit:bit14
19199 }
19200 else
19201 {
19202 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, BIT(14), BIT(14));//sign bit:bit14
19203 }
19204 #else
19205 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//left depth gain:7bits
19206 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_66_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//right depth gain:7bits
19207 if(IS_OUTPUT_TOP_BOTTOM_HW() || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
19208 {
19209 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, 0x0000, BIT(15));//sign bit:bit15
19210 }
19211 else
19212 {
19213 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_65_L, BIT(15), BIT(15));//sign bit:bit15
19214 }
19215 #endif
19216
19217 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_5D_L, 0x0000, 0x8000); // 2nd offset enable
19218 #if (HW_2DTO3D_VER == 0)
19219 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_73_L, 0x0404, 0xBF3F);//dp info software reset, last number,request number
19220 #else
19221 MDrv_WriteByteMask(REG_MIU0_BASE+0x2B, BIT(6), BIT(6)); //enable memory write
19222 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_71_L, 0x0, BIT(11)); //dp info software reset
19223 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_73_L, 0x0404); //last number,request number
19224 #endif
19225 if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
19226 {
19227 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_6C_L, 0x0821, 0x0821);//Enable Depth Render
19228 }
19229 else
19230 {
19231 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_6C_L, 0x0001, 0x0001);//Enable Depth Render
19232 }
19233 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, BIT(12), BIT(12)); // DR force bank enable
19234 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_40_L, BIT(6), BIT(6)); // DD force bank enable
19235 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_41_L, 0x0000, 0x000F); // DD force bank0
19236 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0000, 0x0F00); // DR force bank0
19237 #if HW_2DTO3D_PATCH
19238 pXCResourcePrivate->stdrvXC_3D._bIsHW2Dto3DPatchEnabled = Hal_SC_IsHW2Dto3DPatch_Enable();
19239 #endif
19240 if(FALSE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
19241 {
19242 MDrv_XC_InterruptAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
19243 }
19244 }
19245 else if((!IS_INPUT_MODE_NONE(eWindow))
19246 && (!IS_OUTPUT_MODE_NONE())
19247 && (!IS_OUTPUT_FRAME_L())
19248 && (!IS_OUTPUT_FRAME_R())
19249 && (!IS_INPUT_NORMAL_2D(eWindow))) //real 3d adjust depth using hw 2d to 3d function
19250 {
19251 #if (HW_DESIGN_3D_VER >= 2)
19252 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_64_L, pSrcInfo->stDispWin.width, 0x1FFF);//pixel width
19253 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_60_L, (pSrcInfo->stDispWin.width+3)/4, 0x07FF);//MV width
19254 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_62_L, (pSrcInfo->stDispWin.width+31)/32, 0x00FF);//horizontal number of 32x32 block
19255 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_61_L, (pSrcInfo->stDispWin.height+31)/32, 0x007F);//vertical number of 32x32 block
19256 #else
19257 //for 3d ver<2,vop2 display window or height may not same as main or sub window's display size
19258 MS_U16 u16Width = pSrcInfo->stDispWin.width;
19259 MS_U16 u16Height = pSrcInfo->stDispWin.height;
19260 if(IS_OUTPUT_SIDE_BY_SIDE_HALF()
19261 || IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
19262 {
19263 u16Width = u16Width * 2;
19264 }
19265 else if(IS_OUTPUT_LINE_ALTERNATIVE()
19266 || IS_OUTPUT_LINE_ALTERNATIVE_HW()
19267 || IS_OUTPUT_TOP_BOTTOM()
19268 || IS_OUTPUT_TOP_BOTTOM_HW())
19269 {
19270 u16Height = u16Height * 2;
19271 }
19272 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_64_L, u16Width, 0x1FFF);//pixel width
19273 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_60_L, (u16Width+3)/4, 0x07FF);//MV width
19274 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_62_L, (u16Width+31)/32, 0x00FF);//horizontal number of 32x32 block
19275 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_61_L, (u16Height+31)/32, 0x007F);//vertical number of 32x32 block
19276 #endif
19277 if(MDrv_XC_3D_IsHWDepthAdjSupported(pInstance, eInputMode, eOutputMode, eWindow)) //real 3d adjust depth using hw 2d to 3d function
19278 {
19279 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_6C_L, 0x0001, 0x0001);//Enable Depth Render
19280 if((pXCResourcePrivate->stdrvXC_3D._u163DHShift == 0x80) || (pXCResourcePrivate->stdrvXC_3D._u163DHShift == 0x00))
19281 {
19282 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_5D_L, 0x0000, 0x8000); //2 // 2nd offset enable
19283 }
19284 else if(pXCResourcePrivate->stdrvXC_3D._u163DHShift > 0x80)
19285 {
19286 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_5D_L, 0x8000, 0x8000); //2 // 2nd offset enable
19287 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5E_L, 0x0000); //2 // 2nd offset L
19288 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5F_L, (pXCResourcePrivate->stdrvXC_3D._u163DHShift-0x80)<<8); //2 // 2nd offset R
19289 }
19290 else
19291 {
19292 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_5D_L, 0x8000, 0x8000); //2 // 2nd offset enable
19293 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5E_L, (0x80-pXCResourcePrivate->stdrvXC_3D._u163DHShift)<<8); //2 // 2nd offset L
19294 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK15_5F_L, 0x0000); //2 // 2nd offset R
19295 }
19296 }
19297 }
19298
19299 //output
19300 if(IS_OUTPUT_CHECKBOARD_HW())
19301 {
19302 if (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))))
19303 {
19304 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0000, 0x0007);//Passive mode Select,0:Check Board, R first
19305 }
19306 else
19307 {
19308 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0003, 0x0007);//Passive mode Select,3:Check Board, L first
19309 }
19310 }
19311 else if(IS_OUTPUT_LINE_ALTERNATIVE_HW())
19312 {
19313 if (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))))
19314 {
19315 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0001, 0x0007);//Passive mode Select,1:Line Alternative, R first
19316 }
19317 else
19318 {
19319 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0004, 0x0007);//Passive mode Select,4:Line Alternative, L first
19320 }
19321 }
19322 else if(IS_OUTPUT_FRAME_ALTERNATIVE_HW())
19323 {
19324 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, BIT(14), BIT(14));//active mode
19325 Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, TRUE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);//enable op active 2d to 3d
19326 }
19327 else if(IS_OUTPUT_PIXEL_ALTERNATIVE_HW())
19328 {
19329 if (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))))
19330 {
19331 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0002, 0x0007);//Passive mode Select,2:Pixel Alternative, R first
19332 }
19333 else
19334 {
19335 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0005, 0x0007);//Passive mode Select,5:Pixel Alternative, L first
19336 }
19337 }
19338 else if(IS_OUTPUT_FRAME_L_HW())
19339 {
19340 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0006, 0x0007);//Passive mode Select,6:L Only
19341 }
19342 else if(IS_OUTPUT_FRAME_R_HW())
19343 {
19344 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0007, 0x0007);//Passive mode Select,7:R Only
19345 }
19346 else if(IS_OUTPUT_FRAME_ALTERNATIVE()) //real 3d adjust depth using hw 2d to 3d function:frame alternative output
19347 {
19348 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, BIT(14), BIT(14)); //enable op2t3d_lr
19349 }
19350 else if(IS_OUTPUT_LINE_ALTERNATIVE() || (IS_OUTPUT_TOP_BOTTOM() && MDrv_SC_3D_Is_LR_Sbs2Line(pInstance))) //real 3d adjust depth using hw 2d to 3d function:line alternative output
19351 {
19352 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK15_67_L, 0x0001, 0x0007);//Passive mode Select,1:Line Alternative
19353 }
19354
19355 _XC_RETURN(pInstance);
19356
19357 #else //new 2d to 3d architecture
19358 _XC_ENTRY(pInstance);
19359 //First init all control register to HW init value
19360 if((E_XC_3D_AUTODETECT_HW == pXCResourcePrivate->stdrvXC_3D._enAutoDetectMethod)
19361 && pXCResourcePrivate->stdrvXC_3D._bCurEnableAutoDetect3D)
19362 {
19363 _MDrv_SC_3D_Load2DTo3DReg(pInstance, TRUE, pSrcInfo, eWindow);
19364 pXCResourcePrivate->stdrvXC_3D._bAutoDetect3DReadFirstBank = TRUE;
19365 pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
19366 pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount = 0;
19367 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
19368 if(FALSE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
19369 {
19370 MDrv_XC_InterruptAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
19371 }
19372 }
19373 else
19374 {
19375 //detach vsync interrupt
19376 if(TRUE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
19377 {
19378 MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
19379 }
19380 _MDrv_SC_3D_Load2DTo3DReg(pInstance, FALSE, pSrcInfo, eWindow);
19381 pXCResourcePrivate->stdrvXC_3D._bResetFrameCount = TRUE;
19382 pXCResourcePrivate->stdrvXC_3D._u16CheckedFrameCount = pXCResourcePrivate->stdrvXC_3D._stDetect3DFormatPara.u16MaxCheckingFrameCount;
19383 pXCResourcePrivate->stdrvXC_3D._enCurDetectedRes = E_XC_3D_INPUT_MODE_NONE;
19384 }
19385
19386 if( (pXCResourcePrivate->stdrvXC_3D.ePreInputMode != E_XC_3D_INPUT_MODE_NONE)
19387 && (pXCResourcePrivate->stdrvXC_3D.ePreOutputMode != E_XC_3D_OUTPUT_MODE_NONE)
19388 && ((eInputMode != pXCResourcePrivate->stdrvXC_3D.ePreInputMode)
19389 || (eOutputMode != pXCResourcePrivate->stdrvXC_3D.ePreOutputMode)))
19390 {
19391 _MDrv_SC_3D_Load2DTo3DReg(pInstance, FALSE, pSrcInfo, eWindow);
19392
19393 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, 0x0000);//left gain/offset
19394 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, 0x0000);//right gain/offset
19395 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_07_L, 0x0000); //2 // 2nd offset L
19396 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0F_L, 0x0000); //2 // 2nd offset R
19397 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_65_L, 0x0000 ,0x01ff);
19398 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_66_L, 0x0000, 0x01ff);
19399
19400 if((IS_INPUT_MODE_NONE(eWindow) || IS_OUTPUT_MODE_NONE()))
19401 {
19402 Hal_XC_H3D_LR_Toggle_Enable(pInstance, FALSE, TRUE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);//enable op active 2d to 3d
19403 }
19404 }
19405
19406 if((IS_INPUT_MODE_NONE(eWindow) || IS_OUTPUT_MODE_NONE()))
19407 {
19408 //Close 3D, just need restore Mainwindow here
19409 if( (pXCResourcePrivate->stdrvXC_3D.ePreInputMode != E_XC_3D_INPUT_MODE_NONE)
19410 && (pXCResourcePrivate->stdrvXC_3D.ePreOutputMode != E_XC_3D_OUTPUT_MODE_NONE))
19411 {
19412 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart, VOP_DISPLAY_HSTART_MASK); // Display H start
19413 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd, VOP_DISPLAY_HEND_MASK); // Display H end
19414 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart, VOP_DISPLAY_VSTART_MASK);//Main window display window
19415 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd, VOP_DISPLAY_VEND_MASK);
19416 }
19417 _XC_RETURN(pInstance);
19418 pXCResourcePrivate->stdrvXC_3D.ePreInputMode = eInputMode;
19419 pXCResourcePrivate->stdrvXC_3D.ePreOutputMode = eOutputMode;
19420 return TRUE;
19421 }
19422
19423 //input
19424 if(IS_INPUT_NORMAL_2D_HW(eWindow))
19425 {
19426 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D input is 2D_HW\n");
19427 _MDrv_SC_3D_Load2DTo3DReg(pInstance, TRUE, pSrcInfo, eWindow);
19428 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//left depth offset
19429 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset, 0x00FF);//right depth offset
19430 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//left depth gain:7bits
19431 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain<<8, 0x7F00);//right depth gain:7bits
19432
19433 #if(HW_DESIGN_3D_VER == 5)
19434 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_15_L, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16FRCMVLen, 0x0FFF);//Set the maximum request lines for second channel
19435 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
19436 #endif
19437 #if(HW_DESIGN_3D_VER == 3) //monet mode
19438 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_03_L,BIT(2), BIT(2));//reg_force_fe2_en
19439 #endif
19440 if(FALSE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL))
19441 {
19442 MDrv_XC_InterruptAttachWithoutMutex(pInstance, SC_INT_VSINT, _MDrv_SC_3D_2DTo3D_DepthRefine, NULL);
19443 }
19444 }
19445 else if((!IS_INPUT_MODE_NONE(eWindow))
19446 && (!IS_OUTPUT_MODE_NONE())
19447 && (!IS_OUTPUT_FRAME_L())
19448 && (!IS_OUTPUT_FRAME_R())
19449 && (!IS_INPUT_NORMAL_2D(eWindow))) //real 3d adjust depth using hw 2d to 3d function
19450 {
19451 if(MDrv_XC_3D_IsHWDepthAdjSupported(pInstance, eInputMode, eOutputMode, eWindow)) //real 3d adjust depth using hw 2d to 3d function
19452 {
19453 MS_U16 u16ABSLevel = ((pXCResourcePrivate->stdrvXC_3D._u163DHShift > 0x80)?(pXCResourcePrivate->stdrvXC_3D._u163DHShift - 0x80):(0x80 - pXCResourcePrivate->stdrvXC_3D._u163DHShift));
19454 //DR setting
19455 _MDrv_SC_3D_DR_setting(pInstance, eWindow);
19456
19457 #if (HW_2DTO3D_VER >= 4)
19458 if(IS_OUTPUT_TOP_BOTTOM() || IS_OUTPUT_FRAME_PACKING())
19459 {
19460 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
19461 if(!((MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
19462 && !IsVBY1_16LANE((MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type)
19463 && (pXCResourcePrivate->stdrvXC_3D._bLAToTB || pXCResourcePrivate->stdrvXC_3D._bFAToTB)))// non-maserati manhattan mode FRC 3D
19464 #endif
19465 {
19466 _MDrv_SC_3D_HWDepthAdj_TBOut(pInstance, pSrcInfo, eWindow); //T3d settings & sram depth force to 0x80
19467 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(14)|BIT(13)|BIT(7), BIT(14)|BIT(13)|BIT(7));//TB out 3D depth enable
19468 }
19469 }
19470 #endif
19471
19472 if(IS_OUTPUT_SIDE_BY_SIDE_HALF())
19473 {
19474 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(3), BIT(3));//SBS out 3D depth enable
19475 }
19476 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_49_L, (u32OutputWidth+31)/32, 0x00FF);//horizontal number of 32x32 block
19477
19478 if((pXCResourcePrivate->stdrvXC_3D._u163DHShift == 0x80) || (pXCResourcePrivate->stdrvXC_3D._u163DHShift == 0x00))
19479 {
19480 //original 3d depth
19481 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_07_L, 0x0000); //2 // 2nd offset L
19482 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0F_L, 0x0000); //2 // 2nd offset R
19483 }
19484 else if(pXCResourcePrivate->stdrvXC_3D._u163DHShift > 0x80)
19485 {
19486 // |L--> <--R|
19487 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_07_L, (0xFF - (u16ABSLevel-1))<<8); //2 // 2nd offset L
19488 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0F_L, (u16ABSLevel)<<8); //2 // 2nd offset R
19489 }
19490 else
19491 {
19492 // |L<-- -->R|
19493 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_07_L, (u16ABSLevel)<<8); //2 // 2nd offset L
19494 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK62_0F_L, (0xFF - (u16ABSLevel-1))<<8); //2 // 2nd offset R
19495 }
19496
19497 #if ENABLE_T3D_DEBUG
19498 //enable black edge
19499 Hal_SC_3D_enable_black_edge(pInstance, FALSE);
19500 #endif
19501 }
19502 }
19503
19504 //output
19505 if(IS_OUTPUT_LINE_ALTERNATIVE_HW())
19506 {
19507 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is LA_HW\n");
19508 if (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))))
19509 {
19510 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, BIT(15), BIT(15)); //sign bit:bit15
19511 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, 0x0000, BIT(15)); //sign bit:bit15
19512
19513 }
19514 else
19515 {
19516 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, 0x0000, BIT(15)); //sign bit:bit15
19517 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, BIT(15), BIT(15)); //sign bit:bit15
19518 }
19519 #if (HW_2DTO3D_VER >= 4)
19520 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_65_L, (~(pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain*4) + 1), 0x01FF);//left depth gain:7bits
19521 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_66_L, pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain*4, 0x01FF);//right depth gain:7bits
19522 #endif
19523 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
19524 Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
19525 #endif
19526 }
19527 else if(IS_OUTPUT_FRAME_ALTERNATIVE_HW())
19528 {
19529 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is FA_HW\n");
19530 if(pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA) //output FA_LLRR_HW for 4k0.5k@240Hz
19531 {
19532 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is FA_LLRR_HW \n");
19533 Hal_SC_3D_enable_FALLRR_out(pInstance, TRUE);
19534 #if (HW_DESIGN_3D_VER == 3) && (HW_DESIGN_4K2K_VER != 7)//manhattan mode
19535 // 4k2k needs more time to train data so we need to delay the display time
19536 pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = VALUE_AUTO_TUNE_AREA_TRIG_4K540P;
19537 pXCResourcePrivate->sthal_SC.u16NewValue[E_STORE_VALUE_DISP_AREA_TRIG] = VALUE_DISP_AREA_TRIG_4K540P;
19538 pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_AUTO_TUNE_AREA_TRIG] = TRUE;
19539 pXCResourcePrivate->sthal_SC.bUsingNewValue[E_STORE_VALUE_DISP_AREA_TRIG] = TRUE;
19540 #endif
19541 }
19542
19543 if (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))))
19544 {
19545 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, BIT(15), BIT(15)); //sign bit:bit15
19546 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, 0x0000, BIT(15)); //sign bit:bit15
19547
19548 }
19549 else
19550 {
19551 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, 0x0000, BIT(15)); //sign bit:bit15
19552 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, BIT(15), BIT(15)); //sign bit:bit15
19553 }
19554 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_64_L, BIT(5), BIT(5)); //pixel base active 3d
19555 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_50_L, BIT(14), BIT(14)); //block base active 3d
19556 Hal_XC_H3D_LR_Toggle_Enable(pInstance, TRUE, TRUE, pXCResourcePrivate->stdrvXC_3D._bSkipDefaultLRFlag);//enable op active 2d to 3d
19557
19558 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
19559 Hal_SC_3D_CopyDispWinToSTGEN(pInstance, MAIN_WINDOW);
19560 #endif
19561 }
19562 #if (HW_2DTO3D_VER >= 4)
19563 else if(IS_OUTPUT_TOP_BOTTOM_HW()
19564 || (IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_PACKING()))
19565 {
19566 if(IS_OUTPUT_TOP_BOTTOM_HW())
19567 {
19568 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is TB_HW\n");
19569 }
19570 else
19571 {
19572 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is FPP_HW\n");
19573 }
19574 if (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))))
19575 {
19576 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, BIT(15), BIT(15)); //sign bit:bit15
19577 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, 0x0000, BIT(15)); //sign bit:bit15
19578
19579 }
19580 else
19581 {
19582 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, 0x0000, BIT(15)); //sign bit:bit15
19583 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, BIT(15), BIT(15)); //sign bit:bit15
19584 }
19585 #if (HW_DESIGN_3D_VER == 3)
19586 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
19587 if(!((MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
19588 && !IsVBY1_16LANE((MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type)
19589 && (pXCResourcePrivate->stdrvXC_3D._bLAToTB || pXCResourcePrivate->stdrvXC_3D._bFAToTB)))// non-maserati manhattan mode FRC 3D
19590 #endif
19591 {
19592 //tb out mode for monet.this must be setted for monaco eco,fix me
19593 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(14)|BIT(13)|BIT(7), BIT(14)|BIT(13)|BIT(7));
19594 }
19595 #else
19596 //turn off for TB PQ
19597 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(7), BIT(7));
19598 #endif
19599 #if ENABLE_T3D_DEBUG
19600 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5C_L, 0x0000, 0x8000);
19601 #endif
19602 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, 0x0080, 0x00FF);
19603 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, 0x0080, 0x00FF);
19604 //muji, monaco
19605 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK33_30_L, BIT(14), BIT(14));
19606
19607 //HW 2Dto3D FP out
19608 if(IS_INPUT_NORMAL_2D_HW(eWindow) && IS_OUTPUT_FRAME_PACKING())
19609 {
19610 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_56_L, BIT(7), BIT(7)); //TB out Vsync reset enabel
19611 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_56_L, 0x40, 0x7F); //FP out need more delay,default value is 0x20
19612 }
19613 }
19614 else if(IS_OUTPUT_SIDE_BY_SIDE_HALF_HW())
19615 {
19616 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "## 3D output is SBS_HW\n");
19617 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_69_L, BIT(3), BIT(3));//SS out depth enable bit
19618 if (IsVMirrorMode(eWindow) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, (BIT(0)|BIT(1))) == (BIT(0)|BIT(1))))
19619 {
19620 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, BIT(15), BIT(15)); //sign bit:bit15
19621 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, 0x0000, BIT(15)); //sign bit:bit15
19622
19623 }
19624 else
19625 {
19626 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_06_L, 0x0000, BIT(15)); //sign bit:bit15
19627 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_0E_L, BIT(15), BIT(15)); //sign bit:bit15
19628 }
19629 }
19630 #endif
19631
19632 _XC_RETURN(pInstance);
19633
19634 #endif //(HW_2DTO3D_VER < 3)
19635 #endif //HW_2DTO3D_SUPPORT
19636
19637 _XC_ENTRY(pInstance);
19638 //below is moved from hal sw db
19639 if(Hal_SC_is_extra_req_en(pInstance, NULL, NULL, NULL, NULL))
19640 {
19641 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_11_L, BIT(15), BIT(15));
19642 }
19643 else
19644 {
19645 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_11_L, 0, BIT(15));
19646 }
19647 _XC_RETURN(pInstance);
19648
19649 pXCResourcePrivate->stdrvXC_3D.ePreInputMode = eInputMode;
19650 pXCResourcePrivate->stdrvXC_3D.ePreOutputMode = eOutputMode;
19651
19652 return TRUE;
19653 }
19654 #endif
19655
MDrv_XC_EnableT3D(void * pInstance,MS_BOOL bEnable)19656 MS_BOOL MDrv_XC_EnableT3D(void *pInstance, MS_BOOL bEnable)
19657 {
19658 XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
19659 UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
19660 #ifdef ENABLE_GOP_T3DPATCH
19661 if (MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
19662 {
19663 _MLOAD_ENTRY(pInstance);
19664 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK63_61_L, bEnable, BIT(0));
19665 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK62_08_L, bEnable<<4, BIT(4));
19666 Hal_SC_set_T3D_setting(pInstance, bEnable);
19667 MDrv_XC_MLoad_Fire(pInstance, TRUE);
19668 _MLOAD_RETURN(pInstance);
19669 }
19670 else
19671 {
19672 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_61_L, bEnable, BIT(0));
19673 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_08_L, bEnable<<4, BIT(4));
19674 Hal_SC_set_T3D_setting(pInstance, bEnable);
19675 }
19676 #endif
19677 return TRUE;
19678 }
19679
19680