mirror of
https://github.com/tinygrad/tinygrad.git
synced 2026-04-29 03:00:14 -04:00
114 lines
2.6 KiB
C
114 lines
2.6 KiB
C
#ifndef _TINYDRENO_H
|
|
#define _TINYDRENO_H
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
|
|
typedef void * cl_llvm_instance;
|
|
|
|
cl_llvm_instance cl_compiler_create_llvm_instance(void);
|
|
void cl_compiler_destroy_llvm_instance(cl_llvm_instance inst);
|
|
|
|
enum cl_handle_type {
|
|
CL_HANDLE_COMPILED = 1,
|
|
CL_HANDLE_LIBRARY,
|
|
CL_HANDLE_LINKED
|
|
};
|
|
|
|
// handle->data for CL_HANDLE_COMPILED and CL_HANDLE_LIBRARY
|
|
struct cl_compiled_data {
|
|
uint64_t chip_id;
|
|
uint32_t mode;
|
|
void *llvm_bitcode;
|
|
uint64_t llvm_bitcode_size;
|
|
char *build_log;
|
|
uint32_t build_log_len;
|
|
uint32_t error_code;
|
|
};
|
|
|
|
// handle->data for CL_HANDLE_LINKED
|
|
struct cl_executable_data {
|
|
int32_t num_kernels;
|
|
void *kernel_props;
|
|
uint32_t error_code;
|
|
char *build_log;
|
|
char _unk0[0x20];
|
|
uint64_t chip_id;
|
|
uint32_t mode;
|
|
};
|
|
|
|
typedef struct {
|
|
enum cl_handle_type type;
|
|
union {
|
|
struct cl_compiled_data *compiled;
|
|
struct cl_executable_data *executable;
|
|
};
|
|
} cl_handle;
|
|
|
|
|
|
#define CL_MODE_32BIT 0
|
|
#define CL_MODE_64BIT 1
|
|
|
|
#define CL_SRC_STR 0
|
|
#define CL_SRC_BLOB 1
|
|
|
|
cl_handle *cl_compiler_compile_source(cl_llvm_instance inst, uint64_t chip_id, int mode, const char *options, int p5, uint64_t p6, uint64_t p7,
|
|
const char *source, uint64_t source_len, uint64_t source_type, void *p11);
|
|
|
|
cl_handle *cl_compiler_link_program(cl_llvm_instance inst, uint64_t chip_id, int mode, const char *options, int num_handles,
|
|
cl_handle **input_handles);
|
|
|
|
|
|
void cl_compiler_handle_create_binary(cl_handle *handle, void **out_ptr, size_t *out_size);
|
|
|
|
// lib binary format (output of handle_create_binary for type 3)
|
|
// layout: cl_lib_header, then cl_lib_section[num_sections], then data
|
|
|
|
#define CL_LIB_PROGRAM 0
|
|
#define CL_LIB_CONSTS 6
|
|
#define CL_LIB_IMAGE 7
|
|
#define CL_LIB_CODE 10
|
|
#define CL_LIB_IMAGE_DESC 11
|
|
|
|
typedef struct {
|
|
uint32_t id;
|
|
uint32_t offset;
|
|
uint32_t size;
|
|
uint32_t count;
|
|
uint32_t entry_size;
|
|
} cl_lib_section;
|
|
|
|
typedef struct {
|
|
uint32_t _unk0[6];
|
|
uint32_t num_sections;
|
|
uint32_t _unk1[5];
|
|
cl_lib_section sections[];
|
|
} cl_lib_header;
|
|
|
|
// at sections[CL_LIB_PROGRAM].offset
|
|
typedef struct {
|
|
char name[8];
|
|
uint32_t _unk0[3];
|
|
uint32_t fregs;
|
|
uint32_t hregs;
|
|
} cl_lib_prog;
|
|
|
|
// at sections[CL_LIB_IMAGE_DESC].offset
|
|
typedef struct {
|
|
char _unk0[0xc4];
|
|
uint32_t prg_offset;
|
|
uint32_t pvtmem;
|
|
char _unk1[0x0c];
|
|
uint32_t shmem;
|
|
uint32_t samp_cnt;
|
|
char _unk2[0x28];
|
|
uint32_t brnchstck;
|
|
char _unk4[0x4c];
|
|
char kernel_name[];
|
|
} cl_lib_img_desc;
|
|
|
|
void cl_compiler_free_handle(cl_handle *handle);
|
|
void cl_compiler_free_assembly(void *ptr);
|
|
|
|
#endif
|