diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index c4cababc01..4c38ac24fd 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -280,13 +280,13 @@ void SPUThread::ProcessCmd(u32 cmd, u32 tag, u32 lsa, u64 ea, u32 size) { case MFC_PUT_CMD: { - memcpy(vm::get_ptr((u32)ea), vm::get_ptr(ls_offset + lsa), size); + memcpy(vm::get_ptr(vm::cast(ea)), vm::get_ptr(ls_offset + lsa), size); return; } case MFC_GET_CMD: { - memcpy(vm::get_ptr(ls_offset + lsa), vm::get_ptr((u32)ea), size); + memcpy(vm::get_ptr(ls_offset + lsa), vm::get_ptr(vm::cast(ea)), size); return; } @@ -470,13 +470,17 @@ void SPUThread::EnqMfcCmd(MFCReg& MFCArgs) { vm::reservation_op(ea, 128, [this, tag, lsa, ea]() { - ProcessCmd(MFC_PUT_CMD, tag, lsa, ea, 128); + memcpy(vm::get_priv_ptr(vm::cast(ea)), vm::get_ptr(ls_offset + lsa), 128); }); if (op == MFC_PUTLLUC_CMD) { MFCArgs.AtomicStat.PushUncond(MFC_PUTLLUC_SUCCESS); } + else + { + // tag may be used here + } } break; } diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 8f64343edc..45ab4e068d 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2229,8 +2229,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const temp.reset(new u8[out_bpp * out_w * out_h]); - AVPixelFormat in_format = m_color_format == 4 ? AV_PIX_FMT_RGB565BE : AV_PIX_FMT_BGRA; // ??? - AVPixelFormat out_format = m_color_conv_fmt == 7 ? AV_PIX_FMT_RGB565BE : AV_PIX_FMT_BGRA; // ??? + AVPixelFormat in_format = m_color_format == 4 ? AV_PIX_FMT_RGB565BE : AV_PIX_FMT_ARGB; // ??? + AVPixelFormat out_format = m_color_conv_fmt == 7 ? AV_PIX_FMT_RGB565BE : AV_PIX_FMT_ARGB; // ??? std::unique_ptr sws(sws_getContext(width, height, in_format, out_w, out_h, out_format, inter ? SWS_FAST_BILINEAR : SWS_POINT, NULL, NULL, NULL), sws_freeContext); diff --git a/rpcs3/Emu/SysCalls/LogBase.cpp b/rpcs3/Emu/SysCalls/LogBase.cpp index f0ff6628fb..651e131eea 100644 --- a/rpcs3/Emu/SysCalls/LogBase.cpp +++ b/rpcs3/Emu/SysCalls/LogBase.cpp @@ -18,6 +18,7 @@ void LogBase::LogOutput(LogType type, const std::string& text) const case LogWarning: LOG_WARNING(HLE, GetName() + ": " + text); break; case LogError: LOG_ERROR(HLE, GetName() + " error: " + text); break; case LogTodo: LOG_ERROR(HLE, GetName() + " TODO: " + text); break; + case LogFatal: throw GetName() + " error: " + text; } } diff --git a/rpcs3/Emu/SysCalls/LogBase.h b/rpcs3/Emu/SysCalls/LogBase.h index 82e569e808..880f5333c4 100644 --- a/rpcs3/Emu/SysCalls/LogBase.h +++ b/rpcs3/Emu/SysCalls/LogBase.h @@ -11,6 +11,7 @@ class LogBase LogSuccess, LogWarning, LogError, + LogFatal, LogTodo, }; @@ -68,6 +69,12 @@ public: LogPrepare(LogError, fmt, fmt::do_unveil(args)...); } + template + __forceinline void Fatal(const char* fmt, Targs... args) const + { + LogPrepare(LogFatal, fmt, fmt::do_unveil(args)...); + } + template __forceinline void Todo(const char* fmt, Targs... args) const { diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp index 75a8763003..08cdef858c 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp @@ -679,7 +679,11 @@ int cellAdecGetPcm(u32 handle, vm::ptr outBuffer) return CELL_ADEC_ERROR_EMPTY; } - AVFrame* frame = af.data; + std::unique_ptr frame(af.data, [](AVFrame* frame) + { + av_frame_unref(frame); + av_frame_free(&frame); + }); if (outBuffer) { @@ -766,13 +770,10 @@ int cellAdecGetPcm(u32 handle, vm::ptr outBuffer) } else { - cellAdec->Error("cellAdecGetPcm(): unsupported frame format (channels=%d, format=%d)", frame->channels, frame->format); - Emu.Pause(); + cellAdec->Fatal("cellAdecGetPcm(): unsupported frame format (channels=%d, format=%d)", frame->channels, frame->format); } } - av_frame_unref(af.data); - av_frame_free(&af.data); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp index 518e4589bb..f2a0d62c40 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp @@ -693,36 +693,35 @@ int cellVdecGetPicture(u32 handle, vm::ptr format, vm:: return CELL_OK; } + std::unique_ptr frame(vf.data, [](AVFrame* frame) + { + av_frame_unref(frame); + av_frame_free(&frame); + }); + if (outBuff) { - const u32 buf_size = align(av_image_get_buffer_size(vdec->ctx->pix_fmt, vdec->ctx->width, vdec->ctx->height, 1), 128); - if (format->formatType != CELL_VDEC_PICFMT_YUV420_PLANAR) { - cellVdec->Todo("cellVdecGetPicture: unknown formatType(%d)", (u32)format->formatType); - return CELL_OK; + cellVdec->Fatal("cellVdecGetPicture: unknown formatType(%d)", format->formatType); } if (format->colorMatrixType != CELL_VDEC_COLOR_MATRIX_TYPE_BT709) { - cellVdec->Todo("cellVdecGetPicture: unknown colorMatrixType(%d)", (u32)format->colorMatrixType); - return CELL_OK; + cellVdec->Fatal("cellVdecGetPicture: unknown colorMatrixType(%d)", format->colorMatrixType); } - AVFrame& frame = *vf.data; + const u32 buf_size = align(av_image_get_buffer_size(vdec->ctx->pix_fmt, vdec->ctx->width, vdec->ctx->height, 1), 128); // TODO: zero padding bytes - int err = av_image_copy_to_buffer(outBuff.get_ptr(), buf_size, frame.data, frame.linesize, vdec->ctx->pix_fmt, frame.width, frame.height, 1); + int err = av_image_copy_to_buffer(outBuff.get_ptr(), buf_size, frame->data, frame->linesize, vdec->ctx->pix_fmt, frame->width, frame->height, 1); if (err < 0) { - cellVdec->Error("cellVdecGetPicture: av_image_copy_to_buffer failed (err=0x%x)", err); - Emu.Pause(); + cellVdec->Fatal("cellVdecGetPicture: av_image_copy_to_buffer failed (err=0x%x)", err); } } - av_frame_unref(vf.data); - av_frame_free(&vf.data); return CELL_OK; } @@ -863,8 +862,7 @@ int cellVdecGetPicItem(u32 handle, vm::ptr picItem_ptr) { auto mp2 = vm::ptr::make(info.addr() + sizeof(CellVdecPicItem)); - cellVdec->Todo("cellVdecGetPicItem(MPEG2)"); - Emu.Pause(); + cellVdec->Fatal("cellVdecGetPicItem(MPEG2)"); } *picItem_ptr = info.addr(); diff --git a/rpcs3/Emu/SysCalls/Modules/cellVpost.cpp b/rpcs3/Emu/SysCalls/Modules/cellVpost.cpp index 55b82a138b..fea5149548 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellVpost.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellVpost.cpp @@ -128,7 +128,7 @@ int cellVpostExec(u32 handle, vm::ptr inPicBuff, vm::ptr pA(new u8[w*h]); - memset(pA.get(), (const u8)ctrlParam->outAlpha, w*h); + memset(pA.get(), ctrlParam->outAlpha, w*h); //u64 stamp1 = get_system_time();