opencolorio/tests/gpu/CDLOp_test.cpp

350 lines
11 KiB
C++

// SPDX-License-Identifier: BSD-3-Clause
// Copyright Contributors to the OpenColorIO Project.
#include <stdio.h>
#include <sstream>
#include <string>
#include <OpenColorIO/OpenColorIO.h>
#include "GPUUnitTest.h"
#include "GPUHelpers.h"
namespace OCIO = OCIO_NAMESPACE;
// TODO: Add ctf file unit tests when the CLF reader is in.
namespace CDL_Data_1
{
constexpr double slope[3] = { 1.35, 1.10, 0.71 };
constexpr double offset[3] = { 0.05, -0.23, 0.11 };
constexpr double power[3] = { 0.93, 0.81, 1.27 };
};
// Use the legacy shader description with the CDL from OCIO v1 implementation.
OCIO_ADD_GPU_TEST(CDLOp, clamp_fwd_v1_legacy_shader)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setDirection(OCIO::TRANSFORM_DIR_FORWARD);
cdl->setSlope(CDL_Data_1::slope);
cdl->setOffset(CDL_Data_1::offset);
cdl->setPower(CDL_Data_1::power);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
config->setMajorVersion(1);
test.setProcessor(config, cdl);
test.setLegacyShader(true);
test.setTestWideRange(true);
test.setRelativeComparison(false);
test.setErrorThreshold(1e-6f);
// TODO: Would like to be able to remove the setTestNaN(false)
// from all of these tests.
test.setTestNaN(false);
}
// Use the generic shader description with the CDL from OCIO v1 implementation.
OCIO_ADD_GPU_TEST(CDLOp, clamp_fwd_v1)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setDirection(OCIO::TRANSFORM_DIR_FORWARD);
cdl->setSlope(CDL_Data_1::slope);
cdl->setOffset(CDL_Data_1::offset);
cdl->setPower(CDL_Data_1::power);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
config->setMajorVersion(1);
test.setProcessor(config, cdl);
test.setTestWideRange(true);
test.setRelativeComparison(false);
test.setErrorThreshold(1e-6f);
test.setTestNaN(false);
}
// Use the generic shader description with the CDL from OCIO v2 implementation
// (i.e. use the CDL Op with the ASC/clamping style and a forward direction).
OCIO_ADD_GPU_TEST(CDLOp, clamp_fwd_v2)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setStyle(OCIO::CDL_ASC);
cdl->setDirection(OCIO::TRANSFORM_DIR_FORWARD);
cdl->setSlope(CDL_Data_1::slope);
cdl->setOffset(CDL_Data_1::offset);
cdl->setPower(CDL_Data_1::power);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
test.setProcessor(config, cdl);
test.setTestWideRange(true);
test.setRelativeComparison(false);
test.setErrorThreshold(1e-5f);
}
OCIO_ADD_GPU_TEST(CDLOp, clamp_fwd_no_clamp_v2)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setStyle(OCIO::CDL_NO_CLAMP);
cdl->setDirection(OCIO::TRANSFORM_DIR_FORWARD);
cdl->setSlope(CDL_Data_1::slope);
cdl->setOffset(CDL_Data_1::offset);
cdl->setPower(CDL_Data_1::power);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
test.setProcessor(config, cdl);
test.setTestWideRange(true);
test.setRelativeComparison(false);
test.setErrorThreshold(5e-5f);
test.setTestNaN(false);
test.setTestInfinity(false);
}
// Use the generic shader description with the CDL from OCIO v2 implementation
// (i.e. use the CDL Op with the ASC/clamping style and a inverse direction).
OCIO_ADD_GPU_TEST(CDLOp, clamp_inv_v2)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setStyle(OCIO::CDL_ASC);
cdl->setDirection(OCIO::TRANSFORM_DIR_INVERSE);
cdl->setSlope(CDL_Data_1::slope);
cdl->setOffset(CDL_Data_1::offset);
cdl->setPower(CDL_Data_1::power);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
test.setProcessor(config, cdl);
test.setTestWideRange(true);
test.setRelativeComparison(false);
test.setErrorThreshold(1e-4f);
}
OCIO_ADD_GPU_TEST(CDLOp, clamp_inv_no_clamp_v2)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setStyle(OCIO::CDL_NO_CLAMP);
cdl->setDirection(OCIO::TRANSFORM_DIR_INVERSE);
cdl->setSlope(CDL_Data_1::slope);
cdl->setOffset(CDL_Data_1::offset);
cdl->setPower(CDL_Data_1::power);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
test.setProcessor(config, cdl);
test.setTestWideRange(true);
test.setRelativeComparison(false);
test.setErrorThreshold(1e-4f);
}
namespace CDL_Data_2
{
constexpr double slope[3] = { 1.15, 1.10, 0.90 };
constexpr double offset[3] = { 0.05, -0.02, 0.07 };
constexpr double power[3] = { 1.20, 0.95, 1.13 };
constexpr double saturation = 0.9;
};
// Use the legacy shader description with the CDL from OCIO v1 implementation.
OCIO_ADD_GPU_TEST(CDLOp, clamp_fwd_v1_legacy_shader_Data_2)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setDirection(OCIO::TRANSFORM_DIR_FORWARD);
cdl->setSlope(CDL_Data_2::slope);
cdl->setOffset(CDL_Data_2::offset);
cdl->setPower(CDL_Data_2::power);
cdl->setSat(CDL_Data_2::saturation);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
config->setMajorVersion(1);
test.setProcessor(config, cdl);
test.setLegacyShader(true);
test.setTestWideRange(true);
test.setRelativeComparison(false);
test.setErrorThreshold(1e-6f);
test.setTestNaN(false);
}
// Use the generic shader description with the CDL from OCIO v1 implementation.
OCIO_ADD_GPU_TEST(CDLOp, clamp_fwd_v1_Data_2)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setDirection(OCIO::TRANSFORM_DIR_FORWARD);
cdl->setSlope(CDL_Data_2::slope);
cdl->setOffset(CDL_Data_2::offset);
cdl->setPower(CDL_Data_2::power);
cdl->setSat(CDL_Data_2::saturation);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
config->setMajorVersion(1);
test.setProcessor(config, cdl);
test.setTestWideRange(true);
test.setRelativeComparison(false);
test.setErrorThreshold(1e-6f);
test.setTestNaN(false);
}
// Use the generic shader description with the CDL from OCIO v2 implementation
// (i.e. use the CDL Op with the ASC/clamping style and a forward direction).
OCIO_ADD_GPU_TEST(CDLOp, clamp_fwd_v2_Data_2)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setStyle(OCIO::CDL_ASC);
cdl->setDirection(OCIO::TRANSFORM_DIR_FORWARD);
cdl->setSlope(CDL_Data_2::slope);
cdl->setOffset(CDL_Data_2::offset);
cdl->setPower(CDL_Data_2::power);
cdl->setSat(CDL_Data_2::saturation);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
test.setProcessor(config, cdl);
test.setTestWideRange(true);
test.setRelativeComparison(false);
test.setErrorThreshold(2e-5f);
}
OCIO_ADD_GPU_TEST(CDLOp, clamp_inv_v2_Data_2)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setStyle(OCIO::CDL_ASC);
cdl->setDirection(OCIO::TRANSFORM_DIR_INVERSE);
cdl->setSlope(CDL_Data_2::slope);
cdl->setOffset(CDL_Data_2::offset);
cdl->setPower(CDL_Data_2::power);
cdl->setSat(CDL_Data_2::saturation);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
test.setProcessor(config, cdl);
test.setTestWideRange(true);
test.setRelativeComparison(false);
test.setErrorThreshold(2e-5f);
}
OCIO_ADD_GPU_TEST(CDLOp, clamp_fwd_no_clamp_v2_Data_2)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setStyle(OCIO::CDL_NO_CLAMP);
cdl->setDirection(OCIO::TRANSFORM_DIR_FORWARD);
cdl->setSlope(CDL_Data_2::slope);
cdl->setOffset(CDL_Data_2::offset);
cdl->setPower(CDL_Data_2::power);
cdl->setSat(CDL_Data_2::saturation);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
test.setProcessor(config, cdl);
test.setTestWideRange(true);
test.setRelativeComparison(false);
test.setErrorThreshold(5e-5f);
test.setTestNaN(false);
test.setTestInfinity(false);
}
OCIO_ADD_GPU_TEST(CDLOp, clamp_inv_no_clamp_v2_Data_2)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setStyle(OCIO::CDL_NO_CLAMP);
cdl->setDirection(OCIO::TRANSFORM_DIR_INVERSE);
cdl->setSlope(CDL_Data_2::slope);
cdl->setOffset(CDL_Data_2::offset);
cdl->setPower(CDL_Data_2::power);
cdl->setSat(CDL_Data_2::saturation);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
test.setProcessor(config, cdl);
test.setTestWideRange(true);
test.setRelativeComparison(false);
test.setErrorThreshold(5e-5f);
test.setTestNaN(false);
test.setTestInfinity(false);
}
namespace CDL_Data_3
{
constexpr double slope[3] = { 3.405, 1.0, 1.0 };
constexpr double offset[3] = { -0.178, -0.178, -0.178 };
constexpr double power[3] = { 1.095, 1.095, 1.0 };
constexpr double saturation = 1.2;
};
// Use the generic shader description with the CDL from OCIO v2 implementation
// (i.e. use the CDL Op with the ASC/clamping style and a forward direction).
OCIO_ADD_GPU_TEST(CDLOp, clamp_fwd_v2_Data_3)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setStyle(OCIO::CDL_ASC);
cdl->setDirection(OCIO::TRANSFORM_DIR_FORWARD);
cdl->setSlope(CDL_Data_3::slope);
cdl->setOffset(CDL_Data_3::offset);
cdl->setPower(CDL_Data_3::power);
cdl->setSat(CDL_Data_3::saturation);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
test.setProcessor(config, cdl);
test.setTestWideRange(true);
test.setRelativeComparison(false);
test.setErrorThreshold(5e-5f);
}
OCIO_ADD_GPU_TEST(CDLOp, clamp_fwd_no_clamp_v2_Data_3)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setStyle(OCIO::CDL_NO_CLAMP);
cdl->setDirection(OCIO::TRANSFORM_DIR_FORWARD);
cdl->setSlope(CDL_Data_3::slope);
cdl->setOffset(CDL_Data_3::offset);
cdl->setPower(CDL_Data_3::power);
cdl->setSat(CDL_Data_3::saturation);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
test.setProcessor(config, cdl);
test.setTestWideRange(false);
test.setRelativeComparison(false);
test.setErrorThreshold(5e-5f);
test.setTestNaN(false);
test.setTestInfinity(false);
}
OCIO_ADD_GPU_TEST(CDLOp, clamp_inv_no_clamp_v2_Data_3)
{
OCIO::CDLTransformRcPtr cdl = OCIO::CDLTransform::Create();
cdl->setStyle(OCIO::CDL_NO_CLAMP);
cdl->setDirection(OCIO::TRANSFORM_DIR_INVERSE);
cdl->setSlope(CDL_Data_3::slope);
cdl->setOffset(CDL_Data_3::offset);
cdl->setPower(CDL_Data_3::power);
cdl->setSat(CDL_Data_3::saturation);
OCIO::ConfigRcPtr config = OCIO_NAMESPACE::Config::Create();
test.setProcessor(config, cdl);
test.setTestWideRange(false);
test.setRelativeComparison(false);
test.setErrorThreshold(5e-5f);
test.setTestNaN(false);
test.setTestInfinity(false);
}