ddoverlay.cpp

来自「6410BSP3」· C++ 代码 · 共 936 行 · 第 1/3 页

CPP
936
字号
    // Disable Overlay TV DMA
    if (m_eTVDMAMode == TV_DMA_OVERLAY)
    {
        RETAILMSG(DISP_ZONE_TEMP, (_T("[DDHAL] DevOverlayInitialize() : Disable TV DMA\n\r")));
        DevOutputDisableTVDMA();
    }

    // Initialize Overlay Widnow
    if (m_OverlayCtxt.bLocalPath)
    {
        SVEARG_FIMD_WIN_MODE tParamMode;
        SVEARG_POST_PARAMETER tParamPost;
        SVEARG_POST_BUFFER tParamBuffer;

        tParamMode.dwWinMode = m_OverlayCtxt.dwWinMode;
        tParamMode.dwBPP = m_OverlayCtxt.dwBPPMode;
        tParamMode.dwWidth = m_OverlayCtxt.uiDstWidth;
        tParamMode.dwHeight = m_OverlayCtxt.uiDstHeight;
        tParamMode.dwOffsetX = m_OverlayCtxt.uiDstOffsetX;
        tParamMode.dwOffsetY = m_OverlayCtxt.uiDstOffsetY;

        if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_MODE, &tParamMode, sizeof(SVEARG_FIMD_WIN_MODE), NULL, 0, &dwBytes, NULL) )
        {
            RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlayInitialize() : IOCTL_SVE_FIMD_SET_WINDOW_MODE Failed\n\r")));
        }

        tParamPost.dwOpMode = POST_FREE_RUN_MODE;
        tParamPost.dwScanMode = POST_PROGRESSIVE;
        tParamPost.dwSrcType = m_OverlayCtxt.dwPostSrcType;
        tParamPost.dwSrcBaseWidth = m_OverlayCtxt.pSurface->Width();
        tParamPost.dwSrcBaseHeight = m_OverlayCtxt.pSurface->Height();
        tParamPost.dwSrcWidth = m_OverlayCtxt.uiSrcWidth;
        tParamPost.dwSrcHeight = m_OverlayCtxt.uiSrcHeight;
        tParamPost.dwSrcOffsetX = m_OverlayCtxt.uiSrcOffsetX;
        tParamPost.dwSrcOffsetY = m_OverlayCtxt.uiSrcOffsetY;
        tParamPost.dwDstType = POST_DST_FIFO_RGB888;
        tParamPost.dwDstBaseWidth = m_OverlayCtxt.uiDstWidth;
        tParamPost.dwDstBaseHeight = m_OverlayCtxt.uiDstHeight;
        tParamPost.dwDstWidth = m_OverlayCtxt.uiDstWidth;
        tParamPost.dwDstHeight = m_OverlayCtxt.uiDstHeight;
        tParamPost.dwDstOffsetX = 0;
        tParamPost.dwDstOffsetY = 0;

        if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_POST_SET_PROCESSING_PARAM, &tParamPost, sizeof(SVEARG_POST_PARAMETER), NULL, 0, &dwBytes, NULL) )
        {
            RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlayInitialize() : IOCTL_SVE_POST_SET_PROCESSING_PARAM Failed\n\r")));
        }

        tParamBuffer.dwBufferRGBY = m_OverlayCtxt.pSurface->OffsetInVideoMemory() + m_VideoMemoryPhysicalBase;
        tParamBuffer.dwBufferCb = tParamBuffer.dwBufferRGBY+m_OverlayCtxt.pSurface->m_uiOffsetCb;
        tParamBuffer.dwBufferCr = tParamBuffer.dwBufferRGBY+m_OverlayCtxt.pSurface->m_uiOffsetCr;
        tParamBuffer.bWaitForVSync = FALSE;

        if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_POST_SET_SOURCE_BUFFER, &tParamBuffer, sizeof(SVEARG_POST_BUFFER), NULL, 0, &dwBytes, NULL) )
        {
            RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlayInitialize() : IOCTL_SVE_POST_SET_SOURCE_BUFFER Failed\n\r")));
        }

        if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_POST_SET_NEXT_SOURCE_BUFFER, &tParamBuffer, sizeof(SVEARG_POST_BUFFER), NULL, 0, &dwBytes, NULL) )
        {
            RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlayInitialize() : IOCTL_SVE_POST_SET_NEXT_SOURCE_BUFFER Failed\n\r")));
        }
    }
    else
    {
        SVEARG_FIMD_WIN_MODE tParamMode;
        SVEARG_FIMD_WIN_FRAMEBUFFER tParamFB;

        tParamMode.dwWinMode = m_OverlayCtxt.dwWinMode;
        tParamMode.dwBPP = m_OverlayCtxt.dwBPPMode;
        tParamMode.dwWidth = m_OverlayCtxt.uiDstWidth;
        tParamMode.dwHeight = m_OverlayCtxt.uiDstHeight;
        tParamMode.dwOffsetX = m_OverlayCtxt.uiDstOffsetX;
        tParamMode.dwOffsetY = m_OverlayCtxt.uiDstOffsetY;

        if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_MODE, &tParamMode, sizeof(SVEARG_FIMD_WIN_MODE), NULL, 0, &dwBytes, NULL) )
        {
            RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlayInitialize() : IOCTL_SVE_FIMD_SET_WINDOW_MODE Failed\n\r")));
        }

        tParamFB.dwWinNum = OVERLAY_WINDOW;
        tParamFB.dwFrameBuffer = m_OverlayCtxt.pSurface->OffsetInVideoMemory() + m_VideoMemoryPhysicalBase;
        tParamFB.bWaitForVSync = FALSE;

        if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_FRAMEBUFFER, &tParamFB, sizeof(SVEARG_FIMD_WIN_FRAMEBUFFER), NULL, 0, &dwBytes, NULL) )
        {
            RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlayInitialize() : IOCTL_SVE_FIMD_SET_WINDOW_FRAMEBUFFER Failed\n\r")));
        }
    }

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --DevOverlayInitialize()\n\r")));
}


