⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rprombw.c

📁 此代码为WCE5.0下显示器的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
                ULONG ulBPP, ULONG ulRefRate, ULONG ulMemIPC, LPFIXEDPOINT lpEff)
{
  ULONG   ulHalfKByteRate;

  // MEM_BYTEWIDTH = 64/8 = 8, 0.4k = 2^4
  ulHalfKByteRate = ((((ulDispWidth * ulDispHeight) >> 3) * ulBPP) >> 4) * ulRefRate;

  // Divided by MEM_IPC (= 1 or 2)
  ulHalfKByteRate >>= ulMemIPC - 1;

  // Divided by 2^8 before multiply with Efficiency
  lpBandWidth->Fractional = (ulHalfKByteRate & 0x000000FF);
  lpBandWidth->Integral = ulHalfKByteRate >> 8;
  
  vMultiplyFixed(lpBandWidth, lpEff);

  // round fractional
  if (lpBandWidth->Fractional >= 128)

      lpBandWidth->Integral++;  
  // Divided by 2^8 to get MBytes per second
  lpBandWidth->Fractional = (lpBandWidth->Integral & 0x000000FF);
  lpBandWidth->Integral >>= 8;
}



/****************************Private*Routine*******************************\
*
* vMBW_GetBWforCI()
*
* Calculate Scaler / Overlay Bandwidth in MBytes per Second
* 
* Note: 
*       
*
\**************************************************************************/

VOID vMBW_GetBWforCI(LPFIXEDPOINT lpBandWidth, ULONG ulDispWidth, ULONG ulDispHeight, 
                     ULONG ulBPP, ULONG ulRefRate, ULONG ulMemIPC, LPFIXEDPOINT lpEff)
{
  ULONG   ulHalfKByteRate;

  // MEM_BYTEWIDTH = 64/8 = 8, 0.4k = 2^4
  ulHalfKByteRate = ((ulDispWidth * ulDispHeight * ulBPP) >> 7) * ulRefRate;

  // Divided by MEM_IPC (= 1 or 2)
  ulHalfKByteRate >>= ulMemIPC - 1;

  // Divided by 2^8 before multiply with Efficiency
  lpBandWidth->Fractional = (ulHalfKByteRate & 0x000000FF);
  lpBandWidth->Integral = ulHalfKByteRate >> 8;
  
  vMultiplyFixed(lpBandWidth, lpEff);

  // round fractional
  if (lpBandWidth->Fractional >= 128)
    lpBandWidth->Integral++;

  // Divided by 2^8 to get MBytes per second
  lpBandWidth->Fractional = (lpBandWidth->Integral & 0x000000FF);
    lpBandWidth->Integral >>= 8;
}



/****************************Private*Routine*******************************\
*
* vMBW_GetSclBW()
*
* Calculate Scaler / Overlay Bandwidth in MBytes per Second
* 
* Note: 
*       
*
\**************************************************************************/

VOID vMBW_GetSclBW(LPFIXEDPOINT lpSclBandWidth, ULONG ulSclBurst, ULONG ulSclMode, 
                  LPDEVMODE_INFO lpModeInfo, ULONG ulMemIPC)
{
  FIXEDPOINT   sSclEff;

  if (ulSclMode == MBW_SCL_PLANAR_MODE)
    // YUV plannar mode
    vMBW_GetSclEff(&sSclEff, ulSclBurst, ulMemIPC);
  else if (ulSclMode == MBW_SCL_PACKED_MODE)
    // YUV packed mode - assume page size of 256*64 bits
    vMBW_GetSclEff(&sSclEff, 256, ulMemIPC);
  
  vMBW_GetBW(lpSclBandWidth, lpModeInfo->ulPelsWidth, lpModeInfo->ulPelsHeight, 
             lpModeInfo->ulBitsPerPixel, lpModeInfo->ulDisplayFrequency, 
             ulMemIPC, &sSclEff);
}



/****************************Private*Routine*******************************\
*
* vMBW_GetVidBW()
*
* Calculate Video Capture Bandwidth in MBytes per Second
* 
* Note: 
*       
*
\**************************************************************************/

