// Copyright 2024 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
//    list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

////////////////////////////////////////////////////////////////////////////////
// GLSL builtin definition file                                               //
//                                                                            //
// After modifying this file, run:                                            //
//    tools/run gen                                                           //
// from the Dawn source directory.                                            //
//                                                                            //
// See docs/tint/intrinsic_definition_files.md for syntax                     //
////////////////////////////////////////////////////////////////////////////////

import "src/tint/lang/core/address_space.def"
import "src/tint/lang/core/access.def"
import "src/tint/lang/core/texel_format.def"

////////////////////////////////////////////////////////////////////////////////
// Types                                                                      //
////////////////////////////////////////////////////////////////////////////////

type f16
type f32
type i32
type u32
type atomic<T>
type ptr<S: address_space, T, A: access>

type vec2<T>
type vec3<T>
type vec4<T>
@display("vec{N}<{T}>")     type vec<N: num, T>

type texture_1d<T>
type texture_2d<T>
type texture_2d_array<T>
type texture_3d<T>
type texture_cube<T>
type texture_cube_array<T>
type texture_multisampled_2d<T>
type texture_depth_2d
type texture_depth_2d_array
type texture_depth_cube
type texture_depth_cube_array
type texture_depth_multisampled_2d
type texture_storage_1d<F: texel_format, A: access>
type texture_storage_2d<F: texel_format, A: access>
type texture_storage_2d_array<F: texel_format, A: access>
type texture_storage_3d<F: texel_format, A: access>

////////////////////////////////////////////////////////////////////////////////
// Type matchers                                                              //
////////////////////////////////////////////////////////////////////////////////

match iu32: i32 | u32
match fiu32: f32 | i32 | u32

match read_write: access.read_write

match workgroup_or_storage:
  address_space.storage |
  address_space.workgroup

////////////////////////////////////////////////////////////////////////////////
// Builtin Functions                                                          //
////////////////////////////////////////////////////////////////////////////////

@stage("compute") fn barrier()
@stage("compute") fn memoryBarrierBuffer()
@stage("compute") fn memoryBarrierImage()

@stage("fragment", "compute") implicit(T: iu32) fn atomicCompSwap(
                                    ptr<workgroup_or_storage, atomic<T>, read_write>,
                                    compare_value: T,
                                    value: T) -> T
@stage("fragment", "compute") implicit(T: iu32, S: workgroup_or_storage) fn atomicSub(
                                    ptr<S, atomic<T>, read_write>,
                                    T) -> T

fn floatBitsToInt(value: f32) -> i32
implicit(N: num) fn floatBitsToInt(value: vec<N, f32>) -> vec<N, i32>
fn floatBitsToUint(value: f32) -> u32
implicit(N: num) fn floatBitsToUint(value: vec<N, f32>) -> vec<N, u32>

fn intBitsToFloat(value: i32) -> f32
implicit(N: num) fn intBitsToFloat(value: vec<N, i32>) -> vec<N, f32>
fn uintBitsToFloat(value: u32) -> f32
implicit(N: num) fn uintBitsToFloat(value: vec<N, u32>) -> vec<N, f32>

implicit(T: iu32) fn bitCount(value: T) -> i32
implicit(T: iu32, N: num) fn bitCount(value: vec<N, T>) -> vec<N, i32>

implicit(T: iu32) fn bitfieldExtract(value: T, offset: i32, bits: i32) -> T
implicit(T: iu32, N: num) fn bitfieldExtract(value: vec<N, T>, offset: i32, bits: i32) -> vec<N, T>

implicit(T: iu32) fn bitfieldInsert(base: T, insert: T, offset: i32, bits: i32) -> T
implicit(T: iu32, N: num) fn bitfieldInsert(base: vec<N, T>,
                                             insert: vec<N, T>,
                                             offset: i32,
                                             bits: i32) -> vec<N, T>

fn packFloat2x16(value: vec2<f16>) -> u32
fn unpackFloat2x16(value: u32) -> vec2<f16>

@must_use implicit(T: fiu32) fn textureSize(texture: texture_1d<T>,
                                            level: i32) -> i32
@must_use implicit(T: fiu32) fn textureSize(texture: texture_2d<T>,
                                            level: i32) -> vec2<i32>
@must_use implicit(T: fiu32) fn textureSize(texture: texture_2d_array<T>,
                                            level: i32) -> vec3<i32>
@must_use implicit(T: fiu32) fn textureSize(texture: texture_3d<T>,
                                            level: i32) -> vec3<i32>
@must_use implicit(T: fiu32) fn textureSize(texture: texture_cube<T>,
                                            level: i32) -> vec2<i32>
@must_use implicit(T: fiu32) fn textureSize(texture: texture_cube_array<T>,
                                            level: i32) -> vec3<i32>
@must_use fn textureSize(texture: texture_depth_2d,
                         level: i32) -> vec2<i32>
@must_use fn textureSize(texture: texture_depth_2d_array,
                         level: i32) -> vec3<i32>
@must_use fn textureSize(texture: texture_depth_cube,
                         level: i32) -> vec2<i32>
@must_use fn textureSize(texture: texture_depth_cube_array,
                        level: i32) -> vec3<i32>

@must_use implicit(T: fiu32) fn textureSize(texture: texture_multisampled_2d<T>) -> vec2<i32>
@must_use fn textureSize(texture: texture_depth_multisampled_2d) -> vec2<i32>

@must_use implicit(F: texel_format, A: access) fn imageSize(
                                            texture: texture_storage_1d<F, A>) -> i32
@must_use implicit(F: texel_format, A: access) fn imageSize(
                                            texture: texture_storage_2d<F, A>) -> vec2<i32>
@must_use implicit(F: texel_format, A: access) fn imageSize(
                                            texture: texture_storage_2d_array<F, A>) -> vec3<i32>
@must_use implicit(F: texel_format, A: access) fn imageSize(
                                            texture: texture_storage_3d<F, A>) -> vec3<i32>
