ssbo impl
parent
34c58f04a9
commit
5af4968eed
|
@ -5,16 +5,30 @@ int main() {
|
|||
window_create(50, WINDOW_SQUARE);
|
||||
window_title(__FILE__);
|
||||
|
||||
unsigned TEX_WIDTH = 1000;
|
||||
|
||||
unsigned comp = compute(vfs_read("shaders/compute-test.glsl"));
|
||||
texture_t tex = texture_create(512, 512, 4, 0, TEXTURE_LINEAR|TEXTURE_FLOAT);
|
||||
texture_t tex = texture_create(TEX_WIDTH, TEX_WIDTH, 4, 0, TEXTURE_LINEAR|TEXTURE_FLOAT);
|
||||
shader_bind(comp);
|
||||
shader_image(tex, 0, 0, 0, READ);
|
||||
|
||||
struct {
|
||||
float f;
|
||||
} data;
|
||||
|
||||
unsigned buf = ssbo_create(&data, sizeof(data), STREAM_DRAW);
|
||||
|
||||
while ( window_swap() && !input_down(KEY_ESC) ){
|
||||
if (input(KEY_F5)) window_reload();
|
||||
|
||||
shader_bind(comp);
|
||||
shader_float("t", (float)window_time());
|
||||
shader_image(tex, 0, 0, -1, READ);
|
||||
dispatch(512, 512, 1);
|
||||
data.f = (float)window_time();
|
||||
ssbo_bind(buf, 1);
|
||||
ssbo_update(0, sizeof(data), &data);
|
||||
|
||||
dispatch(TEX_WIDTH/10, TEX_WIDTH/10, 1);
|
||||
image_write_barrier();
|
||||
|
||||
fullscreen_quad_rgb(tex, 2.2);
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,9 @@ layout (local_size_x = 10, local_size_y = 10, local_size_z = 1) in;
|
|||
|
||||
layout(rgba32f, binding = 0) uniform image2D imgOutput;
|
||||
|
||||
layout (location = 0) uniform float t; /** Time */
|
||||
layout (binding = 1) buffer ssbo_data {
|
||||
float t;
|
||||
};
|
||||
|
||||
void main() {
|
||||
vec4 value = vec4(0.0, 0.0, 0.0, 1.0);
|
||||
|
|
|
@ -2370,6 +2370,24 @@ READ_WRITE
|
|||
void shader_image_unit(unsigned texture, unsigned unit, unsigned level, int layer , unsigned texel_type, unsigned access);
|
||||
void image_write_barrier();
|
||||
void write_barrier();
|
||||
enum USAGE_MODE {
|
||||
STATIC_DRAW,
|
||||
STATIC_READ,
|
||||
STATIC_COPY,
|
||||
DYNAMIC_DRAW,
|
||||
DYNAMIC_READ,
|
||||
DYNAMIC_COPY,
|
||||
STREAM_DRAW,
|
||||
STREAM_READ,
|
||||
STREAM_COPY
|
||||
};
|
||||
unsigned ssbo_create(const void *data, int len, unsigned usage);
|
||||
void ssbo_destroy(unsigned ssbo);
|
||||
void ssbo_update(int offset, int len, const void *data);
|
||||
void ssbo_bind(unsigned ssbo, unsigned unit);
|
||||
void *ssbo_map(unsigned access);
|
||||
void ssbo_unmap();
|
||||
void ssbo_unbind();
|
||||
enum MESH_FLAGS {
|
||||
MESH_STATIC = 0,
|
||||
MESH_STREAM = 1,
|
||||
|
|
|
@ -16496,6 +16496,29 @@ API void shader_image_unit(unsigned texture, unsigned unit, unsigned level, int
|
|||
API void image_write_barrier();
|
||||
API void write_barrier();
|
||||
|
||||
// ssbo
|
||||
enum USAGE_MODE {
|
||||
STATIC_DRAW,
|
||||
STATIC_READ,
|
||||
STATIC_COPY,
|
||||
|
||||
DYNAMIC_DRAW,
|
||||
DYNAMIC_READ,
|
||||
DYNAMIC_COPY,
|
||||
|
||||
STREAM_DRAW,
|
||||
STREAM_READ,
|
||||
STREAM_COPY
|
||||
};
|
||||
|
||||
API unsigned ssbo_create(const void *data, int len, unsigned usage);
|
||||
API void ssbo_destroy(unsigned ssbo);
|
||||
API void ssbo_update(int offset, int len, const void *data);
|
||||
API void ssbo_bind(unsigned ssbo, unsigned unit);
|
||||
API void *ssbo_map(unsigned access);
|
||||
API void ssbo_unmap();
|
||||
API void ssbo_unbind();
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// meshes (@fixme: deprecate?)
|
||||
|
||||
|
@ -340115,7 +340138,7 @@ unsigned compute(const char *cs){
|
|||
#else
|
||||
PRINTF(/*"!"*/"Compiling compute shader\n");
|
||||
|
||||
cs = cs[0] == '#' && cs[1] == 'c' ? cs : va("#version 430 core\n%s", cs ? cs : "");
|
||||
cs = cs[0] == '#' && cs[1] == 'c' ? cs : va("#version 450 core\n%s", cs ? cs : "");
|
||||
|
||||
GLuint comp = shader_compile(GL_COMPUTE_SHADER, cs);
|
||||
GLuint program = 0;
|
||||
|
@ -340169,6 +340192,40 @@ void shader_destroy(unsigned program){
|
|||
// if(s->name) FREE(s->name), s->name = NULL;
|
||||
}
|
||||
|
||||
unsigned ssbo_create(const void *data, int len, unsigned usage){
|
||||
static GLuint gl_usage[] = { GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, GL_DYNAMIC_COPY, GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY };
|
||||
GLuint ssbo;
|
||||
glGenBuffers(1, &ssbo);
|
||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
|
||||
glBufferData(GL_SHADER_STORAGE_BUFFER, len, data, gl_usage[usage]);
|
||||
return ssbo;
|
||||
}
|
||||
|
||||
void ssbo_destroy(unsigned ssbo){
|
||||
glDeleteBuffers(1, &ssbo);
|
||||
}
|
||||
|
||||
void ssbo_update(int offset, int len, const void *data){
|
||||
glBufferSubData(GL_SHADER_STORAGE_BUFFER, offset, len, data);
|
||||
}
|
||||
|
||||
void *ssbo_map(unsigned access){
|
||||
static GLenum gl_access[] = {GL_READ_ONLY, GL_WRITE_ONLY, GL_READ_WRITE};
|
||||
return glMapBuffer(GL_SHADER_STORAGE_BUFFER, gl_access[access]);
|
||||
}
|
||||
void ssbo_unmap(){
|
||||
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
|
||||
}
|
||||
|
||||
void ssbo_bind(unsigned ssbo, unsigned unit){
|
||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
|
||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, unit, ssbo);
|
||||
}
|
||||
|
||||
void ssbo_unbind(){
|
||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
||||
}
|
||||
|
||||
static __thread unsigned last_shader = -1;
|
||||
static
|
||||
int shader_uniform(const char *name) {
|
||||
|
@ -340199,7 +340256,7 @@ void shader_image(texture_t t, unsigned unit, unsigned level, int layer /* -1 to
|
|||
shader_image_unit(t.id, unit, level, layer, t.texel_type, access);
|
||||
}
|
||||
void shader_image_unit(unsigned texture, unsigned unit, unsigned level, int layer, unsigned texel_type, unsigned access){
|
||||
GLenum gl_access[] = {GL_READ_ONLY, GL_WRITE_ONLY, GL_READ_WRITE};
|
||||
static GLenum gl_access[] = {GL_READ_ONLY, GL_WRITE_ONLY, GL_READ_WRITE};
|
||||
glBindImageTexture(unit, texture, level, layer!=-1, layer!=-1?layer:0, gl_access[access], texel_type);
|
||||
}
|
||||
|
||||
|
@ -349545,7 +349602,7 @@ void window_hints(unsigned flags) {
|
|||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); // osx, 2:#version150,3:330
|
||||
#else
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
|
||||
#endif
|
||||
#ifdef __APPLE__
|
||||
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //osx
|
||||
|
|
|
@ -200,7 +200,7 @@ unsigned compute(const char *cs){
|
|||
#else
|
||||
PRINTF(/*"!"*/"Compiling compute shader\n");
|
||||
|
||||
cs = cs[0] == '#' && cs[1] == 'c' ? cs : va("#version 430 core\n%s", cs ? cs : "");
|
||||
cs = cs[0] == '#' && cs[1] == 'c' ? cs : va("#version 450 core\n%s", cs ? cs : "");
|
||||
|
||||
GLuint comp = shader_compile(GL_COMPUTE_SHADER, cs);
|
||||
GLuint program = 0;
|
||||
|
@ -254,6 +254,40 @@ void shader_destroy(unsigned program){
|
|||
// if(s->name) FREE(s->name), s->name = NULL;
|
||||
}
|
||||
|
||||
unsigned ssbo_create(const void *data, int len, unsigned usage){
|
||||
static GLuint gl_usage[] = { GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, GL_DYNAMIC_COPY, GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY };
|
||||
GLuint ssbo;
|
||||
glGenBuffers(1, &ssbo);
|
||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
|
||||
glBufferData(GL_SHADER_STORAGE_BUFFER, len, data, gl_usage[usage]);
|
||||
return ssbo;
|
||||
}
|
||||
|
||||
void ssbo_destroy(unsigned ssbo){
|
||||
glDeleteBuffers(1, &ssbo);
|
||||
}
|
||||
|
||||
void ssbo_update(int offset, int len, const void *data){
|
||||
glBufferSubData(GL_SHADER_STORAGE_BUFFER, offset, len, data);
|
||||
}
|
||||
|
||||
void *ssbo_map(unsigned access){
|
||||
static GLenum gl_access[] = {GL_READ_ONLY, GL_WRITE_ONLY, GL_READ_WRITE};
|
||||
return glMapBuffer(GL_SHADER_STORAGE_BUFFER, gl_access[access]);
|
||||
}
|
||||
void ssbo_unmap(){
|
||||
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
|
||||
}
|
||||
|
||||
void ssbo_bind(unsigned ssbo, unsigned unit){
|
||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
|
||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, unit, ssbo);
|
||||
}
|
||||
|
||||
void ssbo_unbind(){
|
||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
||||
}
|
||||
|
||||
static __thread unsigned last_shader = -1;
|
||||
static
|
||||
int shader_uniform(const char *name) {
|
||||
|
@ -284,7 +318,7 @@ void shader_image(texture_t t, unsigned unit, unsigned level, int layer /* -1 to
|
|||
shader_image_unit(t.id, unit, level, layer, t.texel_type, access);
|
||||
}
|
||||
void shader_image_unit(unsigned texture, unsigned unit, unsigned level, int layer, unsigned texel_type, unsigned access){
|
||||
GLenum gl_access[] = {GL_READ_ONLY, GL_WRITE_ONLY, GL_READ_WRITE};
|
||||
static GLenum gl_access[] = {GL_READ_ONLY, GL_WRITE_ONLY, GL_READ_WRITE};
|
||||
glBindImageTexture(unit, texture, level, layer!=-1, layer!=-1?layer:0, gl_access[access], texel_type);
|
||||
}
|
||||
|
||||
|
|
|
@ -341,6 +341,29 @@ API void shader_image_unit(unsigned texture, unsigned unit, unsigned level, int
|
|||
API void image_write_barrier();
|
||||
API void write_barrier();
|
||||
|
||||
// ssbo
|
||||
enum USAGE_MODE {
|
||||
STATIC_DRAW,
|
||||
STATIC_READ,
|
||||
STATIC_COPY,
|
||||
|
||||
DYNAMIC_DRAW,
|
||||
DYNAMIC_READ,
|
||||
DYNAMIC_COPY,
|
||||
|
||||
STREAM_DRAW,
|
||||
STREAM_READ,
|
||||
STREAM_COPY
|
||||
};
|
||||
|
||||
API unsigned ssbo_create(const void *data, int len, unsigned usage);
|
||||
API void ssbo_destroy(unsigned ssbo);
|
||||
API void ssbo_update(int offset, int len, const void *data);
|
||||
API void ssbo_bind(unsigned ssbo, unsigned unit);
|
||||
API void *ssbo_map(unsigned access);
|
||||
API void ssbo_unmap();
|
||||
API void ssbo_unbind();
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// meshes (@fixme: deprecate?)
|
||||
|
||||
|
|
|
@ -175,7 +175,7 @@ void window_hints(unsigned flags) {
|
|||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); // osx, 2:#version150,3:330
|
||||
#else
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
|
||||
#endif
|
||||
#ifdef __APPLE__
|
||||
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //osx
|
||||
|
|
40
engine/v4k.c
40
engine/v4k.c
|
@ -11114,7 +11114,7 @@ unsigned compute(const char *cs){
|
|||
#else
|
||||
PRINTF(/*"!"*/"Compiling compute shader\n");
|
||||
|
||||
cs = cs[0] == '#' && cs[1] == 'c' ? cs : va("#version 430 core\n%s", cs ? cs : "");
|
||||
cs = cs[0] == '#' && cs[1] == 'c' ? cs : va("#version 450 core\n%s", cs ? cs : "");
|
||||
|
||||
GLuint comp = shader_compile(GL_COMPUTE_SHADER, cs);
|
||||
GLuint program = 0;
|
||||
|
@ -11168,6 +11168,40 @@ void shader_destroy(unsigned program){
|
|||
// if(s->name) FREE(s->name), s->name = NULL;
|
||||
}
|
||||
|
||||
unsigned ssbo_create(const void *data, int len, unsigned usage){
|
||||
static GLuint gl_usage[] = { GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, GL_DYNAMIC_COPY, GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY };
|
||||
GLuint ssbo;
|
||||
glGenBuffers(1, &ssbo);
|
||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
|
||||
glBufferData(GL_SHADER_STORAGE_BUFFER, len, data, gl_usage[usage]);
|
||||
return ssbo;
|
||||
}
|
||||
|
||||
void ssbo_destroy(unsigned ssbo){
|
||||
glDeleteBuffers(1, &ssbo);
|
||||
}
|
||||
|
||||
void ssbo_update(int offset, int len, const void *data){
|
||||
glBufferSubData(GL_SHADER_STORAGE_BUFFER, offset, len, data);
|
||||
}
|
||||
|
||||
void *ssbo_map(unsigned access){
|
||||
static GLenum gl_access[] = {GL_READ_ONLY, GL_WRITE_ONLY, GL_READ_WRITE};
|
||||
return glMapBuffer(GL_SHADER_STORAGE_BUFFER, gl_access[access]);
|
||||
}
|
||||
void ssbo_unmap(){
|
||||
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
|
||||
}
|
||||
|
||||
void ssbo_bind(unsigned ssbo, unsigned unit){
|
||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
|
||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, unit, ssbo);
|
||||
}
|
||||
|
||||
void ssbo_unbind(){
|
||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
||||
}
|
||||
|
||||
static __thread unsigned last_shader = -1;
|
||||
static
|
||||
int shader_uniform(const char *name) {
|
||||
|
@ -11198,7 +11232,7 @@ void shader_image(texture_t t, unsigned unit, unsigned level, int layer /* -1 to
|
|||
shader_image_unit(t.id, unit, level, layer, t.texel_type, access);
|
||||
}
|
||||
void shader_image_unit(unsigned texture, unsigned unit, unsigned level, int layer, unsigned texel_type, unsigned access){
|
||||
GLenum gl_access[] = {GL_READ_ONLY, GL_WRITE_ONLY, GL_READ_WRITE};
|
||||
static GLenum gl_access[] = {GL_READ_ONLY, GL_WRITE_ONLY, GL_READ_WRITE};
|
||||
glBindImageTexture(unit, texture, level, layer!=-1, layer!=-1?layer:0, gl_access[access], texel_type);
|
||||
}
|
||||
|
||||
|
@ -20544,7 +20578,7 @@ void window_hints(unsigned flags) {
|
|||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); // osx, 2:#version150,3:330
|
||||
#else
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
|
||||
#endif
|
||||
#ifdef __APPLE__
|
||||
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //osx
|
||||
|
|
23
engine/v4k.h
23
engine/v4k.h
|
@ -2579,6 +2579,29 @@ API void shader_image_unit(unsigned texture, unsigned unit, unsigned level, int
|
|||
API void image_write_barrier();
|
||||
API void write_barrier();
|
||||
|
||||
// ssbo
|
||||
enum USAGE_MODE {
|
||||
STATIC_DRAW,
|
||||
STATIC_READ,
|
||||
STATIC_COPY,
|
||||
|
||||
DYNAMIC_DRAW,
|
||||
DYNAMIC_READ,
|
||||
DYNAMIC_COPY,
|
||||
|
||||
STREAM_DRAW,
|
||||
STREAM_READ,
|
||||
STREAM_COPY
|
||||
};
|
||||
|
||||
API unsigned ssbo_create(const void *data, int len, unsigned usage);
|
||||
API void ssbo_destroy(unsigned ssbo);
|
||||
API void ssbo_update(int offset, int len, const void *data);
|
||||
API void ssbo_bind(unsigned ssbo, unsigned unit);
|
||||
API void *ssbo_map(unsigned access);
|
||||
API void ssbo_unmap();
|
||||
API void ssbo_unbind();
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// meshes (@fixme: deprecate?)
|
||||
|
||||
|
|
107
engine/v4k.html
107
engine/v4k.html
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue