@@ -460,6 +460,56 @@ pl_tex gl_tex_create(pl_gpu gpu, const struct pl_tex_params *params)
460460 return NULL ;
461461}
462462
463+ struct fmt_mapping {
464+ const char * name ;
465+ GLenum format ;
466+ GLenum type ;
467+ };
468+
469+ // taken from OpenGL 4.6 Spec table 8.27
470+ static const struct fmt_mapping fmt_mappings [] = {
471+ {"rgba32f" , GL_RGBA , GL_FLOAT },
472+ {"rgba16f" , GL_RGBA , GL_HALF_FLOAT },
473+ {"rg32f" , GL_RG , GL_FLOAT },
474+ {"rg16f" , GL_RG , GL_HALF_FLOAT },
475+ {"r11f_g11f_b10f" , GL_RGB , GL_UNSIGNED_INT_10F_11F_11F_REV },
476+ {"r32f" , GL_RED , GL_FLOAT },
477+ {"r16f" , GL_RED , GL_HALF_FLOAT },
478+ {"rgba32ui" , GL_RGBA_INTEGER , GL_UNSIGNED_INT },
479+ {"rgba16ui" , GL_RGBA_INTEGER , GL_UNSIGNED_SHORT },
480+ {"rgb10_a2ui" , GL_RGBA_INTEGER , GL_UNSIGNED_INT_2_10_10_10_REV },
481+ {"rgba8ui" , GL_RGBA_INTEGER , GL_UNSIGNED_BYTE },
482+ {"rg32ui" , GL_RG_INTEGER , GL_UNSIGNED_INT },
483+ {"rg16ui" , GL_RG_INTEGER , GL_UNSIGNED_SHORT },
484+ {"rg8ui" , GL_RG_INTEGER , GL_UNSIGNED_BYTE },
485+ {"r32ui" , GL_RED_INTEGER , GL_UNSIGNED_INT },
486+ {"r16ui" , GL_RED_INTEGER , GL_UNSIGNED_SHORT },
487+ {"r8ui" , GL_RED_INTEGER , GL_UNSIGNED_BYTE },
488+ {"rgba32i" , GL_RGBA_INTEGER , GL_INT },
489+ {"rgba16i" , GL_RGBA_INTEGER , GL_SHORT },
490+ {"rgba8i" , GL_RGBA_INTEGER , GL_BYTE },
491+ {"rg32i" , GL_RG_INTEGER , GL_INT },
492+ {"rg16i" , GL_RG_INTEGER , GL_SHORT },
493+ {"rg8i" , GL_RG_INTEGER , GL_BYTE },
494+ {"r32i" , GL_RED_INTEGER , GL_INT },
495+ {"r16i" , GL_RED_INTEGER , GL_SHORT },
496+ {"r8" , GL_RED_INTEGER , GL_BYTE },
497+ {"rgba16" , GL_RGBA , GL_UNSIGNED_SHORT },
498+ {"rgb10_a2" , GL_RGBA , GL_UNSIGNED_INT_2_10_10_10_REV },
499+ {"rgba8" , GL_RGBA , GL_UNSIGNED_BYTE },
500+ {"rg16" , GL_RG , GL_UNSIGNED_SHORT },
501+ {"rg8" , GL_RG , GL_UNSIGNED_BYTE },
502+ {"r16" , GL_RED , GL_UNSIGNED_SHORT },
503+ {"r8" , GL_RED , GL_UNSIGNED_BYTE },
504+ {"rgba16_snorm" , GL_RGBA , GL_SHORT },
505+ {"rgba8_snorm" , GL_RGBA , GL_BYTE },
506+ {"rg16_snorm" , GL_RG , GL_SHORT },
507+ {"rg8_snorm" , GL_RG , GL_BYTE },
508+ {"r16_snorm" , GL_RED , GL_SHORT },
509+ {"r8_snorm" , GL_RED , GL_BYTE },
510+ {NULL , 0 , 0 }
511+ };
512+
463513static bool gl_fb_query (pl_gpu gpu , int fbo , struct pl_fmt_t * fmt ,
464514 struct gl_format * glfmt )
465515{
@@ -489,7 +539,7 @@ static bool gl_fb_query(pl_gpu gpu, int fbo, struct pl_fmt_t *fmt,
489539 if (fbo != 0 )
490540 obj = GL_COLOR_ATTACHMENT0 ;
491541
492- GLint type = 0 ;
542+ GLint format = 0 , type = 0 ;
493543 gl -> GetFramebufferAttachmentParameteriv (GL_DRAW_FRAMEBUFFER , obj ,
494544 GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE , & type );
495545 switch (type ) {
@@ -510,6 +560,17 @@ static bool gl_fb_query(pl_gpu gpu, int fbo, struct pl_fmt_t *fmt,
510560 gl -> GetFramebufferAttachmentParameteriv (GL_DRAW_FRAMEBUFFER , obj ,
511561 GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE , & fmt -> component_depth [3 ]);
512562
563+ if (p -> gl_ver >= 45 ) {
564+ gl -> GetFramebufferParameteriv (GL_DRAW_FRAMEBUFFER , GL_IMPLEMENTATION_COLOR_READ_FORMAT , & format );
565+ gl -> GetFramebufferParameteriv (GL_DRAW_FRAMEBUFFER , GL_IMPLEMENTATION_COLOR_READ_TYPE , & type );
566+ for (const struct fmt_mapping * f = fmt_mappings ; f -> name ; f ++ ) {
567+ if (format == f -> format && type == f -> type ) {
568+ fmt -> name = f -> name ;
569+ break ;
570+ }
571+ }
572+ }
573+
513574 gl -> BindFramebuffer (GL_DRAW_FRAMEBUFFER , 0 );
514575 gl_check_err (gpu , "gl_fb_query" );
515576
0 commit comments