mirror of https://github.com/mpv-player/mpv
vo_opengl: add support for UBOs
Not actually used by anything yet, but straightforward enough to add to the RA API for starters.
This commit is contained in:
parent
8404a354e5
commit
136cf2b770
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue