lovr/src/modules/graphics/shader.h

136 lines
3.6 KiB
C
Raw Normal View History

#include "graphics/texture.h"
2021-02-09 01:25:05 +00:00
#include "core/util.h"
2017-10-31 08:14:09 +00:00
#include <stdbool.h>
2016-07-16 02:17:27 +00:00
2017-01-26 10:20:30 +00:00
#pragma once
2016-10-08 01:30:37 +00:00
2018-07-19 23:58:59 +00:00
#define LOVR_MAX_UNIFORM_LENGTH 64
#define LOVR_MAX_ATTRIBUTE_LENGTH 64
2019-04-05 11:58:29 +00:00
struct Buffer;
struct Texture;
typedef enum {
ACCESS_READ,
ACCESS_WRITE,
ACCESS_READ_WRITE
} UniformAccess;
typedef enum {
BLOCK_UNIFORM,
2019-01-16 16:52:21 +00:00
BLOCK_COMPUTE
} BlockType;
typedef enum {
UNIFORM_FLOAT,
UNIFORM_MATRIX,
UNIFORM_INT,
UNIFORM_SAMPLER,
UNIFORM_IMAGE
} UniformType;
typedef enum {
SHADER_GRAPHICS,
SHADER_COMPUTE
} ShaderType;
typedef enum {
FLAG_BOOL,
FLAG_INT
} ShaderFlagType;
typedef struct {
uint32_t index;
const char* name;
ShaderFlagType type;
union {
bool b32;
int32_t i32;
} value;
} ShaderFlag;
2017-08-09 07:56:13 +00:00
typedef enum {
2019-05-22 23:34:57 +00:00
SHADER_UNLIT,
2019-06-20 21:21:35 +00:00
SHADER_STANDARD,
SHADER_CUBE,
2018-03-05 10:02:25 +00:00
SHADER_PANO,
2017-08-09 07:56:13 +00:00
SHADER_FONT,
2018-07-17 06:51:11 +00:00
SHADER_FILL,
MAX_DEFAULT_SHADERS
2017-08-09 07:56:13 +00:00
} DefaultShader;
typedef struct {
2019-04-05 11:58:29 +00:00
struct Texture* texture;
int slice;
int mipmap;
UniformAccess access;
} StorageImage;
2019-05-18 00:11:22 +00:00
typedef struct Uniform {
2018-07-19 23:58:59 +00:00
char name[LOVR_MAX_UNIFORM_LENGTH];
2018-07-20 23:56:28 +00:00
UniformType type;
2018-07-19 23:58:59 +00:00
int components;
2018-07-20 23:56:28 +00:00
int count;
int location;
int offset;
int size;
2018-07-19 23:58:59 +00:00
union {
void* data;
char* bytes;
2018-07-19 23:58:59 +00:00
int* ints;
float* floats;
2019-04-05 11:58:29 +00:00
struct Texture** textures;
StorageImage* images;
2018-07-19 23:58:59 +00:00
} value;
TextureType textureType;
int baseSlot;
bool shadow;
2018-08-10 10:37:02 +00:00
bool image;
2018-07-19 23:58:59 +00:00
bool dirty;
} Uniform;
2019-08-22 06:16:08 +00:00
typedef arr_t(Uniform) arr_uniform_t;
2018-07-19 23:58:59 +00:00
typedef struct {
arr_uniform_t uniforms;
UniformAccess access;
2019-04-05 11:58:29 +00:00
struct Buffer* source;
size_t offset;
size_t size;
int slot;
} UniformBlock;
2019-08-22 06:16:08 +00:00
typedef arr_t(UniformBlock) arr_block_t;
// Shader
2020-02-23 06:42:05 +00:00
typedef struct Shader Shader;
Shader* lovrShaderCreateGraphics(const char* vertexSource, int vertexSourceLength, const char* fragmentSource, int fragmentSourceLength, ShaderFlag* flags, uint32_t flagCount, bool multiview);
Shader* lovrShaderCreateCompute(const char* source, int length, ShaderFlag* flags, uint32_t flagCount);
Shader* lovrShaderCreateDefault(DefaultShader type, ShaderFlag* flags, uint32_t flagCount, bool multiview);
2018-02-26 08:59:03 +00:00
void lovrShaderDestroy(void* ref);
2018-08-07 23:58:14 +00:00
ShaderType lovrShaderGetType(Shader* shader);
int lovrShaderGetAttributeLocation(Shader* shader, const char* name, bool* integer);
bool lovrShaderHasUniform(Shader* shader, const char* name);
bool lovrShaderHasBlock(Shader* shader, const char* name);
const Uniform* lovrShaderGetUniform(Shader* shader, const char* name);
void lovrShaderSetFloats(Shader* shader, const char* name, float* data, int start, int count);
void lovrShaderSetInts(Shader* shader, const char* name, int* data, int start, int count);
void lovrShaderSetMatrices(Shader* shader, const char* name, float* data, int start, int count);
2019-04-05 11:58:29 +00:00
void lovrShaderSetTextures(Shader* shader, const char* name, struct Texture** data, int start, int count);
void lovrShaderSetImages(Shader* shader, const char* name, StorageImage* data, int start, int count);
2018-08-31 13:03:35 +00:00
void lovrShaderSetColor(Shader* shader, const char* name, Color color);
2019-04-05 11:58:29 +00:00
void lovrShaderSetBlock(Shader* shader, const char* name, struct Buffer* buffer, size_t offset, size_t size, UniformAccess access);
2018-07-28 22:46:46 +00:00
// ShaderBlock
size_t lovrShaderComputeUniformLayout(arr_uniform_t* uniforms);
2020-02-23 06:42:05 +00:00
typedef struct ShaderBlock ShaderBlock;
ShaderBlock* lovrShaderBlockCreate(BlockType type, struct Buffer* buffer, arr_uniform_t* uniforms);
2018-07-28 22:46:46 +00:00
void lovrShaderBlockDestroy(void* ref);
2018-08-06 17:41:57 +00:00
BlockType lovrShaderBlockGetType(ShaderBlock* block);
char* lovrShaderBlockGetShaderCode(ShaderBlock* block, const char* blockName, const char* namespace, size_t* length);
const Uniform* lovrShaderBlockGetUniform(ShaderBlock* block, const char* name);
2019-04-05 11:58:29 +00:00
struct Buffer* lovrShaderBlockGetBuffer(ShaderBlock* block);