Skip to content

Commit 991f066

Browse files
committed
opengl: infer fbo format name in gl_fb_query
1 parent 4aad31a commit 991f066

1 file changed

Lines changed: 62 additions & 1 deletion

File tree

src/opengl/gpu_tex.c

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
463513
static 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

Comments
 (0)