cellFont, cellFs, cellGcmSys funcs added, minor cleanup

This commit is contained in:
Nekotekina 2015-08-03 01:00:00 +03:00
parent c0b90d01bd
commit c7ee8cadde
7 changed files with 391 additions and 52 deletions

View File

@ -180,7 +180,8 @@ public:
write_relaxed(sub_data, to_subtype(value));
}
// perform an atomic operation on data (callable object version, first arg is a reference to atomic type)
// perform an atomic operation on data (func is either pointer to member function or callable object with a T& first arg);
// returns the result of the callable object call or previous (old) value of the atomic variable if the return type is void
template<typename F, typename... Args, typename RT = std::result_of_t<F(T&, Args...)>> auto atomic_op(F func, Args&&... args) volatile -> decltype(atomic_op_result_t<F, RT, T>::result)
{
while (true)

View File

@ -228,14 +228,12 @@ namespace vm
catch (...)
{
// capture any exception possibly thrown by predicate
auto exception = std::current_exception();
// set new predicate that will throw this exception from the original thread
pred = [exception]() -> bool
pred = [exception = std::current_exception()]
{
// new predicate will throw the captured exception from the original thread
std::rethrow_exception(exception);
// dummy return value
// dummy return value, remove when std::rethrow_exception gains [[noreturn]] attribute in MSVC
return true;
};
}
@ -282,6 +280,9 @@ namespace vm
void _notify_at(u32 addr, u32 size)
{
// skip notification if no waiters available
if (_mm_mfence(), !g_waiter_max) return;
std::lock_guard<std::mutex> lock(g_waiter_list_mutex);
const u32 mask = ~(size - 1);

View File

@ -249,12 +249,11 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
m_read_buffer = true;
m_flip_status = 0;
if (m_flip_handler)
if (auto cb = m_flip_handler)
{
auto cb = m_flip_handler;
Emu.GetCallbackManager().Async([=](CPUThread& CPU)
Emu.GetCallbackManager().Async([=](CPUThread& cpu)
{
cb(static_cast<PPUThread&>(CPU), 1);
cb(static_cast<PPUThread&>(cpu), 1);
});
}
@ -2311,11 +2310,19 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case GCM_SET_USER_COMMAND:
{
const u32 cause = ARGS(0);
auto cb = m_user_handler;
Emu.GetCallbackManager().Async([=](CPUThread& CPU)
if (auto cb = m_user_handler)
{
cb(static_cast<PPUThread&>(CPU), cause);
});
Emu.GetCallbackManager().Async([=](CPUThread& cpu)
{
cb(static_cast<PPUThread&>(cpu), cause);
});
}
else
{
throw EXCEPTION("User handler not set");
}
break;
}
@ -2477,9 +2484,9 @@ void RSXThread::Task()
if (auto cb = m_vblank_handler)
{
Emu.GetCallbackManager().Async([=](CPUThread& CPU)
Emu.GetCallbackManager().Async([=](CPUThread& cpu)
{
cb(static_cast<PPUThread&>(CPU), 1);
cb(static_cast<PPUThread&>(cpu), 1);
});
}
}
@ -2544,10 +2551,7 @@ void RSXThread::Task()
if (cmd == 0) //nop
{
m_ctrl->get.atomic_op([](be_t<u32>& value)
{
value += 4;
});
m_ctrl->get += 4;
continue;
}
@ -2560,10 +2564,7 @@ void RSXThread::Task()
DoCmd(cmd, cmd & 0x3ffff, args.addr(), count);
m_ctrl->get.atomic_op([count](be_t<u32>& value)
{
value += (count + 1) * 4;
});
m_ctrl->get += (count + 1) * 4;
}
OnExitThread();

View File

@ -310,7 +310,7 @@ Module cellCamera("cellCamera", []()
REG_FUNC(cellCamera, cellCameraInit);
REG_FUNC(cellCamera, cellCameraEnd);
REG_FUNC(cellCamera, cellCameraOpen);
REG_FUNC(cellCamera, cellCameraOpen); // was "renamed", but exists
REG_FUNC(cellCamera, cellCameraOpenEx);
REG_FUNC(cellCamera, cellCameraClose);
@ -323,7 +323,7 @@ Module cellCamera("cellCamera", []()
REG_FUNC(cellCamera, cellCameraGetAttribute);
REG_FUNC(cellCamera, cellCameraSetAttribute);
REG_FUNC(cellCamera, cellCameraGetBufferSize);
REG_FUNC(cellCamera, cellCameraGetBufferInfo);
REG_FUNC(cellCamera, cellCameraGetBufferInfo); // was "renamed", but exists
REG_FUNC(cellCamera, cellCameraGetBufferInfoEx);
REG_FUNC(cellCamera, cellCameraPrepExtensionUnit);

View File

@ -48,17 +48,6 @@ s32 cellFontGetRevisionFlags(vm::ptr<u64> revisionFlags)
return CELL_OK;
}
s32 cellFontInit(PPUThread& ppu, vm::ptr<CellFontConfig> config)
{
cellFont.Warning("cellFontInit(config=*0x%x)", config);
vm::stackvar<be_t<u64>> revisionFlags(ppu);
revisionFlags.value() = 0;
cellFontGetRevisionFlags(revisionFlags);
return cellFontInitializeWithRevision(revisionFlags.value(), config);
}
s32 cellFontEnd()
{
cellFont.Warning("cellFontEnd()");
@ -632,11 +621,176 @@ s32 cellFontGetCharGlyphMetricsVertical()
return CELL_OK;
}
s32 cellFontGetRenderEffectWeight()
{
throw EXCEPTION("");
}
s32 cellFontGraphicsGetDrawType()
{
throw EXCEPTION("");
}
s32 cellFontGetKerning()
{
throw EXCEPTION("");
}
s32 cellFontGetRenderScaledKerning()
{
throw EXCEPTION("");
}
s32 cellFontGetRenderScalePixel()
{
throw EXCEPTION("");
}
s32 cellFontGlyphGetScalePixel()
{
throw EXCEPTION("");
}
s32 cellFontGlyphGetHorizontalShift()
{
throw EXCEPTION("");
}
s32 cellFontRenderCharGlyphImageHorizontal()
{
throw EXCEPTION("");
}
s32 cellFontGetEffectWeight()
{
throw EXCEPTION("");
}
s32 cellFontGetScalePixel()
{
throw EXCEPTION("");
}
s32 cellFontClearFileCache()
{
throw EXCEPTION("");
}
s32 cellFontAdjustFontScaling()
{
throw EXCEPTION("");
}
s32 cellFontSetupRenderScalePoint()
{
throw EXCEPTION("");
}
s32 cellFontGlyphGetVerticalShift()
{
throw EXCEPTION("");
}
s32 cellFontGetGlyphExpandBufferInfo()
{
throw EXCEPTION("");
}
s32 cellFontGetLibrary()
{
throw EXCEPTION("");
}
s32 cellFontVertexesGlyphRelocate()
{
throw EXCEPTION("");
}
s32 cellFontGetInitializedRevisionFlags()
{
throw EXCEPTION("");
}
s32 cellFontGetResolutionDpi()
{
throw EXCEPTION("");
}
s32 cellFontGlyphRenderImageVertical()
{
throw EXCEPTION("");
}
s32 cellFontGlyphRenderImageHorizontal()
{
throw EXCEPTION("");
}
s32 cellFontAdjustGlyphExpandBuffer()
{
throw EXCEPTION("");
}
s32 cellFontGetRenderScalePoint()
{
throw EXCEPTION("");
}
s32 cellFontGraphicsGetFontRGBA()
{
throw EXCEPTION("");
}
s32 cellFontGlyphGetOutlineVertexes()
{
throw EXCEPTION("");
}
s32 cellFontDelete()
{
throw EXCEPTION("");
}
s32 cellFontPatchWorks()
{
throw EXCEPTION("");
}
s32 cellFontGlyphRenderImage()
{
throw EXCEPTION("");
}
s32 cellFontGetBindingRenderer()
{
throw EXCEPTION("");
}
s32 cellFontGenerateCharGlyphVertical()
{
throw EXCEPTION("");
}
s32 cellFontGetRenderEffectSlant()
{
throw EXCEPTION("");
}
s32 cellFontGetScalePoint()
{
throw EXCEPTION("");
}
s32 cellFontGraphicsGetLineRGBA()
{
throw EXCEPTION("");
}
Module cellFont("cellFont", []()
{
g_font.init = false;
REG_FUNC(cellFont, cellFontInit);
REG_FUNC(cellFont, cellFontSetFontsetOpenMode);
REG_FUNC(cellFont, cellFontSetFontOpenMode);
REG_FUNC(cellFont, cellFontCreateRenderer);
@ -686,4 +840,37 @@ Module cellFont("cellFont", []()
REG_FUNC(cellFont, cellFontGetCharGlyphMetricsVertical);
REG_FUNC(cellFont, cellFontUnbindRenderer);
REG_FUNC(cellFont, cellFontGetRevisionFlags);
REG_FUNC(cellFont, cellFontGetRenderEffectWeight);
REG_FUNC(cellFont, cellFontGraphicsGetDrawType);
REG_FUNC(cellFont, cellFontGetKerning);
REG_FUNC(cellFont, cellFontGetRenderScaledKerning);
REG_FUNC(cellFont, cellFontGetRenderScalePixel);
REG_FUNC(cellFont, cellFontGlyphGetScalePixel);
REG_FUNC(cellFont, cellFontGlyphGetHorizontalShift);
REG_FUNC(cellFont, cellFontRenderCharGlyphImageHorizontal);
REG_FUNC(cellFont, cellFontGetEffectWeight);
REG_FUNC(cellFont, cellFontGetScalePixel);
REG_FUNC(cellFont, cellFontClearFileCache);
REG_FUNC(cellFont, cellFontAdjustFontScaling);
REG_FUNC(cellFont, cellFontSetupRenderScalePoint);
REG_FUNC(cellFont, cellFontGlyphGetVerticalShift);
REG_FUNC(cellFont, cellFontGetGlyphExpandBufferInfo);
REG_FUNC(cellFont, cellFontGetLibrary);
REG_FUNC(cellFont, cellFontVertexesGlyphRelocate);
REG_FUNC(cellFont, cellFontGetInitializedRevisionFlags);
REG_FUNC(cellFont, cellFontGetResolutionDpi);
REG_FUNC(cellFont, cellFontGlyphRenderImageVertical);
REG_FUNC(cellFont, cellFontGlyphRenderImageHorizontal);
REG_FUNC(cellFont, cellFontAdjustGlyphExpandBuffer);
REG_FUNC(cellFont, cellFontGetRenderScalePoint);
REG_FUNC(cellFont, cellFontGraphicsGetFontRGBA);
REG_FUNC(cellFont, cellFontGlyphGetOutlineVertexes);
REG_FUNC(cellFont, cellFontDelete);
REG_FUNC(cellFont, cellFontPatchWorks);
REG_FUNC(cellFont, cellFontGlyphRenderImage);
REG_FUNC(cellFont, cellFontGetBindingRenderer);
REG_FUNC(cellFont, cellFontGenerateCharGlyphVertical);
REG_FUNC(cellFont, cellFontGetRenderEffectSlant);
REG_FUNC(cellFont, cellFontGetScalePoint);
REG_FUNC(cellFont, cellFontGraphicsGetLineRGBA);
});

View File

@ -978,6 +978,72 @@ s32 cellFsSetIoBufferFromDefaultContainer(u32 fd, u32 buffer_size, u32 page_type
return CELL_OK;
}
s32 cellFsUtime()
{
throw EXCEPTION("");
}
s32 cellFsArcadeHddSerialNumber()
{
throw EXCEPTION("");
}
s32 cellFsAllocateFileAreaWithInitialData()
{
throw EXCEPTION("");
}
s32 cellFsAllocateFileAreaByFdWithoutZeroFill()
{
throw EXCEPTION("");
}
s32 cellFsSetIoBuffer()
{
throw EXCEPTION("");
}
s32 cellFsAllocateFileAreaByFdWithInitialData()
{
throw EXCEPTION("");
}
s32 cellFsTruncate2()
{
throw EXCEPTION("");
}
s32 cellFsChangeFileSizeWithoutAllocation()
{
throw EXCEPTION("");
}
s32 cellFsAllocateFileAreaWithoutZeroFill()
{
throw EXCEPTION("");
}
s32 cellFsChangeFileSizeByFdWithoutAllocation()
{
throw EXCEPTION("");
}
s32 cellFsSetDiscReadRetrySetting()
{
throw EXCEPTION("");
}
s32 cellFsRegisterConversionCallback()
{
throw EXCEPTION("");
}
s32 cellFsUnregisterL10nCallbacks()
{
throw EXCEPTION("");
}
Module cellFs("cellFs", []()
{
g_fs_aio_id = 1;
@ -1027,4 +1093,17 @@ Module cellFs("cellFs", []()
REG_FUNC(cellFs, cellFsStReadWaitCallback);
REG_FUNC(cellFs, cellFsSetDefaultContainer);
REG_FUNC(cellFs, cellFsSetIoBufferFromDefaultContainer);
REG_FUNC(cellFs, cellFsUtime);
REG_FUNC(cellFs, cellFsArcadeHddSerialNumber);
REG_FUNC(cellFs, cellFsAllocateFileAreaWithInitialData);
REG_FUNC(cellFs, cellFsAllocateFileAreaByFdWithoutZeroFill);
REG_FUNC(cellFs, cellFsSetIoBuffer);
REG_FUNC(cellFs, cellFsAllocateFileAreaByFdWithInitialData);
REG_FUNC(cellFs, cellFsTruncate2);
REG_FUNC(cellFs, cellFsChangeFileSizeWithoutAllocation);
REG_FUNC(cellFs, cellFsAllocateFileAreaWithoutZeroFill);
REG_FUNC(cellFs, cellFsChangeFileSizeByFdWithoutAllocation);
REG_FUNC(cellFs, cellFsSetDiscReadRetrySetting);
REG_FUNC(cellFs, cellFsRegisterConversionCallback);
REG_FUNC(cellFs, cellFsUnregisterL10nCallbacks);
});

View File

@ -588,6 +588,11 @@ void cellGcmSetUserHandler(vm::ptr<void(u32)> handler)
Emu.GetGSManager().GetRender().m_user_handler = handler;
}
s32 cellGcmSetUserCommand()
{
throw EXCEPTION("");
}
void cellGcmSetVBlankHandler(vm::ptr<void(u32)> handler)
{
cellGcmSys.Warning("cellGcmSetVBlankHandler(handler=*0x%x)", handler);
@ -604,6 +609,11 @@ s32 cellGcmSetWaitFlip(vm::ptr<CellGcmContextData> ctxt)
return CELL_OK;
}
s32 cellGcmSetWaitFlipUnsafe()
{
throw EXCEPTION("");
}
s32 cellGcmSetZcull(u8 index, u32 offset, u32 width, u32 height, u32 cullStart, u32 zFormat, u32 aaFormat, u32 zCullDir, u32 zCullFormat, u32 sFunc, u32 sRef, u32 sMask)
{
cellGcmSys.Todo("cellGcmSetZcull(index=%d, offset=0x%x, width=%d, height=%d, cullStart=0x%x, zFormat=0x%x, aaFormat=0x%x, zCullDir=0x%x, zCullFormat=0x%x, sFunc=0x%x, sRef=0x%x, sMask=0x%x)",
@ -702,6 +712,11 @@ s32 cellGcmSetInvalidateTile()
return CELL_OK;
}
s32 cellGcmTerminate()
{
throw EXCEPTION("");
}
s32 cellGcmDumpGraphicsError()
{
UNIMPLEMENTED_FUNC(cellGcmSys);
@ -734,6 +749,11 @@ u64 cellGcmGetVBlankCount()
return Emu.GetGSManager().GetRender().m_vblank_count;
}
s32 cellGcmSysGetLastVBlankTime()
{
throw EXCEPTION("");
}
s32 cellGcmInitSystemMode(u64 mode)
{
cellGcmSys.Log("cellGcmInitSystemMode(mode=0x%x)", mode);
@ -1085,6 +1105,11 @@ void cellGcmSetDefaultCommandBuffer()
vm::write32(Emu.GetGSManager().GetRender().m_ctxt_addr, gcm_info.context_addr);
}
s32 cellGcmSetDefaultCommandBufferAndSegmentWordSize()
{
throw EXCEPTION("");
}
//------------------------------------------------------------------------
// Other
//------------------------------------------------------------------------
@ -1147,6 +1172,47 @@ s32 cellGcmSetTile(u8 index, u8 location, u32 offset, u32 size, u32 pitch, u8 co
return CELL_OK;
}
s32 _cellGcmFunc2()
{
throw EXCEPTION("");
}
s32 _cellGcmFunc3()
{
throw EXCEPTION("");
}
s32 _cellGcmFunc4()
{
throw EXCEPTION("");
}
s32 _cellGcmFunc13()
{
throw EXCEPTION("");
}
s32 _cellGcmFunc38()
{
throw EXCEPTION("");
}
s32 cellGcmGpadGetStatus()
{
throw EXCEPTION("");
}
s32 cellGcmGpadNotifyCaptureSurface()
{
throw EXCEPTION("");
}
s32 cellGcmGpadCaptureSnapshot()
{
throw EXCEPTION("");
}
//----------------------------------------------------------------------------
@ -1250,12 +1316,6 @@ Module cellGcmSys("cellGcmSys", []()
REG_FUNC(cellGcmSys, cellGcmGetDefaultSegmentWordSize);
REG_FUNC(cellGcmSys, cellGcmInitDefaultFifoMode);
REG_FUNC(cellGcmSys, cellGcmSetDefaultFifoSize);
//cellGcmSys.AddFunc(, cellGcmReserveMethodSize);
//cellGcmSys.AddFunc(, cellGcmResetDefaultCommandBuffer);
//cellGcmSys.AddFunc(, cellGcmSetupContextData);
//cellGcmSys.AddFunc(, cellGcmCallbackForSnc);
//cellGcmSys.AddFunc(, cellGcmFinish);
//cellGcmSys.AddFunc(, cellGcmFlush);
// Hardware Resource Management
REG_FUNC(cellGcmSys, cellGcmBindTile);
@ -1268,6 +1328,7 @@ Module cellGcmSys("cellGcmSys", []()
REG_FUNC(cellGcmSys, cellGcmGetLastSecondVTime);
REG_FUNC(cellGcmSys, cellGcmGetTiledPitchSize);
REG_FUNC(cellGcmSys, cellGcmGetVBlankCount);
REG_FUNC(cellGcmSys, cellGcmSysGetLastVBlankTime);
REG_FUNC(cellGcmSys, _cellGcmFunc1);
REG_FUNC(cellGcmSys, _cellGcmFunc15);
REG_FUNC(cellGcmSys, _cellGcmInitBody);
@ -1275,7 +1336,7 @@ Module cellGcmSys("cellGcmSys", []()
REG_FUNC(cellGcmSys, cellGcmResetFlipStatus);
REG_FUNC(cellGcmSys, cellGcmSetDebugOutputLevel);
REG_FUNC(cellGcmSys, cellGcmSetDisplayBuffer);
REG_FUNC(cellGcmSys, cellGcmSetFlip);
REG_FUNC(cellGcmSys, cellGcmSetFlip); //
REG_FUNC(cellGcmSys, cellGcmSetFlipHandler);
REG_FUNC(cellGcmSys, cellGcmSetFlipImmediate);
REG_FUNC(cellGcmSys, cellGcmSetFlipMode);
@ -1287,9 +1348,11 @@ Module cellGcmSys("cellGcmSys", []()
REG_FUNC(cellGcmSys, cellGcmSetSecondVHandler);
REG_FUNC(cellGcmSys, cellGcmSetTileInfo);
REG_FUNC(cellGcmSys, cellGcmSetUserHandler);
REG_FUNC(cellGcmSys, cellGcmSetUserCommand); //
REG_FUNC(cellGcmSys, cellGcmSetVBlankFrequency);
REG_FUNC(cellGcmSys, cellGcmSetVBlankHandler);
REG_FUNC(cellGcmSys, cellGcmSetWaitFlip);
REG_FUNC(cellGcmSys, cellGcmSetWaitFlip); //
REG_FUNC(cellGcmSys, cellGcmSetWaitFlipUnsafe); //
REG_FUNC(cellGcmSys, cellGcmSetZcull);
REG_FUNC(cellGcmSys, cellGcmSortRemapEaIoAddress);
REG_FUNC(cellGcmSys, cellGcmUnbindTile);
@ -1299,7 +1362,7 @@ Module cellGcmSys("cellGcmSys", []()
REG_FUNC(cellGcmSys, cellGcmGetDisplayInfo);
REG_FUNC(cellGcmSys, cellGcmGetCurrentDisplayBufferId);
REG_FUNC(cellGcmSys, cellGcmSetInvalidateTile);
//cellGcmSys.AddFunc(, cellGcmSetFlipWithWaitLabel);
REG_FUNC(cellGcmSys, cellGcmTerminate);
// Memory Mapping
REG_FUNC(cellGcmSys, cellGcmAddressToOffset);
@ -1325,13 +1388,20 @@ Module cellGcmSys("cellGcmSys", []()
// Functions for Maintaining Compatibility
REG_FUNC(cellGcmSys, cellGcmSetDefaultCommandBuffer);
//cellGcmSys.AddFunc(, cellGcmGetCurrentBuffer);
//cellGcmSys.AddFunc(, cellGcmSetCurrentBuffer);
//cellGcmSys.AddFunc(, cellGcmSetDefaultCommandBufferAndSegmentWordSize);
//cellGcmSys.AddFunc(, cellGcmSetUserCallback);
REG_FUNC(cellGcmSys, cellGcmSetDefaultCommandBufferAndSegmentWordSize);
// Other
REG_FUNC(cellGcmSys, _cellGcmSetFlipCommand);
REG_FUNC(cellGcmSys, _cellGcmSetFlipCommandWithWaitLabel);
REG_FUNC(cellGcmSys, cellGcmSetTile);
REG_FUNC(cellGcmSys, _cellGcmFunc2);
REG_FUNC(cellGcmSys, _cellGcmFunc3);
REG_FUNC(cellGcmSys, _cellGcmFunc4);
REG_FUNC(cellGcmSys, _cellGcmFunc13);
REG_FUNC(cellGcmSys, _cellGcmFunc38);
// GPAD
REG_FUNC(cellGcmSys, cellGcmGpadGetStatus);
REG_FUNC(cellGcmSys, cellGcmGpadNotifyCaptureSurface);
REG_FUNC(cellGcmSys, cellGcmGpadCaptureSnapshot);
});