early-access version 4025
This commit is contained in:
parent
4b3810cf0b
commit
4e9f7119c5
5 changed files with 32 additions and 25 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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_);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue