Skip to content

Commit 4e3fd40

Browse files
committed
Begin splitting up Kernels/ImageFilter in preparation for new stuff.
1 parent 8c3944b commit 4e3fd40

22 files changed

+949
-687
lines changed

SerialPrograms/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,7 @@ file(GLOB MAIN_SOURCES
727727
Source/Kernels/BinaryImageFilters/Kernels_BinaryImage_BasicFilters_x64_AVX2.h
728728
Source/Kernels/BinaryImageFilters/Kernels_BinaryImage_BasicFilters_x64_AVX512.h
729729
Source/Kernels/BinaryImageFilters/Kernels_BinaryImage_BasicFilters_x64_SSE42.h
730+
Source/Kernels/BinaryImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range.h
730731
Source/Kernels/BinaryMatrix/Kernels_BinaryMatrix.cpp
731732
Source/Kernels/BinaryMatrix/Kernels_BinaryMatrix.h
732733
Source/Kernels/BinaryMatrix/Kernels_BinaryMatrixTile_64x16_x64_AVX2.h
@@ -765,6 +766,14 @@ file(GLOB MAIN_SOURCES
765766
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_AVX512.cpp
766767
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_SSE42.cpp
767768
Source/Kernels/ImageFilters/Kernels_ImageFilter_Green_Default.cpp
769+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range.cpp
770+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range.h
771+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_ARM64_NEON.cpp
772+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_Default.cpp
773+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_Routines.cpp
774+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_x64_AVX2.cpp
775+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_x64_AVX512.cpp
776+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_x64_SSE42.cpp
768777
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness.cpp
769778
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness.h
770779
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness_Default.cpp
@@ -2414,6 +2423,7 @@ SET_SOURCE_FILES_PROPERTIES(
24142423
Source/Kernels/AudioStreamConversion/AudioStreamConversion_Core_x86_SSE41.cpp
24152424
Source/Kernels/AbsFFT/Kernels_AbsFFT_Core_x86_SSE41.cpp
24162425
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_SSE42.cpp
2426+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_x64_SSE42.cpp
24172427
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness_x64_SSE41.cpp
24182428
Source/Kernels/ImageStats/Kernels_ImagePixelSumSqr_x64_SSE41.cpp
24192429
Source/Kernels/ImageStats/Kernels_ImagePixelSumSqrDev_x64_SSE41.cpp
@@ -2429,6 +2439,7 @@ if (ARCH_FLAGS_13_Haswell)
24292439
SET_SOURCE_FILES_PROPERTIES(
24302440
Source/Kernels/AbsFFT/Kernels_AbsFFT_Core_x86_AVX2.cpp
24312441
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_AVX2.cpp
2442+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_x64_AVX2.cpp
24322443
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness_x64_AVX2.cpp
24332444
Source/Kernels/ImageStats/Kernels_ImagePixelSumSqr_x64_AVX2.cpp
24342445
Source/Kernels/ImageStats/Kernels_ImagePixelSumSqrDev_x64_AVX2.cpp
@@ -2443,6 +2454,7 @@ endif()
24432454
if (ARCH_FLAGS_17_Skylake)
24442455
SET_SOURCE_FILES_PROPERTIES(
24452456
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_AVX512.cpp
2457+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_x64_AVX512.cpp
24462458
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness_x64_AVX512.cpp
24472459
Source/Kernels/ImageStats/Kernels_ImagePixelSumSqr_x64_AVX512.cpp
24482460
Source/Kernels/ImageStats/Kernels_ImagePixelSumSqrDev_x64_AVX512.cpp

SerialPrograms/SerialPrograms.pro

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,12 @@ SOURCES += \
374374
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_AVX512.cpp \
375375
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_x64_SSE42.cpp \
376376
Source/Kernels/ImageFilters/Kernels_ImageFilter_Green_Default.cpp \
377+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range.cpp \
378+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_ARM64_NEON.cpp \
379+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_Default.cpp \
380+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_x64_AVX2.cpp \
381+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_x64_AVX512.cpp \
382+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_x64_SSE42.cpp \
377383
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness.cpp \
378384
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness_Default.cpp \
379385
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness_arm64_NEON.cpp \
@@ -1571,6 +1577,8 @@ HEADERS += \
15711577
Source/Kernels/BinaryMatrix/Kernels_SparseBinaryMatrixCore.h \
15721578
Source/Kernels/BinaryMatrix/Kernels_SparseBinaryMatrixCore.tpp \
15731579
Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic.h \
1580+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range.h \
1581+
Source/Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range_Routines.h \
15741582
Source/Kernels/ImageScaleBrightness/Kernels_ImageScaleBrightness.h \
15751583
Source/Kernels/ImageStats/Kernels_ImagePixelSumSqr.h \
15761584
Source/Kernels/ImageStats/Kernels_ImagePixelSumSqrDev.h \

SerialPrograms/Source/CommonTools/Images/ImageFilter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include "Common/Cpp/Containers/FixedLimitVector.tpp"
88
#include "Kernels/ImageFilters/Kernels_ImageFilter_Basic.h"
9+
#include "Kernels/ImageFilters/RGB32_Range/Kernels_ImageFilter_RGB32_Range.h"
910
#include "CommonFramework/ImageTypes/ImageViewRGB32.h"
1011
#include "CommonFramework/ImageTypes/ImageRGB32.h"
1112
#include "ImageFilter.h"

SerialPrograms/Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic.cpp

Lines changed: 1 addition & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -6,156 +6,13 @@
66

77
#include "Common/Cpp/Exceptions.h"
88
#include "Common/Cpp/CpuId/CpuId.h"
9-
#include "Kernels_ImageFilter_Basic_Routines.h"
9+
//#include "Kernels_ImageFilter_Basic_Routines.h"
1010
#include "Kernels_ImageFilter_Basic.h"
1111

1212
namespace PokemonAutomation{
1313
namespace Kernels{
1414

1515

16-
size_t filter_rgb32_range_Default(
17-
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
18-
uint32_t* out, size_t out_bytes_per_row,
19-
uint32_t mins, uint32_t maxs,
20-
uint32_t replacement, bool invert
21-
);
22-
size_t filter_rgb32_range_x64_SSE42(
23-
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
24-
uint32_t* out, size_t out_bytes_per_row,
25-
uint32_t mins, uint32_t maxs,
26-
uint32_t replacement, bool invert
27-
);
28-
size_t filter_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,
32-
uint32_t replacement, bool invert
33-
);
34-
size_t filter_rgb32_range_x64_AVX512(
35-
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
36-
uint32_t* out, size_t out_bytes_per_row,
37-
uint32_t mins, uint32_t maxs,
38-
uint32_t replacement, bool invert
39-
);
40-
size_t filter_rgb32_range_arm64_NEON(
41-
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
42-
uint32_t* out, size_t out_bytes_per_row,
43-
uint32_t mins, uint32_t maxs,
44-
uint32_t replacement, bool invert
45-
);
46-
47-
48-
size_t filter_rgb32_range(
49-
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
50-
uint32_t* out, size_t out_bytes_per_row,
51-
uint32_t mins, uint32_t maxs,
52-
uint32_t replacement, bool invert
53-
){
54-
if (width * height > 0xffffffff){
55-
throw InternalProgramError(nullptr, PA_CURRENT_FUNCTION, "Image is too large. more than 2^32 pixels.");
56-
}
57-
#ifdef PA_AutoDispatch_x64_17_Skylake
58-
if (CPU_CAPABILITY_CURRENT.OK_17_Skylake){
59-
return filter_rgb32_range_x64_AVX512(
60-
in, in_bytes_per_row, width, height,
61-
out, out_bytes_per_row, mins, maxs, replacement, invert
62-
);
63-
}
64-
#endif
65-
#ifdef PA_AutoDispatch_x64_13_Haswell
66-
if (CPU_CAPABILITY_CURRENT.OK_13_Haswell){
67-
return filter_rgb32_range_x64_AVX2(
68-
in, in_bytes_per_row, width, height,
69-
out, out_bytes_per_row, mins, maxs, replacement, invert
70-
);
71-
}
72-
#endif
73-
#ifdef PA_AutoDispatch_x64_08_Nehalem
74-
if (CPU_CAPABILITY_CURRENT.OK_08_Nehalem){
75-
return filter_rgb32_range_x64_SSE42(
76-
in, in_bytes_per_row, width, height,
77-
out, out_bytes_per_row, mins, maxs, replacement, invert
78-
);
79-
}
80-
#endif
81-
#ifdef PA_AutoDispatch_arm64_20_M1
82-
if (CPU_CAPABILITY_CURRENT.OK_M1){
83-
return filter_rgb32_range_arm64_NEON(
84-
in, in_bytes_per_row, width, height,
85-
out, out_bytes_per_row, mins, maxs, replacement, invert
86-
);
87-
}
88-
#endif
89-
return filter_rgb32_range_Default(
90-
in, in_bytes_per_row, width, height,
91-
out, out_bytes_per_row, mins, maxs, replacement, invert
92-
);
93-
}
94-
95-
96-
97-
98-
99-
100-
void filter_rgb32_range_Default(
101-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
102-
FilterRgb32RangeFilter* filter, size_t filter_count
103-
);
104-
void filter_rgb32_range_x64_SSE42(
105-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
106-
FilterRgb32RangeFilter* filter, size_t filter_count
107-
);
108-
void filter_rgb32_range_x64_AVX2(
109-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
110-
FilterRgb32RangeFilter* filter, size_t filter_count
111-
);
112-
void filter_rgb32_range_x64_AVX512(
113-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
114-
FilterRgb32RangeFilter* filter, size_t filter_count
115-
);
116-
void filter_rgb32_range_arm64_NEON(
117-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
118-
FilterRgb32RangeFilter* filter, size_t filter_count
119-
);
120-
121-
122-
void filter_rgb32_range(
123-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
124-
FilterRgb32RangeFilter* filter, size_t filter_count
125-
){
126-
if (width * height > 0xffffffff){
127-
throw InternalProgramError(nullptr, PA_CURRENT_FUNCTION, "Image is too large. more than 2^32 pixels.");
128-
}
129-
#ifdef PA_AutoDispatch_x64_17_Skylake
130-
if (CPU_CAPABILITY_CURRENT.OK_17_Skylake){
131-
filter_rgb32_range_x64_AVX512(image, bytes_per_row, width, height, filter, filter_count);
132-
return;
133-
}
134-
#endif
135-
#ifdef PA_AutoDispatch_x64_13_Haswell
136-
if (CPU_CAPABILITY_CURRENT.OK_13_Haswell){
137-
filter_rgb32_range_x64_AVX2(image, bytes_per_row, width, height, filter, filter_count);
138-
return;
139-
}
140-
#endif
141-
#ifdef PA_AutoDispatch_x64_08_Nehalem
142-
if (CPU_CAPABILITY_CURRENT.OK_08_Nehalem){
143-
filter_rgb32_range_x64_SSE42(image, bytes_per_row, width, height, filter, filter_count);
144-
return;
145-
}
146-
#endif
147-
#ifdef PA_AutoDispatch_arm64_20_M1
148-
if (CPU_CAPABILITY_CURRENT.OK_M1){
149-
filter_rgb32_range_arm64_NEON(image, bytes_per_row, width, height, filter, filter_count);
150-
return;
151-
}
152-
#endif
153-
filter_rgb32_range_Default(image, bytes_per_row, width, height, filter, filter_count);
154-
}
155-
156-
157-
158-
15916

16017

16118

SerialPrograms/Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic.h

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -15,48 +15,6 @@
1515
namespace PokemonAutomation{
1616
namespace Kernels{
1717

18-
// Change certain color in `image_in` and save output to `image_out`.
19-
// If `replace_color_within_range` is true, replace the color within range [mins, maxs] with the color `replacement`.
20-
// If `replace_color_within_range` is false, replace the color outside of the range with the color `replacement`.
21-
// Returns the # of pixels inside the range [mins, maxs].
22-
size_t filter_rgb32_range(
23-
const uint32_t* image_in, size_t image_in_bytes_per_row, size_t width, size_t height,
24-
uint32_t* image_out, size_t image_out_bytes_per_row,
25-
uint32_t mins, uint32_t maxs,
26-
uint32_t replacement, bool replace_color_within_range
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 FilterRgb32RangeFilter{
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 uint32_t replacement;
39-
const bool invert;
40-
41-
size_t pixels_in_range;
42-
43-
FilterRgb32RangeFilter(
44-
uint32_t* p_data, size_t p_bytes_per_row,
45-
uint32_t p_mins, uint32_t p_maxs, uint32_t p_replacement, bool p_invert
46-
)
47-
: data(p_data)
48-
, bytes_per_row(p_bytes_per_row)
49-
, mins(p_mins)
50-
, maxs(p_maxs)
51-
, replacement(p_replacement)
52-
, invert(p_invert)
53-
{}
54-
};
55-
void filter_rgb32_range(
56-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
57-
FilterRgb32RangeFilter* filter, size_t filter_count
58-
);
59-
6018

6119

6220
size_t filter_rgb32_euclidean(

SerialPrograms/Source/Kernels/ImageFilters/Kernels_ImageFilter_Basic_Default.cpp

Lines changed: 0 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -12,96 +12,6 @@ namespace PokemonAutomation{
1212
namespace Kernels{
1313

1414

15-
class ImageFilter_RgbRange_Default{
16-
public:
17-
static const size_t VECTOR_SIZE = 1;
18-
using Mask = size_t;
19-
20-
public:
21-
ImageFilter_RgbRange_Default(uint32_t mins, uint32_t maxs, uint32_t replacement_color,
22-
bool replace_color_within_range)
23-
: m_replacement_color(replacement_color)
24-
, m_replace_color_within_range(replace_color_within_range ? 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_replace_color_within_range;
65-
out[0] = ret ? pixel : m_replacement_color;
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_replacement_color;
73-
const uint32_t m_replace_color_within_range;
74-
const uint32_t m_minB;
75-
const uint32_t m_maxB;
76-
const uint32_t m_minG;
77-
const uint32_t m_maxG;
78-
const uint32_t m_minR;
79-
const uint32_t m_maxR;
80-
const uint32_t m_minA;
81-
const uint32_t m_maxA;
82-
size_t m_count;
83-
};
84-
size_t filter_rgb32_range_Default(
85-
const uint32_t* in, size_t in_bytes_per_row, size_t width, size_t height,
86-
uint32_t* out, size_t out_bytes_per_row,
87-
uint32_t mins, uint32_t maxs,
88-
uint32_t replacement_color, bool replace_color_within_range
89-
){
90-
ImageFilter_RgbRange_Default filter(mins, maxs, replacement_color, replace_color_within_range);
91-
filter_per_pixel(in, in_bytes_per_row, width, height, filter, out, out_bytes_per_row);
92-
return filter.count();
93-
}
94-
void filter_rgb32_range_Default(
95-
const uint32_t* image, size_t bytes_per_row, size_t width, size_t height,
96-
FilterRgb32RangeFilter* filter, size_t filter_count
97-
){
98-
filter_per_pixel<ImageFilter_RgbRange_Default>(
99-
image, bytes_per_row, width, height, filter, filter_count
100-
);
101-
}
102-
103-
104-
10515

10616

10717
class ImageFilter_RgbEuclidean_Default{

0 commit comments

Comments
 (0)