/* * Copyright 2024 Valve Corporation * Copyright 2023 Alyssa Rosenzweig * SPDX-License-Identifier: MIT */ #pragma once #ifndef __OPENCL_VERSION__ #error "should only be included from OpenCL" #endif #include /* OpenCL C lacks static_assert, a part of C11. This makes static_assert * available on both host and device. It is defined as variadic to handle also * no-message static_asserts (standardized in C23). */ #define _S(x) #x #define _PASTE_(x, y) x##y #define _PASTE(x, y) _PASTE_(x, y) #define static_assert(_COND, ...) \ typedef char _PASTE(static_assertion, __LINE__)[(_COND) ? 1 : -1] /* OpenCL C lacks a standard assert. We implement one on top of abort. We are * careful to use a single printf so the lines don't get split up if multiple * threads assert in parallel. */ #ifndef NDEBUG #define _ASSERT_STRING(x) _ASSERT_STRING_INNER(x) #define _ASSERT_STRING_INNER(x) #x #define assert(x) if (!(x)) { \ printf("Shader assertion fail at " __FILE__ ":" \ _ASSERT_STRING(__LINE__) "\nExpected " #x "\n\n"); \ nir_printf_abort(); \ } #else #define assert(x) #endif