This implement most of the functions provided by the BLI math library. This is part of the effort to unify GLSL and C++ syntax. Ref T103026. This also adds some infrastructure to make it possible to run GLSL shader unit test. Some code already present in other libs is being copied to the new libs. This patch does not make use of the new libs outside of the tests. Note that the test is still crashing when using metal.
107 lines
3.1 KiB
C++
107 lines
3.1 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright 2022 Blender Foundation. All rights reserved. */
|
|
|
|
/** \file
|
|
* \ingroup gpu
|
|
*
|
|
* Glue definition to make shared declaration of struct & functions work in both C / C++ and GLSL.
|
|
* We use the same vector and matrix types as Blender C++. Some math functions are defined to use
|
|
* the float version to match the GLSL syntax.
|
|
* This file can be used for C & C++ code and the syntax used should follow the same rules.
|
|
* Some preprocessing is done by the GPU back-end to make it GLSL compatible.
|
|
*
|
|
* IMPORTANT:
|
|
* - Always use `u` suffix for enum values. GLSL do not support implicit cast.
|
|
* - Define all values. This is in order to simplify custom pre-processor code.
|
|
* - (C++ only) Always use `uint32_t` as underlying type (`enum eMyEnum : uint32_t`).
|
|
* - (C only) do NOT use the enum type inside UBO/SSBO structs and use `uint` instead.
|
|
* - Use float suffix by default for float literals to avoid double promotion in C++.
|
|
* - Pack one float or int after a vec3/ivec3 to fulfill alignment rules.
|
|
*
|
|
* NOTE: Due to alignment restriction and buggy drivers, do not try to use mat3 inside structs.
|
|
* NOTE: (UBO only) Do not use arrays of float. They are padded to arrays of vec4 and are not worth
|
|
* it. This does not apply to SSBO.
|
|
*
|
|
* IMPORTANT: Do not forget to align mat4, vec3 and vec4 to 16 bytes, and vec2 to 8 bytes.
|
|
*
|
|
* NOTE: You can use bool type using bool1 a int boolean type matching the GLSL type.
|
|
*/
|
|
|
|
#ifdef GPU_SHADER
|
|
# define BLI_STATIC_ASSERT_ALIGN(type_, align_)
|
|
# define BLI_STATIC_ASSERT_SIZE(type_, size_)
|
|
# define static
|
|
# define inline
|
|
# define cosf cos
|
|
# define sinf sin
|
|
# define tanf tan
|
|
# define acosf acos
|
|
# define asinf asin
|
|
# define atanf atan
|
|
# define floorf floor
|
|
# define ceilf ceil
|
|
# define sqrtf sqrt
|
|
# define expf exp
|
|
|
|
# define bool1 bool
|
|
/* Type name collision with Metal shading language - These type-names are already defined. */
|
|
# ifndef GPU_METAL
|
|
# define float2 vec2
|
|
# define float3 vec3
|
|
# define float4 vec4
|
|
# define float4x4 mat4
|
|
# define int2 ivec2
|
|
# define int3 ivec3
|
|
# define int4 ivec4
|
|
# define uint2 uvec2
|
|
# define uint3 uvec3
|
|
# define uint4 uvec4
|
|
# define bool2 bvec2
|
|
# define bool3 bvec3
|
|
# define bool4 bvec4
|
|
# endif
|
|
|
|
#else /* C / C++ */
|
|
# pragma once
|
|
|
|
# include "BLI_assert.h"
|
|
|
|
# ifdef __cplusplus
|
|
# ifndef __BLI_MATH_MATRIX_TYPES_HH__
|
|
# include "BLI_float4x4.hh"
|
|
# endif
|
|
# include "BLI_math_vector_types.hh"
|
|
using blender::float2;
|
|
using blender::float3;
|
|
using blender::float4;
|
|
using blender::float4x4;
|
|
using blender::int2;
|
|
using blender::int3;
|
|
using blender::int4;
|
|
using blender::uint2;
|
|
using blender::uint3;
|
|
using blender::uint4;
|
|
using bool1 = int;
|
|
using bool2 = blender::int2;
|
|
using bool3 = blender::int3;
|
|
using bool4 = blender::int4;
|
|
|
|
# else /* C */
|
|
typedef float float2[2];
|
|
typedef float float3[3];
|
|
typedef float float4[4];
|
|
typedef float float4x4[4][4];
|
|
typedef int int2[2];
|
|
typedef int int3[2];
|
|
typedef int int4[4];
|
|
typedef uint uint2[2];
|
|
typedef uint uint3[3];
|
|
typedef uint uint4[4];
|
|
typedef int bool1;
|
|
typedef int bool2[2];
|
|
typedef int bool3[2];
|
|
typedef int bool4[4];
|
|
# endif
|
|
|
|
#endif
|