VOID vMBW_GetVidBW(LPFIXEDPOINT lpVidBW, ULONG ulVidFlush, ULONG ulVidWidth, ULONG ulMemIPC)
{
  FIXEDPOINT   sFactor;

  vMBW_GetVidEff(&sFactor, ulVidFlush, ulMemIPC);

  lpVidBW->Integral = MBW_VID_CLK;
  lpVidBW->Fractional = 0;

  // VID_BW = VID_CLK / VID_EFF
  vMultiplyFixed(lpVidBW, &sFactor);


  if(ulVidWidth >= 640)
  {
    // do nothing
  }
  else if (ulVidWidth >= 320)
  {
    // VID_BW / 2
    sFactor.Integral = 2;
    sFactor.Fractional = 0;
    vDivideFixed(lpVidBW, &sFactor);
  }
  else if (ulVidWidth >= 240)
  {
    // VID_BW * 3 / 8
    sFactor.Integral = 0;
    sFactor.Fractional = MBW_GetFractional(3, 8);
    vMultiplyFixed(lpVidBW, &sFactor);
  }
  else if (ulVidWidth > 0)
  {
    // VID_BW / 4
    sFactor.Integral = 4;
    sFactor.Fractional = 0;
    vDivideFixed(lpVidBW, &sFactor);    
  }
  else
  {
    // VID_BW = 0
    lpVidBW->Integral = 0;
    lpVidBW->Fractional = 0;
  }


}




/****************************Private*Routine*******************************\
*
* vMBW_GetSubBW()
*
* Calculate DVD Subpicture Bandwidth in MBytes per Second
* 
* Note: 
*       
*
\**************************************************************************/

VOID vMBW_GetSubBW(LPFIXEDPOINT lpSubBW, ULONG ulSubBurst, ULONG ulSubHGT, ULONG ulSubRate, 
                  ULONG ulMemIPC)
{
  FIXEDPOINT   sSubEff;

  vMBW_GetSubEff(&sSubEff, ulSubBurst, ulMemIPC);

  // tricking GetBW() - use the burst size instead of the width as and the bus
  // width instead of bpp
  // this has the same effect to calculate the overall bit width for the given
  // line as the subpicture only has one burst per line.
  vMBW_GetBW(lpSubBW, ulSubBurst, ulSubHGT, 64, ulSubRate, ulMemIPC, &sSubEff);
}



/****************************Private*Routine*******************************\
*
* vMBW_GetHFBBW()
*
* Calculate DSTN Half Frame Buffer Bandwidth in MBytes per Second
* 
* Note: 
*       
*
\**************************************************************************/

VOID vMBW_GetHFBBW(LPFIXEDPOINT lpHalfBW, ULONG ulHalfFIFO, 
                   LPDEVMODE_INFO lpModeInfo, ULONG ulMemIPC)
{
  FIXEDPOINT   sHalfEff;
  FIXEDPOINT   sFactor;

  vMBW_GetBurstEff(&sHalfEff, ulHalfFIFO, ulMemIPC);

  vMBW_GetBW(lpHalfBW, lpModeInfo->ulPelsWidth, lpModeInfo->ulPelsHeight, 
             MBW_HFB_BPP, lpModeInfo->ulDisplayFrequency, 
             ulMemIPC, &sHalfEff);

  sFactor.Integral = 2;
  sFactor.Fractional = 0;

  vMultiplyFixed(lpHalfBW, &sFactor);
}



/****************************Private*Routine*******************************\
*
* ULONG MBW_GetDispBW()
*
* Calculate Frame Display Bandwidth in MBytes per Second
* 
* Note: lpDispBandwidth with returned fixed-point value
*       function return ULONG value
*
\**************************************************************************/

ULONG MBW_GetDispBW(LPFIXEDPOINT lpDispBandwidth, ULONG ulDispFIFO, ULONG ulHWCur_Size, 
                    ULONG ulHWIcon_Size, ULONG ulMemIPC, LPDEVMODE_INFO lpModeInfo)
{
  FIXEDPOINT   sEff;
  FIXEDPOINT   sHWCI_BW;
  ULONG        ulHWCI_Size;

  // calculate DISP bandwidth
  vMBW_GetBurstEff(&sEff, ulDispFIFO, ulMemIPC);
  vMBW_GetBW(lpDispBandwidth, lpModeInfo->ulPelsWidth, lpModeInfo->ulPelsHeight, 
             lpModeInfo->ulBitsPerPixel, lpModeInfo->ulDisplayFrequency,
             ulMemIPC, &sEff);

  // calculate Cursor and Icon efficiency
  ulHWCI_Size = ulHWCur_Size + ulHWIcon_Size;
  vMBW_GetBurstEff(&sEff, ulHWCI_Size, ulMemIPC);

  // calculate Cursor bandwidth
  vMBW_GetBWforCI(&sHWCI_BW, ulHWCur_Size, MBW_HW_CUR_HIGHT, 64, lpModeInfo->ulDisplayFrequency,
                  ulMemIPC, &sEff);

  // DISP_BW + CURSOR_BW
  vAddFixed(lpDispBandwidth, &sHWCI_BW);

  // calculate Icon bandwidth
  vMBW_GetBWforCI(&sHWCI_BW, ulHWIcon_Size, MBW_HW_ICON_HIGHT, 64, lpModeInfo->ulDisplayFrequency,
                  ulMemIPC, &sEff);

  // DISP_BW + CURSOR_BW + ICON_BW
  vAddFixed(lpDispBandwidth, &sHWCI_BW);

  if (lpDispBandwidth->Fractional >= 128)
    return lpDispBandwidth->Integral + 1;
  else
    return lpDispBandwidth->Integral;
}



