mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 20:10:14 +01:00
clc,libcl: Clean up CL includes
This patch does a couple of things to make CL integration with drivers as seamless as possible: - We pull in opencl-c.h and opencl-c-base.h to stop relying on system headers. - Parts of libcl.h are moved to new headers that are incomplete CL-safe variants of libc headers. - A couple of util headers are changed to remove now unnecessary __OPENCL_VERSION__ guards and make more headers CL safe. - Drivers now include src/compiler/libcl and use headers like macros.h,u_math.h instead of libcl.h. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33576>
This commit is contained in:
parent
a80fab3e87
commit
cb31b5a958
28 changed files with 247 additions and 228 deletions
|
|
@ -5,6 +5,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "compiler/libcl/libcl_vk.h"
|
#include "compiler/libcl/libcl_vk.h"
|
||||||
|
#include "util/u_math.h"
|
||||||
#include "geometry.h"
|
#include "geometry.h"
|
||||||
#include "libagx_intrinsics.h"
|
#include "libagx_intrinsics.h"
|
||||||
#include "query.h"
|
#include "query.h"
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,10 @@
|
||||||
#include "compiler/libcl/libcl.h"
|
#include "compiler/libcl/libcl.h"
|
||||||
#include "compiler/shader_enums.h"
|
#include "compiler/shader_enums.h"
|
||||||
|
|
||||||
#ifndef __OPENCL_VERSION__
|
|
||||||
#include "util/bitscan.h"
|
#include "util/bitscan.h"
|
||||||
|
#include "util/u_math.h"
|
||||||
|
|
||||||
|
#ifndef __OPENCL_VERSION__
|
||||||
#define libagx_popcount(x) util_bitcount64(x)
|
#define libagx_popcount(x) util_bitcount64(x)
|
||||||
#define libagx_sub_sat(x, y) ((x >= y) ? (x - y) : 0)
|
#define libagx_sub_sat(x, y) ((x >= y) ? (x - y) : 0)
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,8 @@ libagx_spv = custom_target(
|
||||||
command : [
|
command : [
|
||||||
prog_mesa_clc, '-o', '@OUTPUT@', '--depfile', '@DEPFILE@',
|
prog_mesa_clc, '-o', '@OUTPUT@', '--depfile', '@DEPFILE@',
|
||||||
libagx_shader_files, '--',
|
libagx_shader_files, '--',
|
||||||
|
'-I' + join_paths(meson.project_source_root(), 'include'),
|
||||||
|
'-I' + join_paths(meson.project_source_root(), 'src/compiler/libcl'),
|
||||||
'-I' + join_paths(meson.current_source_dir(), '.'),
|
'-I' + join_paths(meson.current_source_dir(), '.'),
|
||||||
'-I' + join_paths(meson.current_source_dir(), '../../'),
|
'-I' + join_paths(meson.current_source_dir(), '../../'),
|
||||||
'-I' + join_paths(meson.current_source_dir(), 'shaders'),
|
'-I' + join_paths(meson.current_source_dir(), 'shaders'),
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "util/u_math.h"
|
||||||
#include "geometry.h"
|
#include "geometry.h"
|
||||||
#include "tessellator.h"
|
#include "tessellator.h"
|
||||||
|
|
||||||
|
|
|
||||||
39
src/compiler/libcl/assert.h
Normal file
39
src/compiler/libcl/assert.h
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* 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 <stdlib.h>
|
||||||
|
|
||||||
|
/* 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
|
||||||
0
src/compiler/libcl/errno.h
Normal file
0
src/compiler/libcl/errno.h
Normal file
0
src/compiler/libcl/float.h
Normal file
0
src/compiler/libcl/float.h
Normal file
|
|
@ -12,15 +12,11 @@
|
||||||
* OpenCL.
|
* OpenCL.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __OPENCL_VERSION__
|
|
||||||
|
|
||||||
/* The OpenCL version of this header defines many OpenCL versions of stdint.h
|
|
||||||
* and util/macros.h functions. #include both here for consistency in shared
|
|
||||||
* headers.
|
|
||||||
*/
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "util/macros.h"
|
#include "util/macros.h"
|
||||||
|
|
||||||
|
#ifndef __OPENCL_VERSION__
|
||||||
|
|
||||||
/* Structures defined in common host/device headers that include device pointers
|
/* Structures defined in common host/device headers that include device pointers
|
||||||
* need to resolve to a real pointer in OpenCL but an opaque 64-bit address on
|
* need to resolve to a real pointer in OpenCL but an opaque 64-bit address on
|
||||||
* the host. The DEVICE macro facilitates that.
|
* the host. The DEVICE macro facilitates that.
|
||||||
|
|
@ -54,20 +50,6 @@
|
||||||
#define GLOBAL global
|
#define GLOBAL global
|
||||||
#define CONST constant
|
#define CONST constant
|
||||||
|
|
||||||
/* OpenCL lacks explicitly sized integer types, but we know the sizes of
|
|
||||||
* particular integer types. These typedefs allow defining common headers with
|
|
||||||
* explicit integer types (and therefore compatible data layouts).
|
|
||||||
*/
|
|
||||||
typedef ulong uint64_t;
|
|
||||||
typedef uint uint32_t;
|
|
||||||
typedef ushort uint16_t;
|
|
||||||
typedef uchar uint8_t;
|
|
||||||
|
|
||||||
typedef long int64_t;
|
|
||||||
typedef int int32_t;
|
|
||||||
typedef short int16_t;
|
|
||||||
typedef char int8_t;
|
|
||||||
|
|
||||||
/* OpenCL C defines work-item functions to return a scalar for a particular
|
/* OpenCL C defines work-item functions to return a scalar for a particular
|
||||||
* dimension. This is a really annoying papercut, and is not what you want for
|
* dimension. This is a really annoying papercut, and is not what you want for
|
||||||
* either 1D or 3D dispatches. In both cases, it's nicer to get vectors. For
|
* either 1D or 3D dispatches. In both cases, it's nicer to get vectors. For
|
||||||
|
|
@ -91,16 +73,6 @@ typedef char int8_t;
|
||||||
#define cl_group_id _CL_WORKITEM3(get_group_id)
|
#define cl_group_id _CL_WORKITEM3(get_group_id)
|
||||||
#define cl_global_offset _CL_WORKITEM3(get_global_offset)
|
#define cl_global_offset _CL_WORKITEM3(get_global_offset)
|
||||||
|
|
||||||
/* 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]
|
|
||||||
|
|
||||||
/* NIR's precompilation infrastructure requires specifying a workgroup size with
|
/* NIR's precompilation infrastructure requires specifying a workgroup size with
|
||||||
* the kernel, via reqd_work_group_size. Unfortunately, reqd_work_group_size has
|
* the kernel, via reqd_work_group_size. Unfortunately, reqd_work_group_size has
|
||||||
* terrible ergonomics, so we provide these aliases instead.
|
* terrible ergonomics, so we provide these aliases instead.
|
||||||
|
|
@ -119,47 +91,10 @@ typedef char int8_t;
|
||||||
/* This is not an exact match for the util/macros.h version but without the
|
/* This is not an exact match for the util/macros.h version but without the
|
||||||
* aligned(4) we get garbage code gen and in practice this is what you want.
|
* aligned(4) we get garbage code gen and in practice this is what you want.
|
||||||
*/
|
*/
|
||||||
#define PACKED __attribute__((packed, aligned(4)))
|
#ifdef PACKED
|
||||||
|
#undef PACKED
|
||||||
/* OpenCL C doesn't seem to have an equivalent for this but it doesn't matter.
|
|
||||||
* Compare util/macros.h
|
|
||||||
*/
|
|
||||||
#define ENUM_PACKED
|
|
||||||
|
|
||||||
/* FILE * pointers can be useful in function signatures shared across
|
|
||||||
* host/device, but are meaningless in OpenCL. Turn them into void* to allow
|
|
||||||
* consistent prototype across host/device even though there won't be an actual
|
|
||||||
* file pointer on the device side.
|
|
||||||
*/
|
|
||||||
#define FILE void
|
|
||||||
|
|
||||||
/* OpenCL C lacks a standard memcpy, but clang has one that will be plumbed into
|
|
||||||
* a NIR memcpy intrinsic. This is not a competent implementation of memcpy for
|
|
||||||
* large amounts of data, since it's necessarily single threaded, but memcpy is
|
|
||||||
* too useful for shared CPU/GPU code that it's worth making the standard
|
|
||||||
* library function work.
|
|
||||||
*/
|
|
||||||
#define memcpy __builtin_memcpy
|
|
||||||
|
|
||||||
/* OpenCL C lacks a standard abort, so we plumb through the NIR intrinsic. */
|
|
||||||
void nir_printf_abort(void);
|
|
||||||
static inline void abort(void) { nir_printf_abort(); }
|
|
||||||
|
|
||||||
/* 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
|
#endif
|
||||||
|
#define PACKED __attribute__((packed, aligned(4)))
|
||||||
|
|
||||||
/* This is the unreachable macro from macros.h that uses __builtin_unreachable,
|
/* This is the unreachable macro from macros.h that uses __builtin_unreachable,
|
||||||
* which is a clang builtin available in OpenCL C.
|
* which is a clang builtin available in OpenCL C.
|
||||||
|
|
@ -170,103 +105,6 @@ static inline void abort(void) { nir_printf_abort(); }
|
||||||
__builtin_unreachable(); \
|
__builtin_unreachable(); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* Core OpenCL C like likely/unlikely. We might be able to map to a clang built
|
|
||||||
* in though...
|
|
||||||
*/
|
|
||||||
#define likely(x) (x)
|
|
||||||
#define unlikely(x) (x)
|
|
||||||
|
|
||||||
/* These duplicate the C standard library and are required for the
|
|
||||||
* u_intN_min/max implementations.
|
|
||||||
*/
|
|
||||||
#define UINT64_MAX 18446744073709551615ul
|
|
||||||
#define INT64_MAX 9223372036854775807l
|
|
||||||
|
|
||||||
/* These duplicate util/macros.h. This could maybe be cleaned up */
|
|
||||||
#define BITFIELD_BIT(b) (1u << b)
|
|
||||||
#define BITFIELD_MASK(m) (((m) == 32) ? 0xffffffff : ((1u << (m)) - 1))
|
|
||||||
#define ASSERTED
|
|
||||||
#define ALWAYS_INLINE
|
|
||||||
#define UNUSED
|
|
||||||
|
|
||||||
static inline int64_t
|
|
||||||
u_intN_max(unsigned bit_size)
|
|
||||||
{
|
|
||||||
assert(bit_size <= 64 && bit_size > 0);
|
|
||||||
return INT64_MAX >> (64 - bit_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int64_t
|
|
||||||
u_intN_min(unsigned bit_size)
|
|
||||||
{
|
|
||||||
return (-u_intN_max(bit_size)) - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint64_t
|
|
||||||
u_uintN_max(unsigned bit_size)
|
|
||||||
{
|
|
||||||
assert(bit_size <= 64 && bit_size > 0);
|
|
||||||
return UINT64_MAX >> (64 - bit_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint
|
|
||||||
align(uint x, uint y)
|
|
||||||
{
|
|
||||||
return (x + y - 1) & ~(y - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint32_t
|
|
||||||
util_logbase2(uint32_t n)
|
|
||||||
{
|
|
||||||
return (31 - clz(n | 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint32_t
|
|
||||||
util_logbase2_ceil(uint32_t n)
|
|
||||||
{
|
|
||||||
return (n <= 1) ? 0 : 32 - clz(n - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define BITFIELD64_MASK(x) ((x == 64) ? ~0ul : ((1ul << x) - 1))
|
|
||||||
#define IS_POT(v) (((v) & ((v) - 1)) == 0)
|
|
||||||
#define IS_POT_NONZERO(v) ((v) != 0 && IS_POT(v))
|
|
||||||
#define DIV_ROUND_UP(A, B) (((A) + (B) - 1) / (B))
|
|
||||||
#define CLAMP(X, MIN, MAX) ((X) > (MIN) ? ((X) > (MAX) ? (MAX) : (X)) : (MIN))
|
|
||||||
#define ALIGN_POT(x, pot_align) (((x) + (pot_align) - 1) & ~((pot_align) - 1))
|
|
||||||
|
|
||||||
/* TODO: Should we define with OpenCL min/max? Do we want to match the host? */
|
|
||||||
#define MAX2( A, B ) ( (A)>(B) ? (A) : (B) )
|
|
||||||
#define MIN2( A, B ) ( (A)<(B) ? (A) : (B) )
|
|
||||||
|
|
||||||
/* Less worried about these matching */
|
|
||||||
#define MIN3(a, b, c) min(min(a, b), c)
|
|
||||||
#define MAX3(a, b, c) max(max(a, b), c)
|
|
||||||
|
|
||||||
static inline uint32_t
|
|
||||||
fui(float f)
|
|
||||||
{
|
|
||||||
return as_uint(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline float
|
|
||||||
uif(uint32_t ui)
|
|
||||||
{
|
|
||||||
return as_float(ui);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CL_FLT_EPSILON 1.1920928955078125e-7f
|
|
||||||
|
|
||||||
/* OpenCL C lacks roundf and llroundf, we can emulate it */
|
|
||||||
static inline float roundf(float x)
|
|
||||||
{
|
|
||||||
return trunc(x + copysign(0.5f - 0.25f * CL_FLT_EPSILON, x));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline long long llroundf(float x)
|
|
||||||
{
|
|
||||||
return roundf(x);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint16_t
|
static inline uint16_t
|
||||||
_mesa_float_to_half(float f)
|
_mesa_float_to_half(float f)
|
||||||
{
|
{
|
||||||
|
|
@ -279,22 +117,4 @@ _mesa_half_to_float(uint16_t w)
|
||||||
return convert_float(as_half(w));
|
return convert_float(as_half(w));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Duplicates u_math.h. We should make that header CL safe at some point...
|
|
||||||
*/
|
|
||||||
static inline int64_t
|
|
||||||
util_sign_extend(uint64_t val, unsigned width)
|
|
||||||
{
|
|
||||||
unsigned shift = 64 - width;
|
|
||||||
return (int64_t)(val << shift) >> shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* To make u_foreach_bit work. TODO: Use clz? */
|
|
||||||
#define ffs __builtin_ffs
|
|
||||||
|
|
||||||
/* Duplicates bitscan.h... */
|
|
||||||
#define u_foreach_bit(b, dword) \
|
|
||||||
for (uint32_t __dword = (dword), b; \
|
|
||||||
((b) = ffs(__dword) - 1, __dword); \
|
|
||||||
__dword &= ~(1 << (b)))
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
0
src/compiler/libcl/limits.h
Normal file
0
src/compiler/libcl/limits.h
Normal file
34
src/compiler/libcl/math.h
Normal file
34
src/compiler/libcl/math.h
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
|
||||||
|
#define CL_FLT_EPSILON 1.1920928955078125e-7f
|
||||||
|
|
||||||
|
/* OpenCL C lacks roundf and llroundf, we can emulate it */
|
||||||
|
static inline float roundf(float x)
|
||||||
|
{
|
||||||
|
return trunc(x + copysign(0.5f - 0.25f * CL_FLT_EPSILON, x));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long long llroundf(float x)
|
||||||
|
{
|
||||||
|
return roundf(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long lrintf(float x)
|
||||||
|
{
|
||||||
|
return (long)roundf(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline float fabsf(float x)
|
||||||
|
{
|
||||||
|
return fabs(x);
|
||||||
|
}
|
||||||
0
src/compiler/libcl/stdalign.h
Normal file
0
src/compiler/libcl/stdalign.h
Normal file
0
src/compiler/libcl/stdarg.h
Normal file
0
src/compiler/libcl/stdarg.h
Normal file
0
src/compiler/libcl/stdbool.h
Normal file
0
src/compiler/libcl/stdbool.h
Normal file
0
src/compiler/libcl/stddef.h
Normal file
0
src/compiler/libcl/stddef.h
Normal file
45
src/compiler/libcl/stdint.h
Normal file
45
src/compiler/libcl/stdint.h
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
|
||||||
|
/* OpenCL lacks explicitly sized integer types, but we know the sizes of
|
||||||
|
* particular integer types. These typedefs allow defining common headers with
|
||||||
|
* explicit integer types (and therefore compatible data layouts).
|
||||||
|
*/
|
||||||
|
typedef ulong uint64_t;
|
||||||
|
typedef uint uint32_t;
|
||||||
|
typedef ushort uint16_t;
|
||||||
|
typedef uchar uint8_t;
|
||||||
|
|
||||||
|
typedef long int64_t;
|
||||||
|
typedef int int32_t;
|
||||||
|
typedef short int16_t;
|
||||||
|
typedef char int8_t;
|
||||||
|
|
||||||
|
typedef int64_t intmax_t;
|
||||||
|
typedef uint64_t uintmax_t;
|
||||||
|
|
||||||
|
/* These duplicate the C standard library and are required for the
|
||||||
|
* u_intN_min/max implementations.
|
||||||
|
*/
|
||||||
|
#define UINT64_MAX 18446744073709551615ul
|
||||||
|
#define INT64_MAX 9223372036854775807l
|
||||||
|
#define UINT64_C(c) c##UL
|
||||||
|
|
||||||
|
#define INT8_MIN (-128)
|
||||||
|
#define INT16_MIN (-32768)
|
||||||
|
#define INT32_MIN (-2147483648)
|
||||||
|
#define INT64_MIN (-9223372036854775807l - 1)
|
||||||
|
|
||||||
|
#define INT8_MAX 127
|
||||||
|
#define INT16_MAX 32767
|
||||||
|
#define INT32_MAX 2147483647
|
||||||
|
#define INT64_MAX 9223372036854775807l
|
||||||
18
src/compiler/libcl/stdio.h
Normal file
18
src/compiler/libcl/stdio.h
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
|
||||||
|
/* FILE * pointers can be useful in function signatures shared across
|
||||||
|
* host/device, but are meaningless in OpenCL. Turn them into void* to allow
|
||||||
|
* consistent prototype across host/device even though there won't be an actual
|
||||||
|
* file pointer on the device side.
|
||||||
|
*/
|
||||||
|
#define FILE void
|
||||||
15
src/compiler/libcl/stdlib.h
Normal file
15
src/compiler/libcl/stdlib.h
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
|
||||||
|
/* OpenCL C lacks a standard abort, so we plumb through the NIR intrinsic. */
|
||||||
|
void nir_printf_abort(void);
|
||||||
|
static inline void abort(void) { nir_printf_abort(); }
|
||||||
19
src/compiler/libcl/string.h
Normal file
19
src/compiler/libcl/string.h
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
|
||||||
|
/* OpenCL C lacks a standard memcpy, but clang has one that will be plumbed into
|
||||||
|
* a NIR memcpy intrinsic. This is not a competent implementation of memcpy for
|
||||||
|
* large amounts of data, since it's necessarily single threaded, but memcpy is
|
||||||
|
* too useful for shared CPU/GPU code that it's worth making the standard
|
||||||
|
* library function work.
|
||||||
|
*/
|
||||||
|
#define memcpy __builtin_memcpy
|
||||||
|
|
@ -18,13 +18,9 @@
|
||||||
#ifndef NIR_DEFINES_H
|
#ifndef NIR_DEFINES_H
|
||||||
#define NIR_DEFINES_H
|
#define NIR_DEFINES_H
|
||||||
|
|
||||||
#ifndef __OPENCL_VERSION__
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "util/macros.h"
|
#include "util/macros.h"
|
||||||
#else
|
|
||||||
#include "compiler/libcl/libcl.h"
|
|
||||||
#endif
|
|
||||||
#include "util/enum_operators.h"
|
#include "util/enum_operators.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
||||||
|
|
@ -118,6 +118,7 @@ foreach t : [['125', 'gfx125', 'dg2'], ['200', 'gfx20', 'lnl'],
|
||||||
'-e', entrypoint, prepended_input_args, '-o', '@OUTPUT@', '--',
|
'-e', entrypoint, prepended_input_args, '-o', '@OUTPUT@', '--',
|
||||||
'-cl-std=cl2.0', '-D__OPENCL_VERSION__=200',
|
'-cl-std=cl2.0', '-D__OPENCL_VERSION__=200',
|
||||||
'-DMAX_HW_SIMD_WIDTH=16', '-DMAX_WORKGROUP_SIZE=16',
|
'-DMAX_HW_SIMD_WIDTH=16', '-DMAX_WORKGROUP_SIZE=16',
|
||||||
|
'-I' + join_paths(meson.project_source_root(), 'src/compiler/libcl'),
|
||||||
'-I' + join_paths(meson.current_source_dir(), 'gpu'),
|
'-I' + join_paths(meson.current_source_dir(), 'gpu'),
|
||||||
'-I' + join_paths(meson.current_source_dir(), 'include'),
|
'-I' + join_paths(meson.current_source_dir(), 'include'),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -98,6 +98,7 @@ nvkcl_spv = custom_target(
|
||||||
output : 'nvkcl.spv',
|
output : 'nvkcl.spv',
|
||||||
command : [
|
command : [
|
||||||
prog_mesa_clc, '-o', '@OUTPUT@', '--depfile', '@DEPFILE@', nvkcl_files, '--',
|
prog_mesa_clc, '-o', '@OUTPUT@', '--depfile', '@DEPFILE@', nvkcl_files, '--',
|
||||||
|
'-I' + join_paths(meson.project_source_root(), 'src/compiler/libcl'),
|
||||||
'-I' + join_paths(meson.current_source_dir(), '.'),
|
'-I' + join_paths(meson.current_source_dir(), '.'),
|
||||||
'-I' + join_paths(meson.project_source_root(), 'src'),
|
'-I' + join_paths(meson.project_source_root(), 'src'),
|
||||||
cl_args,
|
cl_args,
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@ foreach ver : ['4', '5', '6', '7', '9', '10']
|
||||||
prog_mesa_clc, '-o', '@OUTPUT@', '--depfile', '@DEPFILE@',
|
prog_mesa_clc, '-o', '@OUTPUT@', '--depfile', '@DEPFILE@',
|
||||||
libpan_shader_files, '--',
|
libpan_shader_files, '--',
|
||||||
'-DPAN_ARCH=@0@'.format(ver),
|
'-DPAN_ARCH=@0@'.format(ver),
|
||||||
|
'-I' + join_paths(meson.project_source_root(), 'include'),
|
||||||
|
'-I' + join_paths(meson.project_source_root(), 'src/compiler/libcl'),
|
||||||
'-I' + join_paths(meson.current_source_dir(), '.'),
|
'-I' + join_paths(meson.current_source_dir(), '.'),
|
||||||
'-I' + join_paths(meson.current_source_dir(), '../../'),
|
'-I' + join_paths(meson.current_source_dir(), '../../'),
|
||||||
'-I' + join_paths(meson.current_source_dir(), '../lib/'),
|
'-I' + join_paths(meson.current_source_dir(), '../lib/'),
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,6 @@
|
||||||
#ifndef UTIL_BITPACK_HELPERS_H
|
#ifndef UTIL_BITPACK_HELPERS_H
|
||||||
#define UTIL_BITPACK_HELPERS_H
|
#define UTIL_BITPACK_HELPERS_H
|
||||||
|
|
||||||
#ifndef __OPENCL_VERSION__
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
|
@ -39,9 +38,6 @@
|
||||||
VALGRIND_CHECK_MEM_IS_DEFINED(&(x), sizeof(x))
|
VALGRIND_CHECK_MEM_IS_DEFINED(&(x), sizeof(x))
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#else
|
|
||||||
#include "compiler/libcl/libcl.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef util_bitpack_validate_value
|
#ifndef util_bitpack_validate_value
|
||||||
#define util_bitpack_validate_value(x)
|
#define util_bitpack_validate_value(x)
|
||||||
|
|
|
||||||
|
|
@ -219,7 +219,7 @@ u_bit_scan_consecutive_range(unsigned *mask, int *start, int *count)
|
||||||
static inline void
|
static inline void
|
||||||
u_bit_scan_consecutive_range64(uint64_t *mask, int *start, int *count)
|
u_bit_scan_consecutive_range64(uint64_t *mask, int *start, int *count)
|
||||||
{
|
{
|
||||||
if (*mask == ~0ull) {
|
if (*mask == UINT64_MAX) {
|
||||||
*start = 0;
|
*start = 0;
|
||||||
*count = 64;
|
*count = 64;
|
||||||
*mask = 0;
|
*mask = 0;
|
||||||
|
|
|
||||||
|
|
@ -403,10 +403,10 @@ do { \
|
||||||
(BITFIELD_MASK((b) + (count)) & ~BITFIELD_MASK(b))
|
(BITFIELD_MASK((b) + (count)) & ~BITFIELD_MASK(b))
|
||||||
|
|
||||||
/** Set a single bit */
|
/** Set a single bit */
|
||||||
#define BITFIELD64_BIT(b) (1ull << (b))
|
#define BITFIELD64_BIT(b) (UINT64_C(1) << (b))
|
||||||
/** Set all bits up to excluding bit b */
|
/** Set all bits up to excluding bit b */
|
||||||
#define BITFIELD64_MASK(b) \
|
#define BITFIELD64_MASK(b) \
|
||||||
((b) == 64 ? (~0ull) : BITFIELD64_BIT((b) & 63) - 1)
|
((b) == 64 ? (~UINT64_C(0)) : BITFIELD64_BIT((b) & 63) - 1)
|
||||||
/** Set count bits starting from bit b */
|
/** Set count bits starting from bit b */
|
||||||
#define BITFIELD64_RANGE(b, count) \
|
#define BITFIELD64_RANGE(b, count) \
|
||||||
(BITFIELD64_MASK((b) + (count)) & ~BITFIELD64_MASK(b))
|
(BITFIELD64_MASK((b) + (count)) & ~BITFIELD64_MASK(b))
|
||||||
|
|
|
||||||
|
|
@ -24,28 +24,7 @@
|
||||||
#ifndef _SIMPLE_MTX_H
|
#ifndef _SIMPLE_MTX_H
|
||||||
#define _SIMPLE_MTX_H
|
#define _SIMPLE_MTX_H
|
||||||
|
|
||||||
#include "util/futex.h"
|
#include <stdint.h>
|
||||||
#include "util/macros.h"
|
|
||||||
#include "util/u_call_once.h"
|
|
||||||
#include "u_atomic.h"
|
|
||||||
|
|
||||||
#if UTIL_FUTEX_SUPPORTED
|
|
||||||
#if defined(HAVE_VALGRIND) && !defined(NDEBUG)
|
|
||||||
# include <valgrind.h>
|
|
||||||
# include <helgrind.h>
|
|
||||||
# define HG(x) x
|
|
||||||
#else
|
|
||||||
# define HG(x)
|
|
||||||
#endif
|
|
||||||
#else /* !UTIL_FUTEX_SUPPORTED */
|
|
||||||
# include "c11/threads.h"
|
|
||||||
#endif /* UTIL_FUTEX_SUPPORTED */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if UTIL_FUTEX_SUPPORTED
|
|
||||||
|
|
||||||
/* mtx_t - Fast, simple mutex
|
/* mtx_t - Fast, simple mutex
|
||||||
*
|
*
|
||||||
|
|
@ -75,6 +54,31 @@ typedef struct {
|
||||||
uint32_t val;
|
uint32_t val;
|
||||||
} simple_mtx_t;
|
} simple_mtx_t;
|
||||||
|
|
||||||
|
#ifndef __OPENCL_VERSION__
|
||||||
|
|
||||||
|
#include "util/futex.h"
|
||||||
|
#include "util/macros.h"
|
||||||
|
#include "util/u_call_once.h"
|
||||||
|
#include "u_atomic.h"
|
||||||
|
|
||||||
|
#if UTIL_FUTEX_SUPPORTED
|
||||||
|
#if defined(HAVE_VALGRIND) && !defined(NDEBUG)
|
||||||
|
# include <valgrind.h>
|
||||||
|
# include <helgrind.h>
|
||||||
|
# define HG(x) x
|
||||||
|
#else
|
||||||
|
# define HG(x)
|
||||||
|
#endif
|
||||||
|
#else /* !UTIL_FUTEX_SUPPORTED */
|
||||||
|
# include "c11/threads.h"
|
||||||
|
#endif /* UTIL_FUTEX_SUPPORTED */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if UTIL_FUTEX_SUPPORTED
|
||||||
|
|
||||||
#define SIMPLE_MTX_INITIALIZER { 0 }
|
#define SIMPLE_MTX_INITIALIZER { 0 }
|
||||||
|
|
||||||
#define _SIMPLE_MTX_INVALID_VALUE 0xd0d0d0d0
|
#define _SIMPLE_MTX_INVALID_VALUE 0xd0d0d0d0
|
||||||
|
|
@ -203,4 +207,8 @@ simple_mtx_assert_locked(simple_mtx_t *mtx)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _SIMPLE_MTX_H */
|
#endif /* _SIMPLE_MTX_H */
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,11 @@
|
||||||
#define UTIL_ARCH_LITTLE_ENDIAN 1
|
#define UTIL_ARCH_LITTLE_ENDIAN 1
|
||||||
#define UTIL_ARCH_BIG_ENDIAN 0
|
#define UTIL_ARCH_BIG_ENDIAN 0
|
||||||
|
|
||||||
|
#elif defined(__OPENCL_VERSION__)
|
||||||
|
|
||||||
|
#define UTIL_ARCH_LITTLE_ENDIAN 1
|
||||||
|
#define UTIL_ARCH_BIG_ENDIAN 0
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(UTIL_ARCH_LITTLE_ENDIAN) || !defined(UTIL_ARCH_BIG_ENDIAN)
|
#if !defined(UTIL_ARCH_LITTLE_ENDIAN) || !defined(UTIL_ARCH_BIG_ENDIAN)
|
||||||
|
|
|
||||||
|
|
@ -284,7 +284,7 @@ util_half_inf_sign(int16_t x)
|
||||||
return (x < 0) ? -1 : 1;
|
return (x < 0) ? -1 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __OPENCL_VERSION__
|
||||||
/**
|
/**
|
||||||
* Return float bits.
|
* Return float bits.
|
||||||
*/
|
*/
|
||||||
|
|
@ -296,14 +296,6 @@ fui( float f )
|
||||||
return fi.ui;
|
return fi.ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint64_t
|
|
||||||
dui( double f )
|
|
||||||
{
|
|
||||||
union di di;
|
|
||||||
di.d = f;
|
|
||||||
return di.ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline float
|
static inline float
|
||||||
uif(uint32_t ui)
|
uif(uint32_t ui)
|
||||||
{
|
{
|
||||||
|
|
@ -312,6 +304,28 @@ uif(uint32_t ui)
|
||||||
return fi.f;
|
return fi.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
static inline uint32_t
|
||||||
|
fui(float f)
|
||||||
|
{
|
||||||
|
return as_uint(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline float
|
||||||
|
uif(uint32_t ui)
|
||||||
|
{
|
||||||
|
return as_float(ui);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline uint64_t
|
||||||
|
dui( double f )
|
||||||
|
{
|
||||||
|
union di di;
|
||||||
|
di.d = f;
|
||||||
|
return di.ui;
|
||||||
|
}
|
||||||
|
|
||||||
static inline double
|
static inline double
|
||||||
uid(uint64_t ui)
|
uid(uint64_t ui)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue