none
关于WinCE中的显示驱动一问? RRS feed

  • 问题

  •  

    打算开发显示驱动,看了些文档。好像要继承GPE类,我发现还有个GPESurf类。文档里是这样描述的:

     

    The GPESurf class represents a surface allocated, by the driver or by the Graphics Device Interface (GDI).

     

     

    这句话应该如何理解阿?有什么作用呢?何时使用GPE类,何时使用GPESurf类呢??

     

    请高手给予解答,万分感谢!

     

     

    2008年8月7日 6:27

答案

  •  

    GPE类和GPESurf类没有什么可比性,GPE类相当于用来表示的是display driver的MDD类,也就是说是一个display driver的抽象层。而GPESurf是被GPE类用来表示surface的一个类,这两者不在同一个层次上。你当然可以质疑GPESurf的作用,但是GPE的实现却是要基于GPESurf的,这是由GPE类的设计所决定的。就像你在你自己定义了两个类A和B,B是服务于A的,那你问A和B有什么区别是没有意义的。

    对于写display driver来说,GPE并不是必须的,你当然可以抛弃GPE从DDI层开始实现driver,只不过GPE帮你实现了大多数微软认为与硬件无关的代码,并且也实现的DDI的所有接口,你要做的只是把GPE暴露出来的几个必须实现的与硬件相关的函数实现罢了。

    2008年8月26日 7:05

