Skip to content

Commit cc94a7c

Browse files
committed
Merge remote-tracking branch 'origin/main' into gc2
2 parents c074ace + 01e8606 commit cc94a7c

30 files changed

Lines changed: 2680 additions & 181 deletions

.github/workflows/build.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ jobs:
104104
if: runner.os == 'Linux'
105105
run: |
106106
sudo apt-get update
107-
sudo apt-get install -y ninja-build libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libxcursor-dev libxi-dev libxss-dev libxtst-dev libxrandr-dev libxfixes-dev libudev-dev uuid-dev uuid-dev
107+
sudo apt-get install -y libc++-dev libc++abi-dev ninja-build libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libxcursor-dev libxi-dev libxss-dev libxtst-dev libxrandr-dev libxfixes-dev libudev-dev uuid-dev uuid-dev
108108
109109
- name: Install dependencies (macOS)
110110
if: runner.os == 'macOS'
@@ -118,6 +118,7 @@ jobs:
118118
-DCMAKE_C_COMPILER="${{ matrix.compiler_c }}" \
119119
-DCMAKE_BUILD_TYPE=Debug \
120120
-DENABLE_TESTS=ON \
121+
${{ runner.os == 'Linux' && '-DCMAKE_CXX_FLAGS=-stdlib=libc++' || '' }} \
121122
${{ runner.os == 'macOS' && '-DCMAKE_OSX_ARCHITECTURES=x86_64' || '' }}
122123
shell: bash
123124

@@ -139,7 +140,7 @@ jobs:
139140
shell: bash
140141

141142
- name: Run tests with CTest
142-
run: ctest --test-dir build --output-on-failure --progress
143+
run: ctest --test-dir build --output-on-failure --progress -E 'GcnTest'
143144
shell: bash
144145

145146
windows-sdl:

src/common/logging/log.cpp

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
#include "common/logging/thread_name_formatter.h"
1111
#include "common/types.h"
1212
#include "core/emulator_settings.h"
13+
#ifdef _WIN32
14+
#include <Windows.h>
15+
#endif
1316

1417
namespace Common::Log {
1518
bool g_should_append = false;
@@ -120,6 +123,42 @@ std::unordered_map<std::string_view, std::shared_ptr<spdlog::logger>> ALL_LOGGER
120123
{Class::Tty, nullptr},
121124
};
122125

126+
template <typename T>
127+
static auto UpdateColorLevels(T sink) {
128+
#ifdef _WIN32
129+
using LogColor = std::uint16_t;
130+
131+
const auto Grey = FOREGROUND_INTENSITY;
132+
const auto Cyan = FOREGROUND_GREEN | FOREGROUND_BLUE;
133+
const auto Bright_gray = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
134+
const auto Bright_yellow = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
135+
const auto Bright_red = FOREGROUND_RED | FOREGROUND_INTENSITY;
136+
const auto Bright_magenta = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY;
137+
#else
138+
using LogColor = std::string_view;
139+
140+
#define ESC "\x1b"
141+
const auto Grey = ESC "[1;30m";
142+
const auto Cyan = ESC "[0;36m";
143+
const auto Bright_gray = ESC "[0;37m";
144+
const auto Bright_yellow = ESC "[1;33m";
145+
const auto Bright_red = ESC "[1;31m";
146+
const auto Bright_magenta = ESC "[1;35m";
147+
#undef ESC
148+
#endif
149+
150+
const std::unordered_map<spdlog::level, LogColor> colors{
151+
{spdlog::level::trace, Grey}, {spdlog::level::debug, Cyan},
152+
{spdlog::level::info, Bright_gray}, {spdlog::level::warn, Bright_yellow},
153+
{spdlog::level::err, Bright_red}, {spdlog::level::critical, Bright_magenta}};
154+
155+
for (const auto& [level, color] : colors) {
156+
sink->set_color(level, color);
157+
}
158+
159+
return sink;
160+
}
161+
123162
void Setup(std::string_view log_filename) {
124163
static bool already_registered = false;
125164

@@ -135,8 +174,9 @@ void Setup(std::string_view log_filename) {
135174
} else {
136175
g_console_sink = std::make_shared<spdlog::sinks::msvc_sink_mt>();
137176
}
177+
138178
#else
139-
g_console_sink = std::make_shared<spdlog_stdout>();
179+
g_console_sink = UpdateColorLevels(std::make_shared<spdlog_stdout>());
140180
#endif
141181

142182
g_console_sink->set_formatter(std::make_unique<thread_name_formatter>(UNLIMITED_SIZE));

src/common/logging/thread_name_formatter.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@
1414
namespace Common::Log {
1515
static constexpr unsigned long long UNLIMITED_SIZE = 0;
1616

17+
static constexpr std::array level_string_views{"Trace", "Debug", "Info", "Warning",
18+
"Error", "Critical", "Off"};
19+
20+
[[nodiscard]] static constexpr std::string_view to_string_view(spdlog::level lvl) noexcept {
21+
return level_string_views.at(level_to_number(lvl));
22+
}
23+
1724
struct thread_name_formatter : spdlog::formatter {
1825
~thread_name_formatter() override = default;
1926

@@ -31,8 +38,7 @@ struct thread_name_formatter : spdlog::formatter {
3138
dest.push_back(']');
3239
dest.push_back(' ');
3340
dest.push_back('<');
34-
spdlog::details::fmt_helper::append_string_view(spdlog::to_string_view(msg.log_level),
35-
dest);
41+
spdlog::details::fmt_helper::append_string_view(Log::to_string_view(msg.log_level), dest);
3642
dest.push_back('>');
3743
dest.push_back(' ');
3844
dest.push_back('(');

src/core/address_space.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,12 @@ struct AddressSpace::Impl {
716716
void* Map(VAddr virtual_addr, PAddr phys_addr, u64 size, PosixPageProtection prot,
717717
int fd = -1) {
718718
m_free_regions.subtract({virtual_addr, virtual_addr + size});
719+
#ifdef __APPLE__
720+
if ((prot & PROT_EXEC) != 0) {
721+
ASSERT_MSG(fd == -1, "Requested execute permissions for file mapping");
722+
phys_addr = -1;
723+
}
724+
#endif
719725
const int handle = phys_addr != -1 ? (fd == -1 ? backing_fd : fd) : -1;
720726
const off_t host_offset = phys_addr != -1 ? phys_addr : 0;
721727
const int flag = phys_addr != -1 ? MAP_SHARED : (MAP_ANONYMOUS | MAP_PRIVATE);

src/core/libraries/kernel/process.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@ s32 PS4_SYSV_ABI sceKernelIsInSandbox() {
1717
}
1818

1919
s32 PS4_SYSV_ABI sceKernelIsNeoMode() {
20-
return EmulatorSettings.IsNeo() &&
21-
Common::ElfInfo::Instance().GetPSFAttributes().support_neo_mode;
20+
static s32 IsNeoMode = -1;
21+
if (IsNeoMode == -1) {
22+
IsNeoMode = EmulatorSettings.IsNeo() &&
23+
Common::ElfInfo::Instance().GetPSFAttributes().support_neo_mode;
24+
}
25+
return IsNeoMode;
2226
}
2327

2428
s32 PS4_SYSV_ABI sceKernelHasNeoMode() {

src/core/memory.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -951,7 +951,11 @@ s32 MemoryManager::UnmapMemoryImpl(VAddr virtual_addr, u64 size) {
951951

952952
s32 MemoryManager::QueryProtection(VAddr addr, void** start, void** end, u32* prot) {
953953
std::shared_lock lk{mutex};
954-
ASSERT_MSG(IsValidMapping(addr), "Attempted to access invalid address {:#x}", addr);
954+
VAddr min_query_addr = impl.SystemManagedVirtualBase();
955+
if (addr < min_query_addr) {
956+
LOG_ERROR(Kernel_Vmm, "Address {:#x} is not mapped", addr);
957+
return ORBIS_KERNEL_ERROR_EACCES;
958+
}
955959

956960
const auto it = FindVMA(addr);
957961
const auto& vma = it->second;

src/core/module.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "common/string_util.h"
1111
#include "core/aerolib/aerolib.h"
1212
#include "core/cpu_patches.h"
13+
#include "core/libraries/error_codes.h"
1314
#include "core/loader/dwarf.h"
1415
#include "core/memory.h"
1516
#include "core/module.h"
@@ -112,17 +113,20 @@ void Module::LoadModuleToMemory(u32& max_tls_index) {
112113

113114
// Reserve memory area for module
114115
void** out_addr = reinterpret_cast<void**>(&base_virtual_addr);
115-
memory->MapMemory(out_addr, ModuleLoadBase, aligned_base_size + TrampolineSize,
116-
MemoryProt::NoAccess, MemoryMapFlags::NoFlags, VMAType::Reserved, name);
116+
s32 result =
117+
memory->MapMemory(out_addr, ModuleLoadBase, aligned_base_size + TrampolineSize,
118+
MemoryProt::NoAccess, MemoryMapFlags::NoFlags, VMAType::Reserved, name);
119+
ASSERT_MSG(result == ORBIS_OK, "Failed to reserve memory for module {}", name);
117120
LOG_INFO(Core_Linker, "Loading module {} to {}", name, fmt::ptr(*out_addr));
118121

119122
#ifdef ARCH_X86_64
120123
// Initialize trampoline generator.
121124
VAddr trampoline_vaddr = base_virtual_addr + aligned_base_size;
122125
void* trampoline_addr = std::bit_cast<void*>(trampoline_vaddr);
123-
memory->MapMemory(&trampoline_addr, trampoline_vaddr, TrampolineSize,
124-
MemoryProt::CpuReadWrite | MemoryProt::CpuExec, MemoryMapFlags::Fixed,
125-
VMAType::Code, name);
126+
result = memory->MapMemory(&trampoline_addr, trampoline_vaddr, TrampolineSize,
127+
MemoryProt::CpuReadWrite | MemoryProt::CpuExec,
128+
MemoryMapFlags::Fixed, VMAType::Code, name);
129+
ASSERT_MSG(result == ORBIS_OK, "Failed to map trampoline area for module {}", name);
126130
RegisterPatchModule(*out_addr, aligned_base_size, trampoline_addr, TrampolineSize);
127131
#endif
128132

@@ -147,10 +151,13 @@ void Module::LoadModuleToMemory(u32& max_tls_index) {
147151
if ((phdr.p_flags & PF_EXEC) != 0) {
148152
segment_prot |= MemoryProt::CpuExec;
149153
}
154+
150155
// Map module segments
151156
const auto memory_type = IsSystemLib() ? VMAType::Code : VMAType::Flexible;
152-
memory->MapMemory(&segment_addr, segment_vaddr, segment_size, segment_prot,
153-
MemoryMapFlags::Fixed, memory_type, name);
157+
s32 result = memory->MapMemory(&segment_addr, segment_vaddr, segment_size, segment_prot,
158+
MemoryMapFlags::Fixed, memory_type, name);
159+
ASSERT_MSG(result == ORBIS_OK, "Failed to map segment at {:#x} for module {}",
160+
segment_vaddr, name);
154161
elf.LoadSegment(segment_vaddr, phdr.p_offset, phdr.p_filesz);
155162
}
156163
if (info.num_segments < 4) {

src/shader_recompiler/backend/spirv/emit_spirv_image.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,12 @@ Id EmitImageRead(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id lod
226226
Id texel;
227227
if (!texture.is_storage) {
228228
const Id image = ctx.OpLoad(texture.image_type, texture.id);
229-
operands.Add(spv::ImageOperandsMask::Lod, lod);
229+
if (texture.view_type != AmdGpu::ImageType::Color2DMsaa) {
230+
if (Sirit::ValidId(ms)) {
231+
LOG_ERROR(Render_Recompiler, "image is not MS but ms operand is provided");
232+
}
233+
operands.Add(spv::ImageOperandsMask::Lod, lod);
234+
}
230235
texel = ctx.OpImageFetch(color_type, image, coords, operands.mask, operands.operands);
231236
} else {
232237
Id image_ptr = texture.id;

src/shader_recompiler/ir/passes/resource_tracking_pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1058,7 +1058,7 @@ void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info,
10581058

10591059
auto texel = [&] -> IR::Value {
10601060
if (is_msaa) {
1061-
return ir.ImageRead(handle, coords, ir.Imm32(0U), ir.Imm32(0U), inst_info);
1061+
return ir.ImageRead(handle, coords, {}, ir.Imm32(0U), inst_info);
10621062
}
10631063
if (inst_info.is_gather) {
10641064
if (inst_info.is_depth) {

src/video_core/buffer_cache/buffer_cache.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ std::pair<Buffer*, u32> BufferCache::ObtainBuffer(VAddr device_addr, u32 size,
441441
const bool is_texel_buffer = True(flags & ObtainBufferFlags::IsTexelBuffer);
442442
const bool skip_stream_buffer = True(flags & ObtainBufferFlags::IgnoreStreamBuffer);
443443
if (!is_written && !skip_stream_buffer && size <= CACHING_PAGESIZE &&
444-
!IsRegionGpuModified(device_addr, size)) {
444+
!IsRegionGpuModified(device_addr, size) && IsRegionCpuModified(device_addr, size)) {
445445
const u64 offset = stream_buffer.Copy(device_addr, size, instance.UniformMinAlignment());
446446
return {&stream_buffer, offset};
447447
}

0 commit comments

Comments
 (0)