From 41dff03f8d856273e4a87293f87887d9940009fa Mon Sep 17 00:00:00 2001 From: James Ross-Gowan Date: Sun, 22 Oct 2017 00:10:09 +1100 Subject: vo_gpu: add namespace query mechanism Backported from @haasn's change to libplacebo. More flexible than the previous "shared || non-shared" distinction. The extra flexibility is needed for Direct3D 11, but it also doesn't hurt code-wise. --- video/out/gpu/ra.h | 12 ++++++++---- video/out/gpu/shader_cache.c | 6 +----- video/out/opengl/ra_gl.c | 7 ++++++- video/out/vulkan/ra_vk.c | 6 ++++++ 4 files changed, 21 insertions(+), 10 deletions(-) (limited to 'video') diff --git a/video/out/gpu/ra.h b/video/out/gpu/ra.h index 15fa782bdd..5c5c851e64 100644 --- a/video/out/gpu/ra.h +++ b/video/out/gpu/ra.h @@ -50,8 +50,7 @@ enum { 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 - RA_CAP_GLOBAL_UNIFORM = 1 << 9, // supports using "naked" uniforms (not UBO) + RA_CAP_GLOBAL_UNIFORM = 1 << 8, // supports using "naked" uniforms (not UBO) }; enum ra_ctype { @@ -206,8 +205,8 @@ struct ra_renderpass_input { // RA_VARTYPE_IMG_W: image unit // RA_VARTYPE_BUF_* buffer binding point // Other uniforms: unused - // If RA_CAP_SHARED_BINDING is set, these may only be unique per input type. - // Otherwise, these must be unique for all input values. + // Bindings must be unique within each namespace, as specified by + // desc_namespace() int binding; }; @@ -396,6 +395,11 @@ struct ra_fns { // but must be implemented if ra.max_pushc_size > 0. struct ra_layout (*push_constant_layout)(struct ra_renderpass_input *inp); + // Returns an abstract namespace index for a given renderpass input type. + // This will always be a value >= 0 and < RA_VARTYPE_COUNT. This is used to + // figure out which inputs may share the same value of `binding`. + int (*desc_namespace)(enum ra_vartype type); + // Clear the dst with the given color (rgba) and within the given scissor. // dst must have dst->params.render_dst==true. Content outside of the // scissor is preserved. diff --git a/video/out/gpu/shader_cache.c b/video/out/gpu/shader_cache.c index c3eccac9e9..f191a7198c 100644 --- a/video/out/gpu/shader_cache.c +++ b/video/out/gpu/shader_cache.c @@ -254,11 +254,7 @@ static struct sc_uniform *find_uniform(struct gl_shader_cache *sc, static int gl_sc_next_binding(struct gl_shader_cache *sc, enum ra_vartype type) { - if (sc->ra->caps & RA_CAP_SHARED_BINDING) { - return sc->next_binding[type]++; - } else { - return sc->next_binding[0]++; - } + return sc->next_binding[sc->ra->fns->desc_namespace(type)]++; } void gl_sc_uniform_dynamic(struct gl_shader_cache *sc) diff --git a/video/out/opengl/ra_gl.c b/video/out/opengl/ra_gl.c index ae6cd00765..86488b11ab 100644 --- a/video/out/opengl/ra_gl.c +++ b/video/out/opengl/ra_gl.c @@ -96,7 +96,6 @@ static int ra_init_gl(struct ra *ra, GL *gl) static const int caps_map[][2] = { {RA_CAP_DIRECT_UPLOAD, 0}, - {RA_CAP_SHARED_BINDING, 0}, {RA_CAP_GLOBAL_UNIFORM, 0}, {RA_CAP_TEX_1D, MPGL_CAP_1D_TEX}, {RA_CAP_TEX_3D, MPGL_CAP_3D_TEX}, @@ -653,6 +652,11 @@ static void gl_blit(struct ra *ra, struct ra_tex *dst, struct ra_tex *src, gl->BindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); } +static int gl_desc_namespace(enum ra_vartype type) +{ + return type; +} + static void gl_renderpass_destroy(struct ra *ra, struct ra_renderpass *pass) { GL *gl = ra_gl_get(ra); @@ -1122,6 +1126,7 @@ static struct ra_fns ra_fns_gl = { .clear = gl_clear, .blit = gl_blit, .uniform_layout = std140_layout, + .desc_namespace = gl_desc_namespace, .renderpass_create = gl_renderpass_create, .renderpass_destroy = gl_renderpass_destroy, .renderpass_run = gl_renderpass_run, diff --git a/video/out/vulkan/ra_vk.c b/video/out/vulkan/ra_vk.c index 9f5581d5c1..a39261f049 100644 --- a/video/out/vulkan/ra_vk.c +++ b/video/out/vulkan/ra_vk.c @@ -1585,6 +1585,11 @@ static void vk_clear(struct ra *ra, struct ra_tex *tex, float color[4], } } +static int vk_desc_namespace(enum ra_vartype type) +{ + return 0; +} + #define VK_QUERY_POOL_SIZE (MPVK_MAX_STREAMING_DEPTH * 4) struct vk_timer { @@ -1688,6 +1693,7 @@ static struct ra_fns ra_fns_vk = { .blit = vk_blit, .uniform_layout = std140_layout, .push_constant_layout = std430_layout, + .desc_namespace = vk_desc_namespace, .renderpass_create = vk_renderpass_create, .renderpass_destroy = vk_renderpass_destroy_lazy, .renderpass_run = vk_renderpass_run, -- cgit v1.2.3