summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2017-01-29 19:25:48 -0800
committerGravatar Yuri Kunde Schlesner2017-02-12 18:13:04 -0800
commit426fda1d524b17acd10d962a03af872a85342eca (patch)
treec9ad03dd5495a9a83b30209492720e979e4fbeb9 /src
parentSWRasterizer: Move texturing functions to their own file (diff)
downloadyuzu-426fda1d524b17acd10d962a03af872a85342eca.tar.gz
yuzu-426fda1d524b17acd10d962a03af872a85342eca.tar.xz
yuzu-426fda1d524b17acd10d962a03af872a85342eca.zip
SWRasterizer: Move more framebuffer functions to file
Diffstat (limited to 'src')
-rw-r--r--src/video_core/swrasterizer/framebuffer.cpp99
-rw-r--r--src/video_core/swrasterizer/framebuffer.h6
-rw-r--r--src/video_core/swrasterizer/rasterizer.cpp100
3 files changed, 105 insertions, 100 deletions
diff --git a/src/video_core/swrasterizer/framebuffer.cpp b/src/video_core/swrasterizer/framebuffer.cpp
index 4b31eda89..7de3aac75 100644
--- a/src/video_core/swrasterizer/framebuffer.cpp
+++ b/src/video_core/swrasterizer/framebuffer.cpp
@@ -8,6 +8,7 @@
8#include "common/color.h" 8#include "common/color.h"
9#include "common/common_types.h" 9#include "common/common_types.h"
10#include "common/logging/log.h" 10#include "common/logging/log.h"
11#include "common/math_util.h"
11#include "common/vector_math.h" 12#include "common/vector_math.h"
12#include "core/hw/gpu.h" 13#include "core/hw/gpu.h"
13#include "core/memory.h" 14#include "core/memory.h"
@@ -255,5 +256,103 @@ u8 PerformStencilAction(FramebufferRegs::StencilAction action, u8 old_stencil, u
255 } 256 }
256} 257}
257 258
259Math::Vec4<u8> EvaluateBlendEquation(const Math::Vec4<u8>& src, const Math::Vec4<u8>& srcfactor,
260 const Math::Vec4<u8>& dest, const Math::Vec4<u8>& destfactor,
261 FramebufferRegs::BlendEquation equation) {
262 Math::Vec4<int> result;
263
264 auto src_result = (src * srcfactor).Cast<int>();
265 auto dst_result = (dest * destfactor).Cast<int>();
266
267 switch (equation) {
268 case FramebufferRegs::BlendEquation::Add:
269 result = (src_result + dst_result) / 255;
270 break;
271
272 case FramebufferRegs::BlendEquation::Subtract:
273 result = (src_result - dst_result) / 255;
274 break;
275
276 case FramebufferRegs::BlendEquation::ReverseSubtract:
277 result = (dst_result - src_result) / 255;
278 break;
279
280 // TODO: How do these two actually work? OpenGL doesn't include the blend factors in the
281 // min/max computations, but is this what the 3DS actually does?
282 case FramebufferRegs::BlendEquation::Min:
283 result.r() = std::min(src.r(), dest.r());
284 result.g() = std::min(src.g(), dest.g());
285 result.b() = std::min(src.b(), dest.b());
286 result.a() = std::min(src.a(), dest.a());
287 break;
288
289 case FramebufferRegs::BlendEquation::Max:
290 result.r() = std::max(src.r(), dest.r());
291 result.g() = std::max(src.g(), dest.g());
292 result.b() = std::max(src.b(), dest.b());
293 result.a() = std::max(src.a(), dest.a());
294 break;
295
296 default:
297 LOG_CRITICAL(HW_GPU, "Unknown RGB blend equation %x", equation);
298 UNIMPLEMENTED();
299 }
300
301 return Math::Vec4<u8>(MathUtil::Clamp(result.r(), 0, 255), MathUtil::Clamp(result.g(), 0, 255),
302 MathUtil::Clamp(result.b(), 0, 255), MathUtil::Clamp(result.a(), 0, 255));
303};
304
305u8 LogicOp(u8 src, u8 dest, FramebufferRegs::LogicOp op) {
306 switch (op) {
307 case FramebufferRegs::LogicOp::Clear:
308 return 0;
309
310 case FramebufferRegs::LogicOp::And:
311 return src & dest;
312
313 case FramebufferRegs::LogicOp::AndReverse:
314 return src & ~dest;
315
316 case FramebufferRegs::LogicOp::Copy:
317 return src;
318
319 case FramebufferRegs::LogicOp::Set:
320 return 255;
321
322 case FramebufferRegs::LogicOp::CopyInverted:
323 return ~src;
324
325 case FramebufferRegs::LogicOp::NoOp:
326 return dest;
327
328 case FramebufferRegs::LogicOp::Invert:
329 return ~dest;
330
331 case FramebufferRegs::LogicOp::Nand:
332 return ~(src & dest);
333
334 case FramebufferRegs::LogicOp::Or:
335 return src | dest;
336
337 case FramebufferRegs::LogicOp::Nor:
338 return ~(src | dest);
339
340 case FramebufferRegs::LogicOp::Xor:
341 return src ^ dest;
342
343 case FramebufferRegs::LogicOp::Equiv:
344 return ~(src ^ dest);
345
346 case FramebufferRegs::LogicOp::AndInverted:
347 return ~src & dest;
348
349 case FramebufferRegs::LogicOp::OrReverse:
350 return src | ~dest;
351
352 case FramebufferRegs::LogicOp::OrInverted:
353 return ~src | dest;
354 }
355};
356
258} // namespace Rasterizer 357} // namespace Rasterizer
259} // namespace Pica 358} // namespace Pica
diff --git a/src/video_core/swrasterizer/framebuffer.h b/src/video_core/swrasterizer/framebuffer.h
index 220f7013b..4a32a4979 100644
--- a/src/video_core/swrasterizer/framebuffer.h
+++ b/src/video_core/swrasterizer/framebuffer.h
@@ -19,5 +19,11 @@ void SetDepth(int x, int y, u32 value);
19void SetStencil(int x, int y, u8 value); 19void SetStencil(int x, int y, u8 value);
20u8 PerformStencilAction(FramebufferRegs::StencilAction action, u8 old_stencil, u8 ref); 20u8 PerformStencilAction(FramebufferRegs::StencilAction action, u8 old_stencil, u8 ref);
21 21
22Math::Vec4<u8> EvaluateBlendEquation(const Math::Vec4<u8>& src, const Math::Vec4<u8>& srcfactor,
23 const Math::Vec4<u8>& dest, const Math::Vec4<u8>& destfactor,
24 FramebufferRegs::BlendEquation equation);
25
26u8 LogicOp(u8 src, u8 dest, FramebufferRegs::LogicOp op);
27
22} // namespace Rasterizer 28} // namespace Rasterizer
23} // namespace Pica 29} // namespace Pica
diff --git a/src/video_core/swrasterizer/rasterizer.cpp b/src/video_core/swrasterizer/rasterizer.cpp
index 0fd842abe..7557fcb89 100644
--- a/src/video_core/swrasterizer/rasterizer.cpp
+++ b/src/video_core/swrasterizer/rasterizer.cpp
@@ -31,106 +31,6 @@
31namespace Pica { 31namespace Pica {
32namespace Rasterizer { 32namespace Rasterizer {
33 33
34static Math::Vec4<u8> EvaluateBlendEquation(const Math::Vec4<u8>& src,
35 const Math::Vec4<u8>& srcfactor,
36 const Math::Vec4<u8>& dest,
37 const Math::Vec4<u8>& destfactor,
38 FramebufferRegs::BlendEquation equation) {
39 Math::Vec4<int> result;
40
41 auto src_result = (src * srcfactor).Cast<int>();
42 auto dst_result = (dest * destfactor).Cast<int>();
43
44 switch (equation) {
45 case FramebufferRegs::BlendEquation::Add:
46 result = (src_result + dst_result) / 255;
47 break;
48
49 case FramebufferRegs::BlendEquation::Subtract:
50 result = (src_result - dst_result) / 255;
51 break;
52
53 case FramebufferRegs::BlendEquation::ReverseSubtract:
54 result = (dst_result - src_result) / 255;
55 break;
56
57 // TODO: How do these two actually work? OpenGL doesn't include the blend factors in the
58 // min/max computations, but is this what the 3DS actually does?
59 case FramebufferRegs::BlendEquation::Min:
60 result.r() = std::min(src.r(), dest.r());
61 result.g() = std::min(src.g(), dest.g());
62 result.b() = std::min(src.b(), dest.b());
63 result.a() = std::min(src.a(), dest.a());
64 break;
65
66 case FramebufferRegs::BlendEquation::Max:
67 result.r() = std::max(src.r(), dest.r());
68 result.g() = std::max(src.g(), dest.g());
69 result.b() = std::max(src.b(), dest.b());
70 result.a() = std::max(src.a(), dest.a());
71 break;
72
73 default:
74 LOG_CRITICAL(HW_GPU, "Unknown RGB blend equation %x", equation);
75 UNIMPLEMENTED();
76 }
77
78 return Math::Vec4<u8>(MathUtil::Clamp(result.r(), 0, 255), MathUtil::Clamp(result.g(), 0, 255),
79 MathUtil::Clamp(result.b(), 0, 255), MathUtil::Clamp(result.a(), 0, 255));
80};
81
82static u8 LogicOp(u8 src, u8 dest, FramebufferRegs::LogicOp op) {
83 switch (op) {
84 case FramebufferRegs::LogicOp::Clear:
85 return 0;
86
87 case FramebufferRegs::LogicOp::And:
88 return src & dest;
89
90 case FramebufferRegs::LogicOp::AndReverse:
91 return src & ~dest;
92
93 case FramebufferRegs::LogicOp::Copy:
94 return src;
95
96 case FramebufferRegs::LogicOp::Set:
97 return 255;
98
99 case FramebufferRegs::LogicOp::CopyInverted:
100 return ~src;
101
102 case FramebufferRegs::LogicOp::NoOp:
103 return dest;
104
105 case FramebufferRegs::LogicOp::Invert:
106 return ~dest;
107
108 case FramebufferRegs::LogicOp::Nand:
109 return ~(src & dest);
110
111 case FramebufferRegs::LogicOp::Or:
112 return src | dest;
113
114 case FramebufferRegs::LogicOp::Nor:
115 return ~(src | dest);
116
117 case FramebufferRegs::LogicOp::Xor:
118 return src ^ dest;
119
120 case FramebufferRegs::LogicOp::Equiv:
121 return ~(src ^ dest);
122
123 case FramebufferRegs::LogicOp::AndInverted:
124 return ~src & dest;
125
126 case FramebufferRegs::LogicOp::OrReverse:
127 return src | ~dest;
128
129 case FramebufferRegs::LogicOp::OrInverted:
130 return ~src | dest;
131 }
132};
133
134// NOTE: Assuming that rasterizer coordinates are 12.4 fixed-point values 34// NOTE: Assuming that rasterizer coordinates are 12.4 fixed-point values
135struct Fix12P4 { 35struct Fix12P4 {
136 Fix12P4() {} 36 Fix12P4() {}