Skip to content

Commit bc68000

Browse files
committed
More ImageFilter refactoring.
1 parent 97d3a5f commit bc68000

16 files changed

+583
-635
lines changed

SerialPrograms/Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic.cpp

Lines changed: 0 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -15,115 +15,6 @@ namespace Kernels{
1515

1616

1717

18-
size_t to_blackwhite_rgb32_range_Default(
19-
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
20-
uint32_t* out, size_t out_bytes_per_row,
21-
uint32_t mins, uint32_t maxs, bool in_range_black
22-
);
23-
size_t to_blackwhite_rgb32_range_x64_SSE42(
24-
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
25-
uint32_t* out, size_t out_bytes_per_row,
26-
uint32_t mins, uint32_t maxs, bool in_range_black
27-
);
28-
size_t to_blackwhite_rgb32_range_x64_AVX2(
29-
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
30-
uint32_t* out, size_t out_bytes_per_row,
31-
uint32_t mins, uint32_t maxs, bool in_range_black
32-
);
33-
size_t to_blackwhite_rgb32_range_x64_AVX512(
34-
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
35-
uint32_t* out, size_t out_bytes_per_row,
36-
uint32_t mins, uint32_t maxs, bool in_range_black
37-
);
38-
size_t to_blackwhite_rgb32_range_arm64_NEON(
39-
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
40-
uint32_t* out, size_t out_bytes_per_row,
41-
uint32_t mins, uint32_t maxs, bool in_range_black
42-
);
43-
44-
45-
size_t to_blackwhite_rgb32_range(
46-
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
47-
uint32_t* out, size_t out_bytes_per_row,
48-
uint32_t mins, uint32_t maxs, bool in_range_black
49-
){
50-
#ifdef PA_AutoDispatch_x64_17_Skylake
51-
if (CPU_CAPABILITY_CURRENT.OK_17_Skylake){
52-
return to_blackwhite_rgb32_range_x64_AVX512(in, in_bytes_per_row, width, height, out, out_bytes_per_row, mins, maxs, in_range_black);
53-
}
54-
#endif
55-
#ifdef PA_AutoDispatch_x64_13_Haswell
56-
if (CPU_CAPABILITY_CURRENT.OK_13_Haswell){
57-
return to_blackwhite_rgb32_range_x64_AVX2(in, in_bytes_per_row, width, height, out, out_bytes_per_row, mins, maxs, in_range_black);
58-
}
59-
#endif
60-
#ifdef PA_AutoDispatch_x64_08_Nehalem
61-
if (CPU_CAPABILITY_CURRENT.OK_08_Nehalem){
62-
return to_blackwhite_rgb32_range_x64_SSE42(in, in_bytes_per_row, width, height, out, out_bytes_per_row, mins, maxs, in_range_black);
63-
}
64-
#endif
65-
#ifdef PA_AutoDispatch_arm64_20_M1
66-
if (CPU_CAPABILITY_CURRENT.OK_M1){
67-
return to_blackwhite_rgb32_range_arm64_NEON(in, in_bytes_per_row, width, height, out, out_bytes_per_row, mins, maxs, in_range_black);
68-
}
69-
#endif
70-
return to_blackwhite_rgb32_range_Default(in, in_bytes_per_row, width, height, out, out_bytes_per_row, mins, maxs, in_range_black);
71-
}
72-
73-
74-
75-
76-
77-
78-
79-
void to_blackwhite_rgb32_range_Default(
80-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
81-
ToBlackWhiteRgb32RangeFilter* filter, size_t filter_count
82-
);
83-
void to_blackwhite_rgb32_range_x64_SSE42(
84-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
85-
ToBlackWhiteRgb32RangeFilter* filter, size_t filter_count
86-
);
87-
void to_blackwhite_rgb32_range_x64_AVX2(
88-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
89-
ToBlackWhiteRgb32RangeFilter* filter, size_t filter_count
90-
);
91-
void to_blackwhite_rgb32_range_x64_AVX512(
92-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
93-
ToBlackWhiteRgb32RangeFilter* filter, size_t filter_count
94-
);
95-
void to_blackwhite_rgb32_range_arm64_NEON(
96-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
97-
ToBlackWhiteRgb32RangeFilter* filter, size_t filter_count
98-
);
99-
100-
101-
void to_blackwhite_rgb32_range(
102-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
103-
ToBlackWhiteRgb32RangeFilter* filter, size_t filter_count
104-
){
105-
#ifdef PA_AutoDispatch_x64_17_Skylake
106-
if (CPU_CAPABILITY_CURRENT.OK_17_Skylake){
107-
return to_blackwhite_rgb32_range_x64_AVX512(image, bytes_per_row, width, height, filter, filter_count);
108-
}
109-
#endif
110-
#ifdef PA_AutoDispatch_x64_13_Haswell
111-
if (CPU_CAPABILITY_CURRENT.OK_13_Haswell){
112-
return to_blackwhite_rgb32_range_x64_AVX2(image, bytes_per_row, width, height, filter, filter_count);
113-
}
114-
#endif
115-
#ifdef PA_AutoDispatch_x64_08_Nehalem
116-
if (CPU_CAPABILITY_CURRENT.OK_08_Nehalem){
117-
return to_blackwhite_rgb32_range_x64_SSE42(image, bytes_per_row, width, height, filter, filter_count);
118-
}
119-
#endif
120-
#ifdef PA_AutoDispatch_arm64_20_M1
121-
if (CPU_CAPABILITY_CURRENT.OK_M1){
122-
return to_blackwhite_rgb32_range_arm64_NEON(image, bytes_per_row, width, height, filter, filter_count);
123-
}
124-
#endif
125-
return to_blackwhite_rgb32_range_Default(image, bytes_per_row, width, height, filter, filter_count);
126-
}
12718

12819
size_t filter_green_Default(
12920
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,

SerialPrograms/Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic.h

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -21,39 +21,6 @@ namespace Kernels{
2121

2222

2323

24-
size_t to_blackwhite_rgb32_range(
25-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
26-
uint32_t* out0, size_t bytes_per_row0, uint32_t mins0, uint32_t maxs0, bool in_range_black0
27-
);
28-
29-
30-
// Same as above, but multiple filters.
31-
// The purpose is to reduce passes over the entire image.
32-
// All matricies must have the same dimensions.
33-
struct ToBlackWhiteRgb32RangeFilter{
34-
uint32_t* data; // Pointer will be overwritten.
35-
const size_t bytes_per_row;
36-
const uint32_t mins;
37-
const uint32_t maxs;
38-
const bool in_range_black;
39-
40-
size_t pixels_in_range;
41-
42-
ToBlackWhiteRgb32RangeFilter(
43-
uint32_t* p_data, size_t p_bytes_per_row,
44-
uint32_t p_mins, uint32_t p_maxs, bool p_in_range_black
45-
)
46-
: data(p_data)
47-
, bytes_per_row(p_bytes_per_row)
48-
, mins(p_mins)
49-
, maxs(p_maxs)
50-
, in_range_black(p_in_range_black)
51-
{}
52-
};
53-
void to_blackwhite_rgb32_range(
54-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
55-
ToBlackWhiteRgb32RangeFilter* filter, size_t filter_count
56-
);
5724

5825

5926

SerialPrograms/Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_Default.cpp

Lines changed: 0 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -14,92 +14,6 @@ namespace Kernels{
1414

1515

1616

17-
class ToBlackWhite_RgbRange_Default{
18-
public:
19-
static const size_t VECTOR_SIZE = 1;
20-
using Mask = size_t;
21-
22-
public:
23-
ToBlackWhite_RgbRange_Default(uint32_t mins, uint32_t maxs, bool in_range_black)
24-
: m_in_range_black(in_range_black ? 1 : 0)
25-
, m_minB(mins & 0x000000ff)
26-
, m_maxB(maxs & 0x000000ff)
27-
, m_minG(mins & 0x0000ff00)
28-
, m_maxG(maxs & 0x0000ff00)
29-
, m_minR(mins & 0x00ff0000)
30-
, m_maxR(maxs & 0x00ff0000)
31-
, m_minA(mins & 0xff000000)
32-
, m_maxA(maxs & 0xff000000)
33-
, m_count(0)
34-
{}
35-
36-
PA_FORCE_INLINE size_t count() const{
37-
return m_count;
38-
}
39-
40-
PA_FORCE_INLINE void process_full(uint32_t* out, const uint32_t* in){
41-
uint32_t pixel = in[0];
42-
uint64_t ret = 1;
43-
{
44-
uint32_t p = pixel & 0xff000000;
45-
ret &= p >= m_minA;
46-
ret &= p <= m_maxA;
47-
}
48-
{
49-
uint32_t p = pixel & 0x00ff0000;
50-
ret &= p >= m_minR;
51-
ret &= p <= m_maxR;
52-
}
53-
{
54-
uint32_t p = pixel & 0x0000ff00;
55-
ret &= p >= m_minG;
56-
ret &= p <= m_maxG;
57-
}
58-
{
59-
uint32_t p = pixel & 0x000000ff;
60-
ret &= p >= m_minB;
61-
ret &= p <= m_maxB;
62-
}
63-
m_count += ret;
64-
ret ^= m_in_range_black;
65-
out[0] = ret ? 0xffffffff : 0xff000000;
66-
}
67-
PA_FORCE_INLINE void process_partial(uint32_t* out, const uint32_t* in, size_t left){
68-
process_full(out, in);
69-
}
70-
71-
private:
72-
const uint32_t m_in_range_black;
73-
const uint32_t m_minB;
74-
const uint32_t m_maxB;
75-
const uint32_t m_minG;
76-
const uint32_t m_maxG;
77-
const uint32_t m_minR;
78-
const uint32_t m_maxR;
79-
const uint32_t m_minA;
80-
const uint32_t m_maxA;
81-
size_t m_count;
82-
};
83-
84-
85-
86-
size_t to_blackwhite_rgb32_range_Default(
87-
const uint32_t* image, size_t in_bytes_per_row, size_t width, size_t height,
88-
uint32_t* out, size_t out_bytes_per_row,
89-
uint32_t mins, uint32_t maxs, bool in_range_black
90-
){
91-
ToBlackWhite_RgbRange_Default filter(mins, maxs, in_range_black);
92-
filter_per_pixel(image, in_bytes_per_row, width, height, filter, out, out_bytes_per_row);
93-
return filter.count();
94-
}
95-
void to_blackwhite_rgb32_range_Default(
96-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
97-
ToBlackWhiteRgb32RangeFilter* filter, size_t filter_count
98-
){
99-
to_blackwhite_rbg32<ToBlackWhite_RgbRange_Default>(
100-
image, bytes_per_row, width, height, filter, filter_count
101-
);
102-
}
10317

10418

10519

SerialPrograms/Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_Routines.h

Lines changed: 3 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,10 @@
1111
#include <stdint.h>
1212
#include "Common/Compiler.h"
1313
#include "Common/Cpp/Containers/FixedLimitVector.tpp"
14-
#include "Kernels_ImageFilter_Basic.h"
1514

16-
// REMOVE
17-
#include <iostream>
18-
using std::cout;
19-
using std::endl;
15+
//#include <iostream>
16+
//using std::cout;
17+
//using std::endl;
2018

2119
namespace PokemonAutomation{
2220
namespace Kernels{
@@ -191,104 +189,6 @@ PA_FORCE_INLINE void filter_per_pixel(
191189

192190

193191

194-
template <typename Runner>
195-
PA_FORCE_INLINE void to_blackwhite_rbg32(
196-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
197-
ToBlackWhiteRgb32RangeFilter* filters, size_t filter_count
198-
){
199-
if (width == 0 || height == 0){
200-
return;
201-
}
202-
203-
// cout << "to_blackwhite_rbg32(" << filter_count << "): " << width << " x " << height << endl;
204-
205-
FixedLimitVector<Runner> entries(filter_count);
206-
for (size_t c = 0; c < filter_count; c++){
207-
ToBlackWhiteRgb32RangeFilter& filter = filters[c];
208-
entries.emplace_back(filter.mins, filter.maxs, filter.in_range_black);
209-
}
210-
211-
const size_t VECTOR_SIZE = Runner::VECTOR_SIZE;
212-
do{
213-
// Less than vector width. No need for steady-state loop.
214-
if (width < VECTOR_SIZE){
215-
typename Runner::Mask mask(width);
216-
do{
217-
const uint32_t* in = image;
218-
for (size_t c = 0; c < filter_count; c++){
219-
entries[c].process_partial(filters[c].data, in, mask);
220-
}
221-
image = (const uint32_t*)((const char*)image + bytes_per_row);
222-
for (size_t c = 0; c < filter_count; c++){
223-
ToBlackWhiteRgb32RangeFilter& filter = filters[c];
224-
filter.data = (uint32_t*)((const char*)filter.data + filter.bytes_per_row);
225-
}
226-
}while (--height);
227-
break;
228-
}
229-
230-
// Divisible by vector width. No need for peel loop.
231-
size_t left = width % VECTOR_SIZE;
232-
if (left == 0){
233-
do{
234-
const uint32_t* in = image;
235-
size_t shift = 0;
236-
size_t lc = width / VECTOR_SIZE;
237-
do{
238-
for (size_t c = 0; c < filter_count; c++){
239-
entries[c].process_full(filters[c].data + shift, in);
240-
}
241-
in += VECTOR_SIZE;
242-
shift += VECTOR_SIZE;
243-
}while (--lc);
244-
image = (const uint32_t*)((const char*)image + bytes_per_row);
245-
for (size_t c = 0; c < filter_count; c++){
246-
ToBlackWhiteRgb32RangeFilter& filter = filters[c];
247-
filter.data = (uint32_t*)((const char*)filter.data + filter.bytes_per_row);
248-
}
249-
}while (--height);
250-
break;
251-
}
252-
253-
// Need both steady-state and peel loops.
254-
{
255-
typename Runner::Mask mask(left);
256-
do{
257-
const uint32_t* in = image;
258-
size_t shift = 0;
259-
size_t lc = width / VECTOR_SIZE;
260-
do{
261-
for (size_t c = 0; c < filter_count; c++){
262-
entries[c].process_full(filters[c].data + shift, in);
263-
}
264-
in += VECTOR_SIZE;
265-
shift += VECTOR_SIZE;
266-
}while (--lc);
267-
for (size_t c = 0; c < filter_count; c++){
268-
entries[c].process_partial(filters[c].data + shift, in, mask);
269-
}
270-
image = (const uint32_t*)((const char*)image + bytes_per_row);
271-
for (size_t c = 0; c < filter_count; c++){
272-
ToBlackWhiteRgb32RangeFilter& filter = filters[c];
273-
filter.data = (uint32_t*)((const char*)filter.data + filter.bytes_per_row);
274-
}
275-
}while (--height);
276-
break;
277-
}
278-
}while (false);
279-
280-
for (size_t c = 0; c < filter_count; c++){
281-
filters[c].pixels_in_range = entries[c].count();
282-
}
283-
}
284-
285-
286-
287-
288-
289-
290-
291-
292192

293193

294194

0 commit comments

Comments
 (0)