early-access version 2911
This commit is contained in:
parent
f8139dd06e
commit
2eb5b7b57e
10 changed files with 219 additions and 17 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 2910.
|
This is the source code for early-access 2911.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#include "core/hle/ipc_helpers.h"
|
||||||
#include "core/hle/service/pcv/pcv.h"
|
#include "core/hle/service/pcv/pcv.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
#include "core/hle/service/sm/sm.h"
|
#include "core/hle/service/sm/sm.h"
|
||||||
|
@ -77,10 +78,102 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class IClkrstSession final : public ServiceFramework<IClkrstSession> {
|
||||||
|
public:
|
||||||
|
explicit IClkrstSession(Core::System& system_, DeviceCode deivce_code_)
|
||||||
|
: ServiceFramework{system_, "IClkrstSession"}, deivce_code(deivce_code_) {
|
||||||
|
// clang-format off
|
||||||
|
static const FunctionInfo functions[] = {
|
||||||
|
{0, nullptr, "SetClockEnabled"},
|
||||||
|
{1, nullptr, "SetClockDisabled"},
|
||||||
|
{2, nullptr, "SetResetAsserted"},
|
||||||
|
{3, nullptr, "SetResetDeasserted"},
|
||||||
|
{4, nullptr, "SetPowerEnabled"},
|
||||||
|
{5, nullptr, "SetPowerDisabled"},
|
||||||
|
{6, nullptr, "GetState"},
|
||||||
|
{7, &IClkrstSession::SetClockRate, "SetClockRate"},
|
||||||
|
{8, &IClkrstSession::GetClockRate, "GetClockRate"},
|
||||||
|
{9, nullptr, "SetMinVClockRate"},
|
||||||
|
{10, nullptr, "GetPossibleClockRates"},
|
||||||
|
{11, nullptr, "GetDvfsTable"},
|
||||||
|
};
|
||||||
|
// clang-format on
|
||||||
|
RegisterHandlers(functions);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void SetClockRate(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
clock_rate = rp.Pop<u32>();
|
||||||
|
LOG_DEBUG(Service_PCV, "(STUBBED) called, clock_rate={}", clock_rate);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetClockRate(Kernel::HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_PCV, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push<u32>(clock_rate);
|
||||||
|
}
|
||||||
|
|
||||||
|
DeviceCode deivce_code;
|
||||||
|
u32 clock_rate{};
|
||||||
|
};
|
||||||
|
|
||||||
|
class CLKRST final : public ServiceFramework<CLKRST> {
|
||||||
|
public:
|
||||||
|
explicit CLKRST(Core::System& system_, const char* name) : ServiceFramework{system_, name} {
|
||||||
|
// clang-format off
|
||||||
|
static const FunctionInfo functions[] = {
|
||||||
|
{0, &CLKRST::OpenSession, "OpenSession"},
|
||||||
|
{1, nullptr, "GetTemperatureThresholds"},
|
||||||
|
{2, nullptr, "SetTemperature"},
|
||||||
|
{3, nullptr, "GetModuleStateTable"},
|
||||||
|
{4, nullptr, "GetModuleStateTableEvent"},
|
||||||
|
{5, nullptr, "GetModuleStateTableMaxCount"},
|
||||||
|
};
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
RegisterHandlers(functions);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void OpenSession(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
const auto device_code = static_cast<DeviceCode>(rp.Pop<u32>());
|
||||||
|
const auto unkonwn_input = rp.Pop<u32>();
|
||||||
|
|
||||||
|
LOG_DEBUG(Service_PCV, "called, device_code={}, input={}", device_code, unkonwn_input);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushIpcInterface<IClkrstSession>(system, device_code);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class CLKRST_A final : public ServiceFramework<CLKRST_A> {
|
||||||
|
public:
|
||||||
|
explicit CLKRST_A(Core::System& system_) : ServiceFramework{system_, "clkrst:a"} {
|
||||||
|
// clang-format off
|
||||||
|
static const FunctionInfo functions[] = {
|
||||||
|
{0, nullptr, "ReleaseControl"},
|
||||||
|
};
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
RegisterHandlers(functions);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void InstallInterfaces(SM::ServiceManager& sm, Core::System& system) {
|
void InstallInterfaces(SM::ServiceManager& sm, Core::System& system) {
|
||||||
std::make_shared<PCV>(system)->InstallAsService(sm);
|
std::make_shared<PCV>(system)->InstallAsService(sm);
|
||||||
std::make_shared<PCV_ARB>(system)->InstallAsService(sm);
|
std::make_shared<PCV_ARB>(system)->InstallAsService(sm);
|
||||||
std::make_shared<PCV_IMM>(system)->InstallAsService(sm);
|
std::make_shared<PCV_IMM>(system)->InstallAsService(sm);
|
||||||
|
std::make_shared<CLKRST>(system, "clkrst")->InstallAsService(sm);
|
||||||
|
std::make_shared<CLKRST>(system, "clkrst:i")->InstallAsService(sm);
|
||||||
|
std::make_shared<CLKRST_A>(system)->InstallAsService(sm);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Service::PCV
|
} // namespace Service::PCV
|
||||||
|
|
|
@ -13,6 +13,97 @@ class ServiceManager;
|
||||||
|
|
||||||
namespace Service::PCV {
|
namespace Service::PCV {
|
||||||
|
|
||||||
|
enum class DeviceCode : u32 {
|
||||||
|
Cpu = 0x40000001,
|
||||||
|
Gpu = 0x40000002,
|
||||||
|
I2s1 = 0x40000003,
|
||||||
|
I2s2 = 0x40000004,
|
||||||
|
I2s3 = 0x40000005,
|
||||||
|
Pwm = 0x40000006,
|
||||||
|
I2c1 = 0x02000001,
|
||||||
|
I2c2 = 0x02000002,
|
||||||
|
I2c3 = 0x02000003,
|
||||||
|
I2c4 = 0x02000004,
|
||||||
|
I2c5 = 0x02000005,
|
||||||
|
I2c6 = 0x02000006,
|
||||||
|
Spi1 = 0x07000000,
|
||||||
|
Spi2 = 0x07000001,
|
||||||
|
Spi3 = 0x07000002,
|
||||||
|
Spi4 = 0x07000003,
|
||||||
|
Disp1 = 0x40000011,
|
||||||
|
Disp2 = 0x40000012,
|
||||||
|
Isp = 0x40000013,
|
||||||
|
Vi = 0x40000014,
|
||||||
|
Sdmmc1 = 0x40000015,
|
||||||
|
Sdmmc2 = 0x40000016,
|
||||||
|
Sdmmc3 = 0x40000017,
|
||||||
|
Sdmmc4 = 0x40000018,
|
||||||
|
Owr = 0x40000019,
|
||||||
|
Csite = 0x4000001A,
|
||||||
|
Tsec = 0x4000001B,
|
||||||
|
Mselect = 0x4000001C,
|
||||||
|
Hda2codec2x = 0x4000001D,
|
||||||
|
Actmon = 0x4000001E,
|
||||||
|
I2cSlow = 0x4000001F,
|
||||||
|
Sor1 = 0x40000020,
|
||||||
|
Sata = 0x40000021,
|
||||||
|
Hda = 0x40000022,
|
||||||
|
XusbCoreHostSrc = 0x40000023,
|
||||||
|
XusbFalconSrc = 0x40000024,
|
||||||
|
XusbFsSrc = 0x40000025,
|
||||||
|
XusbCoreDevSrc = 0x40000026,
|
||||||
|
XusbSsSrc = 0x40000027,
|
||||||
|
UartA = 0x03000001,
|
||||||
|
UartB = 0x35000405,
|
||||||
|
UartC = 0x3500040F,
|
||||||
|
UartD = 0x37000001,
|
||||||
|
Host1x = 0x4000002C,
|
||||||
|
Entropy = 0x4000002D,
|
||||||
|
SocTherm = 0x4000002E,
|
||||||
|
Vic = 0x4000002F,
|
||||||
|
Nvenc = 0x40000030,
|
||||||
|
Nvjpg = 0x40000031,
|
||||||
|
Nvdec = 0x40000032,
|
||||||
|
Qspi = 0x40000033,
|
||||||
|
ViI2c = 0x40000034,
|
||||||
|
Tsecb = 0x40000035,
|
||||||
|
Ape = 0x40000036,
|
||||||
|
AudioDsp = 0x40000037,
|
||||||
|
AudioUart = 0x40000038,
|
||||||
|
Emc = 0x40000039,
|
||||||
|
Plle = 0x4000003A,
|
||||||
|
PlleHwSeq = 0x4000003B,
|
||||||
|
Dsi = 0x4000003C,
|
||||||
|
Maud = 0x4000003D,
|
||||||
|
Dpaux1 = 0x4000003E,
|
||||||
|
MipiCal = 0x4000003F,
|
||||||
|
UartFstMipiCal = 0x40000040,
|
||||||
|
Osc = 0x40000041,
|
||||||
|
SysBus = 0x40000042,
|
||||||
|
SorSafe = 0x40000043,
|
||||||
|
XusbSs = 0x40000044,
|
||||||
|
XusbHost = 0x40000045,
|
||||||
|
XusbDevice = 0x40000046,
|
||||||
|
Extperiph1 = 0x40000047,
|
||||||
|
Ahub = 0x40000048,
|
||||||
|
Hda2hdmicodec = 0x40000049,
|
||||||
|
Gpuaux = 0x4000004A,
|
||||||
|
UsbD = 0x4000004B,
|
||||||
|
Usb2 = 0x4000004C,
|
||||||
|
Pcie = 0x4000004D,
|
||||||
|
Afi = 0x4000004E,
|
||||||
|
PciExClk = 0x4000004F,
|
||||||
|
PExUsbPhy = 0x40000050,
|
||||||
|
XUsbPadCtl = 0x40000051,
|
||||||
|
Apbdma = 0x40000052,
|
||||||
|
Usb2TrkClk = 0x40000053,
|
||||||
|
XUsbIoPll = 0x40000054,
|
||||||
|
XUsbIoPllHwSeq = 0x40000055,
|
||||||
|
Cec = 0x40000056,
|
||||||
|
Extperiph2 = 0x40000057,
|
||||||
|
OscClk = 0x40000080
|
||||||
|
};
|
||||||
|
|
||||||
void InstallInterfaces(SM::ServiceManager& sm, Core::System& system);
|
void InstallInterfaces(SM::ServiceManager& sm, Core::System& system);
|
||||||
|
|
||||||
} // namespace Service::PCV
|
} // namespace Service::PCV
|
||||||
|
|
|
@ -135,9 +135,11 @@ public:
|
||||||
/// Updates counters from GPU state. Expected to be called once per draw, clear or dispatch.
|
/// Updates counters from GPU state. Expected to be called once per draw, clear or dispatch.
|
||||||
void UpdateCounters() {
|
void UpdateCounters() {
|
||||||
std::unique_lock lock{mutex};
|
std::unique_lock lock{mutex};
|
||||||
|
if (maxwell3d) {
|
||||||
const auto& regs = maxwell3d->regs;
|
const auto& regs = maxwell3d->regs;
|
||||||
Stream(VideoCore::QueryType::SamplesPassed).Update(regs.samplecnt_enable);
|
Stream(VideoCore::QueryType::SamplesPassed).Update(regs.samplecnt_enable);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Resets a counter to zero. It doesn't disable the query after resetting.
|
/// Resets a counter to zero. It doesn't disable the query after resetting.
|
||||||
void ResetCounter(VideoCore::QueryType type) {
|
void ResetCounter(VideoCore::QueryType type) {
|
||||||
|
|
|
@ -237,6 +237,6 @@ void StateTracker::InvalidateState() {
|
||||||
flags->set();
|
flags->set();
|
||||||
}
|
}
|
||||||
|
|
||||||
StateTracker::StateTracker() : flags{} {}
|
StateTracker::StateTracker() : flags{&default_flags} {}
|
||||||
|
|
||||||
} // namespace OpenGL
|
} // namespace OpenGL
|
||||||
|
|
|
@ -223,6 +223,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Tegra::Engines::Maxwell3D::DirtyState::Flags* flags;
|
Tegra::Engines::Maxwell3D::DirtyState::Flags* flags;
|
||||||
|
Tegra::Engines::Maxwell3D::DirtyState::Flags default_flags{};
|
||||||
|
|
||||||
GLuint framebuffer = 0;
|
GLuint framebuffer = 0;
|
||||||
GLuint index_buffer = 0;
|
GLuint index_buffer = 0;
|
||||||
|
|
|
@ -478,13 +478,16 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT_MSG(framebuffer_crop_rect.top == 0, "Unimplemented");
|
|
||||||
ASSERT_MSG(framebuffer_crop_rect.left == 0, "Unimplemented");
|
ASSERT_MSG(framebuffer_crop_rect.left == 0, "Unimplemented");
|
||||||
|
|
||||||
|
f32 left_start{};
|
||||||
|
if (framebuffer_crop_rect.Top() > 0) {
|
||||||
|
left_start = static_cast<f32>(framebuffer_crop_rect.Top()) /
|
||||||
|
static_cast<f32>(framebuffer_crop_rect.Bottom());
|
||||||
|
}
|
||||||
f32 scale_u = static_cast<f32>(framebuffer_width) / static_cast<f32>(screen_info.texture.width);
|
f32 scale_u = static_cast<f32>(framebuffer_width) / static_cast<f32>(screen_info.texture.width);
|
||||||
f32 scale_v =
|
f32 scale_v =
|
||||||
static_cast<f32>(framebuffer_height) / static_cast<f32>(screen_info.texture.height);
|
static_cast<f32>(framebuffer_height) / static_cast<f32>(screen_info.texture.height);
|
||||||
|
|
||||||
// Scale the output by the crop width/height. This is commonly used with 1280x720 rendering
|
// Scale the output by the crop width/height. This is commonly used with 1280x720 rendering
|
||||||
// (e.g. handheld mode) on a 1920x1080 framebuffer.
|
// (e.g. handheld mode) on a 1920x1080 framebuffer.
|
||||||
if (framebuffer_crop_rect.GetWidth() > 0) {
|
if (framebuffer_crop_rect.GetWidth() > 0) {
|
||||||
|
@ -503,10 +506,14 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) {
|
||||||
|
|
||||||
const auto& screen = layout.screen;
|
const auto& screen = layout.screen;
|
||||||
const std::array vertices = {
|
const std::array vertices = {
|
||||||
ScreenRectVertex(screen.left, screen.top, texcoords.top * scale_u, left * scale_v),
|
ScreenRectVertex(screen.left, screen.top, texcoords.top * scale_u,
|
||||||
ScreenRectVertex(screen.right, screen.top, texcoords.bottom * scale_u, left * scale_v),
|
left_start + left * scale_v),
|
||||||
ScreenRectVertex(screen.left, screen.bottom, texcoords.top * scale_u, right * scale_v),
|
ScreenRectVertex(screen.right, screen.top, texcoords.bottom * scale_u,
|
||||||
ScreenRectVertex(screen.right, screen.bottom, texcoords.bottom * scale_u, right * scale_v),
|
left_start + left * scale_v),
|
||||||
|
ScreenRectVertex(screen.left, screen.bottom, texcoords.top * scale_u,
|
||||||
|
left_start + right * scale_v),
|
||||||
|
ScreenRectVertex(screen.right, screen.bottom, texcoords.bottom * scale_u,
|
||||||
|
left_start + right * scale_v),
|
||||||
};
|
};
|
||||||
glNamedBufferSubData(vertex_buffer.handle, 0, sizeof(vertices), std::data(vertices));
|
glNamedBufferSubData(vertex_buffer.handle, 0, sizeof(vertices), std::data(vertices));
|
||||||
|
|
||||||
|
|
|
@ -1402,12 +1402,15 @@ void BlitScreen::SetVertexData(BufferData& data, const Tegra::FramebufferConfig&
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
UNIMPLEMENTED_IF(framebuffer_crop_rect.top != 0);
|
|
||||||
UNIMPLEMENTED_IF(framebuffer_crop_rect.left != 0);
|
UNIMPLEMENTED_IF(framebuffer_crop_rect.left != 0);
|
||||||
|
|
||||||
|
f32 left_start{};
|
||||||
|
if (framebuffer_crop_rect.Top() > 0) {
|
||||||
|
left_start = static_cast<f32>(framebuffer_crop_rect.Top()) /
|
||||||
|
static_cast<f32>(framebuffer_crop_rect.Bottom());
|
||||||
|
}
|
||||||
f32 scale_u = static_cast<f32>(framebuffer.width) / static_cast<f32>(screen_info.width);
|
f32 scale_u = static_cast<f32>(framebuffer.width) / static_cast<f32>(screen_info.width);
|
||||||
f32 scale_v = static_cast<f32>(framebuffer.height) / static_cast<f32>(screen_info.height);
|
f32 scale_v = static_cast<f32>(framebuffer.height) / static_cast<f32>(screen_info.height);
|
||||||
|
|
||||||
// Scale the output by the crop width/height. This is commonly used with 1280x720 rendering
|
// Scale the output by the crop width/height. This is commonly used with 1280x720 rendering
|
||||||
// (e.g. handheld mode) on a 1920x1080 framebuffer.
|
// (e.g. handheld mode) on a 1920x1080 framebuffer.
|
||||||
if (!fsr) {
|
if (!fsr) {
|
||||||
|
@ -1426,10 +1429,13 @@ void BlitScreen::SetVertexData(BufferData& data, const Tegra::FramebufferConfig&
|
||||||
const auto y = static_cast<f32>(screen.top);
|
const auto y = static_cast<f32>(screen.top);
|
||||||
const auto w = static_cast<f32>(screen.GetWidth());
|
const auto w = static_cast<f32>(screen.GetWidth());
|
||||||
const auto h = static_cast<f32>(screen.GetHeight());
|
const auto h = static_cast<f32>(screen.GetHeight());
|
||||||
data.vertices[0] = ScreenRectVertex(x, y, texcoords.top * scale_u, left * scale_v);
|
data.vertices[0] = ScreenRectVertex(x, y, texcoords.top * scale_u, left_start + left * scale_v);
|
||||||
data.vertices[1] = ScreenRectVertex(x + w, y, texcoords.bottom * scale_u, left * scale_v);
|
data.vertices[1] =
|
||||||
data.vertices[2] = ScreenRectVertex(x, y + h, texcoords.top * scale_u, right * scale_v);
|
ScreenRectVertex(x + w, y, texcoords.bottom * scale_u, left_start + left * scale_v);
|
||||||
data.vertices[3] = ScreenRectVertex(x + w, y + h, texcoords.bottom * scale_u, right * scale_v);
|
data.vertices[2] =
|
||||||
|
ScreenRectVertex(x, y + h, texcoords.top * scale_u, left_start + right * scale_v);
|
||||||
|
data.vertices[3] =
|
||||||
|
ScreenRectVertex(x + w, y + h, texcoords.bottom * scale_u, left_start + right * scale_v);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlitScreen::CreateFSR() {
|
void BlitScreen::CreateFSR() {
|
||||||
|
|
|
@ -206,6 +206,7 @@ void StateTracker::InvalidateState() {
|
||||||
flags->set();
|
flags->set();
|
||||||
}
|
}
|
||||||
|
|
||||||
StateTracker::StateTracker() : flags{}, invalidation_flags{MakeInvalidationFlags()} {}
|
StateTracker::StateTracker()
|
||||||
|
: flags{&default_flags}, default_flags{}, invalidation_flags{MakeInvalidationFlags()} {}
|
||||||
|
|
||||||
} // namespace Vulkan
|
} // namespace Vulkan
|
||||||
|
|
|
@ -161,6 +161,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
Tegra::Engines::Maxwell3D::DirtyState::Flags* flags;
|
Tegra::Engines::Maxwell3D::DirtyState::Flags* flags;
|
||||||
|
Tegra::Engines::Maxwell3D::DirtyState::Flags default_flags;
|
||||||
Tegra::Engines::Maxwell3D::DirtyState::Flags invalidation_flags;
|
Tegra::Engines::Maxwell3D::DirtyState::Flags invalidation_flags;
|
||||||
Maxwell::PrimitiveTopology current_topology = INVALID_TOPOLOGY;
|
Maxwell::PrimitiveTopology current_topology = INVALID_TOPOLOGY;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue