mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-05-18 17:34:52 +00:00
recompiler: added support for discard on export with masked EXEC
This commit is contained in:
parent
1b94f07a6a
commit
f041276b04
12 changed files with 47 additions and 5 deletions
|
@ -121,7 +121,7 @@ void CFG::EmitBlocks() {
|
|||
|
||||
void CFG::LinkBlocks() {
|
||||
const auto get_block = [this](u32 address) {
|
||||
const auto it = blocks.find(address, Compare{});
|
||||
auto it = blocks.find(address, Compare{});
|
||||
ASSERT_MSG(it != blocks.end() && it->begin == address);
|
||||
return &*it;
|
||||
};
|
||||
|
@ -131,7 +131,10 @@ void CFG::LinkBlocks() {
|
|||
// If the block doesn't end with a branch we simply
|
||||
// need to link with the next block.
|
||||
if (!end_inst.IsTerminateInstruction()) {
|
||||
block.branch_true = get_block(block.end);
|
||||
auto* next_block = get_block(block.end);
|
||||
++next_block->num_predecessors;
|
||||
|
||||
block.branch_true = next_block;
|
||||
block.end_class = EndClass::Branch;
|
||||
continue;
|
||||
}
|
||||
|
@ -141,11 +144,20 @@ void CFG::LinkBlocks() {
|
|||
const u32 branch_pc = block.end - end_inst.length;
|
||||
const u32 target_pc = end_inst.BranchTarget(branch_pc);
|
||||
if (end_inst.IsUnconditionalBranch()) {
|
||||
block.branch_true = get_block(target_pc);
|
||||
auto* target_block = get_block(target_pc);
|
||||
++target_block->num_predecessors;
|
||||
|
||||
block.branch_true = target_block;
|
||||
block.end_class = EndClass::Branch;
|
||||
} else if (end_inst.IsConditionalBranch()) {
|
||||
block.branch_true = get_block(target_pc);
|
||||
block.branch_false = get_block(block.end);
|
||||
auto* target_block = get_block(target_pc);
|
||||
++target_block->num_predecessors;
|
||||
|
||||
auto* end_block = get_block(block.end);
|
||||
++end_block->num_predecessors;
|
||||
|
||||
block.branch_true = target_block;
|
||||
block.branch_false = end_block;
|
||||
block.end_class = EndClass::Branch;
|
||||
} else if (end_inst.opcode == Opcode::S_ENDPGM) {
|
||||
const auto& prev_inst = inst_list[block.end_index - 1];
|
||||
|
|
|
@ -36,6 +36,7 @@ struct Block : Hook {
|
|||
u32 end;
|
||||
u32 begin_index;
|
||||
u32 end_index;
|
||||
u32 num_predecessors{};
|
||||
IR::Condition cond{};
|
||||
GcnInst end_inst{};
|
||||
EndClass end_class{};
|
||||
|
|
|
@ -631,6 +631,7 @@ private:
|
|||
case StatementType::Code: {
|
||||
ensure_block();
|
||||
if (!stmt.block->is_dummy) {
|
||||
current_block->has_multiple_predecessors = stmt.block->num_predecessors > 1;
|
||||
const u32 start = stmt.block->begin_index;
|
||||
const u32 size = stmt.block->end_index - start + 1;
|
||||
Translate(current_block, stmt.block->begin, inst_list.subspan(start, size),
|
||||
|
|
|
@ -1,11 +1,17 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include "common/logging/log.h"
|
||||
#include "shader_recompiler/frontend/translate/translate.h"
|
||||
|
||||
namespace Shader::Gcn {
|
||||
|
||||
void Translator::EXP(const GcnInst& inst) {
|
||||
if (ir.block->has_multiple_predecessors) {
|
||||
LOG_WARNING(Render_Recompiler, "An ambiguous export appeared in translation");
|
||||
ir.Discard(ir.LogicalNot(ir.GetExec()));
|
||||
}
|
||||
|
||||
const auto& exp = inst.control.exp;
|
||||
const IR::Attribute attrib{exp.target};
|
||||
const std::array vsrc = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue