diff options
Diffstat (limited to 'video/out/opengl')
-rw-r--r-- | video/out/opengl/gl_headers.h | 3 | ||||
-rw-r--r-- | video/out/opengl/gl_utils.c | 29 | ||||
-rw-r--r-- | video/out/opengl/gl_utils.h | 1 | ||||
-rw-r--r-- | video/out/opengl/ra_gl.c | 49 |
4 files changed, 46 insertions, 36 deletions
diff --git a/video/out/opengl/gl_headers.h b/video/out/opengl/gl_headers.h index 9f479dd42f..609cf53ff2 100644 --- a/video/out/opengl/gl_headers.h +++ b/video/out/opengl/gl_headers.h @@ -37,6 +37,9 @@ #define GL_RGBA12 0x805A #define GL_RGBA16 0x805B #define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F // --- GL 1.1 (removed from 3.0 core and not in GLES 2/3) diff --git a/video/out/opengl/gl_utils.c b/video/out/opengl/gl_utils.c index 9f81166404..ab34eea2e5 100644 --- a/video/out/opengl/gl_utils.c +++ b/video/out/opengl/gl_utils.c @@ -335,35 +335,6 @@ void gl_pbo_upload_uninit(struct gl_pbo_upload *pbo) *pbo = (struct gl_pbo_upload){0}; } -// The intention is to return the actual depth of any fixed point 16 bit -// textures. (Actually tests only 1 format - hope that is good enough.) -int gl_determine_16bit_tex_depth(GL *gl) -{ - const struct gl_format *fmt = gl_find_unorm_format(gl, 2, 1); - if (!gl->GetTexLevelParameteriv || !fmt) { - // ANGLE supports ES 3.0 and the extension, but lacks the function above. - if (gl->mpgl_caps & MPGL_CAP_EXT16) - return 16; - return -1; - } - - GLuint tex; - gl->GenTextures(1, &tex); - gl->BindTexture(GL_TEXTURE_2D, tex); - gl->TexImage2D(GL_TEXTURE_2D, 0, fmt->internal_format, 64, 64, 0, - fmt->format, fmt->type, NULL); - GLenum pname = 0; - switch (fmt->format) { - case GL_RED: pname = GL_TEXTURE_RED_SIZE; break; - case GL_LUMINANCE: pname = GL_TEXTURE_LUMINANCE_SIZE; break; - } - GLint param = -1; - if (pname) - gl->GetTexLevelParameteriv(GL_TEXTURE_2D, 0, pname, ¶m); - gl->DeleteTextures(1, &tex); - return param; -} - int gl_get_fb_depth(GL *gl, int fbo) { if ((gl->es < 300 && !gl->version) || !(gl->mpgl_caps & MPGL_CAP_FB)) diff --git a/video/out/opengl/gl_utils.h b/video/out/opengl/gl_utils.h index c7b478790a..cb7bcf34cb 100644 --- a/video/out/opengl/gl_utils.h +++ b/video/out/opengl/gl_utils.h @@ -66,7 +66,6 @@ void gl_pbo_upload_tex(struct gl_pbo_upload *pbo, GL *gl, bool use_pbo, int x, int y, int w, int h); void gl_pbo_upload_uninit(struct gl_pbo_upload *pbo); -int gl_determine_16bit_tex_depth(GL *gl); int gl_get_fb_depth(GL *gl, int fbo); #endif diff --git a/video/out/opengl/ra_gl.c b/video/out/opengl/ra_gl.c index fbde3c81d4..5f8c525f5b 100644 --- a/video/out/opengl/ra_gl.c +++ b/video/out/opengl/ra_gl.c @@ -41,6 +41,42 @@ struct ra_renderpass_gl { struct gl_vao vao; }; +// (Init time only.) +static void probe_real_size(GL *gl, struct ra_format *fmt) +{ + const struct gl_format *gl_fmt = fmt->priv; + + if (!gl->GetTexLevelParameteriv) + return; // GLES + + bool is_la = gl_fmt->format == GL_LUMINANCE || + gl_fmt->format == GL_LUMINANCE_ALPHA; + if (is_la && gl->es) + return; // GLES doesn't provide GL_TEXTURE_LUMINANCE_SIZE. + + GLuint tex; + gl->GenTextures(1, &tex); + gl->BindTexture(GL_TEXTURE_2D, tex); + gl->TexImage2D(GL_TEXTURE_2D, 0, gl_fmt->internal_format, 64, 64, 0, + gl_fmt->format, gl_fmt->type, NULL); + for (int i = 0; i < fmt->num_components; i++) { + const GLenum pnames[] = { + GL_TEXTURE_RED_SIZE, + GL_TEXTURE_GREEN_SIZE, + GL_TEXTURE_BLUE_SIZE, + GL_TEXTURE_ALPHA_SIZE, + GL_TEXTURE_LUMINANCE_SIZE, + GL_TEXTURE_ALPHA_SIZE, + }; + int comp = is_la ? i + 4 : i; + assert(comp < MP_ARRAY_SIZE(pnames)); + GLint param = -1; + gl->GetTexLevelParameteriv(GL_TEXTURE_2D, 0, pnames[comp], ¶m); + fmt->component_depth[i] = param > 0 ? param : 0; + } + gl->DeleteTextures(1, &tex); +} + static int ra_init_gl(struct ra *ra, GL *gl) { if (gl->version < 210 && gl->es < 200) { @@ -74,10 +110,6 @@ static int ra_init_gl(struct ra *ra, GL *gl) int gl_fmt_features = gl_format_feature_flags(gl); - // Test whether we can use 10 bit. - int depth16 = gl_determine_16bit_tex_depth(gl); - MP_VERBOSE(ra, "16 bit texture depth: %d.\n", depth16); - for (int n = 0; gl_formats[n].internal_format; n++) { const struct gl_format *gl_fmt = &gl_formats[n]; @@ -100,8 +132,7 @@ static int ra_init_gl(struct ra *ra, GL *gl) int csize = gl_component_size(gl_fmt->type) * 8; int depth = csize; - if (fmt->ctype == RA_CTYPE_UNORM) - depth = MPMIN(csize, depth16); // naive/approximate + if (gl_fmt->flags & F_F16) { depth = 16; csize = 32; // always upload as GL_FLOAT (simpler for us) @@ -112,6 +143,9 @@ static int ra_init_gl(struct ra *ra, GL *gl) fmt->component_depth[i] = depth; } + if (fmt->ctype == RA_CTYPE_UNORM && depth != 8) + probe_real_size(gl, fmt); + // Special formats for which OpenGL happens to have direct support. if (strcmp(fmt->name, "rgb565") == 0) { fmt->special_imgfmt = IMGFMT_RGB565; @@ -149,6 +183,9 @@ static int ra_init_gl(struct ra *ra, GL *gl) gl->Disable(GL_DITHER); + if (!ra_find_unorm_format(ra, 2, 1)) + MP_VERBOSE(ra, "16 bit UNORM textures not available.\n"); + return 0; } |