UnresizeImpl *create_unresize_impl_x86(const BilinearContext &hcontext, const BilinearContext &vcontext, CPUClass cpu)
{
	X86Capabilities caps = query_x86_capabilities();
	UnresizeImpl *ret;

	if (cpu == CPUClass::CPU_X86_AUTO) {
		if (caps.sse2)
			ret = create_unresize_impl_sse2(hcontext, vcontext);
		else
			ret = nullptr;
	} else if (cpu >= CPUClass::CPU_X86_SSE2) {
		ret = create_unresize_impl_sse2(hcontext, vcontext);
	} else {
		ret = nullptr;
	}

	return ret;
}
PixelAdapter *create_pixel_adapter_x86(CPUClass cpu)
{
	X86Capabilities caps = query_x86_capabilities();
	PixelAdapter *ret;

	if (cpu == CPUClass::CPU_X86_AUTO) {
		if (caps.f16c)
			ret = create_pixel_adapter_f16c();
		else
			ret = nullptr;
	} else if (cpu >= CPUClass::CPU_X86_F16C) {
		ret = create_pixel_adapter_f16c();
	} else {
		ret = nullptr;
	}

	return ret;
}
Operation *create_rec709_inverse_gamma_operation_x86(CPUClass cpu)
{
	X86Capabilities caps = query_x86_capabilities();
	Operation *ret;

	if (cpu == CPUClass::CPU_X86_AUTO) {
		if (caps.f16c)
			ret = create_rec709_inverse_gamma_operation_f16c();
		else
			ret = nullptr;
	} else if (cpu >= CPUClass::CPU_X86_F16C) {
		ret = create_rec709_inverse_gamma_operation_f16c();
	} else {
		ret = nullptr;
	}

	return ret;
}
Operation *create_rec709_gamma_operation_x86(CPUClass cpu)
{
	X86Capabilities caps = query_x86_capabilities();
	Operation *ret;

	if (cpu == CPUClass::CPU_AUTO) {
		if (caps.avx2)
			ret = create_rec709_gamma_operation_avx2();
		else
			ret = nullptr;
	} else if (cpu >= CPUClass::CPU_X86_AVX2) {
		ret = create_rec709_gamma_operation_avx2();
	} else {
		ret = nullptr;
	}

	return ret;
}
Operation *create_matrix_operation_x86(const Matrix3x3 &m, CPUClass cpu)
{
	X86Capabilities caps = query_x86_capabilities();
	Operation *ret;

	if (cpu == CPUClass::CPU_X86_AUTO) {
		if (caps.avx2)
			ret = create_matrix_operation_avx2(m);
		else if (caps.sse2)
			ret = create_matrix_operation_sse2(m);
		else
			ret = nullptr;
	} else if (cpu >= CPUClass::CPU_X86_AVX2) {
		ret = create_matrix_operation_avx2(m);
	} else if (cpu >= CPUClass::CPU_X86_SSE2) {
		ret = create_matrix_operation_sse2(m);
	} else {
		ret = nullptr;
	}

	return ret;
}