mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 18:28:12 +02:00
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>
285 lines
9.3 KiB
C
285 lines
9.3 KiB
C
/*
|
|
* Copyright © 2014 Connor Abbott
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
/**
|
|
* @file nir_defines.h
|
|
*
|
|
* This file contains forward declarations and basic type definitions for NIR.
|
|
* it is meant to be used when the full NIR header is not necessary, such as
|
|
* in parts that work with NIR, but don't need the full implementation details
|
|
* of the various NIR structures.
|
|
*
|
|
* The contents of this file should be kept simple enough that we should be able
|
|
* to also include it in OpenCL programs.
|
|
*/
|
|
|
|
#ifndef NIR_DEFINES_H
|
|
#define NIR_DEFINES_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include "util/macros.h"
|
|
#include "util/enum_operators.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct shader_info shader_info;
|
|
|
|
typedef struct nir_shader nir_shader;
|
|
typedef struct nir_shader_compiler_options nir_shader_compiler_options;
|
|
typedef struct nir_builder nir_builder;
|
|
typedef struct nir_def nir_def;
|
|
typedef struct nir_variable nir_variable;
|
|
|
|
typedef struct nir_cf_node nir_cf_node;
|
|
typedef struct nir_block nir_block;
|
|
typedef struct nir_if nir_if;
|
|
typedef struct nir_loop nir_loop;
|
|
typedef struct nir_function nir_function;
|
|
typedef struct nir_function_impl nir_function_impl;
|
|
|
|
typedef struct nir_instr nir_instr;
|
|
typedef struct nir_alu_instr nir_alu_instr;
|
|
typedef struct nir_deref_instr nir_deref_instr;
|
|
typedef struct nir_call_instr nir_call_instr;
|
|
typedef struct nir_jump_instr nir_jump_instr;
|
|
typedef struct nir_tex_instr nir_tex_instr;
|
|
typedef struct nir_intrinsic_instr nir_intrinsic_instr;
|
|
typedef struct nir_load_const_instr nir_load_const_instr;
|
|
typedef struct nir_undef_instr nir_undef_instr;
|
|
typedef struct nir_phi_instr nir_phi_instr;
|
|
typedef struct nir_parallel_copy_instr nir_parallel_copy_instr;
|
|
|
|
typedef struct nir_xfb_info nir_xfb_info;
|
|
typedef struct nir_tcs_info nir_tcs_info;
|
|
|
|
/* clang-format off */
|
|
typedef enum {
|
|
nir_var_system_value = (1 << 0),
|
|
nir_var_uniform = (1 << 1),
|
|
nir_var_shader_in = (1 << 2),
|
|
nir_var_shader_out = (1 << 3),
|
|
nir_var_image = (1 << 4),
|
|
/** Incoming call or ray payload data for ray-tracing shaders */
|
|
nir_var_shader_call_data = (1 << 5),
|
|
/** Ray hit attributes */
|
|
nir_var_ray_hit_attrib = (1 << 6),
|
|
|
|
/* Modes named nir_var_mem_* have explicit data layout */
|
|
nir_var_mem_ubo = (1 << 7),
|
|
nir_var_mem_push_const = (1 << 8),
|
|
nir_var_mem_ssbo = (1 << 9),
|
|
nir_var_mem_constant = (1 << 10),
|
|
nir_var_mem_task_payload = (1 << 11),
|
|
nir_var_mem_node_payload = (1 << 12),
|
|
nir_var_mem_node_payload_in = (1 << 13),
|
|
|
|
nir_var_function_in = (1 << 14),
|
|
nir_var_function_out = (1 << 15),
|
|
nir_var_function_inout = (1 << 16),
|
|
|
|
/* Generic modes intentionally come last. See encode_dref_modes() in
|
|
* nir_serialize.c for more details.
|
|
*/
|
|
nir_var_shader_temp = (1 << 17),
|
|
nir_var_function_temp = (1 << 18),
|
|
nir_var_mem_shared = (1 << 19),
|
|
nir_var_mem_global = (1 << 20),
|
|
|
|
nir_var_mem_generic = (nir_var_shader_temp |
|
|
nir_var_function_temp |
|
|
nir_var_mem_shared |
|
|
nir_var_mem_global),
|
|
|
|
nir_var_read_only_modes = nir_var_shader_in | nir_var_uniform |
|
|
nir_var_system_value | nir_var_mem_constant |
|
|
nir_var_mem_ubo,
|
|
/* Modes where vector derefs can be indexed as arrays. nir_var_shader_out
|
|
* is only for mesh stages. nir_var_system_value is only for kernel stages.
|
|
*/
|
|
nir_var_vec_indexable_modes = nir_var_shader_temp | nir_var_function_temp |
|
|
nir_var_mem_ubo | nir_var_mem_ssbo |
|
|
nir_var_mem_shared | nir_var_mem_global |
|
|
nir_var_mem_push_const | nir_var_mem_task_payload |
|
|
nir_var_shader_out | nir_var_system_value,
|
|
nir_num_variable_modes = 21,
|
|
nir_var_all = (1 << nir_num_variable_modes) - 1,
|
|
} nir_variable_mode;
|
|
MESA_DEFINE_CPP_ENUM_BITFIELD_OPERATORS(nir_variable_mode)
|
|
/* clang-format on */
|
|
|
|
/** NIR sized and unsized types
|
|
*
|
|
* The values in this enum are carefully chosen so that the sized type is
|
|
* just the unsized type OR the number of bits.
|
|
*/
|
|
/* clang-format off */
|
|
typedef enum ENUM_PACKED {
|
|
nir_type_invalid = 0, /* Not a valid type */
|
|
nir_type_int = 2,
|
|
nir_type_uint = 4,
|
|
nir_type_bool = 6,
|
|
nir_type_float = 128,
|
|
nir_type_bool1 = 1 | nir_type_bool,
|
|
nir_type_bool8 = 8 | nir_type_bool,
|
|
nir_type_bool16 = 16 | nir_type_bool,
|
|
nir_type_bool32 = 32 | nir_type_bool,
|
|
nir_type_int1 = 1 | nir_type_int,
|
|
nir_type_int8 = 8 | nir_type_int,
|
|
nir_type_int16 = 16 | nir_type_int,
|
|
nir_type_int32 = 32 | nir_type_int,
|
|
nir_type_int64 = 64 | nir_type_int,
|
|
nir_type_uint1 = 1 | nir_type_uint,
|
|
nir_type_uint8 = 8 | nir_type_uint,
|
|
nir_type_uint16 = 16 | nir_type_uint,
|
|
nir_type_uint32 = 32 | nir_type_uint,
|
|
nir_type_uint64 = 64 | nir_type_uint,
|
|
nir_type_float16 = 16 | nir_type_float,
|
|
nir_type_float32 = 32 | nir_type_float,
|
|
nir_type_float64 = 64 | nir_type_float,
|
|
} nir_alu_type;
|
|
/* clang-format on */
|
|
|
|
typedef enum {
|
|
/**
|
|
* An address format which is a simple 32-bit global GPU address.
|
|
*/
|
|
nir_address_format_32bit_global,
|
|
|
|
/**
|
|
* An address format which is a simple 64-bit global GPU address.
|
|
*/
|
|
nir_address_format_64bit_global,
|
|
|
|
/**
|
|
* An address format which is a 64-bit global GPU address encoded as a
|
|
* 2x32-bit vector.
|
|
*/
|
|
nir_address_format_2x32bit_global,
|
|
|
|
/**
|
|
* An address format which is a 64-bit global base address and a 32-bit
|
|
* offset.
|
|
*
|
|
* This is identical to 64bit_bounded_global except that bounds checking
|
|
* is not applied when lowering to global access. Even though the size is
|
|
* never used for an actual bounds check, it needs to be valid so we can
|
|
* lower deref_buffer_array_length properly.
|
|
*/
|
|
nir_address_format_64bit_global_32bit_offset,
|
|
|
|
/**
|
|
* An address format which is a bounds-checked 64-bit global GPU address.
|
|
*
|
|
* The address is comprised as a 32-bit vec4 where .xy are a uint64_t base
|
|
* address stored with the low bits in .x and high bits in .y, .z is a
|
|
* size, and .w is an offset. When the final I/O operation is lowered, .w
|
|
* is checked against .z and the operation is predicated on the result.
|
|
*/
|
|
nir_address_format_64bit_bounded_global,
|
|
|
|
/**
|
|
* An address format which is comprised of a vec2 where the first
|
|
* component is a buffer index and the second is an offset.
|
|
*/
|
|
nir_address_format_32bit_index_offset,
|
|
|
|
/**
|
|
* An address format which is a 64-bit value, where the high 32 bits
|
|
* are a buffer index, and the low 32 bits are an offset.
|
|
*/
|
|
nir_address_format_32bit_index_offset_pack64,
|
|
|
|
/**
|
|
* An address format which is comprised of a vec3 where the first two
|
|
* components specify the buffer and the third is an offset.
|
|
*/
|
|
nir_address_format_vec2_index_32bit_offset,
|
|
|
|
/**
|
|
* An address format which represents generic pointers with a 62-bit
|
|
* pointer and a 2-bit enum in the top two bits. The top two bits have
|
|
* the following meanings:
|
|
*
|
|
* - 0x0: Global memory
|
|
* - 0x1: Shared memory
|
|
* - 0x2: Scratch memory
|
|
* - 0x3: Global memory
|
|
*
|
|
* The redundancy between 0x0 and 0x3 is because of Intel sign-extension of
|
|
* addresses. Valid global memory addresses may naturally have either 0 or
|
|
* ~0 as their high bits.
|
|
*
|
|
* Shared and scratch pointers are represented as 32-bit offsets with the
|
|
* top 32 bits only being used for the enum. This allows us to avoid
|
|
* 64-bit address calculations in a bunch of cases.
|
|
*/
|
|
nir_address_format_62bit_generic,
|
|
|
|
/**
|
|
* An address format which is a simple 32-bit offset.
|
|
*/
|
|
nir_address_format_32bit_offset,
|
|
|
|
/**
|
|
* An address format which is a simple 32-bit offset cast to 64-bit.
|
|
*/
|
|
nir_address_format_32bit_offset_as_64bit,
|
|
|
|
/**
|
|
* An address format representing a purely logical addressing model. In
|
|
* this model, all deref chains must be complete from the dereference
|
|
* operation to the variable. Cast derefs are not allowed. These
|
|
* addresses will be 32-bit scalars but the format is immaterial because
|
|
* you can always chase the chain.
|
|
*/
|
|
nir_address_format_logical,
|
|
} nir_address_format;
|
|
|
|
typedef union {
|
|
bool b;
|
|
float f32;
|
|
double f64;
|
|
int8_t i8;
|
|
uint8_t u8;
|
|
int16_t i16;
|
|
uint16_t u16;
|
|
int32_t i32;
|
|
uint32_t u32;
|
|
int64_t i64;
|
|
uint64_t u64;
|
|
} nir_const_value;
|
|
|
|
#define NIR_ALU_TYPE_SIZE_MASK 0x79
|
|
#define NIR_ALU_TYPE_BASE_TYPE_MASK 0x86
|
|
|
|
static inline bool
|
|
nir_num_components_valid(unsigned num_components)
|
|
{
|
|
return (num_components >= 1 &&
|
|
num_components <= 5) ||
|
|
num_components == 8 ||
|
|
num_components == 16;
|
|
}
|
|
|
|
static inline unsigned
|
|
nir_alu_type_get_type_size(nir_alu_type type)
|
|
{
|
|
return type & NIR_ALU_TYPE_SIZE_MASK;
|
|
}
|
|
|
|
static inline nir_alu_type
|
|
nir_alu_type_get_base_type(nir_alu_type type)
|
|
{
|
|
return (nir_alu_type)(type & NIR_ALU_TYPE_BASE_TYPE_MASK);
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|