19#include <freerdp/config.h>
21#include <winpr/sysinfo.h>
23#include <freerdp/utils/profiler.h>
26static BOOL test_YCoCgRToRGB_8u_AC4R_func(UINT32 width, UINT32 height)
28 pstatus_t status = -1;
29 BYTE* out_sse =
nullptr;
31 BYTE* out_c =
nullptr;
32 const UINT32 srcStride = width * 4;
33 const UINT32 size = srcStride * height;
34 const UINT32 formats[] = { PIXEL_FORMAT_ARGB32, PIXEL_FORMAT_ABGR32, PIXEL_FORMAT_RGBA32,
35 PIXEL_FORMAT_RGBX32, PIXEL_FORMAT_BGRA32, PIXEL_FORMAT_BGRX32 };
36 PROFILER_DEFINE(genericProf)
37 PROFILER_DEFINE(optProf)
38 in = winpr_aligned_calloc(1, size, 16);
39 out_c = winpr_aligned_calloc(1, size, 16);
40 out_sse = winpr_aligned_calloc(1, size, 16);
42 if (!in || !out_c || !out_sse)
45 if (winpr_RAND(in, size) < 0)
48 for (
size_t x = 0; x <
sizeof(formats) /
sizeof(formats[0]); x++)
50 const UINT32 format = formats[x];
51 const UINT32 dstStride = width * FreeRDPGetBytesPerPixel(format);
52 const char* formatName = FreeRDPGetColorFormatName(format);
53 PROFILER_CREATE(genericProf,
"YCoCgRToRGB_8u_AC4R-GENERIC")
54 PROFILER_CREATE(optProf, "YCoCgRToRGB_8u_AC4R-OPT")
55 PROFILER_ENTER(genericProf)
56 status = generic->YCoCgToRGB_8u_AC4R(in, WINPR_ASSERTING_INT_CAST(
int, srcStride), out_c,
57 format, WINPR_ASSERTING_INT_CAST(
int, dstStride),
58 width, height, 2, TRUE);
59 PROFILER_EXIT(genericProf)
61 if (status != PRIMITIVES_SUCCESS)
64 PROFILER_ENTER(optProf)
65 status = optimized->YCoCgToRGB_8u_AC4R(
66 in, WINPR_ASSERTING_INT_CAST(
int, srcStride), out_sse, format,
67 WINPR_ASSERTING_INT_CAST(
int, dstStride), width, height, 2, TRUE);
68 PROFILER_EXIT(optProf)
70 if (status != PRIMITIVES_SUCCESS)
73 if (memcmp(out_c, out_sse, 1ULL * dstStride * height) != 0)
75 for (
size_t i = 0; i < 1ull * width * height; ++i)
77 const UINT32 c = FreeRDPReadColor(out_c + 4 * i, format);
78 const UINT32 sse = FreeRDPReadColor(out_sse + 4 * i, format);
82 printf(
"optimized->YCoCgRToRGB FAIL[%s] [%" PRIuz
"]: 0x%08" PRIx32
83 " -> C 0x%08" PRIx32
" vs optimized 0x%08" PRIx32
"\n",
84 formatName, i, in[i + 1], c, sse);
90 printf(
"--------------------------- [%s] [%" PRIu32
"x%" PRIu32
91 "] ---------------------------\n",
92 formatName, width, height);
94 PROFILER_PRINT(genericProf)
95 PROFILER_PRINT(optProf)
98 PROFILER_FREE(genericProf)
99 PROFILER_FREE(optProf)
101 if (status != PRIMITIVES_SUCCESS)
106 winpr_aligned_free(in);
107 winpr_aligned_free(out_c);
108 winpr_aligned_free(out_sse);
109 return status == PRIMITIVES_SUCCESS;
112int TestPrimitivesYCoCg(
int argc,
char* argv[])
116 prim_test_setup(FALSE);
121 for (UINT32 x = 0; x < 10; x++)
128 if (winpr_RAND(&w,
sizeof(w)) < 0)
135 if (winpr_RAND(&h,
sizeof(h)) < 0)
140 if (!test_YCoCgRToRGB_8u_AC4R_func(w, h))
146 if (!test_YCoCgRToRGB_8u_AC4R_func(1920 / 4, 1080 / 4))