stuff-from-scratch/src/ui/windows/ui_interfaces/wayland/WaylandBuffer.cpp
2023-01-17 10:13:25 +00:00

78 lines
1.8 KiB
C++

#include "WaylandBuffer.h"
#include "FileLogger.h"
#include <sys/mman.h>
#include <unistd.h>
void WaylandBuffer::initializeSharedBuffer(int size)
{
mSharedMemory = std::make_unique<SharedMemory>();
mSharedMemory->allocate("/wl_shm-XXXXXX", size);
if (!mSharedMemory->isValid())
{
return;
}
mPoolData = static_cast<uint8_t*>(mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, mSharedMemory->getFileDescriptor(), 0));
if (mPoolData == MAP_FAILED)
{
close(mSharedMemory->getFileDescriptor());
mPoolData = nullptr;
}
}
void WaylandBuffer::setSharedMemory(wl_shm* shared_memory)
{
mWlSharedMemory = shared_memory;
}
void WaylandBuffer::setUpPool(int size, int width, int height, int stride)
{
if (!mSharedMemory->isValid())
{
MLOG_ERROR("Failed to allocate shared memory.");
return;
}
if (!mPoolData)
{
MLOG_ERROR("Failed to allocate shared memory.");
return;
}
auto pool = wl_shm_create_pool(mWlSharedMemory, mSharedMemory->getFileDescriptor(), size);
int index = 0;
// int offset = height * stride * index; // Two buffers, offset to starting point of second
int offset = 0;
mWorkingBuffer = wl_shm_pool_create_buffer(pool, offset, width, height, stride, WL_SHM_FORMAT_XRGB8888);
wl_shm_pool_destroy(pool);
close(mSharedMemory->getFileDescriptor());
}
void WaylandBuffer::tearDownPool(int size)
{
munmap(mPoolData, size);
auto wl_buffer_release = [](void *data, struct wl_buffer *wl_buffer)
{
wl_buffer_destroy(wl_buffer);
};
mBufferListener.release = wl_buffer_release;
wl_buffer_add_listener(mWorkingBuffer, &mBufferListener, nullptr);
}
uint8_t* WaylandBuffer::getPoolData()
{
return mPoolData;
}
wl_buffer* WaylandBuffer::getWorkingBuffer()
{
return mWorkingBuffer;
}