[host1x] add syncpoint to codecs #2641
9 changed files with 35 additions and 15 deletions
|
@ -12,9 +12,10 @@
|
||||||
|
|
||||||
namespace Tegra {
|
namespace Tegra {
|
||||||
|
|
||||||
Decoder::Decoder(Host1x::Host1x& host1x_, s32 id_, const Host1x::NvdecCommon::NvdecRegisters& regs_,
|
Decoder::Decoder(Host1x::Host1x& host1x_, s32 id_, u32 syncpoint_,
|
||||||
|
const Host1x::NvdecCommon::NvdecRegisters& regs_,
|
||||||
Host1x::FrameQueue& frame_queue_)
|
Host1x::FrameQueue& frame_queue_)
|
||||||
: host1x(host1x_), memory_manager{host1x.GMMU()}, regs{regs_}, id{id_}, frame_queue{
|
: host1x(host1x_), memory_manager{host1x.GMMU()}, regs{regs_}, syncpoint{syncpoint_},id{id_}, frame_queue{
|
||||||
frame_queue_} {}
|
frame_queue_} {}
|
||||||
|
|
||||||
Decoder::~Decoder() = default;
|
Decoder::~Decoder() = default;
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -41,7 +44,7 @@ public:
|
||||||
[[nodiscard]] virtual std::string_view GetCurrentCodecName() const = 0;
|
[[nodiscard]] virtual std::string_view GetCurrentCodecName() const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
explicit Decoder(Host1x::Host1x& host1x, s32 id,
|
explicit Decoder(Host1x::Host1x& host1x, s32 id, u32 syncpoint,
|
||||||
const Host1x::NvdecCommon::NvdecRegisters& regs,
|
const Host1x::NvdecCommon::NvdecRegisters& regs,
|
||||||
Host1x::FrameQueue& frame_queue);
|
Host1x::FrameQueue& frame_queue);
|
||||||
|
|
||||||
|
@ -53,6 +56,7 @@ protected:
|
||||||
Host1x::Host1x& host1x;
|
Host1x::Host1x& host1x;
|
||||||
Tegra::MemoryManager& memory_manager;
|
Tegra::MemoryManager& memory_manager;
|
||||||
const Host1x::NvdecCommon::NvdecRegisters& regs;
|
const Host1x::NvdecCommon::NvdecRegisters& regs;
|
||||||
|
u32 syncpoint;
|
||||||
s32 id;
|
s32 id;
|
||||||
Host1x::FrameQueue& frame_queue;
|
Host1x::FrameQueue& frame_queue;
|
||||||
Host1x::NvdecCommon::VideoCodec codec;
|
Host1x::NvdecCommon::VideoCodec codec;
|
||||||
|
|
|
@ -29,8 +29,9 @@ constexpr std::array<u8, 16> zig_zag_scan{
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
H264::H264(Host1x::Host1x& host1x_, const Host1x::NvdecCommon::NvdecRegisters& regs_, s32 id_,
|
H264::H264(Host1x::Host1x& host1x_, const Host1x::NvdecCommon::NvdecRegisters& regs_, s32 id_,
|
||||||
|
u32 syncpoint_,
|
||||||
Host1x::FrameQueue& frame_queue_)
|
Host1x::FrameQueue& frame_queue_)
|
||||||
: Decoder{host1x_, id_, regs_, frame_queue_} {
|
: Decoder{host1x_, id_, syncpoint_, regs_, frame_queue_} {
|
||||||
codec = Host1x::NvdecCommon::VideoCodec::H264;
|
codec = Host1x::NvdecCommon::VideoCodec::H264;
|
||||||
initialized = decode_api.Initialize(codec);
|
initialized = decode_api.Initialize(codec);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -242,7 +245,7 @@ ASSERT_POSITION(weight_scale_4x4, 0x1C0);
|
||||||
class H264 final : public Decoder {
|
class H264 final : public Decoder {
|
||||||
public:
|
public:
|
||||||
explicit H264(Host1x::Host1x& host1x, const Host1x::NvdecCommon::NvdecRegisters& regs, s32 id,
|
explicit H264(Host1x::Host1x& host1x, const Host1x::NvdecCommon::NvdecRegisters& regs, s32 id,
|
||||||
Host1x::FrameQueue& frame_queue);
|
u32 syncpoint, Host1x::FrameQueue& frame_queue);
|
||||||
~H264() override;
|
~H264() override;
|
||||||
|
|
||||||
H264(const H264&) = delete;
|
H264(const H264&) = delete;
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -9,8 +12,8 @@
|
||||||
|
|
||||||
namespace Tegra::Decoders {
|
namespace Tegra::Decoders {
|
||||||
VP8::VP8(Host1x::Host1x& host1x_, const Host1x::NvdecCommon::NvdecRegisters& regs_, s32 id_,
|
VP8::VP8(Host1x::Host1x& host1x_, const Host1x::NvdecCommon::NvdecRegisters& regs_, s32 id_,
|
||||||
Host1x::FrameQueue& frame_queue_)
|
u32 syncpoint_, Host1x::FrameQueue& frame_queue_)
|
||||||
: Decoder{host1x_, id_, regs_, frame_queue_} {
|
: Decoder{host1x_, id_, syncpoint_, regs_, frame_queue_} {
|
||||||
codec = Host1x::NvdecCommon::VideoCodec::VP8;
|
codec = Host1x::NvdecCommon::VideoCodec::VP8;
|
||||||
initialized = decode_api.Initialize(codec);
|
initialized = decode_api.Initialize(codec);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -29,7 +32,7 @@ enum class Vp8SurfaceIndex : u32 {
|
||||||
class VP8 final : public Decoder {
|
class VP8 final : public Decoder {
|
||||||
public:
|
public:
|
||||||
explicit VP8(Host1x::Host1x& host1x, const Host1x::NvdecCommon::NvdecRegisters& regs, s32 id,
|
explicit VP8(Host1x::Host1x& host1x, const Host1x::NvdecCommon::NvdecRegisters& regs, s32 id,
|
||||||
Host1x::FrameQueue& frame_queue);
|
u32 syncpoint, Host1x::FrameQueue& frame_queue);
|
||||||
~VP8() override;
|
~VP8() override;
|
||||||
|
|
||||||
VP8(const VP8&) = delete;
|
VP8(const VP8&) = delete;
|
||||||
|
|
|
@ -242,8 +242,8 @@ constexpr std::array<u8, 254> map_lut{
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
VP9::VP9(Host1x::Host1x& host1x_, const Host1x::NvdecCommon::NvdecRegisters& regs_, s32 id_,
|
VP9::VP9(Host1x::Host1x& host1x_, const Host1x::NvdecCommon::NvdecRegisters& regs_, s32 id_,
|
||||||
Host1x::FrameQueue& frame_queue_)
|
u32 syncpoint_, Host1x::FrameQueue& frame_queue_)
|
||||||
: Decoder{host1x_, id_, regs_, frame_queue_} {
|
: Decoder{host1x_, id_, syncpoint_, regs_, frame_queue_} {
|
||||||
codec = Host1x::NvdecCommon::VideoCodec::VP9;
|
codec = Host1x::NvdecCommon::VideoCodec::VP9;
|
||||||
initialized = decode_api.Initialize(codec);
|
initialized = decode_api.Initialize(codec);
|
||||||
}
|
}
|
||||||
|
@ -900,6 +900,8 @@ std::span<const u8> VP9::ComposeFrame() {
|
||||||
|
|
||||||
vp9_hidden_frame = WasFrameHidden();
|
vp9_hidden_frame = WasFrameHidden();
|
||||||
|
|
||||||
|
host1x.GetSyncpointManager().IncrementGuest(syncpoint);
|
||||||
|
|
||||||
return GetFrameBytes();
|
return GetFrameBytes();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -113,8 +116,8 @@ private:
|
||||||
|
|
||||||
class VP9 final : public Decoder {
|
class VP9 final : public Decoder {
|
||||||
public:
|
public:
|
||||||
explicit VP9(Host1x::Host1x& host1x, const Host1x::NvdecCommon::NvdecRegisters& regs, s32 id,
|
VP9(Host1x::Host1x& host1x_, const Host1x::NvdecCommon::NvdecRegisters& regs_, s32 id_,
|
||||||
Host1x::FrameQueue& frame_queue);
|
u32 syncpoint_, Host1x::FrameQueue& frame_queue_);
|
||||||
~VP9() override;
|
~VP9() override;
|
||||||
|
|
||||||
VP9(const VP9&) = delete;
|
VP9(const VP9&) = delete;
|
||||||
|
|
|
@ -48,13 +48,13 @@ void Nvdec::CreateDecoder(NvdecCommon::VideoCodec codec) {
|
||||||
}
|
}
|
||||||
switch (codec) {
|
switch (codec) {
|
||||||
case NvdecCommon::VideoCodec::H264:
|
case NvdecCommon::VideoCodec::H264:
|
||||||
decoder = std::make_unique<Decoders::H264>(host1x, regs, id, frame_queue);
|
decoder = std::make_unique<Decoders::H264>(host1x, regs, id, syncpoint, frame_queue);
|
||||||
break;
|
break;
|
||||||
case NvdecCommon::VideoCodec::VP8:
|
case NvdecCommon::VideoCodec::VP8:
|
||||||
decoder = std::make_unique<Decoders::VP8>(host1x, regs, id, frame_queue);
|
decoder = std::make_unique<Decoders::VP8>(host1x, regs, id, syncpoint, frame_queue);
|
||||||
break;
|
break;
|
||||||
case NvdecCommon::VideoCodec::VP9:
|
case NvdecCommon::VideoCodec::VP9:
|
||||||
decoder = std::make_unique<Decoders::VP9>(host1x, regs, id, frame_queue);
|
decoder = std::make_unique<Decoders::VP9>(host1x, regs, id, syncpoint, frame_queue);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
UNIMPLEMENTED_MSG("Codec {}", decoder->GetCurrentCodecName());
|
UNIMPLEMENTED_MSG("Codec {}", decoder->GetCurrentCodecName());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue