isware
驱动牛犊
驱动牛犊
  • 注册日期2006-01-24
  • 最后登录2013-04-15
  • 粉丝0
  • 关注0
  • 积分385分
  • 威望79点
  • 贡献值0点
  • 好评度38点
  • 原创分0分
  • 专家分0分
阅读:6672回复:1

请教显卡驱动中关于Device Managed Bitmap 和 GDI Managed Bitmap的问题

楼主#
更多 发布于:2011-01-04 20:33
在看DDK中提供的显卡驱动的示例(src\video\displays\3dlabs\perm3),其中DrvCreateDeviceBitmap函数创建并关联了两次Bitmap:
HBITMAP
DrvCreateDeviceBitmap( DHPDEV      dhpdev,  SIZEL       sizl,  ULONG       iFormat)
{
    …… 省略部分不相关的代码 ……

    // 这里先创建了一个Device Managed Bitmap
    hbmDevice = EngCreateDeviceBitmap((DHSURF) pdsurf, sizl, iFormat);

    // 然后将其关联到GDI返回的 hdevEng 上
    if (EngAssociateSurface(
                        (HSURF) hbmDevice, ppdev->hdevEng, flHooks))
                {
                    pdsurf->dt    = DT_SCREEN;
                    pdsurf->bOffScreen = TRUE;
                    pdsurf->poh   = poh;
                    pdsurf->sizl  = sizl;
                    pdsurf->ppdev = ppdev;
                    poh->pdsurf   = pdsurf;

                    // 接着又在下面bCreateScreenDIBForOH函数中创建一个GDI Managed Bitmap
                    // 同样也关联到同一个 hdevEng
                    // 该函数注释说是当硬件无法执行绘制操作时,可以让GDI直接在屏幕上绘图。
                    // 并解释:This is possible because we map the screen in fully and linearly

                    if (bCreateScreenDIBForOH(ppdev, poh, HOOK_SYNCHRONIZE))
                    {
                        DISPDBG((DBGLVL, "DFB created at (%d,%d), w %d, h %d",
                                         poh->x, poh->y, poh->cx, poh->cy));

                        return (hbmDevice);
                    }
    ……
}

BCreateScreenDIBForOH的代码一并贴上来:
/******************************Public*Routine**********************************\
 * BOOL bCreateScreenDIBForOH
 *
 * Given an OH create a surface for the bitmap which is accessible by GDI.
 * So if we can't handle any drawing using GLINT we can get GDI to draw
 * driectly to the screen. This is possible because we map the screen in
 * fully and linearly. We can use this for the screen and off-screen bitmaps.
 *
 * Returns: FALSE if we didn't create the surface, TRUE if we did.
 *
\******************************************************************************/

BOOL
bCreateScreenDIBForOH(
    PPDEV       ppdev,
    OH         *poh,
    ULONG       hooks)
{              
    DSURF      *pdsurf = poh->pdsurf;
    UCHAR      *pvBits = poh->pvScan0;
    LONG        lDelta = poh->lPixDelta << ppdev->cPelSize;
    HBITMAP     hbmDib;
    SURFOBJ    *pso;    

    DISPDBG((DBGLVL, "bCreateScreenDIBForOH: poh at 0x%x, pdsurf at 0x%x, "
                     "pvBits 0x%x", poh, pdsurf, pvBits));

    hbmDib = EngCreateBitmap(
                 pdsurf->sizl,
                 (ULONG)lDelta,
                 (ULONG)(ppdev->iBitmapFormat),
                 (FLONG)(((lDelta > 0) ? BMF_TOPDOWN : 0)),
                 (PVOID)pvBits);
    if (hbmDib)
    {
        
        // set HOOK_SYNCHRONIZE so that GDI will call DrvSynchronize before
        // drawing on this surface. This means we can call Eng anytime safe
        // in the knowledge that DrvSynchronize will sync for us.
        //
        if (EngAssociateSurface((HSURF)hbmDib, ppdev->hdevEng, hooks))
        {            
            // NB: use the temporary pso so we don't overwrite pdsurf->pso
            // if we fail
            if (pso = EngLockSurface((HSURF)hbmDib))
            {
                pdsurf->pso = pso;
                DISPDBG((DBGLVL, "created surface 0x%x", pso));
                return (TRUE);
            }
        }

        EngDeleteSurface((HSURF)hbmDib);
    }

    DISPDBG((DBGLVL, "bCreateScreenDIBForOH failed"));
    return (FALSE);
}

需要请教的问题
DrvCreateDeviceBitmap函数实际上是在同一个ppdev->hdevEng上执行了两次 EngAssociateSurface,分别先后关联了两个不同类型的Bitmap:
    EngCreateDeviceBitmap 函数创建的Device Managed Bitmap
    EngCreateBitmap  函数创建的GDI Managed Bitmap

这两个函数返回的都是HBITMAP,第二次调用EngAssociateSurface难道不会覆盖第一次调用的关联吗,系统对这两种不同的Bitmap是怎么处理的,麻烦简单介绍一下其工作机制或者给个参考资料的链接也行。

不胜感激!



isware
驱动牛犊
驱动牛犊
  • 注册日期2006-01-24
  • 最后登录2013-04-15
  • 粉丝0
  • 关注0
  • 积分385分
  • 威望79点
  • 贡献值0点
  • 好评度38点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2011-01-06 14:28
看来只能不求甚解了。
就当他原本就该这样子好了。
游客

返回顶部