steamcompmgr: Color management microbenchmark
This commit is contained in:
parent
9bac374ff7
commit
eacb55f8fc
1 changed files with 47 additions and 1 deletions
|
@ -119,6 +119,14 @@ extern float g_flHDRItmTargetNits;
|
||||||
|
|
||||||
extern std::atomic<uint64_t> g_lastVblank;
|
extern std::atomic<uint64_t> g_lastVblank;
|
||||||
|
|
||||||
|
uint64_t timespec_to_nanos(struct timespec& spec)
|
||||||
|
{
|
||||||
|
return spec.tv_sec * 1'000'000'000ul + spec.tv_nsec;
|
||||||
|
}
|
||||||
|
|
||||||
|
//#define COLOR_MGMT_MICROBENCH
|
||||||
|
// sudo cpupower frequency-set --governor performance
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_color_mgmt()
|
update_color_mgmt()
|
||||||
{
|
{
|
||||||
|
@ -137,9 +145,13 @@ update_color_mgmt()
|
||||||
g_ColorMgmt.pending.outputEncodingEOTF = EOTF_Gamma22;
|
g_ColorMgmt.pending.outputEncodingEOTF = EOTF_Gamma22;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef COLOR_MGMT_MICROBENCH
|
||||||
|
struct timespec t0, t1;
|
||||||
|
#else
|
||||||
// check if any part of our color mgmt stack is dirty
|
// check if any part of our color mgmt stack is dirty
|
||||||
if ( g_ColorMgmt.pending == g_ColorMgmt.current && g_ColorMgmt.serial != 0 )
|
if ( g_ColorMgmt.pending == g_ColorMgmt.current && g_ColorMgmt.serial != 0 )
|
||||||
return;
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (g_ColorMgmt.pending.enabled)
|
if (g_ColorMgmt.pending.enabled)
|
||||||
{
|
{
|
||||||
|
@ -212,10 +224,26 @@ update_color_mgmt()
|
||||||
buildPQColorimetry( &inputColorimetry, &colorMapping, displayColorimetry );
|
buildPQColorimetry( &inputColorimetry, &colorMapping, displayColorimetry );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef COLOR_MGMT_MICROBENCH
|
||||||
|
const int nProfileEOTF = 1;
|
||||||
|
|
||||||
|
if ( nInputEOTF == nProfileEOTF )
|
||||||
|
{
|
||||||
|
clock_gettime(CLOCK_MONOTONIC_RAW, &t0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
calcColorTransform( &lut1d[0], nLutSize1d, &lut3d[0], nLutEdgeSize3d, inputColorimetry, inputEOTF,
|
calcColorTransform( &lut1d[0], nLutSize1d, &lut3d[0], nLutEdgeSize3d, inputColorimetry, inputEOTF,
|
||||||
outputEncodingColorimetry, g_ColorMgmt.pending.outputEncodingEOTF,
|
outputEncodingColorimetry, g_ColorMgmt.pending.outputEncodingEOTF,
|
||||||
colorMapping, g_ColorMgmt.pending.nightmode, tonemapping, pLook, flGain );
|
colorMapping, g_ColorMgmt.pending.nightmode, tonemapping, pLook, flGain );
|
||||||
|
|
||||||
|
#ifdef COLOR_MGMT_MICROBENCH
|
||||||
|
if ( nInputEOTF == nProfileEOTF )
|
||||||
|
{
|
||||||
|
clock_gettime(CLOCK_MONOTONIC_RAW, &t1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if ( !g_ColorMgmtLutsOverride[nInputEOTF].lut3d.empty() && !g_ColorMgmtLutsOverride[nInputEOTF].lut1d.empty() )
|
if ( !g_ColorMgmtLutsOverride[nInputEOTF].lut3d.empty() && !g_ColorMgmtLutsOverride[nInputEOTF].lut1d.empty() )
|
||||||
{
|
{
|
||||||
g_ColorMgmtLuts[nInputEOTF].lut1d = g_ColorMgmtLutsOverride[nInputEOTF].lut1d;
|
g_ColorMgmtLuts[nInputEOTF].lut1d = g_ColorMgmtLutsOverride[nInputEOTF].lut1d;
|
||||||
|
@ -241,6 +269,24 @@ update_color_mgmt()
|
||||||
g_ColorMgmtLuts[i].reset();
|
g_ColorMgmtLuts[i].reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef COLOR_MGMT_MICROBENCH
|
||||||
|
double delta = (timespec_to_nanos(t1) - timespec_to_nanos(t0)) / 1000000.0;
|
||||||
|
|
||||||
|
static uint32_t iter = 0;
|
||||||
|
static const uint32_t iter_count = 120;
|
||||||
|
static double accum = 0;
|
||||||
|
|
||||||
|
accum += delta;
|
||||||
|
|
||||||
|
if (iter++ == iter_count)
|
||||||
|
{
|
||||||
|
printf("update_color_mgmt: %.3fms\n", accum / iter_count);
|
||||||
|
|
||||||
|
iter = 0;
|
||||||
|
accum = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static uint32_t s_NextColorMgmtSerial = 0;
|
static uint32_t s_NextColorMgmtSerial = 0;
|
||||||
|
|
||||||
g_ColorMgmt.serial = ++s_NextColorMgmtSerial;
|
g_ColorMgmt.serial = ++s_NextColorMgmtSerial;
|
||||||
|
@ -928,7 +974,7 @@ uint64_t get_time_in_nanos()
|
||||||
timespec ts;
|
timespec ts;
|
||||||
// Kernel reports page flips with CLOCK_MONOTONIC.
|
// Kernel reports page flips with CLOCK_MONOTONIC.
|
||||||
clock_gettime(CLOCK_MONOTONIC, &ts);
|
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||||
return ts.tv_sec * 1'000'000'000ul + ts.tv_nsec;
|
return timespec_to_nanos(ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sleep_for_nanos(uint64_t nanos)
|
void sleep_for_nanos(uint64_t nanos)
|
||||||
|
|
Loading…
Reference in a new issue