rasterizer: Implemented combiner output scaling.

master
bunnei 2015-05-07 18:37:59 +07:00
parent ff767eeb40
commit 23e8be573e
2 changed files with 16 additions and 2 deletions

@ -300,7 +300,18 @@ struct Regs {
BitField<24, 8, u32> const_a; BitField<24, 8, u32> const_a;
}; };
INSERT_PADDING_WORDS(0x1); union {
BitField< 0, 2, u32> color_scale;
BitField<16, 2, u32> alpha_scale;
};
inline unsigned GetColorMultiplier() const {
return (color_scale < 3) ? (1 << color_scale) : 1;
}
inline unsigned GetAlphaMultiplier() const {
return (alpha_scale < 3) ? (1 << alpha_scale) : 1;
}
}; };
TevStageConfig tev_stage0; TevStageConfig tev_stage0;

@ -597,7 +597,10 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0,
}; };
auto alpha_output = AlphaCombine(tev_stage.alpha_op, alpha_result); auto alpha_output = AlphaCombine(tev_stage.alpha_op, alpha_result);
combiner_output = Math::MakeVec(color_output, alpha_output); combiner_output[0] = std::min((unsigned)255, color_output.r() * tev_stage.GetColorMultiplier());
combiner_output[1] = std::min((unsigned)255, color_output.g() * tev_stage.GetColorMultiplier());
combiner_output[2] = std::min((unsigned)255, color_output.b() * tev_stage.GetColorMultiplier());
combiner_output[3] = std::min((unsigned)255, alpha_output * tev_stage.GetAlphaMultiplier());
if (registers.tev_combiner_buffer_input.TevStageUpdatesCombinerBufferColor(tev_stage_index)) { if (registers.tev_combiner_buffer_input.TevStageUpdatesCombinerBufferColor(tev_stage_index)) {
combiner_buffer.r() = combiner_output.r(); combiner_buffer.r() = combiner_output.r();