diff options
Diffstat (limited to 'video/out/opengl/ra_gl.c')
-rw-r--r-- | video/out/opengl/ra_gl.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/video/out/opengl/ra_gl.c b/video/out/opengl/ra_gl.c index b7deba9fbe..f535f1f13d 100644 --- a/video/out/opengl/ra_gl.c +++ b/video/out/opengl/ra_gl.c @@ -103,6 +103,7 @@ static int ra_init_gl(struct ra *ra, GL *gl) {RA_CAP_COMPUTE, MPGL_CAP_COMPUTE_SHADER}, {RA_CAP_NUM_GROUPS, MPGL_CAP_COMPUTE_SHADER}, {RA_CAP_NESTED_ARRAY, MPGL_CAP_NESTED_ARRAY}, + {RA_CAP_SLOW_DR, MPGL_CAP_SLOW_DR}, }; for (int i = 0; i < MP_ARRAY_SIZE(caps_map); i++) { @@ -117,8 +118,8 @@ static int ra_init_gl(struct ra *ra, GL *gl) ra->caps |= RA_CAP_BUF_RW; } - // textureGather is only supported in GLSL 400+ - if (ra->glsl_version >= 400) + // textureGather is only supported in GLSL 400+ / ES 310+ + if (ra->glsl_version >= (ra->glsl_es ? 310 : 400)) ra->caps |= RA_CAP_GATHER; if (gl->BlitFramebuffer) @@ -127,7 +128,14 @@ static int ra_init_gl(struct ra *ra, GL *gl) // Disable compute shaders for GLSL < 420. This work-around is needed since // some buggy OpenGL drivers expose compute shaders for lower GLSL versions, // despite the spec requiring 420+. - if (ra->glsl_version < 420) + if (ra->glsl_version < (ra->glsl_es ? 310 : 420)) { + ra->caps &= ~RA_CAP_COMPUTE; + } + + // While we can handle compute shaders on GLES the spec (intentionally) + // does not support binding textures for writing, which all uses inside mpv + // would require. So disable it unconditionally anyway. + if (ra->glsl_es) ra->caps &= ~RA_CAP_COMPUTE; int gl_fmt_features = gl_format_feature_flags(gl); @@ -217,6 +225,8 @@ static int ra_init_gl(struct ra *ra, GL *gl) if (ra->caps & RA_CAP_COMPUTE) { gl->GetIntegerv(GL_MAX_COMPUTE_SHARED_MEMORY_SIZE, &ival); ra->max_shmem = ival; + gl->GetIntegerv(GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS, &ival); + ra->max_compute_group_threads = ival; } gl->Disable(GL_DITHER); @@ -286,7 +296,7 @@ static struct ra_tex *gl_tex_create_blank(struct ra *ra, case 1: tex_gl->target = GL_TEXTURE_1D; break; case 2: tex_gl->target = GL_TEXTURE_2D; break; case 3: tex_gl->target = GL_TEXTURE_3D; break; - default: abort(); + default: MP_ASSERT_UNREACHABLE(); } if (params->non_normalized) { assert(params->dimensions == 2); @@ -581,7 +591,7 @@ static struct ra_buf *gl_buf_create(struct ra *ra, { GL *gl = ra_gl_get(ra); - if (params->host_mapped && gl->version < 440) + if (params->host_mapped && !gl->BufferStorage) return NULL; struct ra_buf *buf = talloc_zero(NULL, struct ra_buf); @@ -622,7 +632,7 @@ static struct ra_buf *gl_buf_create(struct ra *ra, 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(); + default: MP_ASSERT_UNREACHABLE(); } gl->BufferData(buf_gl->target, params->size, params->initial_data, hint); @@ -729,7 +739,7 @@ static const char *shader_typestr(GLenum type) case GL_VERTEX_SHADER: return "vertex"; case GL_FRAGMENT_SHADER: return "fragment"; case GL_COMPUTE_SHADER: return "compute"; - default: abort(); + default: MP_ASSERT_UNREACHABLE(); } } @@ -955,14 +965,14 @@ static void update_uniform(struct ra *ra, struct ra_renderpass *pass, case 2: gl->Uniform2f(loc, f[0], f[1]); break; case 3: gl->Uniform3f(loc, f[0], f[1], f[2]); break; case 4: gl->Uniform4f(loc, f[0], f[1], f[2], f[3]); break; - default: abort(); + default: MP_ASSERT_UNREACHABLE(); } } else if (input->dim_v == 2 && input->dim_m == 2) { gl->UniformMatrix2fv(loc, 1, GL_FALSE, f); } else if (input->dim_v == 3 && input->dim_m == 3) { gl->UniformMatrix3fv(loc, 1, GL_FALSE, f); } else { - abort(); + MP_ASSERT_UNREACHABLE(); } break; } @@ -989,11 +999,11 @@ static void update_uniform(struct ra *ra, struct ra_renderpass *pass, 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); + gl->MemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); break; } default: - abort(); + MP_ASSERT_UNREACHABLE(); } } @@ -1077,7 +1087,7 @@ static void gl_renderpass_run(struct ra *ra, gl->MemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT); break; } - default: abort(); + default: MP_ASSERT_UNREACHABLE(); } for (int n = 0; n < params->num_values; n++) |