diff options
| author | 2015-05-31 02:21:55 -0400 | |
|---|---|---|
| committer | 2015-05-31 02:21:55 -0400 | |
| commit | 8852fc6a87eaf8edbb26e93d44c1596f0167e3ac (patch) | |
| tree | 2ff0e6c796bcc3d489c7fb3e67a78bccbc4a3cc4 /src/video_core/vertex_shader.cpp | |
| parent | Merge pull request #830 from SeannyM/qt-noborder (diff) | |
| parent | Pica: Use zero for the SecondaryFragmentColor source. (diff) | |
| download | yuzu-8852fc6a87eaf8edbb26e93d44c1596f0167e3ac.tar.gz yuzu-8852fc6a87eaf8edbb26e93d44c1596f0167e3ac.tar.xz yuzu-8852fc6a87eaf8edbb26e93d44c1596f0167e3ac.zip | |
Merge pull request #822 from bunnei/pica-improvements
Pica improvements
Diffstat (limited to 'src/video_core/vertex_shader.cpp')
| -rw-r--r-- | src/video_core/vertex_shader.cpp | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/src/video_core/vertex_shader.cpp b/src/video_core/vertex_shader.cpp index 4ebb42429..87006a832 100644 --- a/src/video_core/vertex_shader.cpp +++ b/src/video_core/vertex_shader.cpp | |||
| @@ -119,17 +119,13 @@ static void ProcessShaderCode(VertexShaderState& state) { | |||
| 119 | switch (instr.opcode.Value().GetInfo().type) { | 119 | switch (instr.opcode.Value().GetInfo().type) { |
| 120 | case OpCode::Type::Arithmetic: | 120 | case OpCode::Type::Arithmetic: |
| 121 | { | 121 | { |
| 122 | bool is_inverted = 0 != (instr.opcode.Value().GetInfo().subtype & OpCode::Info::SrcInversed); | 122 | const bool is_inverted = (0 != (instr.opcode.Value().GetInfo().subtype & OpCode::Info::SrcInversed)); |
| 123 | // TODO: We don't really support this properly: For instance, the address register | ||
| 124 | // offset needs to be applied to SRC2 instead, etc. | ||
| 125 | // For now, we just abort in this situation. | ||
| 126 | ASSERT_MSG(!is_inverted, "Bad condition..."); | ||
| 127 | 123 | ||
| 128 | const int address_offset = (instr.common.address_register_index == 0) | 124 | const int address_offset = (instr.common.address_register_index == 0) |
| 129 | ? 0 : state.address_registers[instr.common.address_register_index - 1]; | 125 | ? 0 : state.address_registers[instr.common.address_register_index - 1]; |
| 130 | 126 | ||
| 131 | const float24* src1_ = LookupSourceRegister(instr.common.GetSrc1(is_inverted) + address_offset); | 127 | const float24* src1_ = LookupSourceRegister(instr.common.GetSrc1(is_inverted) + (!is_inverted * address_offset)); |
| 132 | const float24* src2_ = LookupSourceRegister(instr.common.GetSrc2(is_inverted)); | 128 | const float24* src2_ = LookupSourceRegister(instr.common.GetSrc2(is_inverted) + ( is_inverted * address_offset)); |
| 133 | 129 | ||
| 134 | const bool negate_src1 = ((bool)swizzle.negate_src1 != false); | 130 | const bool negate_src1 = ((bool)swizzle.negate_src1 != false); |
| 135 | const bool negate_src2 = ((bool)swizzle.negate_src2 != false); | 131 | const bool negate_src2 = ((bool)swizzle.negate_src2 != false); |
| @@ -208,6 +204,15 @@ static void ProcessShaderCode(VertexShaderState& state) { | |||
| 208 | } | 204 | } |
| 209 | break; | 205 | break; |
| 210 | 206 | ||
| 207 | case OpCode::Id::MIN: | ||
| 208 | for (int i = 0; i < 4; ++i) { | ||
| 209 | if (!swizzle.DestComponentEnabled(i)) | ||
| 210 | continue; | ||
| 211 | |||
| 212 | dest[i] = std::min(src1[i], src2[i]); | ||
| 213 | } | ||
| 214 | break; | ||
| 215 | |||
| 211 | case OpCode::Id::DP3: | 216 | case OpCode::Id::DP3: |
| 212 | case OpCode::Id::DP4: | 217 | case OpCode::Id::DP4: |
| 213 | { | 218 | { |
| @@ -279,6 +284,16 @@ static void ProcessShaderCode(VertexShaderState& state) { | |||
| 279 | break; | 284 | break; |
| 280 | } | 285 | } |
| 281 | 286 | ||
| 287 | case OpCode::Id::SLT: | ||
| 288 | case OpCode::Id::SLTI: | ||
| 289 | for (int i = 0; i < 4; ++i) { | ||
| 290 | if (!swizzle.DestComponentEnabled(i)) | ||
| 291 | continue; | ||
| 292 | |||
| 293 | dest[i] = (src1[i] < src2[i]) ? float24::FromFloat32(1.0f) : float24::FromFloat32(0.0f); | ||
| 294 | } | ||
| 295 | break; | ||
| 296 | |||
| 282 | case OpCode::Id::CMP: | 297 | case OpCode::Id::CMP: |
| 283 | for (int i = 0; i < 2; ++i) { | 298 | for (int i = 0; i < 2; ++i) { |
| 284 | // TODO: Can you restrict to one compare via dest masking? | 299 | // TODO: Can you restrict to one compare via dest masking? |