summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon
diff options
context:
space:
mode:
authorScott Mansell <phiren@gmail.com>2016-05-18 08:21:02 +1200
committerStenzek <stenzek@gmail.com>2018-04-29 17:56:51 +1000
commitfc96479f122d3b2fdd9a5191c67ebce811ff569d (patch)
treeeff66e79fb109110349a0aea3e571e9584c30d73 /Source/Core/VideoCommon
parent0cd46f4d21ff86fddd7d9a67a2921ac0299209b3 (diff)
VideoSoftware: Implement xfb copy filter (Deflickering/Brightness)
Diffstat (limited to 'Source/Core/VideoCommon')
-rw-r--r--Source/Core/VideoCommon/BPMemory.h72
-rw-r--r--Source/Core/VideoCommon/BPStructs.cpp4
2 files changed, 49 insertions, 27 deletions
diff --git a/Source/Core/VideoCommon/BPMemory.h b/Source/Core/VideoCommon/BPMemory.h
index 0157b5aed3..4a1cea9d48 100644
--- a/Source/Core/VideoCommon/BPMemory.h
+++ b/Source/Core/VideoCommon/BPMemory.h
@@ -4,6 +4,7 @@
#pragma once
+#include <array>
#include <string>
#include "Common/BitField.h"
@@ -944,8 +945,8 @@ union UPE_Copy
{
u32 Hex;
- BitField<0, 1, u32> clamp0; // if set clamp top
- BitField<1, 1, u32> clamp1; // if set clamp bottom
+ BitField<0, 1, u32> clamp_top; // if set clamp top
+ BitField<1, 1, u32> clamp_bottom; // if set clamp bottom
BitField<2, 1, u32> yuv; // if set, color conversion from RGB to YUV
BitField<3, 4, u32> target_pixel_format; // realformat is (fmt/2)+((fmt&1)*8).... for some reason
// the msb is the lsb (pattern: cycling right shift)
@@ -967,6 +968,27 @@ union UPE_Copy
}
};
+union CopyFilterCoefficients
+{
+ u64 Hex;
+
+ BitField<0, 6, u64> w0;
+ BitField<6, 6, u64> w1;
+ BitField<12, 6, u64> w2;
+ BitField<18, 6, u64> w3;
+ BitField<32, 6, u64> w4;
+ BitField<38, 6, u64> w5;
+ BitField<44, 6, u64> w6;
+
+ std::array<u8, 7> GetCoefficients() const
+ {
+ return {
+ static_cast<u8>(w0), static_cast<u8>(w1), static_cast<u8>(w2), static_cast<u8>(w3),
+ static_cast<u8>(w4), static_cast<u8>(w5), static_cast<u8>(w6),
+ };
+ }
+};
+
union BPU_PreloadTileInfo
{
u32 hex;
@@ -1036,29 +1058,29 @@ struct BPMemory
// 2 channel, 16 when dest is RGBA
// also, doubles whenever mipmap box filter option is set (excent on RGBA). Probably to do with
// number of bytes to look at when smoothing
- u32 dispcopyyscale; // 4e
- u32 clearcolorAR; // 4f
- u32 clearcolorGB; // 50
- u32 clearZValue; // 51
- UPE_Copy triggerEFBCopy; // 52
- u32 copyfilter[2]; // 53,54
- u32 boundbox0; // 55
- u32 boundbox1; // 56
- u32 unknown7[2]; // 57,58
- X10Y10 scissorOffset; // 59
- u32 unknown8[6]; // 5a,5b,5c,5d, 5e,5f
- BPS_TmemConfig tmem_config; // 60-66
- u32 metric; // 67
- FieldMode fieldmode; // 68
- u32 unknown10[7]; // 69-6F
- u32 unknown11[16]; // 70-7F
- FourTexUnits tex[2]; // 80-bf
- TevStageCombiner combiners[16]; // 0xC0-0xDF
- TevReg tevregs[4]; // 0xE0
- FogRangeParams fogRange; // 0xE8
- FogParams fog; // 0xEE,0xEF,0xF0,0xF1,0xF2
- AlphaTest alpha_test; // 0xF3
- ZTex1 ztex1; // 0xf4,0xf5
+ u32 dispcopyyscale; // 4e
+ u32 clearcolorAR; // 4f
+ u32 clearcolorGB; // 50
+ u32 clearZValue; // 51
+ UPE_Copy triggerEFBCopy; // 52
+ CopyFilterCoefficients copyfilter; // 53,54
+ u32 boundbox0; // 55
+ u32 boundbox1; // 56
+ u32 unknown7[2]; // 57,58
+ X10Y10 scissorOffset; // 59
+ u32 unknown8[6]; // 5a,5b,5c,5d, 5e,5f
+ BPS_TmemConfig tmem_config; // 60-66
+ u32 metric; // 67
+ FieldMode fieldmode; // 68
+ u32 unknown10[7]; // 69-6F
+ u32 unknown11[16]; // 70-7F
+ FourTexUnits tex[2]; // 80-bf
+ TevStageCombiner combiners[16]; // 0xC0-0xDF
+ TevReg tevregs[4]; // 0xE0
+ FogRangeParams fogRange; // 0xE8
+ FogParams fog; // 0xEE,0xEF,0xF0,0xF1,0xF2
+ AlphaTest alpha_test; // 0xF3
+ ZTex1 ztex1; // 0xf4,0xf5
ZTex2 ztex2;
TevKSel tevksel[8]; // 0xf6,0xf7,f8,f9,fa,fb,fc,fd
u32 bpMask; // 0xFE
diff --git a/Source/Core/VideoCommon/BPStructs.cpp b/Source/Core/VideoCommon/BPStructs.cpp
index 4647c3de4e..143132ecaf 100644
--- a/Source/Core/VideoCommon/BPStructs.cpp
+++ b/Source/Core/VideoCommon/BPStructs.cpp
@@ -1015,9 +1015,9 @@ void GetBPRegInfo(const u8* data, std::string* name, std::string* desc)
"Copy to XFB: %s\n"
"Intensity format: %s\n"
"Automatic color conversion: %s",
- (copy.clamp0 && copy.clamp1) ?
+ (copy.clamp_top && copy.clamp_bottom) ?
"Top and Bottom" :
- (copy.clamp0) ? "Top only" : (copy.clamp1) ? "Bottom only" : "None",
+ (copy.clamp_top) ? "Top only" : (copy.clamp_bottom) ? "Bottom only" : "None",
no_yes[copy.yuv], static_cast<int>(copy.tp_realFormat()),
(copy.gamma == 0) ?
"1.0" :