Mic 的技术点滴:关于linux, wince 6.0...还有其他牢骚 mic's another world http://www.ootroo.com/zblog

Wince 5下面frame buffer 内存分配

上一篇 / 下一篇  2008-04-15 11:28:50 / 个人分类:瘟蜥蜴

如何在wince下分配大段的内存,比如说framebuffer,应该是需要了解的事情。
今天在看framebuffer的驱动——还是习惯这个叫法——在代码中可以看出来。

Wt{$by H"I3m0
首先调用CreateFileMapping创建一个file-mapping 对象。什么是file-mapping对象啊?file-mapping对象就是内存映射文件对象。

.Hn5H2f/D!nQPN0
首先通过CreateFileMapping()函数创建一个内存映射文件对象,如果创建成功则通过MapViewOfFile()函数将此文件映射对象的视图映射进地址空间,同时得到此映射视图的首址。
;c$D`5p u(EYm3UU0
LUPA开源社区|'cL7Fy2\NS

'g3UR7r#p8wo+a-W0
LUPA开源社区 f Pa#l_J\

b!Z7] Wd7ZG/u/y0
然后调用MapViewOfFile

2D i%u`l nL {?d0
然后就是virtualCopy,使得之前分配的地址在物理上真正得到兑现
LUPA开源社区 {n&P ?0\
接着设置属性
LUPA开源社区&FU8[:d9Wx?4M
最后清零分配的内存区域。
LUPA开源社区D1D{x3^bB
可以看到,在分配连续的,可以使用dma的内存的时候,没有用virtualAlloc了。而是创建file-mapping object.

%x.obd U!`F0n$L0
以下是代码片段
    // compute frame buffer displayable area offset
    offsetX = (m_cxPhysicalScreen - m_nScreenWidthSave) / 2;
    offsetY = (m_cyPhysicalScreen - m_nScreenHeightSave) / 2;
    fbOffset = (offsetY * m_cbScanLineLength) + offsetX;
LUPA开源社区*e^$^ YJr N8r'}
    // compute physical frame buffer size
    fbSize = m_cyPhysicalScreen * m_cbScanLineLength;
LUPA开源社区*}-N}3d8m*uF;y
    // for DDraw enabled, make sure we also have some off-screen video memory available for surface allocations
    fbSize = 0x100000;

Fo9S:Kf,P s D0
    // Use CreateFileMapping/MapViewOfFile to guarantee the VirtualFrameBuffer
    // pointer is allocated in shared memory.

~MRmP'|/?$U|A0
    m_hVFBMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, fbSize, NULL);

M/M*k.AsiSk&}#k0
    if (m_hVFBMapping != NULL) {
            m_VirtualFrameBuffer = (DWORD)MapViewOfFile(m_hVFBMapping, FILE_MAP_WRITE, 0, 0, 0);
    } else {
        m_VirtualFrameBuffer = NULL;
    }

b`J/U)Fza`0
        if (VirtualCopy((void *)m_VirtualFrameBuffer, (void *)(m_pvFlatFrameBuffer >> 8), fbSize, PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL)) {
            CeSetMemoryAttributes ((void *)m_VirtualFrameBuffer, (void *)(m_pvFlatFrameBuffer >> 8), fbSize, PAGE_WRITECOMBINE);
        }

/Y$zF;uSM!e3O m0
    memset ((void*)m_VirtualFrameBuffer, 0x0, fbSize);LUPA开源社区H+c4}9\BU+]

!n @#zk n0

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar