X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin4_src%2FServer%2FCSurface.cpp;h=27078d87d98a558be2a413d5c197ddb1ae1b3758;hb=5f4d39ad0059ceec48c59d5ed87457a6bcb1c5f1;hp=429657a345cb7a684141ed0bbb0cfef675f30b78;hpb=4696a38ba9ea5798e67ccd475c8b77f318db133d;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin4_src/Server/CSurface.cpp b/Usermode/Applications/axwin4_src/Server/CSurface.cpp index 429657a3..27078d87 100644 --- a/Usermode/Applications/axwin4_src/Server/CSurface.cpp +++ b/Usermode/Applications/axwin4_src/Server/CSurface.cpp @@ -9,11 +9,15 @@ #include #include #include +#include +#include namespace AxWin { CSurface::CSurface(int x, int y, unsigned int w, unsigned int h): - m_rect(x,y, w,h) + m_rect(x,y, w,h), + m_fd(-1), + m_data(0) { if( w > 0 && h > 0 ) { @@ -25,18 +29,50 @@ CSurface::~CSurface() { } +uint64_t CSurface::GetSHMHandle() +{ + size_t size = m_rect.m_w*m_rect.m_h*4; + if( m_fd == -1 ) + { + // 2. Allocate a copy in SHM + m_fd = _SysOpen("/Devices/shm/anon", OPENFLAG_WRITE|OPENFLAG_READ); + if(m_fd == -1) { + _SysDebug("GetSHMHandle: Unable to open anon SHM"); + return -1; + } + // 1. Free local buffer + delete m_data; + _SysTruncate(m_fd, size); + } + else + { + _SysMUnMap(m_data, size); + } + // 3. mmap shm copy + m_data = static_cast( _SysMMap(nullptr, size, MMAP_PROT_WRITE, 0, m_fd, 0) ); + if(!m_data) throw ::std::system_error(errno, ::std::system_category()); + + return _SysMarshalFD(m_fd); +} + void CSurface::Resize(unsigned int W, unsigned int H) { - // Easy realloc - // TODO: Should I maintain window contents sanely? NOPE! - delete m_data; - m_data = new uint32_t[W * H]; + if( m_fd == -1 ) + { + // Easy realloc + // TODO: Should I maintain window contents sanely? NOPE! + delete m_data; + m_data = new uint32_t[W * H]; + } + else + { + //_SysIOCtl(m_fd, SHM_IOCTL_SETSIZE, W*H*4); + } m_rect.Resize(W, H); } void CSurface::DrawScanline(unsigned int row, unsigned int x_ofs, unsigned int w, const void* data) { - _SysDebug("DrawScanline(%i,%i,%i,%p)", row, x_ofs, w, data); if( row >= m_rect.m_h ) throw ::std::out_of_range("CSurface::DrawScanline row"); if( x_ofs >= m_rect.m_w ) @@ -45,8 +81,8 @@ void CSurface::DrawScanline(unsigned int row, unsigned int x_ofs, unsigned int w if( w > m_rect.m_w ) throw ::std::out_of_range("CSurface::DrawScanline width"); - _SysDebug(" memcpy(%p, %p, %i)", &m_data[row*m_rect.m_w + x_ofs], data, w*4 ); - ::memcpy( &m_data[row*m_rect.m_w + x_ofs], data, w*4 ); + size_t ofs = row*m_rect.m_w + x_ofs; + ::memcpy( &m_data[ofs], data, w*4 ); } const uint32_t* CSurface::GetScanline(unsigned int row, unsigned int x_ofs) const