summaryrefslogtreecommitdiff
path: root/src/video_core/rasterizer.cpp
diff options
context:
space:
mode:
authorGravatar Tony Wasserka2015-02-05 16:07:37 +0100
committerGravatar Tony Wasserka2015-02-05 16:07:37 +0100
commit1576a318f2c059305364f0e5de81aab80094a610 (patch)
treee85a096e8e637af7a9151dfd3176c4167463100f /src/video_core/rasterizer.cpp
parentMerge pull request #537 from lioncash/vfp (diff)
parentRasterizer: Implement the other color and alpha modifiers. (diff)
downloadyuzu-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.cpp97
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