mirror of https://github.com/yshui/picom.git
backend: gl_common: Add descriptive checks for framebuffer-completeness
Added more descriptive checks for framebuffer-completeness after adding attaching textures (for the first time). Also check for GL errors after `IMAGE_OP_APPLY_ALPHA`.
This commit is contained in:
parent
e09679c7cf
commit
f11710a885
|
@ -241,6 +241,7 @@ _gl_average_texture_color(backend_t *base, GLuint source_texture, GLuint destina
|
|||
glBindTexture(GL_TEXTURE_2D, destination_texture);
|
||||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
||||
destination_texture, 0);
|
||||
gl_check_fb_complete(GL_FRAMEBUFFER);
|
||||
|
||||
// Bind source texture as downscaling shader uniform input
|
||||
glBindTexture(GL_TEXTURE_2D, source_texture);
|
||||
|
@ -605,8 +606,7 @@ bool gl_kernel_blur(backend_t *base, double opacity, void *ctx, const rect_t *ex
|
|||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
||||
GL_TEXTURE_2D, bctx->blur_textures[!curr], 0);
|
||||
glDrawBuffer(GL_COLOR_ATTACHMENT0);
|
||||
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
||||
log_error("Framebuffer attachment failed.");
|
||||
if (!gl_check_fb_complete(GL_FRAMEBUFFER)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -794,9 +794,7 @@ bool gl_blur(backend_t *base, double opacity, void *ctx, const region_t *reg_blu
|
|||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
|
||||
GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
||||
bctx->blur_textures[i], 0);
|
||||
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) !=
|
||||
GL_FRAMEBUFFER_COMPLETE) {
|
||||
log_error("Framebuffer attachment failed.");
|
||||
if (!gl_check_fb_complete(GL_FRAMEBUFFER)) {
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
return false;
|
||||
}
|
||||
|
@ -1063,6 +1061,8 @@ static void _gl_fill(backend_t *base, struct color c, const region_t *clip, GLui
|
|||
glDeleteBuffers(2, bo);
|
||||
free(indices);
|
||||
free(coord);
|
||||
|
||||
gl_check_err();
|
||||
}
|
||||
|
||||
void gl_fill(backend_t *base, struct color c, const region_t *clip) {
|
||||
|
@ -1698,6 +1698,9 @@ bool gl_init(struct gl_data *gd, session_t *ps) {
|
|||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
||||
gd->back_texture, 0);
|
||||
glDrawBuffer(GL_COLOR_ATTACHMENT0);
|
||||
if (!gl_check_fb_complete(GL_FRAMEBUFFER)) {
|
||||
return false;
|
||||
}
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||
|
||||
gd->logger = gl_string_marker_logger_new();
|
||||
|
|
|
@ -136,6 +136,14 @@ static inline const char *gl_get_err_str(GLenum err) {
|
|||
CASESTRRET(GL_OUT_OF_MEMORY);
|
||||
CASESTRRET(GL_STACK_UNDERFLOW);
|
||||
CASESTRRET(GL_STACK_OVERFLOW);
|
||||
CASESTRRET(GL_FRAMEBUFFER_UNDEFINED);
|
||||
CASESTRRET(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT);
|
||||
CASESTRRET(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT);
|
||||
CASESTRRET(GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER);
|
||||
CASESTRRET(GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER);
|
||||
CASESTRRET(GL_FRAMEBUFFER_UNSUPPORTED);
|
||||
CASESTRRET(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE);
|
||||
CASESTRRET(GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
@ -167,6 +175,30 @@ static inline void gl_clear_err(void) {
|
|||
|
||||
#define gl_check_err() gl_check_err_(__func__, __LINE__)
|
||||
|
||||
/**
|
||||
* Check for GL framebuffer completeness.
|
||||
*/
|
||||
static inline bool gl_check_fb_complete_(const char *func, int line, GLenum fb) {
|
||||
GLenum status = glCheckFramebufferStatus(fb);
|
||||
|
||||
if (status == GL_FRAMEBUFFER_COMPLETE) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const char *stattext = gl_get_err_str(status);
|
||||
if (stattext) {
|
||||
log_printf(tls_logger, LOG_LEVEL_ERROR, func,
|
||||
"Framebuffer attachment failed at line %d: %s", line, stattext);
|
||||
} else {
|
||||
log_printf(tls_logger, LOG_LEVEL_ERROR, func,
|
||||
"Framebuffer attachment failed at line %d: %d", line, status);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#define gl_check_fb_complete(fb) gl_check_fb_complete_(__func__, __LINE__, (fb))
|
||||
|
||||
/**
|
||||
* Check if a GLX extension exists.
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue