19 #include <freerdp/config.h>
21 #include <winpr/sysinfo.h>
22 #include "prim_test.h"
23 #include <freerdp/utils/profiler.h>
26 static BOOL test_YCoCgRToRGB_8u_AC4R_func(UINT32 width, UINT32 height)
28 pstatus_t status = -1;
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)
47 for (
size_t x = 0; x <
sizeof(formats) /
sizeof(formats[0]); x++)
49 const UINT32 format = formats[x];
50 const UINT32 dstStride = width * FreeRDPGetBytesPerPixel(format);
51 const char* formatName = FreeRDPGetColorFormatName(format);
52 PROFILER_CREATE(genericProf,
"YCoCgRToRGB_8u_AC4R-GENERIC")
53 PROFILER_CREATE(optProf, "YCoCgRToRGB_8u_AC4R-OPT")
54 PROFILER_ENTER(genericProf)
55 status = generic->YCoCgToRGB_8u_AC4R(in, srcStride, out_c, format, dstStride, width, height,
57 PROFILER_EXIT(genericProf)
59 if (status != PRIMITIVES_SUCCESS)
62 PROFILER_ENTER(optProf)
63 status = optimized->YCoCgToRGB_8u_AC4R(in, srcStride, out_sse, format, dstStride, width,
65 PROFILER_EXIT(optProf)
67 if (status != PRIMITIVES_SUCCESS)
70 if (memcmp(out_c, out_sse, 1ULL * dstStride * height) != 0)
72 for (
size_t i = 0; i < 1ull * width * height; ++i)
74 const UINT32 c = FreeRDPReadColor(out_c + 4 * i, format);
75 const UINT32 sse = FreeRDPReadColor(out_sse + 4 * i, format);
79 printf(
"optimized->YCoCgRToRGB FAIL[%s] [%" PRIuz
"]: 0x%08" PRIx32
80 " -> C 0x%08" PRIx32
" vs optimized 0x%08" PRIx32
"\n",
81 formatName, i, in[i + 1], c, sse);
87 printf(
"--------------------------- [%s] [%" PRIu32
"x%" PRIu32
88 "] ---------------------------\n",
89 formatName, width, height);
91 PROFILER_PRINT(genericProf)
92 PROFILER_PRINT(optProf)
95 PROFILER_FREE(genericProf)
96 PROFILER_FREE(optProf)
98 if (status != PRIMITIVES_SUCCESS)
103 winpr_aligned_free(in);
104 winpr_aligned_free(out_c);
105 winpr_aligned_free(out_sse);
106 return status == PRIMITIVES_SUCCESS;
109 int TestPrimitivesYCoCg(
int argc,
char* argv[])
113 prim_test_setup(FALSE);
118 for (UINT32 x = 0; x < 10; x++)
125 winpr_RAND(&w,
sizeof(w));
131 winpr_RAND(&h,
sizeof(h));
135 if (!test_YCoCgRToRGB_8u_AC4R_func(w, h))
141 if (!test_YCoCgRToRGB_8u_AC4R_func(1920 / 4, 1080 / 4))