From 136cf2b770f08a435710f71fe2fa597c908cc8a0 Mon Sep 17 00:00:00 2001 From: Niklas Haas Date: Sat, 26 Aug 2017 05:48:12 +0200 Subject: vo_opengl: add support for UBOs Not actually used by anything yet, but straightforward enough to add to the RA API for starters. --- video/out/opengl/common.c | 5 +++++ video/out/opengl/common.h | 7 ++++--- video/out/opengl/ra.h | 17 +++++++++++------ video/out/opengl/ra_gl.c | 10 ++++++++-- video/out/opengl/shader_cache.c | 5 +++++ 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/video/out/opengl/common.c b/video/out/opengl/common.c index f2550e8b8c..0b83555ad2 100644 --- a/video/out/opengl/common.c +++ b/video/out/opengl/common.c @@ -351,6 +351,11 @@ static const struct gl_functions gl_functions[] = { {0} }, }, + { + .ver_core = 310, + .extension = "GL_ARB_uniform_buffer_object", + .provides = MPGL_CAP_UBO, + }, { .ver_core = 430, .extension = "GL_ARB_shader_storage_buffer_object", diff --git a/video/out/opengl/common.h b/video/out/opengl/common.h index 1ec06fb3f3..7b2e3ed497 100644 --- a/video/out/opengl/common.h +++ b/video/out/opengl/common.h @@ -54,9 +54,10 @@ enum { MPGL_CAP_EXT16 = (1 << 18), // GL_EXT_texture_norm16 MPGL_CAP_ARB_FLOAT = (1 << 19), // GL_ARB_texture_float MPGL_CAP_EXT_CR_HFLOAT = (1 << 20), // GL_EXT_color_buffer_half_float - MPGL_CAP_SSBO = (1 << 21), // GL_ARB_shader_storage_buffer_object - MPGL_CAP_COMPUTE_SHADER = (1 << 22), // GL_ARB_compute_shader & GL_ARB_shader_image_load_store - MPGL_CAP_NESTED_ARRAY = (1 << 23), // GL_ARB_arrays_of_arrays + MPGL_CAP_UBO = (1 << 21), // GL_ARB_uniform_buffer_object + MPGL_CAP_SSBO = (1 << 22), // GL_ARB_shader_storage_buffer_object + MPGL_CAP_COMPUTE_SHADER = (1 << 23), // GL_ARB_compute_shader & GL_ARB_shader_image_load_store + MPGL_CAP_NESTED_ARRAY = (1 << 24), // GL_ARB_arrays_of_arrays MPGL_CAP_SW = (1 << 30), // indirect or sw renderer }; diff --git a/video/out/opengl/ra.h b/video/out/opengl/ra.h index 23e69790a6..bcd65e1027 100644 --- a/video/out/opengl/ra.h +++ b/video/out/opengl/ra.h @@ -43,9 +43,10 @@ enum { RA_CAP_BLIT = 1 << 2, // supports ra_fns.blit RA_CAP_COMPUTE = 1 << 3, // supports compute shaders RA_CAP_DIRECT_UPLOAD = 1 << 4, // supports tex_upload without ra_buf - RA_CAP_BUF_RW = 1 << 5, // supports RA_VARTYPE_BUF_RW - RA_CAP_NESTED_ARRAY = 1 << 6, // supports nested arrays - RA_CAP_SHARED_BINDING = 1 << 7, // sampler/image/buffer namespaces are disjoint + RA_CAP_BUF_RO = 1 << 5, // supports RA_VARTYPE_BUF_RO + RA_CAP_BUF_RW = 1 << 6, // supports RA_VARTYPE_BUF_RW + RA_CAP_NESTED_ARRAY = 1 << 7, // supports nested arrays + RA_CAP_SHARED_BINDING = 1 << 8, // sampler/image/buffer namespaces are disjoint }; enum ra_ctype { @@ -140,8 +141,9 @@ struct ra_tex_upload_params { // operation, although it shouldn't technically prohibit anything enum ra_buf_type { RA_BUF_TYPE_INVALID, - RA_BUF_TYPE_TEX_UPLOAD, // texture upload buffer (pixel buffer object) - RA_BUF_TYPE_SHADER_STORAGE // shader buffer, used for RA_VARTYPE_BUF_RW + RA_BUF_TYPE_TEX_UPLOAD, // texture upload buffer (pixel buffer object) + RA_BUF_TYPE_SHADER_STORAGE, // shader buffer (SSBO), for RA_VARTYPE_BUF_RW + RA_BUF_TYPE_UNIFORM, // uniform buffer (UBO), for RA_VARTYPE_BUF_RO }; struct ra_buf_params { @@ -175,7 +177,10 @@ enum ra_vartype { // write-only (W) image for compute shaders // ra_tex.params.storage_dst must be true RA_VARTYPE_BYTE_UNORM, // C: uint8_t, GLSL: int, vec* (vertex data only) - RA_VARTYPE_BUF_RW, // C: ra_buf*, GLSL: buffer block + RA_VARTYPE_BUF_RO, // C: ra_buf*, GLSL: uniform buffer block + // buf type must be RA_BUF_TYPE_UNIFORM + RA_VARTYPE_BUF_RW, // C: ra_buf*, GLSL: shader storage buffer block + // buf type must be RA_BUF_TYPE_SHADER_STORAGE RA_VARTYPE_COUNT }; diff --git a/video/out/opengl/ra_gl.c b/video/out/opengl/ra_gl.c index 1726980615..e18beb58f3 100644 --- a/video/out/opengl/ra_gl.c +++ b/video/out/opengl/ra_gl.c @@ -101,6 +101,7 @@ static int ra_init_gl(struct ra *ra, GL *gl) {RA_CAP_TEX_3D, MPGL_CAP_3D_TEX}, {RA_CAP_COMPUTE, MPGL_CAP_COMPUTE_SHADER}, {RA_CAP_NESTED_ARRAY, MPGL_CAP_NESTED_ARRAY}, + {RA_CAP_BUF_RO, MPGL_CAP_UBO}, {RA_CAP_BUF_RW, MPGL_CAP_SSBO}, }; @@ -533,6 +534,7 @@ static struct ra_buf *gl_buf_create(struct ra *ra, switch (params->type) { case RA_BUF_TYPE_TEX_UPLOAD: buf_gl->target = GL_PIXEL_UNPACK_BUFFER; break; case RA_BUF_TYPE_SHADER_STORAGE: buf_gl->target = GL_SHADER_STORAGE_BUFFER; break; + case RA_BUF_TYPE_UNIFORM: buf_gl->target = GL_UNIFORM_BUFFER; break; default: abort(); }; @@ -559,6 +561,7 @@ static struct ra_buf *gl_buf_create(struct ra *ra, switch (params->type) { case RA_BUF_TYPE_TEX_UPLOAD: hint = GL_STREAM_DRAW; break; case RA_BUF_TYPE_SHADER_STORAGE: hint = GL_STREAM_COPY; break; + case RA_BUF_TYPE_UNIFORM: hint = GL_STATIC_DRAW; break; default: abort(); } @@ -914,11 +917,14 @@ static void update_uniform(struct ra *ra, struct ra_renderpass *pass, gl->BindTexture(tex_gl->target, tex_gl->texture); break; } + case RA_VARTYPE_BUF_RO: // fall through case RA_VARTYPE_BUF_RW: { struct ra_buf *buf = *(struct ra_buf **)val->data; struct ra_buf_gl *buf_gl = buf->priv; - gl->BindBufferBase(GL_SHADER_STORAGE_BUFFER, input->binding, buf_gl->buffer); - gl->MemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); + gl->BindBufferBase(buf_gl->target, input->binding, buf_gl->buffer); + // SSBOs are not implicitly coherent in OpengL + if (input->type == RA_VARTYPE_BUF_RW) + gl->MemoryBarrier(buf_gl->target); break; } default: diff --git a/video/out/opengl/shader_cache.c b/video/out/opengl/shader_cache.c index 97374e781b..e5bddd7960 100644 --- a/video/out/opengl/shader_cache.c +++ b/video/out/opengl/shader_cache.c @@ -277,6 +277,7 @@ void gl_sc_uniform_image2D_wo(struct gl_shader_cache *sc, const char *name, void gl_sc_ssbo(struct gl_shader_cache *sc, char *name, struct ra_buf *buf, char *format, ...) { + assert(sc->ra->caps & RA_CAP_BUF_RW); gl_sc_enable_extension(sc, "GL_ARB_shader_storage_buffer_object"); struct sc_uniform *u = find_uniform(sc, name); @@ -526,6 +527,10 @@ static void add_uniforms(struct gl_shader_cache *sc, bstr *dst) case RA_VARTYPE_IMG_W: ADD(dst, "uniform %s %s;\n", u->glsl_type, u->input.name); break; + case RA_VARTYPE_BUF_RO: + ADD(dst, "layout(std140, binding=%d) uniform %s { %s };\n", + u->input.binding, u->input.name, u->buffer_format); + break; case RA_VARTYPE_BUF_RW: ADD(dst, "layout(std430, binding=%d) buffer %s { %s };\n", u->input.binding, u->input.name, u->buffer_format); -- cgit v1.2.3