void
S3C6410Disp::DevOverlaySetPosition(void)
{
    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++DevOverlaySetPosition()\n\r")));

    DWORD dwBytes;

    SVEARG_FIMD_WIN_POS tParam;

    tParam.dwWinNum = OVERLAY_WINDOW;
    tParam.dwOffsetX = m_OverlayCtxt.uiDstOffsetX;
    tParam.dwOffsetY = m_OverlayCtxt.uiDstOffsetY;

    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_POSITION, &tParam, sizeof(SVEARG_FIMD_WIN_POS), NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlaySetPosition() : IOCTL_SVE_FIMD_SET_WINDOW_POSITION Failed\n\r")));
    }

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --DevOverlaySetPosition()\n\r")));
}


void
S3C6410Disp::DevOverlayEnable(void)
{
    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++%s()\n\r"), _T(__FUNCTION__)));

    DWORD dwBytes;

    if (!m_OverlayCtxt.bEnabled)
    {
        if (m_OverlayCtxt.bLocalPath)
        {
            if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_LOCALPATH_SET_WIN0_START, NULL, 0, NULL, 0, &dwBytes, NULL) )
            {
                RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlaySetPosition() : IOCTL_SVE_LOCALPATH_SET_WIN0_START Failed\n\r")));
            }
        }
        else
        {
            DWORD dwParam;
            dwParam = OVERLAY_WINDOW;
            if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_ENABLE, &dwParam, sizeof(DWORD), NULL, 0, &dwBytes, NULL) )
            {
                RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] %s() : IOCTL_SVE_FIMD_SET_WINDOW_ENABLE Failed\n\r"), _T(__FUNCTION__)));
            }
        }

        m_OverlayCtxt.bEnabled = TRUE;
    }

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --%s()\n\r"), _T(__FUNCTION__)));
}


void
S3C6410Disp::DevOverlayDisable(void)
{
    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++%s()\n\r"), _T(__FUNCTION__)));

    DWORD dwBytes;

    if (m_OverlayCtxt.bEnabled)
    {
        if (m_OverlayCtxt.bLocalPath)
        {
            if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_LOCALPATH_SET_WIN0_STOP, NULL, 0, NULL, 0, &dwBytes, NULL) )
            {
                RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlaySetPosition() : IOCTL_SVE_LOCALPATH_SET_WIN0_STOP Failed\n\r")));
            }
        }
        else
        {
            DWORD dwParam;
            dwParam = OVERLAY_WINDOW;
            if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_DISABLE, &dwParam, sizeof(DWORD), NULL, 0, &dwBytes, NULL) )
            {
                RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlayDisable() : IOCTL_SVE_FIMD_SET_WINDOW_DISABLE Failed\n\r")));
            }
        }

        m_OverlayCtxt.bEnabled = FALSE;
    }

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --DevOverlayDisable()\n\r")));
}

