From cd226bdfd8d417e4316aca6d4e59b32561791f93 Mon Sep 17 00:00:00 2001 From: Niklas Haas Date: Tue, 25 Jul 2017 01:59:54 +0200 Subject: vo_opengl: fix incoherent texture usage This bug slipped past my attention because nvidia ignores memory barriers, but this is not necessarily always the case. Since image_load_store is incoherent (specifically, writing to images from compute shaders is incoherent) we need to insert a memory barrier to make it coherent again. Since we only care about texture fetches, that's the only barrier we need. --- video/out/opengl/gl_headers.h | 4 ++++ video/out/opengl/video.c | 1 + 2 files changed, 5 insertions(+) (limited to 'video') diff --git a/video/out/opengl/gl_headers.h b/video/out/opengl/gl_headers.h index a55749cbb7..c764d1fbef 100644 --- a/video/out/opengl/gl_headers.h +++ b/video/out/opengl/gl_headers.h @@ -79,6 +79,10 @@ #define GL_DYNAMIC_STORAGE_BIT 0x0100 #define GL_CLIENT_STORAGE_BIT 0x0200 +// --- GL 4.2 or GL_ARB_image_load_store + +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 + // -- GL 4.3 or GL_ARB_compute_shader #define GL_COMPUTE_SHADER 0x91B9 diff --git a/video/out/opengl/video.c b/video/out/opengl/video.c index d0efcd067d..5d94a62b2f 100644 --- a/video/out/opengl/video.c +++ b/video/out/opengl/video.c @@ -1274,6 +1274,7 @@ static void finish_pass_fbo(struct gl_video *p, struct fbotex *dst_fbo, dst_fbo->iformat, GL_WRITE_ONLY); GLSL(imageStore(out_image, ivec2(gl_GlobalInvocationID), color);) dispatch_compute(p, w, h, p->compute_w, p->compute_h); + p->gl->MemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT); } else { finish_pass_direct(p, dst_fbo->fbo, dst_fbo->rw, dst_fbo->rh, &(struct mp_rect){0, 0, w, h}); -- cgit v1.2.3