mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-25 19:44:57 +00:00
Merge branch 'main' into fix-shared-2
This commit is contained in:
commit
00aad6d502
@ -10,6 +10,8 @@
|
|||||||
|
|
||||||
namespace Core::FileSys {
|
namespace Core::FileSys {
|
||||||
|
|
||||||
|
bool MntPoints::ignore_game_patches = false;
|
||||||
|
|
||||||
std::string RemoveTrailingSlashes(const std::string& path) {
|
std::string RemoveTrailingSlashes(const std::string& path) {
|
||||||
// Remove trailing slashes to make comparisons simpler.
|
// Remove trailing slashes to make comparisons simpler.
|
||||||
std::string path_sanitized = path;
|
std::string path_sanitized = path;
|
||||||
@ -77,7 +79,7 @@ std::filesystem::path MntPoints::GetHostPath(std::string_view path, bool* is_rea
|
|||||||
patch_path /= rel_path;
|
patch_path /= rel_path;
|
||||||
|
|
||||||
if ((corrected_path.starts_with("/app0") || corrected_path.starts_with("/hostapp")) &&
|
if ((corrected_path.starts_with("/app0") || corrected_path.starts_with("/hostapp")) &&
|
||||||
!force_base_path && std::filesystem::exists(patch_path)) {
|
!force_base_path && !ignore_game_patches && std::filesystem::exists(patch_path)) {
|
||||||
return patch_path;
|
return patch_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +139,7 @@ std::filesystem::path MntPoints::GetHostPath(std::string_view path, bool* is_rea
|
|||||||
return std::optional<std::filesystem::path>(current_path);
|
return std::optional<std::filesystem::path>(current_path);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!force_base_path) {
|
if (!force_base_path && !ignore_game_patches) {
|
||||||
if (const auto path = search(patch_path)) {
|
if (const auto path = search(patch_path)) {
|
||||||
return *path;
|
return *path;
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ class MntPoints {
|
|||||||
static constexpr bool NeedsCaseInsensitiveSearch = true;
|
static constexpr bool NeedsCaseInsensitiveSearch = true;
|
||||||
#endif
|
#endif
|
||||||
public:
|
public:
|
||||||
|
static bool ignore_game_patches;
|
||||||
struct MntPair {
|
struct MntPair {
|
||||||
std::filesystem::path host_path;
|
std::filesystem::path host_path;
|
||||||
std::string mount; // e.g /app0
|
std::string mount; // e.g /app0
|
||||||
|
@ -1050,6 +1050,7 @@ void RegisterFileSystem(Core::Loader::SymbolsResolver* sym) {
|
|||||||
LIB_FUNCTION("4wSze92BhLI", "libkernel", 1, "libkernel", 1, 1, sceKernelWrite);
|
LIB_FUNCTION("4wSze92BhLI", "libkernel", 1, "libkernel", 1, 1, sceKernelWrite);
|
||||||
LIB_FUNCTION("+WRlkKjZvag", "libkernel", 1, "libkernel", 1, 1, readv);
|
LIB_FUNCTION("+WRlkKjZvag", "libkernel", 1, "libkernel", 1, 1, readv);
|
||||||
LIB_FUNCTION("YSHRBRLn2pI", "libkernel", 1, "libkernel", 1, 1, writev);
|
LIB_FUNCTION("YSHRBRLn2pI", "libkernel", 1, "libkernel", 1, 1, writev);
|
||||||
|
LIB_FUNCTION("kAt6VDbHmro", "libkernel", 1, "libkernel", 1, 1, sceKernelWritev);
|
||||||
LIB_FUNCTION("Oy6IpwgtYOk", "libScePosix", 1, "libkernel", 1, 1, posix_lseek);
|
LIB_FUNCTION("Oy6IpwgtYOk", "libScePosix", 1, "libkernel", 1, 1, posix_lseek);
|
||||||
LIB_FUNCTION("Oy6IpwgtYOk", "libkernel", 1, "libkernel", 1, 1, posix_lseek);
|
LIB_FUNCTION("Oy6IpwgtYOk", "libkernel", 1, "libkernel", 1, 1, posix_lseek);
|
||||||
LIB_FUNCTION("oib76F-12fk", "libkernel", 1, "libkernel", 1, 1, sceKernelLseek);
|
LIB_FUNCTION("oib76F-12fk", "libkernel", 1, "libkernel", 1, 1, sceKernelLseek);
|
||||||
|
@ -140,7 +140,7 @@ s32 PS4_SYSV_ABI sceVideodec2Flush(OrbisVideodec2Decoder decoder,
|
|||||||
return ORBIS_VIDEODEC2_ERROR_ARGUMENT_POINTER;
|
return ORBIS_VIDEODEC2_ERROR_ARGUMENT_POINTER;
|
||||||
}
|
}
|
||||||
if (frameBuffer->thisSize != sizeof(OrbisVideodec2FrameBuffer) ||
|
if (frameBuffer->thisSize != sizeof(OrbisVideodec2FrameBuffer) ||
|
||||||
outputInfo->thisSize != sizeof(OrbisVideodec2OutputInfo)) {
|
(outputInfo->thisSize | 8) != sizeof(OrbisVideodec2OutputInfo)) {
|
||||||
LOG_ERROR(Lib_Vdec2, "Invalid struct size");
|
LOG_ERROR(Lib_Vdec2, "Invalid struct size");
|
||||||
return ORBIS_VIDEODEC2_ERROR_STRUCT_SIZE;
|
return ORBIS_VIDEODEC2_ERROR_STRUCT_SIZE;
|
||||||
}
|
}
|
||||||
@ -167,7 +167,7 @@ s32 PS4_SYSV_ABI sceVideodec2GetPictureInfo(const OrbisVideodec2OutputInfo* outp
|
|||||||
LOG_ERROR(Lib_Vdec2, "Invalid arguments");
|
LOG_ERROR(Lib_Vdec2, "Invalid arguments");
|
||||||
return ORBIS_VIDEODEC2_ERROR_ARGUMENT_POINTER;
|
return ORBIS_VIDEODEC2_ERROR_ARGUMENT_POINTER;
|
||||||
}
|
}
|
||||||
if (outputInfo->thisSize != sizeof(OrbisVideodec2OutputInfo)) {
|
if ((outputInfo->thisSize | 8) != sizeof(OrbisVideodec2OutputInfo)) {
|
||||||
LOG_ERROR(Lib_Vdec2, "Invalid struct size");
|
LOG_ERROR(Lib_Vdec2, "Invalid struct size");
|
||||||
return ORBIS_VIDEODEC2_ERROR_STRUCT_SIZE;
|
return ORBIS_VIDEODEC2_ERROR_STRUCT_SIZE;
|
||||||
}
|
}
|
||||||
@ -179,7 +179,7 @@ s32 PS4_SYSV_ABI sceVideodec2GetPictureInfo(const OrbisVideodec2OutputInfo* outp
|
|||||||
if (p1stPictureInfoOut) {
|
if (p1stPictureInfoOut) {
|
||||||
OrbisVideodec2AvcPictureInfo* picInfo =
|
OrbisVideodec2AvcPictureInfo* picInfo =
|
||||||
static_cast<OrbisVideodec2AvcPictureInfo*>(p1stPictureInfoOut);
|
static_cast<OrbisVideodec2AvcPictureInfo*>(p1stPictureInfoOut);
|
||||||
if (picInfo->thisSize != sizeof(OrbisVideodec2AvcPictureInfo)) {
|
if ((picInfo->thisSize | 16) != sizeof(OrbisVideodec2AvcPictureInfo)) {
|
||||||
LOG_ERROR(Lib_Vdec2, "Invalid struct size");
|
LOG_ERROR(Lib_Vdec2, "Invalid struct size");
|
||||||
return ORBIS_VIDEODEC2_ERROR_STRUCT_SIZE;
|
return ORBIS_VIDEODEC2_ERROR_STRUCT_SIZE;
|
||||||
}
|
}
|
||||||
|
@ -73,8 +73,10 @@ struct OrbisVideodec2OutputInfo {
|
|||||||
u32 frameHeight;
|
u32 frameHeight;
|
||||||
void* frameBuffer;
|
void* frameBuffer;
|
||||||
u64 frameBufferSize;
|
u64 frameBufferSize;
|
||||||
|
u32 frameFormat;
|
||||||
|
u32 framePitchInBytes;
|
||||||
};
|
};
|
||||||
static_assert(sizeof(OrbisVideodec2OutputInfo) == 0x30);
|
static_assert(sizeof(OrbisVideodec2OutputInfo) == 0x38);
|
||||||
|
|
||||||
struct OrbisVideodec2FrameBuffer {
|
struct OrbisVideodec2FrameBuffer {
|
||||||
u64 thisSize;
|
u64 thisSize;
|
||||||
|
@ -55,6 +55,23 @@ struct OrbisVideodec2AvcPictureInfo {
|
|||||||
u8 pic_struct;
|
u8 pic_struct;
|
||||||
u8 field_pic_flag;
|
u8 field_pic_flag;
|
||||||
u8 bottom_field_flag;
|
u8 bottom_field_flag;
|
||||||
|
|
||||||
|
u8 sequenceParameterSetPresentFlag;
|
||||||
|
u8 pictureParameterSetPresentFlag;
|
||||||
|
u8 auDelimiterPresentFlag;
|
||||||
|
u8 endOfSequencePresentFlag;
|
||||||
|
u8 endOfStreamPresentFlag;
|
||||||
|
u8 fillerDataPresentFlag;
|
||||||
|
u8 pictureTimingSeiPresentFlag;
|
||||||
|
u8 bufferingPeriodSeiPresentFlag;
|
||||||
|
|
||||||
|
u8 constraint_set0_flag;
|
||||||
|
u8 constraint_set1_flag;
|
||||||
|
u8 constraint_set2_flag;
|
||||||
|
u8 constraint_set3_flag;
|
||||||
|
u8 constraint_set4_flag;
|
||||||
|
u8 constraint_set5_flag;
|
||||||
};
|
};
|
||||||
|
static_assert(sizeof(OrbisVideodec2AvcPictureInfo) == 0x78);
|
||||||
|
|
||||||
} // namespace Libraries::Vdec2
|
} // namespace Libraries::Vdec2
|
@ -48,6 +48,7 @@ s32 VdecDecoder::Decode(const OrbisVideodec2InputData& inputData,
|
|||||||
outputInfo.isValid = false;
|
outputInfo.isValid = false;
|
||||||
outputInfo.isErrorFrame = true;
|
outputInfo.isErrorFrame = true;
|
||||||
outputInfo.pictureCount = 0;
|
outputInfo.pictureCount = 0;
|
||||||
|
outputInfo.frameFormat = 0;
|
||||||
|
|
||||||
if (!inputData.auData) {
|
if (!inputData.auData) {
|
||||||
return ORBIS_VIDEODEC2_ERROR_ACCESS_UNIT_POINTER;
|
return ORBIS_VIDEODEC2_ERROR_ACCESS_UNIT_POINTER;
|
||||||
@ -106,6 +107,7 @@ s32 VdecDecoder::Decode(const OrbisVideodec2InputData& inputData,
|
|||||||
outputInfo.frameWidth = frame->width;
|
outputInfo.frameWidth = frame->width;
|
||||||
outputInfo.frameHeight = frame->height;
|
outputInfo.frameHeight = frame->height;
|
||||||
outputInfo.framePitch = frame->linesize[0];
|
outputInfo.framePitch = frame->linesize[0];
|
||||||
|
outputInfo.framePitchInBytes = frame->linesize[0];
|
||||||
outputInfo.frameBufferSize = frameBuffer.frameBufferSize;
|
outputInfo.frameBufferSize = frameBuffer.frameBufferSize;
|
||||||
outputInfo.frameBuffer = frameBuffer.frameBuffer;
|
outputInfo.frameBuffer = frameBuffer.frameBuffer;
|
||||||
|
|
||||||
@ -144,6 +146,7 @@ s32 VdecDecoder::Flush(OrbisVideodec2FrameBuffer& frameBuffer,
|
|||||||
outputInfo.isValid = false;
|
outputInfo.isValid = false;
|
||||||
outputInfo.isErrorFrame = true;
|
outputInfo.isErrorFrame = true;
|
||||||
outputInfo.pictureCount = 0;
|
outputInfo.pictureCount = 0;
|
||||||
|
outputInfo.frameFormat = 0;
|
||||||
|
|
||||||
AVFrame* frame = av_frame_alloc();
|
AVFrame* frame = av_frame_alloc();
|
||||||
if (!frame) {
|
if (!frame) {
|
||||||
@ -175,6 +178,7 @@ s32 VdecDecoder::Flush(OrbisVideodec2FrameBuffer& frameBuffer,
|
|||||||
outputInfo.frameWidth = frame->width;
|
outputInfo.frameWidth = frame->width;
|
||||||
outputInfo.frameHeight = frame->height;
|
outputInfo.frameHeight = frame->height;
|
||||||
outputInfo.framePitch = frame->linesize[0];
|
outputInfo.framePitch = frame->linesize[0];
|
||||||
|
outputInfo.framePitchInBytes = frame->linesize[0];
|
||||||
outputInfo.frameBufferSize = frameBuffer.frameBufferSize;
|
outputInfo.frameBufferSize = frameBuffer.frameBufferSize;
|
||||||
outputInfo.frameBuffer = frameBuffer.frameBuffer;
|
outputInfo.frameBuffer = frameBuffer.frameBuffer;
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ void Emulator::Run(std::filesystem::path file, const std::vector<std::string> ar
|
|||||||
game_folder_name.ends_with("-UPDATE") || game_folder_name.ends_with("-patch")) {
|
game_folder_name.ends_with("-UPDATE") || game_folder_name.ends_with("-patch")) {
|
||||||
// If an executable was launched from a separate update directory,
|
// If an executable was launched from a separate update directory,
|
||||||
// use the base game directory as the game folder.
|
// use the base game directory as the game folder.
|
||||||
const auto base_name = game_folder_name.substr(0, game_folder_name.size() - 7);
|
const std::string base_name = game_folder_name.substr(0, game_folder_name.rfind('-'));
|
||||||
const auto base_path = game_folder.parent_path() / base_name;
|
const auto base_path = game_folder.parent_path() / base_name;
|
||||||
if (std::filesystem::is_directory(base_path)) {
|
if (std::filesystem::is_directory(base_path)) {
|
||||||
game_folder = base_path;
|
game_folder = base_path;
|
||||||
|
26
src/main.cpp
26
src/main.cpp
@ -35,17 +35,19 @@ int main(int argc, char* argv[]) {
|
|||||||
std::unordered_map<std::string, std::function<void(int&)>> arg_map = {
|
std::unordered_map<std::string, std::function<void(int&)>> arg_map = {
|
||||||
{"-h",
|
{"-h",
|
||||||
[&](int&) {
|
[&](int&) {
|
||||||
std::cout << "Usage: shadps4 [options] <elf or eboot.bin path>\n"
|
std::cout
|
||||||
"Options:\n"
|
<< "Usage: shadps4 [options] <elf or eboot.bin path>\n"
|
||||||
" -g, --game <path|ID> Specify game path to launch\n"
|
"Options:\n"
|
||||||
" -- ... Parameters passed to the game ELF. "
|
" -g, --game <path|ID> Specify game path to launch\n"
|
||||||
"Needs to be at the end of the line, and everything after \"--\" is a "
|
" -- ... Parameters passed to the game ELF. "
|
||||||
"game argument.\n"
|
"Needs to be at the end of the line, and everything after \"--\" is a "
|
||||||
" -p, --patch <patch_file> Apply specified patch file\n"
|
"game argument.\n"
|
||||||
" -f, --fullscreen <true|false> Specify window initial fullscreen "
|
" -p, --patch <patch_file> Apply specified patch file\n"
|
||||||
"state. Does not overwrite the config file.\n"
|
" -i, --ignore-game-patch Disable automatic loading of game patch\n"
|
||||||
" --add-game-folder <folder> Adds a new game folder to the config.\n"
|
" -f, --fullscreen <true|false> Specify window initial fullscreen "
|
||||||
" -h, --help Display this help message\n";
|
"state. Does not overwrite the config file.\n"
|
||||||
|
" --add-game-folder <folder> Adds a new game folder to the config.\n"
|
||||||
|
" -h, --help Display this help message\n";
|
||||||
exit(0);
|
exit(0);
|
||||||
}},
|
}},
|
||||||
{"--help", [&](int& i) { arg_map["-h"](i); }},
|
{"--help", [&](int& i) { arg_map["-h"](i); }},
|
||||||
@ -72,6 +74,8 @@ int main(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
}},
|
}},
|
||||||
{"--patch", [&](int& i) { arg_map["-p"](i); }},
|
{"--patch", [&](int& i) { arg_map["-p"](i); }},
|
||||||
|
{"-i", [&](int&) { Core::FileSys::MntPoints::ignore_game_patches = true; }},
|
||||||
|
{"--ignore-game-patch", [&](int& i) { arg_map["-i"](i); }},
|
||||||
{"-f",
|
{"-f",
|
||||||
[&](int& i) {
|
[&](int& i) {
|
||||||
if (++i >= argc) {
|
if (++i >= argc) {
|
||||||
|
@ -41,20 +41,22 @@ int main(int argc, char* argv[]) {
|
|||||||
std::unordered_map<std::string, std::function<void(int&)>> arg_map = {
|
std::unordered_map<std::string, std::function<void(int&)>> arg_map = {
|
||||||
{"-h",
|
{"-h",
|
||||||
[&](int&) {
|
[&](int&) {
|
||||||
std::cout << "Usage: shadps4 [options]\n"
|
std::cout
|
||||||
"Options:\n"
|
<< "Usage: shadps4 [options]\n"
|
||||||
" No arguments: Opens the GUI.\n"
|
"Options:\n"
|
||||||
" -g, --game <path|ID> Specify <eboot.bin or elf path> or "
|
" No arguments: Opens the GUI.\n"
|
||||||
"<game ID (CUSAXXXXX)> to launch\n"
|
" -g, --game <path|ID> Specify <eboot.bin or elf path> or "
|
||||||
" -- ... Parameters passed to the game ELF. "
|
"<game ID (CUSAXXXXX)> to launch\n"
|
||||||
"Needs to be at the end of the line, and everything after \"--\" is a "
|
" -- ... Parameters passed to the game ELF. "
|
||||||
"game argument.\n"
|
"Needs to be at the end of the line, and everything after \"--\" is a "
|
||||||
" -p, --patch <patch_file> Apply specified patch file\n"
|
"game argument.\n"
|
||||||
" -s, --show-gui Show the GUI\n"
|
" -p, --patch <patch_file> Apply specified patch file\n"
|
||||||
" -f, --fullscreen <true|false> Specify window initial fullscreen "
|
" -i, --ignore-game-patch Disable automatic loading of game patch\n"
|
||||||
"state. Does not overwrite the config file.\n"
|
" -s, --show-gui Show the GUI\n"
|
||||||
" --add-game-folder <folder> Adds a new game folder to the config.\n"
|
" -f, --fullscreen <true|false> Specify window initial fullscreen "
|
||||||
" -h, --help Display this help message\n";
|
"state. Does not overwrite the config file.\n"
|
||||||
|
" --add-game-folder <folder> Adds a new game folder to the config.\n"
|
||||||
|
" -h, --help Display this help message\n";
|
||||||
exit(0);
|
exit(0);
|
||||||
}},
|
}},
|
||||||
{"--help", [&](int& i) { arg_map["-h"](i); }}, // Redirect --help to -h
|
{"--help", [&](int& i) { arg_map["-h"](i); }}, // Redirect --help to -h
|
||||||
@ -84,6 +86,8 @@ int main(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
}},
|
}},
|
||||||
{"--patch", [&](int& i) { arg_map["-p"](i); }},
|
{"--patch", [&](int& i) { arg_map["-p"](i); }},
|
||||||
|
{"-i", [&](int&) { Core::FileSys::MntPoints::ignore_game_patches = true; }},
|
||||||
|
{"--ignore-game-patch", [&](int& i) { arg_map["-i"](i); }},
|
||||||
{"-f",
|
{"-f",
|
||||||
[&](int& i) {
|
[&](int& i) {
|
||||||
if (++i >= argc) {
|
if (++i >= argc) {
|
||||||
|
@ -299,8 +299,7 @@ void EmitContext::DefineInterpolatedAttribs() {
|
|||||||
// Iterate all input attributes, load them and manually interpolate.
|
// Iterate all input attributes, load them and manually interpolate.
|
||||||
for (s32 i = 0; i < runtime_info.fs_info.num_inputs; i++) {
|
for (s32 i = 0; i < runtime_info.fs_info.num_inputs; i++) {
|
||||||
const auto& input = runtime_info.fs_info.inputs[i];
|
const auto& input = runtime_info.fs_info.inputs[i];
|
||||||
const u32 semantic = input.param_index;
|
auto& params = input_params[i];
|
||||||
auto& params = input_params[semantic];
|
|
||||||
if (input.is_flat || params.is_loaded) {
|
if (input.is_flat || params.is_loaded) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -318,7 +317,7 @@ void EmitContext::DefineInterpolatedAttribs() {
|
|||||||
const Id p10_y{OpVectorTimesScalar(F32[4], p10, bary_coord_y)};
|
const Id p10_y{OpVectorTimesScalar(F32[4], p10, bary_coord_y)};
|
||||||
const Id p20_z{OpVectorTimesScalar(F32[4], p20, bary_coord_z)};
|
const Id p20_z{OpVectorTimesScalar(F32[4], p20, bary_coord_z)};
|
||||||
params.id = OpFAdd(F32[4], p0, OpFAdd(F32[4], p10_y, p20_z));
|
params.id = OpFAdd(F32[4], p0, OpFAdd(F32[4], p10_y, p20_z));
|
||||||
Name(params.id, fmt::format("fs_in_attr{}", semantic));
|
Name(params.id, fmt::format("fs_in_attr{}", i));
|
||||||
params.is_loaded = true;
|
params.is_loaded = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -427,25 +426,28 @@ void EmitContext::DefineInputs() {
|
|||||||
}
|
}
|
||||||
for (s32 i = 0; i < runtime_info.fs_info.num_inputs; i++) {
|
for (s32 i = 0; i < runtime_info.fs_info.num_inputs; i++) {
|
||||||
const auto& input = runtime_info.fs_info.inputs[i];
|
const auto& input = runtime_info.fs_info.inputs[i];
|
||||||
const u32 semantic = input.param_index;
|
|
||||||
ASSERT(semantic < IR::NumParams);
|
|
||||||
if (input.IsDefault()) {
|
if (input.IsDefault()) {
|
||||||
input_params[semantic] = {
|
input_params[i] = {
|
||||||
MakeDefaultValue(*this, input.default_value), input_f32, F32[1], 4, false, true,
|
.id = MakeDefaultValue(*this, input.default_value),
|
||||||
|
.pointer_type = input_f32,
|
||||||
|
.component_type = F32[1],
|
||||||
|
.num_components = 4,
|
||||||
|
.is_integer = false,
|
||||||
|
.is_loaded = true,
|
||||||
};
|
};
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const IR::Attribute param{IR::Attribute::Param0 + input.param_index};
|
const IR::Attribute param{IR::Attribute::Param0 + i};
|
||||||
const u32 num_components = info.loads.NumComponents(param);
|
const u32 num_components = info.loads.NumComponents(param);
|
||||||
const Id type{F32[num_components]};
|
const Id type{F32[num_components]};
|
||||||
Id attr_id{};
|
Id attr_id{};
|
||||||
if (profile.needs_manual_interpolation && !input.is_flat) {
|
if (profile.needs_manual_interpolation && !input.is_flat) {
|
||||||
attr_id = DefineInput(TypeArray(type, ConstU32(3U)), semantic);
|
attr_id = DefineInput(TypeArray(type, ConstU32(3U)), input.param_index);
|
||||||
Decorate(attr_id, spv::Decoration::PerVertexKHR);
|
Decorate(attr_id, spv::Decoration::PerVertexKHR);
|
||||||
Name(attr_id, fmt::format("fs_in_attr{}_p", semantic));
|
Name(attr_id, fmt::format("fs_in_attr{}_p", i));
|
||||||
} else {
|
} else {
|
||||||
attr_id = DefineInput(type, semantic);
|
attr_id = DefineInput(type, input.param_index);
|
||||||
Name(attr_id, fmt::format("fs_in_attr{}", semantic));
|
Name(attr_id, fmt::format("fs_in_attr{}", i));
|
||||||
|
|
||||||
if (input.is_flat) {
|
if (input.is_flat) {
|
||||||
Decorate(attr_id, spv::Decoration::Flat);
|
Decorate(attr_id, spv::Decoration::Flat);
|
||||||
@ -453,7 +455,7 @@ void EmitContext::DefineInputs() {
|
|||||||
Decorate(attr_id, spv::Decoration::NoPerspective);
|
Decorate(attr_id, spv::Decoration::NoPerspective);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
input_params[semantic] =
|
input_params[i] =
|
||||||
GetAttributeInfo(AmdGpu::NumberFormat::Float, attr_id, num_components, false);
|
GetAttributeInfo(AmdGpu::NumberFormat::Float, attr_id, num_components, false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -22,15 +22,17 @@ void Translator::EmitVectorInterpolation(const GcnInst& inst) {
|
|||||||
// VINTRP
|
// VINTRP
|
||||||
|
|
||||||
void Translator::V_INTERP_P2_F32(const GcnInst& inst) {
|
void Translator::V_INTERP_P2_F32(const GcnInst& inst) {
|
||||||
const auto& attr = runtime_info.fs_info.inputs.at(inst.control.vintrp.attr);
|
const u32 attr_index = inst.control.vintrp.attr;
|
||||||
info.interp_qualifiers[attr.param_index] = vgpr_to_interp[inst.src[0].code];
|
const auto& attr = runtime_info.fs_info.inputs.at(attr_index);
|
||||||
const IR::Attribute attrib{IR::Attribute::Param0 + attr.param_index};
|
info.interp_qualifiers[attr_index] = vgpr_to_interp[inst.src[0].code];
|
||||||
|
const IR::Attribute attrib{IR::Attribute::Param0 + attr_index};
|
||||||
SetDst(inst.dst[0], ir.GetAttribute(attrib, inst.control.vintrp.chan));
|
SetDst(inst.dst[0], ir.GetAttribute(attrib, inst.control.vintrp.chan));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Translator::V_INTERP_MOV_F32(const GcnInst& inst) {
|
void Translator::V_INTERP_MOV_F32(const GcnInst& inst) {
|
||||||
const auto& attr = runtime_info.fs_info.inputs.at(inst.control.vintrp.attr);
|
const u32 attr_index = inst.control.vintrp.attr;
|
||||||
const IR::Attribute attrib{IR::Attribute::Param0 + attr.param_index};
|
const auto& attr = runtime_info.fs_info.inputs.at(attr_index);
|
||||||
|
const IR::Attribute attrib{IR::Attribute::Param0 + attr_index};
|
||||||
SetDst(inst.dst[0], ir.GetAttribute(attrib, inst.control.vintrp.chan));
|
SetDst(inst.dst[0], ir.GetAttribute(attrib, inst.control.vintrp.chan));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,7 +319,8 @@ void Image::CopyImage(const Image& image) {
|
|||||||
auto cmdbuf = scheduler->CommandBuffer();
|
auto cmdbuf = scheduler->CommandBuffer();
|
||||||
|
|
||||||
boost::container::small_vector<vk::ImageCopy, 14> image_copy{};
|
boost::container::small_vector<vk::ImageCopy, 14> image_copy{};
|
||||||
for (u32 m = 0; m < image.info.resources.levels; ++m) {
|
const u32 num_mips = std::min(image.info.resources.levels, info.resources.levels);
|
||||||
|
for (u32 m = 0; m < num_mips; ++m) {
|
||||||
const auto mip_w = std::max(image.info.size.width >> m, 1u);
|
const auto mip_w = std::max(image.info.size.width >> m, 1u);
|
||||||
const auto mip_h = std::max(image.info.size.height >> m, 1u);
|
const auto mip_h = std::max(image.info.size.height >> m, 1u);
|
||||||
const auto mip_d = std::max(image.info.size.depth >> m, 1u);
|
const auto mip_d = std::max(image.info.size.depth >> m, 1u);
|
||||||
|
@ -461,9 +461,9 @@ ImageView& TextureCache::FindDepthTarget(BaseDesc& desc) {
|
|||||||
const ImageId image_id = FindImage(desc);
|
const ImageId image_id = FindImage(desc);
|
||||||
Image& image = slot_images[image_id];
|
Image& image = slot_images[image_id];
|
||||||
image.flags |= ImageFlagBits::GpuModified;
|
image.flags |= ImageFlagBits::GpuModified;
|
||||||
image.flags &= ~ImageFlagBits::Dirty;
|
|
||||||
image.usage.depth_target = 1u;
|
image.usage.depth_target = 1u;
|
||||||
image.usage.stencil = image.info.HasStencil();
|
image.usage.stencil = image.info.HasStencil();
|
||||||
|
UpdateImage(image_id);
|
||||||
|
|
||||||
// Register meta data for this depth buffer
|
// Register meta data for this depth buffer
|
||||||
if (!(image.flags & ImageFlagBits::MetaRegistered)) {
|
if (!(image.flags & ImageFlagBits::MetaRegistered)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user