2022-12-04 10:32:10 +11:00
|
|
|
#ifndef __LIBRASHADER_H__
|
|
|
|
#define __LIBRASHADER_H__
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
2022-12-04 10:56:57 +11:00
|
|
|
typedef struct _filter_chain_gl _filter_chain_gl;
|
2022-12-04 10:32:10 +11:00
|
|
|
|
|
|
|
typedef struct _libra_error _libra_error;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A shader preset including all specified parameters, textures, and paths to specified shaders.
|
|
|
|
*
|
|
|
|
* A shader preset can be used to create a filter chain runtime instance, or reflected to get
|
|
|
|
* parameter metadata.
|
|
|
|
*/
|
|
|
|
typedef struct _shader_preset _shader_preset;
|
|
|
|
|
|
|
|
typedef const struct _libra_error *libra_error_t;
|
|
|
|
|
|
|
|
typedef struct _shader_preset *libra_shader_preset_t;
|
|
|
|
|
|
|
|
typedef const void *(*gl_loader_t)(const char*);
|
|
|
|
|
2022-12-04 10:56:57 +11:00
|
|
|
typedef struct filter_chain_gl_opt_t {
|
2022-12-04 10:32:10 +11:00
|
|
|
uint16_t gl_version;
|
|
|
|
bool use_dsa;
|
2022-12-04 10:56:57 +11:00
|
|
|
} filter_chain_gl_opt_t;
|
|
|
|
|
|
|
|
typedef struct _filter_chain_gl *libra_gl_filter_chain_t;
|
|
|
|
|
|
|
|
typedef struct libra_source_image_gl_t {
|
|
|
|
uint32_t handle;
|
|
|
|
uint32_t format;
|
|
|
|
uint32_t width;
|
|
|
|
uint32_t height;
|
|
|
|
} libra_source_image_gl_t;
|
|
|
|
|
|
|
|
typedef struct libra_viewport_t {
|
|
|
|
float x;
|
|
|
|
float y;
|
|
|
|
uint32_t width;
|
|
|
|
uint32_t height;
|
|
|
|
} libra_viewport_t;
|
|
|
|
|
|
|
|
typedef struct libra_draw_framebuffer_gl_t {
|
|
|
|
uint32_t handle;
|
|
|
|
uint32_t texture;
|
|
|
|
uint32_t format;
|
|
|
|
uint32_t width;
|
|
|
|
uint32_t height;
|
|
|
|
} libra_draw_framebuffer_gl_t;
|
2022-12-04 10:32:10 +11:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Load a preset.
|
|
|
|
*/
|
|
|
|
typedef libra_error_t (*PFN_lbr_load_preset)(const char*, libra_shader_preset_t*);
|
|
|
|
|
|
|
|
typedef libra_error_t (*PFN_lbr_preset_free)(libra_shader_preset_t*);
|
|
|
|
|
|
|
|
typedef libra_error_t (*PFN_lbr_preset_set_param)(libra_shader_preset_t*, const char*, float);
|
|
|
|
|
|
|
|
typedef libra_error_t (*PFN_lbr_preset_get_param)(libra_shader_preset_t*, const char*, float*);
|
|
|
|
|
|
|
|
typedef libra_error_t (*PFN_lbr_preset_print)(libra_shader_preset_t*);
|
|
|
|
|
|
|
|
typedef libra_error_t (*PFN_lbr_preset_get_runtime_param_names)(libra_shader_preset_t*, float*);
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif // __cplusplus
|
|
|
|
|
|
|
|
libra_error_t libra_load_preset(const char *filename, libra_shader_preset_t *out);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Free the preset.
|
|
|
|
*/
|
|
|
|
libra_error_t libra_preset_free(libra_shader_preset_t *preset);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the value of the parameter in the preset.
|
|
|
|
*/
|
|
|
|
libra_error_t libra_preset_set_param(libra_shader_preset_t *preset, const char *name, float value);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the value of the parameter as set in the preset.
|
|
|
|
*/
|
|
|
|
libra_error_t libra_preset_get_param(libra_shader_preset_t *preset, const char *name, float *value);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Pretty print the shader preset.
|
|
|
|
*/
|
|
|
|
libra_error_t libra_preset_print(libra_shader_preset_t *preset);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get a list of runtime parameter names.
|
|
|
|
*
|
|
|
|
* The returned value can not currently be freed.
|
|
|
|
*/
|
|
|
|
libra_error_t libra_preset_get_runtime_param_names(libra_shader_preset_t *preset,
|
|
|
|
const char **value);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initialize the OpenGL Context for librashader.
|
|
|
|
*
|
|
|
|
* ## Safety
|
2022-12-04 11:55:27 +11:00
|
|
|
* Attempting to create a filter chain will fail.
|
2022-12-04 10:32:10 +11:00
|
|
|
*
|
|
|
|
* Reinitializing the OpenGL context with a different loader immediately invalidates previous filter
|
|
|
|
* chain objects, and drawing with them causes immediate undefined behaviour.
|
|
|
|
*/
|
|
|
|
libra_error_t libra_gl_init_context(gl_loader_t loader);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create the filter chain given the shader preset.
|
|
|
|
*
|
|
|
|
* The shader preset is immediately invalidated and must be recreated after
|
|
|
|
* the filter chain is created.
|
|
|
|
*
|
|
|
|
* ## Safety:
|
|
|
|
* - `preset` must be either null, or valid and aligned.
|
|
|
|
* - `options` must be either null, or valid and aligned.
|
|
|
|
* - `out` may be either null or uninitialized, but must be aligned.
|
|
|
|
*/
|
2022-12-04 11:55:27 +11:00
|
|
|
libra_error_t libra_gl_filter_chain_create(libra_shader_preset_t *preset,
|
2022-12-04 10:56:57 +11:00
|
|
|
const struct filter_chain_gl_opt_t *options,
|
2022-12-04 10:32:10 +11:00
|
|
|
libra_gl_filter_chain_t *out);
|
|
|
|
|
2022-12-04 10:56:57 +11:00
|
|
|
libra_error_t libra_gl_filter_chain_frame(libra_gl_filter_chain_t *chain,
|
|
|
|
size_t frame_count,
|
|
|
|
struct libra_source_image_gl_t image,
|
|
|
|
struct libra_viewport_t viewport,
|
|
|
|
struct libra_draw_framebuffer_gl_t out,
|
|
|
|
const float *mvp);
|
|
|
|
|
2022-12-04 11:55:27 +11:00
|
|
|
libra_error_t libra_gl_filter_chain_free(libra_gl_filter_chain_t *chain);
|
|
|
|
|
2022-12-04 10:32:10 +11:00
|
|
|
#ifdef __cplusplus
|
|
|
|
} // extern "C"
|
|
|
|
#endif // __cplusplus
|
|
|
|
|
|
|
|
#endif /* __LIBRASHADER_H__ */
|