全部回复

  •  

    我最近在开发DirectDraw驱动,也是刚开始搞。

    GPE可以看作驱动控制和初始化的类,GPESurf可以看作是一块显存。

    不知道你对DirectDraw熟悉否,GPESurf可以看作DirectDraw下的一个surface。其实在GDI启动时也会创建一个主surface,用于显示。

    建议看一下wince的显示驱动。

    2008年8月25日 3:30
  • 我只说Display驱动,至于DirectDraw类,应该是DDGPE类了吧。

     

    其实在WinCE6.0下,GPE类里面也定义了GPESurf类的指针,这样其实也具有了GPESurf的方法和属性。一般用GPE类就足够了,那GPESurf类什么时候用呢?

     

    2008年8月25日 5:18
  •  

    关于GPESurf类我没怎么研究,我研究的主要是还关于DDGPESurf。其实无论是GDI还是DirectDraw都是基于GPE实现,因此两者有很多相似的地方,所以在上个帖子中才建议你看看DirecetDraw的驱动源码,在这些源码中可以看到是如何利用GPESurf类或者GPESurf的子类。

     

    在Wince源码中,关于GPESurf有如下注释:

    // CLASS GPESurf
    //
    // This is the class used for surfaces created in system memory
    // Derived classes are used for surfaces stored in video memory

     

    刚才看了一下GPESurf类的属性和方法,个人觉得是对应着一块分配好的内存,负责获取或管理这块分配好的内存的信息。

    比方说,new一个GPESurf类,这时将分配一块内存,

    GPESurf::GPESurf()

    {

            m_nStrideBytes         = ( (EGPEFormatToBpp[ format ] * width + 7 )/ 8 + 3 ) & ~3L;
            m_pVirtAddr            = (ADDRESS)new unsigned char[ m_nStrideBytes * height ];

    }

    分配的内存地址保存在m_pVirtAddr,m_fInVideoMemory置0,表明其缓存分配不在显存中;这些工作在GPE::AllocSurface中完成。

    其中第一行代码是根据X位色计算需要的内存。

     

    如果是GPESurf的子类,可以考虑分配一块显存,将显存的偏移地址保存在m_nOffsetInVideoMemory中,m_fInVideoMemory置1,这些工作在GPE子类::AllocSurface中完成。

     

    当需要进行绘图时,需要将图绘制到一块buffer上,然后在显示这块绘制好的buffer。绘图时需要获取这块buffer的地址,就可以通过GPESurf::Buffer()方法获取这块buffer进行绘图。

     

    以上仅是个人分析根据DDGPESurf的分析。希望对你有帮助!

     

    2008年8月25日 6:07
  • 我知道DDGPE继承于GPE,DDGPESurf继承于GPESurf。同样在GPE类里面也可以在系统内存中分配一块内存。但是我没有看到GPESurf和GPE到底在使用上面有什么区别,我前面说过了,GPE类的定义里面已经包含了GPESurf类的指针。我在开发Display驱动的时候,什么时候使用GPE类,什么时候使用GPESurf类呢?

     

    我个人觉得只使用GPE就够了,甚至觉得GPESurf可以不考虑。

     

    你写DirectDraw驱动也同样。你也可以使用DDGPE类,一样没有问题,可你使用了DDGPESurf类,那请问你真的理解了DDGPE类和DDGPESurf类的区别了么?

     

    微软提供了这两个类,到底他们有什么本质的区别么?

    2008年8月25日 6:48
  •  

    我说一下对DDGPE和DDGPESurf的理解吧,不知能否对你有帮助。

    DDGPE对应一个硬件显示设备,DDGPESurf对应着系统中分配的显示缓冲块,系统中的显示设备设备只有一个,因此DDGPE类实例也只有一个。系统分配了各种各样用途的显示缓冲块,如:用于primary surface的缓冲块、backbuffer、用于offscreen的缓冲块等等。每个缓冲快对应一个DDGPESurf实例(个人感觉微软把一块显存称为一个surface)。

     

    操纵硬件用DDGPE,操纵显存块用DDGPESurf。通过DDGPESurf我可以方便的操纵它对应的显存。如果把DDGPESurf删除,那么对应的每块显存块通过链表搜索使用吗?好像不太方便。

     

    呵呵,刚开始接触WinCE,有点班门弄斧了!见笑!

    2008年8月25日 7:19
  • “DDGPE对应一个硬件显示设备,DDGPESurf对应着系统中分配的显示缓冲块”

     

    上面这句话没明白你什么意思?

     

    比如我的系统里有一个LCD显示,你说我用DDGPE还是用DDGPESurf类?Frame buffer都是已经预留好的,在config.bib文件中定义了。DDGPESurf里面无非就是在系统内存中又分配了一块显存,但最终不还是要通过Frame buffer把数据刷到LCD上面么,我知道DDGPESurf类中的属性和方法和DDGPE类有区别,但实际上在使用中用哪个类都可以。

     

     

    假如有人说,DDGPESurf在做屏幕翻转的时候效率更高,或者在画什么图形的时候,速度更快。那我就会根据自己的应用需求来选择用DDGPESurf类。但是目前没有发现这两个类对系统应用会有什么影响。

     

     

    我的问题是:这两个类有区别,那么这些区别到底对WinCE系统来说,有什么影响呢?何时该使用DDGPE或GPE,何时使用DDGPESurf或GPESurf?

    2008年8月25日 8:47
  • “DDGPE对应一个硬件显示设备,DDGPESurf对应着系统中分配的显示缓冲块”

    这句话我指的是在系统中,硬件部分会有控制显示的单元,DDGPE就是用来初始化和配置这部分的。

    DDGPESurf是用于系统中显存动态分配和回收,比方说显存预先定义为16M,那么这16M显存每划分出来一块buffer就对应的创建一个DDGPESurf实例。

     

    在你的系统中用于LCD显示的Buffer已经预先分配好,也就是显存(或者用的是系统内存)已经固定,无需动态分配,那么个人觉得无需用到DDGPESurf类。

    我这边搞的是一个需要动态分配显存的系统,因此用到DDGPESurf类。

     

    另外,补充一下,在DirectDraw中有surface的概念,DDGPESurf和surface有着对应的关系。我是从surface的角度来理解的DDGPESurf。DirectDraw中会创建或回收各种各样的surface,每个surface都需要显存,它的显存分配不是固定的。我没有研究过GDI,不知道在GDI中是否也有surface的概念。

     

    希望上面的解释对你有帮助。

     

    2008年8月25日 10:41
  • 我不同意你的看法,DDGPE类也可以实现在系统中动态分配显存.

     

    我的系统中用LCD,用frame buffer.难道你的系统中没有LCD么?没有frame buffer么?你最终还是要把数据显示到LCD上面.你总不可能只把数据写到你的动态分配的内存中把,那样是显示不出来画面的,你不还是要把数据写到frame buffer中,最中被刷到LCD上面.

     

    我的看法是,在你的驱动中,你即使不用DDGPESurf类,就用DDGPE类也能实现.

     

    我的问题是Big SmileDGPE类或GPE类和DDGPESurf类或GPESurf类,他们在WinCE中到底什么区别? 在开发Display驱动时,什么时候该使用DDGPE或GPE,什么时候该使用DDGPESurf或GPESurf类?

     

     

    原代码我也看过,大概的东西也都理解,但是不明白本质有什么区别?不明白系统会怎么使用这两个不同的类?

     

    2008年8月25日 13:49
  • 举个例子DDGPESurf类有SetOverlay,可作用于overlay.
    2008年8月25日 15:32
  • 从类的定义来看是这样。那是如何支持的呢?你了解么?

     

    这个Overlay对硬件有要求么?比如是针对不同的LCD控制器,或者其它什么的。还是为了满足什么特殊的软件应用?

     

     

    还是老问题:开发显示驱动用DDGPE或者DDGPESurf都可以,他们两个对WinCE来说到底有什么本质的区别,什么时候该用DDGPE? 而什么时候用DDGPESurf更好?

     

    表面上的东西就不要说了,没什么意思。

    2008年8月26日 1:41
  •  

    GPE类和GPESurf类没有什么可比性,GPE类相当于用来表示的是display driver的MDD类,也就是说是一个display driver的抽象层。而GPESurf是被GPE类用来表示surface的一个类,这两者不在同一个层次上。你当然可以质疑GPESurf的作用,但是GPE的实现却是要基于GPESurf的,这是由GPE类的设计所决定的。就像你在你自己定义了两个类A和B,B是服务于A的,那你问A和B有什么区别是没有意义的。

    对于写display driver来说,GPE并不是必须的,你当然可以抛弃GPE从DDI层开始实现driver,只不过GPE帮你实现了大多数微软认为与硬件无关的代码,并且也实现的DDI的所有接口,你要做的只是把GPE暴露出来的几个必须实现的与硬件相关的函数实现罢了。

    2008年8月26日 7:05
  •  

    还是楼上总结的明白!受教了!
    2008年8月26日 7:33
  • 你的意思是说,开发Display驱动要从GPE类继承,不能从GPESurf类继承,至少GPESurf类里面没有像GPE类那样提供了那些纯虚函数来让PDD层实现,对吧。

     

    也就是说GPESurf类本身单独存在没有太大意义,而真正有用的还是GPE类,该类里面定义了GPESurf类的一个指针,这样GPE类就包含了GPESurf类的特性。

     

    这里是我疏忽了,我没有仔细看GPESurf类的定义,以为它里面也包含了和GPE类中同样的纯虚函数,需要PDD层来实现,刚才又review了一下代码,GPESurf类中并没有提供硬件相关的函数接口。所以,这样看来,你的解释是正确的。

     

    2008年8月26日 8:35