/****************************Public*Routine*******************************\
*
* ULONG MBW_RequiredBW()
*
* Calculate Required Bandwidth in MBytes per Second
* 
* Note: lpReqBandwidth with returned fixed-point value
*       function return ULONG value
*
\**************************************************************************/

ULONG MBW_RequiredBW(LPFIXEDPOINT lpReqBandwidth, ULONG ulMemIPC)
{
  FIXEDPOINT   sTemp;
  ULONG        ulDisp1FIFO = 32;    // hard code
  ULONG        ulDisp2FIFO = 32;    // hard code
  DEVMODE_INFO sModeInfo1 = {0, 1024, 768, 32}; // hard code
  DEVMODE_INFO sModeInfo2 = {0, 1024, 768, 32}; // hard code
  ULONG        ulVidFlush = 12;     // hard code
  ULONG        ulVidWidth = 720;    // hard code
  ULONG        ulHalfFIFO = 64;     // hard code
  DEVMODE_INFO sHalfMode = {0, 1024, 768, 32}; // hard code
  ULONG        ulSubBurst = 16;     // hard code
  ULONG        ulSubHGT = 480;      // hard code
  ULONG        ulSubRate = 60;      // hard code
  ULONG        ulSclMode = MBW_SCL_PLANAR_MODE; // hard code
  ULONG        ulSclBurst = 16;     // hard code
  DEVMODE_INFO sSclMode = {0, 720, 480, 32}; // hard code

#define HWCUR1_SIZE  2 
#define HWICON1_SIZE 4 

#define HWCUR2_SIZE  2 
#define HWICON2_SIZE 4 
  
  // TOTAL_BW = DISP1_BW
  MBW_GetDispBW(lpReqBandwidth, ulDisp1FIFO, HWCUR1_SIZE, 
                HWICON1_SIZE, ulMemIPC, &sModeInfo1);

  MBW_GetDispBW(&sTemp, ulDisp2FIFO, HWCUR2_SIZE, 
                HWICON2_SIZE, ulMemIPC, &sModeInfo2);

  // TOTAL_BW += DISP2_BW
  vAddFixed(lpReqBandwidth, &sTemp);

  vMBW_GetVidBW(&sTemp, ulVidFlush, ulVidWidth, ulMemIPC);

  // TOTAL_BW += VID_BW
  vAddFixed(lpReqBandwidth, &sTemp);

  vMBW_GetHFBBW(&sTemp, ulHalfFIFO, &sHalfMode, ulMemIPC);

  // TOTAL_BW += HFB_BW
  vAddFixed(lpReqBandwidth, &sTemp);

  vMBW_GetSubBW(&sTemp, ulSubBurst, ulSubHGT, ulSubRate, ulMemIPC);

  // TOTAL_BW += SUB_BW
  vAddFixed(lpReqBandwidth, &sTemp);

  vMBW_GetSclBW(&sTemp, ulSclBurst, ulSclMode, &sSclMode, ulMemIPC);

  // TOTAL_BW += SCL_BW
  vAddFixed(lpReqBandwidth, &sTemp);

  // return TOTAL_BW
  if (lpReqBandwidth->Fractional >= 128)
    return lpReqBandwidth->Integral + 1;
  else
    return lpReqBandwidth->Integral;
}



/****************************Private*Routine*******************************\
*
* vMBW_AvailHActiveTime()
*
* Calculate Available Active Time in Micro Second
* 
* Note: lpActiveTime with output fixed-point value
*       function return ULONG value
*
\**************************************************************************/

