Full support for translation and compilation of shaders in Metal, using GPUShaderCreateInfo. Includes render pipeline state creation and management, enabling all standard GPU viewport rendering features in Metal. Authored by Apple: Michael Parkin-White, Marco Giordano Ref T96261 Reviewed By: fclem Maniphest Tasks: T96261 Differential Revision: https://developer.blender.org/D15563
105 lines
3.1 KiB
C++
105 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 typenames 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
|
|
# include "BLI_float4x4.hh"
|
|
# include "BLI_math_vec_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
|