VideoCore: Implement the DOT3_RGB combiner
This commit is contained in:
parent
2501f111a6
commit
d08e9b29e2
|
@ -290,6 +290,7 @@ struct Regs {
|
||||||
AddSigned = 3,
|
AddSigned = 3,
|
||||||
Lerp = 4,
|
Lerp = 4,
|
||||||
Subtract = 5,
|
Subtract = 5,
|
||||||
|
Dot3_RGB = 6,
|
||||||
|
|
||||||
MultiplyThenAdd = 8,
|
MultiplyThenAdd = 8,
|
||||||
AddThenMultiply = 9,
|
AddThenMultiply = 9,
|
||||||
|
|
|
@ -641,7 +641,18 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0,
|
||||||
result = (result * input[2].Cast<int>()) / 255;
|
result = (result * input[2].Cast<int>()) / 255;
|
||||||
return result.Cast<u8>();
|
return result.Cast<u8>();
|
||||||
}
|
}
|
||||||
|
case Operation::Dot3_RGB:
|
||||||
|
{
|
||||||
|
// Not fully accurate.
|
||||||
|
// Worst case scenario seems to yield a +/-3 error
|
||||||
|
// Some HW results indicate that the per-component computation can't have a higher precision than 1/256,
|
||||||
|
// while dot3_rgb( (0x80,g0,b0),(0x7F,g1,b1) ) and dot3_rgb( (0x80,g0,b0),(0x80,g1,b1) ) give different results
|
||||||
|
int result = ((input[0].r() * 2 - 255) * (input[1].r() * 2 - 255) + 128) / 256 +
|
||||||
|
((input[0].g() * 2 - 255) * (input[1].g() * 2 - 255) + 128) / 256 +
|
||||||
|
((input[0].b() * 2 - 255) * (input[1].b() * 2 - 255) + 128) / 256;
|
||||||
|
result = std::max(0, std::min(255, result));
|
||||||
|
return { (u8)result, (u8)result, (u8)result };
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
LOG_ERROR(HW_GPU, "Unknown color combiner operation %d\n", (int)op);
|
LOG_ERROR(HW_GPU, "Unknown color combiner operation %d\n", (int)op);
|
||||||
UNIMPLEMENTED();
|
UNIMPLEMENTED();
|
||||||
|
|
Loading…
Reference in New Issue