2018-12-07 00:14:30 +00:00
|
|
|
#include "graphics/buffer.h"
|
2017-10-21 20:39:50 +00:00
|
|
|
#include "graphics/texture.h"
|
2018-12-19 07:53:51 +00:00
|
|
|
#include "graphics/opengl.h"
|
2018-07-19 23:58:59 +00:00
|
|
|
#include "lib/map/map.h"
|
|
|
|
#include "lib/vec/vec.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
|
|
|
|
|
2018-08-17 22:01:11 +00:00
|
|
|
typedef enum {
|
|
|
|
ACCESS_READ,
|
|
|
|
ACCESS_WRITE,
|
|
|
|
ACCESS_READ_WRITE
|
|
|
|
} UniformAccess;
|
|
|
|
|
2018-08-03 18:34:11 +00:00
|
|
|
typedef enum {
|
|
|
|
BLOCK_UNIFORM,
|
|
|
|
BLOCK_STORAGE
|
|
|
|
} BlockType;
|
|
|
|
|
2017-10-21 20:39:50 +00:00
|
|
|
typedef enum {
|
|
|
|
UNIFORM_FLOAT,
|
|
|
|
UNIFORM_MATRIX,
|
|
|
|
UNIFORM_INT,
|
2018-08-18 02:52:34 +00:00
|
|
|
UNIFORM_SAMPLER,
|
|
|
|
UNIFORM_IMAGE
|
2017-10-21 20:39:50 +00:00
|
|
|
} UniformType;
|
|
|
|
|
2018-08-07 23:34:35 +00:00
|
|
|
typedef enum {
|
|
|
|
SHADER_GRAPHICS,
|
|
|
|
SHADER_COMPUTE
|
|
|
|
} ShaderType;
|
|
|
|
|
2017-08-09 07:56:13 +00:00
|
|
|
typedef enum {
|
|
|
|
SHADER_DEFAULT,
|
2018-03-11 07:18:07 +00:00
|
|
|
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;
|
|
|
|
|
2018-08-18 02:52:34 +00:00
|
|
|
typedef struct {
|
|
|
|
Texture* texture;
|
|
|
|
int slice;
|
|
|
|
int mipmap;
|
|
|
|
UniformAccess access;
|
|
|
|
} Image;
|
|
|
|
|
2018-07-19 23:58:59 +00:00
|
|
|
typedef struct {
|
|
|
|
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;
|
2018-07-28 22:40:13 +00:00
|
|
|
int offset;
|
|
|
|
int size;
|
2018-07-19 23:58:59 +00:00
|
|
|
union {
|
|
|
|
void* data;
|
2018-08-18 02:52:34 +00:00
|
|
|
char* bytes;
|
2018-07-19 23:58:59 +00:00
|
|
|
int* ints;
|
|
|
|
float* floats;
|
|
|
|
Texture** textures;
|
2018-08-18 02:52:34 +00:00
|
|
|
Image* images;
|
2018-07-19 23:58:59 +00:00
|
|
|
} value;
|
2018-08-10 02:25:51 +00:00
|
|
|
TextureType textureType;
|
2018-08-18 02:52:34 +00:00
|
|
|
int baseSlot;
|
2018-08-10 10:37:02 +00:00
|
|
|
bool image;
|
2018-07-19 23:58:59 +00:00
|
|
|
bool dirty;
|
|
|
|
} Uniform;
|
|
|
|
|
2018-07-28 22:40:13 +00:00
|
|
|
typedef vec_t(Uniform) vec_uniform_t;
|
2018-07-19 23:58:59 +00:00
|
|
|
|
2018-12-19 07:53:51 +00:00
|
|
|
typedef struct {
|
|
|
|
Ref ref;
|
|
|
|
BlockType type;
|
|
|
|
vec_uniform_t uniforms;
|
|
|
|
map_int_t uniformMap;
|
|
|
|
Buffer* buffer;
|
|
|
|
GPU_SHADER_BLOCK_FIELDS
|
|
|
|
} ShaderBlock;
|
2018-07-09 07:51:09 +00:00
|
|
|
|
2018-08-18 02:52:34 +00:00
|
|
|
typedef struct {
|
|
|
|
vec_uniform_t uniforms;
|
|
|
|
int slot;
|
|
|
|
ShaderBlock* source;
|
|
|
|
UniformAccess access;
|
|
|
|
} UniformBlock;
|
|
|
|
|
|
|
|
typedef vec_t(UniformBlock) vec_block_t;
|
|
|
|
|
2018-12-19 07:53:51 +00:00
|
|
|
typedef struct {
|
|
|
|
Ref ref;
|
|
|
|
ShaderType type;
|
|
|
|
vec_uniform_t uniforms;
|
|
|
|
vec_block_t blocks[2];
|
|
|
|
map_int_t attributes;
|
|
|
|
map_int_t uniformMap;
|
|
|
|
map_int_t blockMap;
|
|
|
|
GPU_SHADER_FIELDS
|
|
|
|
} Shader;
|
|
|
|
|
2018-12-25 05:08:06 +00:00
|
|
|
// Shader
|
|
|
|
|
2018-12-19 08:15:08 +00:00
|
|
|
Shader* lovrShaderInitGraphics(Shader* shader, const char* vertexSource, const char* fragmentSource);
|
|
|
|
Shader* lovrShaderInitCompute(Shader* shader, const char* source);
|
|
|
|
Shader* lovrShaderInitDefault(Shader* shader, DefaultShader type);
|
2018-12-19 08:25:20 +00:00
|
|
|
#define lovrShaderCreateGraphics(...) lovrShaderInitGraphics(lovrAlloc(Shader), __VA_ARGS__)
|
|
|
|
#define lovrShaderCreateCompute(...) lovrShaderInitCompute(lovrAlloc(Shader), __VA_ARGS__)
|
|
|
|
#define lovrShaderCreateDefault(...) lovrShaderInitDefault(lovrAlloc(Shader), __VA_ARGS__)
|
2018-02-26 08:59:03 +00:00
|
|
|
void lovrShaderDestroy(void* ref);
|
2018-08-07 23:58:14 +00:00
|
|
|
ShaderType lovrShaderGetType(Shader* shader);
|
2016-11-13 10:35:26 +00:00
|
|
|
int lovrShaderGetAttributeId(Shader* shader, const char* name);
|
2018-07-09 09:05:30 +00:00
|
|
|
bool lovrShaderHasUniform(Shader* shader, const char* name);
|
2018-08-01 01:23:04 +00:00
|
|
|
const Uniform* lovrShaderGetUniform(Shader* shader, const char* name);
|
2018-08-18 02:52:34 +00:00
|
|
|
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);
|
|
|
|
void lovrShaderSetTextures(Shader* shader, const char* name, Texture** data, int start, int count);
|
|
|
|
void lovrShaderSetImages(Shader* shader, const char* name, Image* data, int start, int count);
|
2018-08-31 13:03:35 +00:00
|
|
|
void lovrShaderSetColor(Shader* shader, const char* name, Color color);
|
2018-08-17 22:09:13 +00:00
|
|
|
void lovrShaderSetBlock(Shader* shader, const char* name, ShaderBlock* block, UniformAccess access);
|
2018-07-28 22:46:46 +00:00
|
|
|
|
2018-12-25 05:08:06 +00:00
|
|
|
// ShaderBlock
|
|
|
|
|
2018-12-19 08:15:08 +00:00
|
|
|
ShaderBlock* lovrShaderBlockInit(ShaderBlock* block, vec_uniform_t* uniforms, BlockType type, BufferUsage usage);
|
2018-12-19 08:25:20 +00:00
|
|
|
#define lovrShaderBlockCreate(...) lovrShaderBlockInit(lovrAlloc(ShaderBlock), __VA_ARGS__)
|
2018-07-28 22:46:46 +00:00
|
|
|
void lovrShaderBlockDestroy(void* ref);
|
2018-08-06 17:41:57 +00:00
|
|
|
BlockType lovrShaderBlockGetType(ShaderBlock* block);
|
2018-08-06 18:46:42 +00:00
|
|
|
char* lovrShaderBlockGetShaderCode(ShaderBlock* block, const char* blockName, size_t* length);
|
2018-08-01 01:23:04 +00:00
|
|
|
const Uniform* lovrShaderBlockGetUniform(ShaderBlock* block, const char* name);
|
2018-12-07 00:34:14 +00:00
|
|
|
Buffer* lovrShaderBlockGetBuffer(ShaderBlock* block);
|