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`5pu(EYm3UU0
LUPA开源社区|'cL7Fy2\NS
'g3UR7r#p8wo+a-W0
LUPA开源社区f
Pa#l_J\
b!Z7] Wd7ZG/u/y0
然后调用MapViewOfFile
2Di%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: