early-access version 4025

This commit is contained in:
pineappleEA 2023-12-18 23:28:40 +01:00
parent 4b3810cf0b
commit 4e9f7119c5
5 changed files with 32 additions and 25 deletions

View file

@ -1,7 +1,7 @@
yuzu emulator early access yuzu emulator early access
============= =============
This is the source code for early-access 4024. This is the source code for early-access 4025.
## Legal Notice ## Legal Notice

View file

@ -54,6 +54,13 @@ enum class ImageDirectoryId : u32 {
SdCard, SdCard,
}; };
enum class OpenDirectoryMode : u64 {
Directory = (1 << 0),
File = (1 << 1),
All = Directory | File
};
DECLARE_ENUM_FLAG_OPERATORS(OpenDirectoryMode);
class FileSystemController { class FileSystemController {
public: public:
explicit FileSystemController(Core::System& system_); explicit FileSystemController(Core::System& system_);

View file

@ -259,7 +259,7 @@ static void BuildEntryIndex(std::vector<FileSys::Entry>& entries, const std::vec
class IDirectory final : public ServiceFramework<IDirectory> { class IDirectory final : public ServiceFramework<IDirectory> {
public: public:
explicit IDirectory(Core::System& system_, FileSys::VirtualDir backend_) explicit IDirectory(Core::System& system_, FileSys::VirtualDir backend_, OpenDirectoryMode mode)
: ServiceFramework{system_, "IDirectory"}, backend(std::move(backend_)) { : ServiceFramework{system_, "IDirectory"}, backend(std::move(backend_)) {
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &IDirectory::Read, "Read"}, {0, &IDirectory::Read, "Read"},
@ -269,9 +269,13 @@ public:
// TODO(DarkLordZach): Verify that this is the correct behavior. // TODO(DarkLordZach): Verify that this is the correct behavior.
// Build entry index now to save time later. // Build entry index now to save time later.
BuildEntryIndex(entries, backend->GetFiles(), FileSys::EntryType::File); if (True(mode & OpenDirectoryMode::Directory)) {
BuildEntryIndex(entries, backend->GetSubdirectories(), FileSys::EntryType::Directory); BuildEntryIndex(entries, backend->GetSubdirectories(), FileSys::EntryType::Directory);
} }
if (True(mode & OpenDirectoryMode::File)) {
BuildEntryIndex(entries, backend->GetFiles(), FileSys::EntryType::File);
}
}
private: private:
FileSys::VirtualDir backend; FileSys::VirtualDir backend;
@ -446,11 +450,9 @@ public:
const auto file_buffer = ctx.ReadBuffer(); const auto file_buffer = ctx.ReadBuffer();
const std::string name = Common::StringFromBuffer(file_buffer); const std::string name = Common::StringFromBuffer(file_buffer);
const auto mode = rp.PopRaw<OpenDirectoryMode>();
// TODO(Subv): Implement this filter. LOG_DEBUG(Service_FS, "called. directory={}, mode={}", name, mode);
const u32 filter_flags = rp.Pop<u32>();
LOG_DEBUG(Service_FS, "called. directory={}, filter={}", name, filter_flags);
FileSys::VirtualDir vfs_dir{}; FileSys::VirtualDir vfs_dir{};
auto result = backend.OpenDirectory(&vfs_dir, name); auto result = backend.OpenDirectory(&vfs_dir, name);
@ -460,7 +462,7 @@ public:
return; return;
} }
auto directory = std::make_shared<IDirectory>(system, vfs_dir); auto directory = std::make_shared<IDirectory>(system, vfs_dir, mode);
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);

View file

@ -538,6 +538,14 @@ void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo
flags.type.Assign(ReadTextureType(env, cbuf)); flags.type.Assign(ReadTextureType(env, cbuf));
inst->SetFlags(flags); inst->SetFlags(flags);
break; break;
case IR::Opcode::ImageSampleImplicitLod:
if (flags.type != TextureType::Color2D) {
break;
}
if (ReadTextureType(env, cbuf) == TextureType::Color2DRect) {
PatchImageSampleImplicitLod(*texture_inst.block, *texture_inst.inst);
}
break;
case IR::Opcode::ImageFetch: case IR::Opcode::ImageFetch:
if (flags.type == TextureType::Color2D || flags.type == TextureType::Color2DRect || if (flags.type == TextureType::Color2D || flags.type == TextureType::Color2DRect ||
flags.type == TextureType::ColorArray2D) { flags.type == TextureType::ColorArray2D) {
@ -654,19 +662,6 @@ void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo
PatchTexelFetch(*texture_inst.block, *texture_inst.inst, pixel_format); PatchTexelFetch(*texture_inst.block, *texture_inst.inst, pixel_format);
} }
} }
switch (inst->GetOpcode()) {
case IR::Opcode::ImageSampleImplicitLod:
if (flags.type != TextureType::Color2D) {
break;
}
if (ReadTextureType(env, cbuf) == TextureType::Color2DRect) {
PatchImageSampleImplicitLod(*texture_inst.block, *texture_inst.inst);
}
break;
default:
break;
}
} }
} }

View file

@ -289,12 +289,15 @@ public:
} }
if (has_multi_queries) { if (has_multi_queries) {
size_t intermediary_buffer_index = ObtainBuffer<false>(num_slots_used); const size_t min_accumulation_limit =
std::min(first_accumulation_checkpoint, num_slots_used);
const size_t max_accumulation_limit =
std::max(last_accumulation_checkpoint, num_slots_used);
const size_t intermediary_buffer_index = ObtainBuffer<false>(num_slots_used);
resolve_buffers.push_back(intermediary_buffer_index); resolve_buffers.push_back(intermediary_buffer_index);
queries_prefix_scan_pass->Run(*accumulation_buffer, *buffers[intermediary_buffer_index], queries_prefix_scan_pass->Run(*accumulation_buffer, *buffers[intermediary_buffer_index],
*buffers[resolve_buffer_index], num_slots_used, *buffers[resolve_buffer_index], num_slots_used,
std::min(first_accumulation_checkpoint, num_slots_used), min_accumulation_limit, max_accumulation_limit);
last_accumulation_checkpoint);
} else { } else {
scheduler.RequestOutsideRenderPassOperationContext(); scheduler.RequestOutsideRenderPassOperationContext();