void
S3C6410Disp::DevOverlayBlendDisable(void)
{
    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] DevOverlayBlendDisable()\n\r")));

    SVEARG_FIMD_WIN_COLORKEY tParamCKey;
    SVEARG_FIMD_WIN_ALPHA tParamAlpha;
    DWORD dwBytes;

    // Color Key Disable
    tParamCKey.dwWinNum = PRIMARY_WINDOW;
    tParamCKey.bOnOff = FALSE;
    tParamCKey.dwDirection = DISP_FG_MATCH_BG_DISPLAY;
    tParamCKey.dwColorKey = 0;
    tParamCKey.dwCompareKey = 0;

    // Alpha Set to 0x0 (Show Window0)
    tParamAlpha.dwWinNum = PRIMARY_WINDOW;
    tParamAlpha.dwMethod = DISP_ALPHA_PER_PLANE;
    tParamAlpha.dwAlpha0 = 0x0;
    tParamAlpha.dwAlpha1 = 0x0;

    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_BLEND_COLORKEY, &tParamCKey, sizeof(SVEARG_FIMD_WIN_COLORKEY), NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlayBlendDisable() : IOCTL_SVE_FIMD_SET_WINDOW_BLEND_COLORKEY Failed\n\r")));
    }

    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_BLEND_ALPHA, &tParamAlpha, sizeof(SVEARG_FIMD_WIN_ALPHA), NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlayBlendDisable() : IOCTL_SVE_FIMD_SET_WINDOW_BLEND_ALPHA Failed\n\r")));
    }

}


void
S3C6410Disp::DevOverlaySetColorKey(void)
{
    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] DevOverlaySetColorKey()\n\r")));

    SVEARG_FIMD_WIN_COLORKEY tParamCKey;
    DWORD dwBytes;

    if (m_OverlayCtxt.bSrcCKey)
    {
        tParamCKey.dwWinNum = PRIMARY_WINDOW;
        tParamCKey.bOnOff = TRUE;
        tParamCKey.dwDirection = DISP_BG_MATCH_FG_DISPLAY;
        tParamCKey.dwColorKey = m_OverlayCtxt.ColorKey;
        tParamCKey.dwCompareKey = m_OverlayCtxt.CompareKey;
    }
    else
    {
        tParamCKey.dwWinNum = PRIMARY_WINDOW;
        tParamCKey.bOnOff = TRUE;
        tParamCKey.dwDirection = DISP_FG_MATCH_BG_DISPLAY;
        tParamCKey.dwColorKey = m_OverlayCtxt.ColorKey;
        tParamCKey.dwCompareKey = m_OverlayCtxt.CompareKey;
    }

    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_BLEND_COLORKEY, &tParamCKey, sizeof(SVEARG_FIMD_WIN_COLORKEY), NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlaySetColorKey() : IOCTL_SVE_FIMD_SET_WINDOW_BLEND_COLORKEY Failed\n\r")));
    }

}


void
S3C6410Disp::DevOverlaySetAlpha(void)
{
    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] DevOverlaySetAlpha()\n\r")));

    SVEARG_FIMD_WIN_ALPHA tParamAlpha;
    DWORD dwBytes;

    if (m_OverlayCtxt.bUsePixelBlend)
    {
        tParamAlpha.dwWinNum = PRIMARY_WINDOW;
        tParamAlpha.dwMethod = DISP_ALPHA_PER_PIXEL;
        tParamAlpha.dwAlpha0 = m_OverlayCtxt.Alpha;
        tParamAlpha.dwAlpha1 = 0x0;
    }
    else
    {
        tParamAlpha.dwWinNum = PRIMARY_WINDOW;
        tParamAlpha.dwMethod = DISP_ALPHA_PER_PLANE;
        tParamAlpha.dwAlpha0 = m_OverlayCtxt.Alpha;
        tParamAlpha.dwAlpha1 = m_OverlayCtxt.Alpha;
    }

    if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_BLEND_ALPHA, &tParamAlpha, sizeof(SVEARG_FIMD_WIN_ALPHA), NULL, 0, &dwBytes, NULL) )
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlaySetAlpha() : IOCTL_SVE_FIMD_SET_WINDOW_BLEND_ALPHA Failed\n\r")));
    }

}


void
S3C6410Disp::DevRecoverOverlay(void)
{
    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++DevRecoverOverlay()\n\r")));

    if (m_OverlayCtxt.bShow)
    {
        // Initialize Overlay Window
        DevOverlayInitialize();

        // Configure Blending
        if (m_OverlayCtxt.bBlendOn)
        {
            if (m_OverlayCtxt.bColorKey)
            {
                DevOverlaySetColorKey();
            }
            else
            {
                DevOverlaySetAlpha();
            }
        }
        else
        {
            DevOverlayBlendDisable();
        }

        DevOverlayEnable();
    }

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --DevRecoverOverlay()\n\r")));
}

⌨️ 快捷键说明

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