mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-05 00:42:48 +00:00
control_flow: Avoid adding unnecessary divergant blocks
This commit is contained in:
parent
6244d00795
commit
29b51567ea
@ -47,6 +47,15 @@ static IR::Condition MakeCondition(const GcnInst& inst) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool IgnoresExecMask(Opcode opcode) {
|
||||||
|
switch (opcode) {
|
||||||
|
case Opcode::V_WRITELANE_B32:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static constexpr size_t LabelReserveSize = 32;
|
static constexpr size_t LabelReserveSize = 32;
|
||||||
|
|
||||||
CFG::CFG(Common::ObjectPool<Block>& block_pool_, std::span<const GcnInst> inst_list_)
|
CFG::CFG(Common::ObjectPool<Block>& block_pool_, std::span<const GcnInst> inst_list_)
|
||||||
@ -133,6 +142,9 @@ void CFG::EmitDivergenceLabels() {
|
|||||||
curr_begin = -1;
|
curr_begin = -1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
// If all instructions in the scope ignore exec masking, we shouldn't insert a scope.
|
||||||
|
const auto start = inst_list.begin() + curr_begin + 1;
|
||||||
|
if (!std::ranges::all_of(start, inst_list.begin() + index, IgnoresExecMask, &GcnInst::opcode)) {
|
||||||
// Add a label to the instruction right after the open scope call.
|
// Add a label to the instruction right after the open scope call.
|
||||||
// It is the start of a new basic block.
|
// It is the start of a new basic block.
|
||||||
const auto& save_inst = inst_list[curr_begin];
|
const auto& save_inst = inst_list[curr_begin];
|
||||||
@ -148,6 +160,7 @@ void CFG::EmitDivergenceLabels() {
|
|||||||
if (is_close) {
|
if (is_close) {
|
||||||
AddLabel(index_to_pc[index]);
|
AddLabel(index_to_pc[index]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// Reset scope begin.
|
// Reset scope begin.
|
||||||
curr_begin = -1;
|
curr_begin = -1;
|
||||||
}
|
}
|
||||||
|
@ -702,7 +702,7 @@ Liverpool::Task Liverpool::ProcessCompute(std::span<const u32> acb, int vqid) {
|
|||||||
false);
|
false);
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
|
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
|
||||||
dma_data->dst_sel == DmaDataDst::Memory) {
|
dma_data->dst_sel == DmaDataDst::Memory) {
|
||||||
LOG_WARNING(Render_Vulkan, "GDS memory read");
|
// LOG_WARNING(Render_Vulkan, "GDS memory read");
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Memory &&
|
} else if (dma_data->src_sel == DmaDataSrc::Memory &&
|
||||||
dma_data->dst_sel == DmaDataDst::Memory) {
|
dma_data->dst_sel == DmaDataDst::Memory) {
|
||||||
rasterizer->InlineData(dma_data->DstAddress<VAddr>(),
|
rasterizer->InlineData(dma_data->DstAddress<VAddr>(),
|
||||||
|
Loading…
Reference in New Issue
Block a user