cellCamera: fix buffer allocation
This commit is contained in:
@@ -541,15 +541,18 @@ error_code cellCameraOpenEx(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
|
|||||||
|
|
||||||
std::lock_guard lock(g_camera.mutex);
|
std::lock_guard lock(g_camera.mutex);
|
||||||
|
|
||||||
if (info->read_mode == CELL_CAMERA_READ_FUNCCALL && !info->buffer)
|
// TODO: find out if the buffers are also checked for nullptr
|
||||||
{
|
if (info->read_mode == CELL_CAMERA_READ_DIRECT)
|
||||||
info->buffer = vm::cast(vm::alloc(vbuf_size, vm::main));
|
|
||||||
info->bytesize = vbuf_size;
|
|
||||||
}
|
|
||||||
else if (info->read_mode && !info->pbuf[0] && !info->pbuf[1])
|
|
||||||
{
|
{
|
||||||
info->pbuf[0] = vm::cast(vm::alloc(vbuf_size, vm::main));
|
info->pbuf[0] = vm::cast(vm::alloc(vbuf_size, vm::main));
|
||||||
info->pbuf[1] = vm::cast(vm::alloc(vbuf_size, vm::main));
|
info->pbuf[1] = vm::cast(vm::alloc(vbuf_size, vm::main));
|
||||||
|
|
||||||
|
// TODO: verify
|
||||||
|
info->bytesize = vbuf_size;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
info->buffer = vm::cast(vm::alloc(vbuf_size, vm::main));
|
||||||
info->bytesize = vbuf_size;
|
info->bytesize = vbuf_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -604,7 +607,18 @@ error_code cellCameraClose(s32 dev_num)
|
|||||||
std::lock_guard lock(g_camera.mutex);
|
std::lock_guard lock(g_camera.mutex);
|
||||||
g_camera.is_streaming = false;
|
g_camera.is_streaming = false;
|
||||||
|
|
||||||
vm::dealloc(g_camera.info.buffer.addr(), vm::main);
|
if (g_camera.info.buffer)
|
||||||
|
{
|
||||||
|
vm::dealloc(g_camera.info.buffer.addr(), vm::main);
|
||||||
|
}
|
||||||
|
if (g_camera.info.pbuf[0])
|
||||||
|
{
|
||||||
|
vm::dealloc(g_camera.info.pbuf[0].addr(), vm::main);
|
||||||
|
}
|
||||||
|
if (g_camera.info.pbuf[1])
|
||||||
|
{
|
||||||
|
vm::dealloc(g_camera.info.pbuf[1].addr(), vm::main);
|
||||||
|
}
|
||||||
|
|
||||||
g_camera.close_camera();
|
g_camera.close_camera();
|
||||||
g_camera.is_open = false;
|
g_camera.is_open = false;
|
||||||
@@ -1777,6 +1791,19 @@ void camera_context::reset_state()
|
|||||||
pbuf_locked[0] = false;
|
pbuf_locked[0] = false;
|
||||||
pbuf_locked[1] = false;
|
pbuf_locked[1] = false;
|
||||||
|
|
||||||
|
if (info.buffer)
|
||||||
|
{
|
||||||
|
vm::dealloc(info.buffer.addr(), vm::main);
|
||||||
|
}
|
||||||
|
if (info.pbuf[0])
|
||||||
|
{
|
||||||
|
vm::dealloc(info.pbuf[0].addr(), vm::main);
|
||||||
|
}
|
||||||
|
if (info.pbuf[1])
|
||||||
|
{
|
||||||
|
vm::dealloc(info.pbuf[1].addr(), vm::main);
|
||||||
|
}
|
||||||
|
|
||||||
std::scoped_lock lock(mutex_notify_data_map);
|
std::scoped_lock lock(mutex_notify_data_map);
|
||||||
notify_data_map.clear();
|
notify_data_map.clear();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user