diff options
| author | 2015-02-05 16:07:37 +0100 | |
|---|---|---|
| committer | 2015-02-05 16:07:37 +0100 | |
| commit | 1576a318f2c059305364f0e5de81aab80094a610 (patch) | |
| tree | e85a096e8e637af7a9151dfd3176c4167463100f /src/video_core/rasterizer.cpp | |
| parent | Merge pull request #537 from lioncash/vfp (diff) | |
| parent | Rasterizer: Implement the other color and alpha modifiers. (diff) | |
| download | yuzu-1576a318f2c059305364f0e5de81aab80094a610.tar.gz yuzu-1576a318f2c059305364f0e5de81aab80094a610.tar.xz yuzu-1576a318f2c059305364f0e5de81aab80094a610.zip | |
Merge pull request #535 from bunnei/color-modifiers
Implement color/alpha modifiers
Diffstat (limited to 'src/video_core/rasterizer.cpp')
| -rw-r--r-- | src/video_core/rasterizer.cpp | 97 |
1 files changed, 49 insertions, 48 deletions
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp index 845f1c4b2..5920477eb 100644 --- a/src/video_core/rasterizer.cpp +++ b/src/video_core/rasterizer.cpp | |||
| @@ -260,7 +260,7 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0, | |||
| 260 | using AlphaModifier = Regs::TevStageConfig::AlphaModifier; | 260 | using AlphaModifier = Regs::TevStageConfig::AlphaModifier; |
| 261 | using Operation = Regs::TevStageConfig::Operation; | 261 | using Operation = Regs::TevStageConfig::Operation; |
| 262 | 262 | ||
| 263 | auto GetColorSource = [&](Source source) -> Math::Vec4<u8> { | 263 | auto GetSource = [&](Source source) -> Math::Vec4<u8> { |
| 264 | switch (source) { | 264 | switch (source) { |
| 265 | case Source::PrimaryColor: | 265 | case Source::PrimaryColor: |
| 266 | return primary_color; | 266 | return primary_color; |
| @@ -287,36 +287,8 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0, | |||
| 287 | } | 287 | } |
| 288 | }; | 288 | }; |
| 289 | 289 | ||
| 290 | auto GetAlphaSource = [&](Source source) -> u8 { | ||
| 291 | switch (source) { | ||
| 292 | case Source::PrimaryColor: | ||
| 293 | return primary_color.a(); | ||
| 294 | |||
| 295 | case Source::Texture0: | ||
| 296 | return texture_color[0].a(); | ||
| 297 | |||
| 298 | case Source::Texture1: | ||
| 299 | return texture_color[1].a(); | ||
| 300 | |||
| 301 | case Source::Texture2: | ||
| 302 | return texture_color[2].a(); | ||
| 303 | |||
| 304 | case Source::Constant: | ||
| 305 | return tev_stage.const_a; | ||
| 306 | |||
| 307 | case Source::Previous: | ||
| 308 | return combiner_output.a(); | ||
| 309 | |||
| 310 | default: | ||
| 311 | LOG_ERROR(HW_GPU, "Unknown alpha combiner source %d\n", (int)source); | ||
| 312 | _dbg_assert_(HW_GPU, 0); | ||
| 313 | return 0; | ||
| 314 | } | ||
| 315 | }; | ||
| 316 | |||
| 317 | static auto GetColorModifier = [](ColorModifier factor, const Math::Vec4<u8>& values) -> Math::Vec3<u8> { | 290 | static auto GetColorModifier = [](ColorModifier factor, const Math::Vec4<u8>& values) -> Math::Vec3<u8> { |
| 318 | switch (factor) | 291 | switch (factor) { |
| 319 | { | ||
| 320 | case ColorModifier::SourceColor: | 292 | case ColorModifier::SourceColor: |
| 321 | return values.rgb(); | 293 | return values.rgb(); |
| 322 | 294 | ||
| @@ -324,27 +296,56 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0, | |||
| 324 | return (Math::Vec3<u8>(255, 255, 255) - values.rgb()).Cast<u8>(); | 296 | return (Math::Vec3<u8>(255, 255, 255) - values.rgb()).Cast<u8>(); |
| 325 | 297 | ||
| 326 | case ColorModifier::SourceAlpha: | 298 | case ColorModifier::SourceAlpha: |
| 327 | return { values.a(), values.a(), values.a() }; | 299 | return values.aaa(); |
| 328 | 300 | ||
| 329 | default: | 301 | case ColorModifier::OneMinusSourceAlpha: |
| 330 | LOG_ERROR(HW_GPU, "Unknown color factor %d\n", (int)factor); | 302 | return (Math::Vec3<u8>(255, 255, 255) - values.aaa()).Cast<u8>(); |
| 331 | _dbg_assert_(HW_GPU, 0); | 303 | |
| 332 | return {}; | 304 | case ColorModifier::SourceRed: |
| 305 | return values.rrr(); | ||
| 306 | |||
| 307 | case ColorModifier::OneMinusSourceRed: | ||
| 308 | return (Math::Vec3<u8>(255, 255, 255) - values.rrr()).Cast<u8>(); | ||
| 309 | |||
| 310 | case ColorModifier::SourceGreen: | ||
| 311 | return values.ggg(); | ||
| 312 | |||
| 313 | case ColorModifier::OneMinusSourceGreen: | ||
| 314 | return (Math::Vec3<u8>(255, 255, 255) - values.ggg()).Cast<u8>(); | ||
| 315 | |||
| 316 | case ColorModifier::SourceBlue: | ||
| 317 | return values.bbb(); | ||
| 318 | |||
| 319 | case ColorModifier::OneMinusSourceBlue: | ||
| 320 | return (Math::Vec3<u8>(255, 255, 255) - values.bbb()).Cast<u8>(); | ||
| 333 | } | 321 | } |
| 334 | }; | 322 | }; |
| 335 | 323 | ||
| 336 | static auto GetAlphaModifier = [](AlphaModifier factor, u8 value) -> u8 { | 324 | static auto GetAlphaModifier = [](AlphaModifier factor, const Math::Vec4<u8>& values) -> u8 { |
| 337 | switch (factor) { | 325 | switch (factor) { |
| 338 | case AlphaModifier::SourceAlpha: | 326 | case AlphaModifier::SourceAlpha: |
| 339 | return value; | 327 | return values.a(); |
| 340 | 328 | ||
| 341 | case AlphaModifier::OneMinusSourceAlpha: | 329 | case AlphaModifier::OneMinusSourceAlpha: |
| 342 | return 255 - value; | 330 | return 255 - values.a(); |
| 343 | 331 | ||
| 344 | default: | 332 | case AlphaModifier::SourceRed: |
| 345 | LOG_ERROR(HW_GPU, "Unknown alpha factor %d\n", (int)factor); | 333 | return values.r(); |
| 346 | _dbg_assert_(HW_GPU, 0); | 334 | |
| 347 | return 0; | 335 | case AlphaModifier::OneMinusSourceRed: |
| 336 | return 255 - values.r(); | ||
| 337 | |||
| 338 | case AlphaModifier::SourceGreen: | ||
| 339 | return values.g(); | ||
| 340 | |||
| 341 | case AlphaModifier::OneMinusSourceGreen: | ||
| 342 | return 255 - values.g(); | ||
| 343 | |||
| 344 | case AlphaModifier::SourceBlue: | ||
| 345 | return values.b(); | ||
| 346 | |||
| 347 | case AlphaModifier::OneMinusSourceBlue: | ||
| 348 | return 255 - values.b(); | ||
| 348 | } | 349 | } |
| 349 | }; | 350 | }; |
| 350 | 351 | ||
| @@ -414,17 +415,17 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0, | |||
| 414 | // combiner_output.rgb(), but instead store it in a temporary variable until | 415 | // combiner_output.rgb(), but instead store it in a temporary variable until |
| 415 | // alpha combining has been done. | 416 | // alpha combining has been done. |
| 416 | Math::Vec3<u8> color_result[3] = { | 417 | Math::Vec3<u8> color_result[3] = { |
| 417 | GetColorModifier(tev_stage.color_modifier1, GetColorSource(tev_stage.color_source1)), | 418 | GetColorModifier(tev_stage.color_modifier1, GetSource(tev_stage.color_source1)), |
| 418 | GetColorModifier(tev_stage.color_modifier2, GetColorSource(tev_stage.color_source2)), | 419 | GetColorModifier(tev_stage.color_modifier2, GetSource(tev_stage.color_source2)), |
| 419 | GetColorModifier(tev_stage.color_modifier3, GetColorSource(tev_stage.color_source3)) | 420 | GetColorModifier(tev_stage.color_modifier3, GetSource(tev_stage.color_source3)) |
| 420 | }; | 421 | }; |
| 421 | auto color_output = ColorCombine(tev_stage.color_op, color_result); | 422 | auto color_output = ColorCombine(tev_stage.color_op, color_result); |
| 422 | 423 | ||
| 423 | // alpha combiner | 424 | // alpha combiner |
| 424 | std::array<u8,3> alpha_result = { | 425 | std::array<u8,3> alpha_result = { |
| 425 | GetAlphaModifier(tev_stage.alpha_modifier1, GetAlphaSource(tev_stage.alpha_source1)), | 426 | GetAlphaModifier(tev_stage.alpha_modifier1, GetSource(tev_stage.alpha_source1)), |
| 426 | GetAlphaModifier(tev_stage.alpha_modifier2, GetAlphaSource(tev_stage.alpha_source2)), | 427 | GetAlphaModifier(tev_stage.alpha_modifier2, GetSource(tev_stage.alpha_source2)), |
| 427 | GetAlphaModifier(tev_stage.alpha_modifier3, GetAlphaSource(tev_stage.alpha_source3)) | 428 | GetAlphaModifier(tev_stage.alpha_modifier3, GetSource(tev_stage.alpha_source3)) |
| 428 | }; | 429 | }; |
| 429 | auto alpha_output = AlphaCombine(tev_stage.alpha_op, alpha_result); | 430 | auto alpha_output = AlphaCombine(tev_stage.alpha_op, alpha_result); |
| 430 | 431 | ||