VOID vMBW_AvailHActiveTime(HGCO hGCO, LPFIXEDPOINT lpActiveTime, LPDEVMODE_INFO lpModeInfo, 
                           LPFIXEDPOINT lpPixelClock, ULONG ulHBlankFactor)
{
  LPHW_RAGEPROCRTC_EXTENSION lpHwCrtc = (LPHW_RAGEPROCRTC_EXTENSION)hGCO;
  FIXEDPOINT                 sTemp;

  lpActiveTime->Integral = 1;
  lpActiveTime->Fractional = ulHBlankFactor;

  sTemp.Integral = lpModeInfo->ulPelsWidth;
  sTemp.Fractional = 0;

  vMultiplyFixed(lpActiveTime, &sTemp);

  vDivideFixed(lpActiveTime, lpPixelClock);
}



/****************************Private*Routine*******************************\
*
* vMBW_GetDispHActiveTime()
*
* Calculate Display Horizontal Active Time in Micro Second
* 
* Note: 
*       
*
\**************************************************************************/

ULONG vMBW_GetDispHActiveTime(LPFIXEDPOINT lpHActiveTime, ULONG ulDispFIFO, 
                              ULONG ulHWCI_Size, ULONG ulDispWid, 
                              ULONG ulBPP, ULONG ulMemClock, ULONG ulMemIPC)
{
  FIXEDPOINT   sDispEff;
  FIXEDPOINT   sHWCIEff;
  FIXEDPOINT   sTemp;

  vMBW_GetBurstEff(&sDispEff, ulDispFIFO, ulMemIPC);
  vMBW_GetBurstEff(&sHWCIEff, ulHWCI_Size, ulMemIPC);

  // DISP_QW_WID = DISP_WID * DISP_BPP / 64
  lpHActiveTime->Integral = ulDispWid * ulBPP >> 6;
  lpHActiveTime->Fractional = 0;

  // (1 / DISP_EFF) * DISP_QW_WID
  vMultiplyFixed(lpHActiveTime, &sDispEff);

  sTemp.Integral = ulHWCI_Size;
  sTemp.Fractional = 0;

  // (1 / HWCI_EFF) * HWCI_SIZE
  vMultiplyFixed(&sTemp, &sHWCIEff);

  // (1/DISP_EFF)*DISP_QW_WID+(1/HWCI_EFF)*HWCI_SIZE
  vAddFixed(lpHActiveTime, &sTemp);

  sTemp.Integral = ulMemClock;
  sTemp.Fractional = 0;
  // Divided by MEM_CLK
  vDivideFixed(lpHActiveTime, &sTemp);

  if (lpHActiveTime->Fractional >= 128)
    return lpHActiveTime->Integral + 1;
  else
    return lpHActiveTime->Integral;
}



/****************************Private*Routine*******************************\
*
* vMBW_GetVidHActiveTime()
*
* Calculate Video Capture Horizontal Active Time in Micro Second
* 
* Note: 
*       
*
\**************************************************************************/

VOID vMBW_GetVidHActiveTime(LPFIXEDPOINT lpHActiveTime, ULONG ulVidFlush, 
                            ULONG ulVidWid, LPFIXEDPOINT lpHTotalTime, 
                            ULONG ulMemClock, ULONG ulMemIPC)
{
  FIXEDPOINT   sTemp;
  FIXEDPOINT   sMemBw;
 
  if (!ulMemIPC)
    return;

  // VID_BW
  vMBW_GetVidBW(&sTemp, ulVidFlush, ulVidWid, ulMemIPC);
  
  // MEM_BW = MEM_CLK * 8 / MEM_IPC
  sMemBw.Integral = (ulMemClock << 3) / ulMemIPC;
  sMemBw.Fractional = 0;

  // VID_PORTION = VID_BW / MEM_BW
  vDivideFixed(&sTemp, &sMemBw);

  *lpHActiveTime = *lpHTotalTime;

  // VID_PORTION * HTOT_TIME
  vMultiplyFixed(lpHActiveTime, &sTemp);
}



VOID vMBW_GetHActiveTime(LPFIXEDPOINT lpHActiveTime, ULONG ulBurstSize, 
                         ULONG ulWidth, ULONG ulBPP, ULONG ulMemClock, 
                         ULONG   ulMemIPC)
{
  FIXEDPOINT   sEff;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -