2021-03-19 23:28:31 +01:00
|
|
|
// Copyright 2021 yuzu Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#include "common/common_types.h"
|
|
|
|
#include "shader_recompiler/exception.h"
|
|
|
|
#include "shader_recompiler/frontend/maxwell/translate/impl/impl.h"
|
|
|
|
|
|
|
|
namespace Shader::Maxwell {
|
|
|
|
namespace {
|
|
|
|
void ExitFragment(TranslatorVisitor& v) {
|
|
|
|
const ProgramHeader sph{v.env.SPH()};
|
|
|
|
IR::Reg src_reg{IR::Reg::R0};
|
|
|
|
for (u32 render_target = 0; render_target < 8; ++render_target) {
|
|
|
|
const std::array<bool, 4> mask{sph.ps.EnabledOutputComponents(render_target)};
|
|
|
|
for (u32 component = 0; component < 4; ++component) {
|
|
|
|
if (!mask[component]) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
v.ir.SetFragColor(render_target, component, v.F(src_reg));
|
|
|
|
++src_reg;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (sph.ps.omap.sample_mask != 0) {
|
|
|
|
throw NotImplementedException("Sample mask");
|
|
|
|
}
|
|
|
|
if (sph.ps.omap.depth != 0) {
|
2021-03-25 20:27:09 +01:00
|
|
|
v.ir.SetFragDepth(v.F(src_reg + 1));
|
2021-03-19 23:28:31 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
} // Anonymous namespace
|
|
|
|
|
|
|
|
void TranslatorVisitor::EXIT() {
|
|
|
|
switch (env.ShaderStage()) {
|
|
|
|
case Stage::Fragment:
|
|
|
|
ExitFragment(*this);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace Shader::Maxwell
|