Skip to content

Commit 18111ac

Browse files
Megamouseelad335
authored andcommitted
rsx: add simple pair and tuple types
1 parent 5a761c7 commit 18111ac

File tree

12 files changed

+285
-8
lines changed

12 files changed

+285
-8
lines changed

rpcs3/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,8 @@ if(BUILD_RPCS3_TESTS)
188188
PRIVATE
189189
tests/test.cpp
190190
tests/test_fmt.cpp
191+
tests/test_pair.cpp
192+
tests/test_tuple.cpp
191193
tests/test_simple_array.cpp
192194
tests/test_address_range.cpp
193195
)

rpcs3/Emu/RSX/Common/simple_array.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ namespace rsx
196196
if (is_local_storage())
197197
{
198198
// Switch to heap storage
199-
_data = static_cast<Ty*>(std::malloc(sizeof(Ty) * size));
199+
ensure(_data = static_cast<Ty*>(std::malloc(sizeof(Ty) * size)));
200200
std::memcpy(static_cast<void*>(_data), _local_storage, size_bytes());
201201
}
202202
else

rpcs3/Emu/RSX/Common/surface_store.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <list>
1010

1111
#include "util/asm.hpp"
12+
#include "util/pair.hpp"
1213

1314
namespace rsx
1415
{
@@ -244,10 +245,9 @@ namespace rsx
244245
template <bool is_depth_surface>
245246
void intersect_surface_region(command_list_type cmd, u32 address, surface_type new_surface, surface_type prev_surface)
246247
{
247-
auto scan_list = [&new_surface, address](const rsx::address_range32& mem_range,
248-
surface_ranged_map& data) -> rsx::simple_array<std::pair<u32, surface_type>>
248+
auto scan_list = [&new_surface, address](const rsx::address_range32& mem_range, surface_ranged_map& data)
249249
{
250-
rsx::simple_array<std::pair<u32, surface_type>> result;
250+
rsx::simple_array<utils::pair<u32, surface_type>> result;
251251
for (auto it = data.begin_range(mem_range); it != data.end(); ++it)
252252
{
253253
auto surface = Traits::get(it->second);
@@ -314,7 +314,7 @@ namespace rsx
314314
}
315315
}
316316

317-
rsx::simple_array<std::pair<u32, surface_type>> surface_info;
317+
rsx::simple_array<utils::pair<u32, surface_type>> surface_info;
318318
if (list1.empty())
319319
{
320320
surface_info = std::move(list2);
@@ -1091,7 +1091,7 @@ namespace rsx
10911091
rsx::simple_array<surface_overlap_info> get_merged_texture_memory_region(commandbuffer_type& cmd, u32 texaddr, u32 required_width, u32 required_height, u32 required_pitch, u8 required_bpp, rsx::surface_access access)
10921092
{
10931093
rsx::simple_array<surface_overlap_info> result;
1094-
rsx::simple_array<std::pair<u32, bool>> dirty;
1094+
rsx::simple_array<utils::pair<u32, bool>> dirty;
10951095

10961096
const auto surface_internal_pitch = (required_width * required_bpp);
10971097

rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ namespace gl
387387
allocator.pools[i].flags = 0;
388388
}
389389

390-
rsx::simple_array<std::pair<int, int>> replacement_map;
390+
rsx::simple_array<utils::pair<int, int>> replacement_map;
391391
for (int i = 0; i < rsx::limits::fragment_textures_count; ++i)
392392
{
393393
if (reference_mask & (1 << i))

rpcs3/emucore.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,8 @@
736736
<ClInclude Include="Loader\mself.hpp" />
737737
<ClInclude Include="util\atomic.hpp" />
738738
<ClInclude Include="util\bless.hpp" />
739+
<ClInclude Include="util\pair.hpp" />
740+
<ClInclude Include="util\tuple.hpp" />
739741
<ClInclude Include="util\video_sink.h" />
740742
<ClInclude Include="util\video_provider.h" />
741743
<ClInclude Include="util\media_utils.h" />

rpcs3/emucore.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2758,6 +2758,12 @@
27582758
<ClInclude Include="..\Utilities\deferred_op.hpp">
27592759
<Filter>Utilities</Filter>
27602760
</ClInclude>
2761+
<ClInclude Include="util\tuple.hpp">
2762+
<Filter>Utilities</Filter>
2763+
</ClInclude>
2764+
<ClInclude Include="util\pair.hpp">
2765+
<Filter>Utilities</Filter>
2766+
</ClInclude>
27612767
</ItemGroup>
27622768
<ItemGroup>
27632769
<None Include="Emu\RSX\Program\GLSLSnippets\GPUDeswizzle.glsl">

rpcs3/tests/rpcs3_test.vcxproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@
9090
<ClCompile Include="test_fmt.cpp" />
9191
<ClCompile Include="test_simple_array.cpp" />
9292
<ClCompile Include="test_address_range.cpp" />
93+
<ClCompile Include="test_tuple.cpp" />
94+
<ClCompile Include="test_pair.cpp" />
9395
</ItemGroup>
9496
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
9597
<ImportGroup Label="ExtensionTargets" Condition="'$(GTestInstalled)' == 'true'">
@@ -102,4 +104,4 @@
102104
</PropertyGroup>
103105
<Warning Condition="!Exists('$(GTestPath)')" Text="$([System.String]::Format('$(ErrorText)', '$(GTestPath)'))" />
104106
</Target>
105-
</Project>
107+
</Project>

rpcs3/tests/test_pair.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#include <gtest/gtest.h>
2+
3+
#include "util/types.hpp"
4+
#include "util/pair.hpp"
5+
6+
struct some_struct
7+
{
8+
u64 v {};
9+
char s[12] = "Hello World";
10+
11+
bool operator == (const some_struct& r) const
12+
{
13+
return v == r.v && std::memcmp(s, r.s, sizeof(s)) == 0;
14+
}
15+
};
16+
17+
TEST(Utils, Pair)
18+
{
19+
some_struct s {};
20+
s.v = 1234;
21+
22+
utils::pair<int, some_struct> p;
23+
EXPECT_EQ(sizeof(p), 32);
24+
EXPECT_EQ(p.first, 0);
25+
EXPECT_EQ(p.second, some_struct{});
26+
27+
p = { 666, s };
28+
EXPECT_EQ(p.first, 666);
29+
EXPECT_EQ(p.second, s);
30+
31+
const utils::pair<int, some_struct> p1 = p;
32+
EXPECT_EQ(p.first, 666);
33+
EXPECT_EQ(p.second, s);
34+
EXPECT_EQ(p1.first, 666);
35+
EXPECT_EQ(p1.second, s);
36+
37+
utils::pair<int, some_struct> p2 = p1;
38+
EXPECT_EQ(p1.first, 666);
39+
EXPECT_EQ(p1.second, s);
40+
EXPECT_EQ(p2.first, 666);
41+
EXPECT_EQ(p2.second, s);
42+
43+
utils::pair<int, some_struct> p3 = std::move(p);
44+
EXPECT_EQ(p3.first, 666);
45+
EXPECT_EQ(p3.second, s);
46+
}

rpcs3/tests/test_simple_array.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include <gtest/gtest.h>
22

3+
#include "util/pair.hpp"
4+
35
#define private public
46
#include "Emu/RSX/Common/simple_array.hpp"
57
#undef private
@@ -240,4 +242,29 @@ namespace rsx
240242

241243
EXPECT_EQ(sum, 15);
242244
}
245+
246+
TEST(SimpleArray, SimplePair)
247+
{
248+
struct some_struct
249+
{
250+
u64 v {};
251+
char s[12] = "Hello World";
252+
};
253+
some_struct s {};
254+
255+
rsx::simple_array<utils::pair<int, some_struct>> arr;
256+
for (int i = 0; i < 5; ++i)
257+
{
258+
s.v = i;
259+
arr.push_back(utils::pair(i, s));
260+
}
261+
262+
EXPECT_EQ(arr.size(), 5);
263+
for (int i = 0; i < 5; ++i)
264+
{
265+
EXPECT_EQ(arr[i].first, i);
266+
EXPECT_EQ(arr[i].second.v, i);
267+
EXPECT_EQ(std::memcmp(arr[i].second.s, "Hello World", sizeof(arr[i].second.s)), 0);
268+
}
269+
}
243270
}

rpcs3/tests/test_tuple.cpp

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#include <gtest/gtest.h>
2+
3+
#include "util/tuple.hpp"
4+
5+
struct some_struct
6+
{
7+
u64 v {};
8+
char s[12] = "Hello World";
9+
10+
bool operator == (const some_struct& r) const
11+
{
12+
return v == r.v && std::memcmp(s, r.s, sizeof(s)) == 0;
13+
}
14+
};
15+
16+
TEST(Utils, Tuple)
17+
{
18+
some_struct s {};
19+
s.v = 1234;
20+
21+
utils::tuple t0 = {};
22+
EXPECT_EQ(t0.size(), 0);
23+
24+
utils::tuple<int> t;
25+
EXPECT_EQ(sizeof(t), sizeof(int));
26+
EXPECT_TRUE((std::is_same_v<decltype(t.get<0>()), int&>));
27+
EXPECT_EQ(t.size(), 1);
28+
EXPECT_EQ(t.get<0>(), 0);
29+
30+
utils::tuple<int> t1 = 2;
31+
EXPECT_EQ(sizeof(t1), sizeof(int));
32+
EXPECT_TRUE((std::is_same_v<decltype(t1.get<0>()), int&>));
33+
EXPECT_EQ(t1.size(), 1);
34+
EXPECT_EQ(t1.get<0>(), 2);
35+
t1 = {};
36+
EXPECT_EQ(t1.size(), 1);
37+
EXPECT_EQ(t1.get<0>(), 0);
38+
39+
utils::tuple<int, some_struct> t2 = { 2, s };
40+
EXPECT_EQ(sizeof(t2), 32);
41+
EXPECT_EQ(t2.size(), 2);
42+
EXPECT_TRUE((std::is_same_v<decltype(t2.get<0>()), int&>));
43+
EXPECT_TRUE((std::is_same_v<decltype(t2.get<1>()), some_struct&>));
44+
EXPECT_EQ(t2.get<0>(), 2);
45+
EXPECT_EQ(t2.get<1>(), s);
46+
t2 = {};
47+
EXPECT_EQ(t2.size(), 2);
48+
EXPECT_EQ(t2.get<0>(), 0);
49+
EXPECT_EQ(t2.get<1>(), some_struct{});
50+
51+
t2.get<0>() = 666;
52+
t2.get<1>() = s;
53+
EXPECT_EQ(t2.get<0>(), 666);
54+
EXPECT_EQ(t2.get<1>(), s);
55+
56+
utils::tuple<int, some_struct, double> t3 = { 2, s, 1234.0 };
57+
EXPECT_EQ(sizeof(t3), 40);
58+
EXPECT_EQ(t3.size(), 3);
59+
EXPECT_TRUE((std::is_same_v<decltype(t3.get<0>()), int&>));
60+
EXPECT_TRUE((std::is_same_v<decltype(t3.get<1>()), some_struct&>));
61+
EXPECT_TRUE((std::is_same_v<decltype(t3.get<2>()), double&>));
62+
EXPECT_EQ(t3.get<0>(), 2);
63+
EXPECT_EQ(t3.get<1>(), s);
64+
EXPECT_EQ(t3.get<2>(), 1234.0);
65+
t3 = {};
66+
EXPECT_EQ(t3.size(), 3);
67+
EXPECT_EQ(t3.get<0>(), 0);
68+
EXPECT_EQ(t3.get<1>(), some_struct{});
69+
EXPECT_EQ(t3.get<2>(), 0.0);
70+
71+
t3.get<0>() = 666;
72+
t3.get<1>() = s;
73+
t3.get<2>() = 7.0;
74+
EXPECT_EQ(t3.get<0>(), 666);
75+
EXPECT_EQ(t3.get<1>(), s);
76+
EXPECT_EQ(t3.get<2>(), 7.0);
77+
78+
// const
79+
const utils::tuple<int, some_struct> tc = { 2, s };
80+
EXPECT_EQ(tc.size(), 2);
81+
EXPECT_TRUE((std::is_same_v<decltype(tc.get<0>()), const int&>));
82+
EXPECT_TRUE((std::is_same_v<decltype(tc.get<1>()), const some_struct&>));
83+
EXPECT_EQ(tc.get<0>(), 2);
84+
EXPECT_EQ(tc.get<1>(), s);
85+
86+
// assignment
87+
const utils::tuple<int, some_struct> ta1 = { 2, s };
88+
utils::tuple<int, some_struct> ta = ta1;
89+
EXPECT_EQ(ta.size(), 2);
90+
EXPECT_TRUE((std::is_same_v<decltype(ta.get<0>()), int&>));
91+
EXPECT_TRUE((std::is_same_v<decltype(ta.get<1>()), some_struct&>));
92+
EXPECT_EQ(ta.get<0>(), 2);
93+
EXPECT_EQ(ta.get<1>(), s);
94+
95+
utils::tuple<int, some_struct> ta2 = { 2, s };
96+
ta = ta2;
97+
EXPECT_EQ(ta.size(), 2);
98+
EXPECT_TRUE((std::is_same_v<decltype(ta.get<0>()), int&>));
99+
EXPECT_TRUE((std::is_same_v<decltype(ta.get<1>()), some_struct&>));
100+
EXPECT_EQ(ta.get<0>(), 2);
101+
EXPECT_EQ(ta.get<1>(), s);
102+
EXPECT_EQ(ta2.size(), 2);
103+
EXPECT_TRUE((std::is_same_v<decltype(ta2.get<0>()), int&>));
104+
EXPECT_TRUE((std::is_same_v<decltype(ta2.get<1>()), some_struct&>));
105+
EXPECT_EQ(ta2.get<0>(), 2);
106+
EXPECT_EQ(ta2.get<1>(), s);
107+
108+
ta = std::move(ta2);
109+
EXPECT_EQ(ta.size(), 2);
110+
EXPECT_TRUE((std::is_same_v<decltype(ta.get<0>()), int&>));
111+
EXPECT_TRUE((std::is_same_v<decltype(ta.get<1>()), some_struct&>));
112+
EXPECT_EQ(ta.get<0>(), 2);
113+
EXPECT_EQ(ta.get<1>(), s);
114+
}

0 commit comments

Comments
 (0)