mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-09 19:09:41 +00:00
Fix TFP logic and simplify the FBO model. i.e. it's not necessary
to create another texture (and storage) for the TFP, simply a new texture name.
This commit is contained in:
parent
8e6dea5b74
commit
b8aadb9e82
3 changed files with 43 additions and 60 deletions
|
@ -593,7 +593,6 @@ _gst_vaapi_texture_put_surface(
|
|||
#else
|
||||
guint surface_width, surface_height;
|
||||
GLContextState old_cs;
|
||||
GLTextureState ts;
|
||||
gboolean success = FALSE;
|
||||
|
||||
gst_vaapi_surface_get_size(surface, &surface_width, &surface_height);
|
||||
|
@ -613,19 +612,16 @@ _gst_vaapi_texture_put_surface(
|
|||
return FALSE;
|
||||
|
||||
GST_VAAPI_OBJECT_LOCK_DISPLAY(texture);
|
||||
success = gl_set_current_context(priv->gl_context, &old_cs);
|
||||
if (!success)
|
||||
goto end;
|
||||
|
||||
if (!gl_bind_texture(&ts, priv->target, GST_VAAPI_OBJECT_ID(texture))) {
|
||||
GST_DEBUG("could not bind texture %u", GST_VAAPI_OBJECT_ID(texture));
|
||||
goto out_reset_context;
|
||||
if (priv->gl_context) {
|
||||
success = gl_set_current_context(priv->gl_context, &old_cs);
|
||||
if (!success)
|
||||
goto end;
|
||||
}
|
||||
|
||||
success = gl_bind_framebuffer_object(priv->fbo);
|
||||
if (!success) {
|
||||
GST_DEBUG("could not bind FBO");
|
||||
goto out_unbind_texture;
|
||||
goto out_reset_context;
|
||||
}
|
||||
|
||||
GST_VAAPI_OBJECT_UNLOCK_DISPLAY(texture);
|
||||
|
@ -661,10 +657,8 @@ _gst_vaapi_texture_put_surface(
|
|||
out_unbind_fbo:
|
||||
if (!gl_unbind_framebuffer_object(priv->fbo))
|
||||
success = FALSE;
|
||||
out_unbind_texture:
|
||||
gl_unbind_texture(&ts);
|
||||
out_reset_context:
|
||||
if (!gl_set_current_context(&old_cs, NULL))
|
||||
if (priv->gl_context && !gl_set_current_context(&old_cs, NULL))
|
||||
success = FALSE;
|
||||
end:
|
||||
GST_VAAPI_OBJECT_UNLOCK_DISPLAY(texture);
|
||||
|
|
|
@ -474,7 +474,7 @@ gl_bind_texture(GLTextureState *ts, GLenum target, GLuint texture)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if (ts->was_enabled && !gl_get_param(texture_binding, &ts->old_texture))
|
||||
if (!gl_get_param(texture_binding, &ts->old_texture))
|
||||
return FALSE;
|
||||
|
||||
ts->was_bound = texture == ts->old_texture;
|
||||
|
@ -780,7 +780,7 @@ gl_create_pixmap_object(Display *dpy, guint width, guint height)
|
|||
|
||||
int fbconfig_attrs[32] = {
|
||||
GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT,
|
||||
GLX_DOUBLEBUFFER, GL_TRUE,
|
||||
GLX_DOUBLEBUFFER, GL_FALSE,
|
||||
GLX_RENDER_TYPE, GLX_RGBA_BIT,
|
||||
GLX_X_RENDERABLE, GL_TRUE,
|
||||
GLX_Y_INVERTED_EXT, GL_TRUE,
|
||||
|
@ -855,7 +855,7 @@ gl_create_pixmap_object(Display *dpy, guint width, guint height)
|
|||
if (!fbconfig)
|
||||
goto error;
|
||||
|
||||
/* Initialize GLX Pixmap attrutes */
|
||||
/* Initialize GLX Pixmap attributes */
|
||||
for (attr = pixmap_attrs; *attr != GL_NONE; attr += 2)
|
||||
;
|
||||
*attr++ = GLX_TEXTURE_FORMAT_EXT;
|
||||
|
@ -870,6 +870,14 @@ gl_create_pixmap_object(Display *dpy, guint width, guint height)
|
|||
free(fbconfig);
|
||||
if (x11_untrap_errors() != 0)
|
||||
goto error;
|
||||
|
||||
pixo->target = GL_TEXTURE_2D;
|
||||
glGenTextures(1, &pixo->texture);
|
||||
if (!gl_bind_texture(&pixo->old_texture, pixo->target, pixo->texture))
|
||||
goto error;
|
||||
glTexParameteri(pixo->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(pixo->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
gl_unbind_texture(&pixo->old_texture);
|
||||
return pixo;
|
||||
|
||||
error:
|
||||
|
@ -891,6 +899,11 @@ gl_destroy_pixmap_object(GLPixmapObject *pixo)
|
|||
|
||||
gl_unbind_pixmap_object(pixo);
|
||||
|
||||
if (pixo->texture) {
|
||||
glDeleteTextures(1, &pixo->texture);
|
||||
pixo->texture = 0;
|
||||
}
|
||||
|
||||
if (pixo->glx_pixmap) {
|
||||
glXDestroyPixmap(pixo->dpy, pixo->glx_pixmap);
|
||||
pixo->glx_pixmap = None;
|
||||
|
@ -921,6 +934,9 @@ gl_bind_pixmap_object(GLPixmapObject *pixo)
|
|||
if (pixo->is_bound)
|
||||
return TRUE;
|
||||
|
||||
if (!gl_bind_texture(&pixo->old_texture, pixo->target, pixo->texture))
|
||||
return FALSE;
|
||||
|
||||
x11_trap_errors();
|
||||
gl_vtable->glx_bind_tex_image(
|
||||
pixo->dpy,
|
||||
|
@ -966,6 +982,8 @@ gl_unbind_pixmap_object(GLPixmapObject *pixo)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
gl_unbind_texture(&pixo->old_texture);
|
||||
|
||||
pixo->is_bound = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -992,9 +1010,7 @@ gl_create_framebuffer_object(
|
|||
{
|
||||
GLVTable * const gl_vtable = gl_get_vtable();
|
||||
GLFramebufferObject *fbo;
|
||||
GLTextureState ts;
|
||||
GLenum status;
|
||||
gboolean texture_was_bound;
|
||||
|
||||
if (!gl_vtable || !gl_vtable->has_framebuffer_object)
|
||||
return NULL;
|
||||
|
@ -1010,35 +1026,22 @@ gl_create_framebuffer_object(
|
|||
fbo->width = width;
|
||||
fbo->height = height;
|
||||
fbo->fbo = 0;
|
||||
fbo->fbo_buffer = 0;
|
||||
fbo->fbo_target = target;
|
||||
fbo->fbo_texture = 0;
|
||||
fbo->old_fbo = 0;
|
||||
fbo->is_bound = FALSE;
|
||||
|
||||
fbo->fbo_texture = gl_create_texture(target, GL_BGRA, width, height);
|
||||
if (!fbo->fbo_texture)
|
||||
goto error;
|
||||
|
||||
gl_get_param(GL_FRAMEBUFFER_BINDING, &fbo->old_fbo);
|
||||
gl_vtable->gl_gen_framebuffers(1, &fbo->fbo);
|
||||
gl_vtable->gl_bind_framebuffer(GL_FRAMEBUFFER_EXT, fbo->fbo);
|
||||
gl_vtable->gl_gen_renderbuffers(1, &fbo->fbo_buffer);
|
||||
gl_vtable->gl_bind_renderbuffer(GL_RENDERBUFFER_EXT, fbo->fbo_buffer);
|
||||
gl_vtable->gl_framebuffer_texture_2d(
|
||||
GL_FRAMEBUFFER_EXT,
|
||||
GL_COLOR_ATTACHMENT0_EXT,
|
||||
target, texture,
|
||||
0
|
||||
);
|
||||
|
||||
texture_was_bound = gl_bind_texture(&ts, target, texture);
|
||||
if (texture_was_bound) {
|
||||
gl_vtable->gl_framebuffer_texture_2d(
|
||||
GL_FRAMEBUFFER_EXT,
|
||||
GL_COLOR_ATTACHMENT0_EXT,
|
||||
target, texture,
|
||||
0
|
||||
);
|
||||
gl_unbind_texture(&ts);
|
||||
}
|
||||
status = gl_vtable->gl_check_framebuffer_status(GL_DRAW_FRAMEBUFFER_EXT);
|
||||
gl_vtable->gl_bind_framebuffer(GL_FRAMEBUFFER_EXT, fbo->old_fbo);
|
||||
if (!texture_was_bound || status != GL_FRAMEBUFFER_COMPLETE_EXT)
|
||||
if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
|
||||
goto error;
|
||||
return fbo;
|
||||
|
||||
|
@ -1063,16 +1066,6 @@ gl_destroy_framebuffer_object(GLFramebufferObject *fbo)
|
|||
|
||||
gl_unbind_framebuffer_object(fbo);
|
||||
|
||||
if (fbo->fbo_texture) {
|
||||
glDeleteTextures(1, &fbo->fbo_texture);
|
||||
fbo->fbo_texture = 0;
|
||||
}
|
||||
|
||||
if (fbo->fbo_buffer) {
|
||||
gl_vtable->gl_delete_renderbuffers(1, &fbo->fbo_buffer);
|
||||
fbo->fbo_buffer = 0;
|
||||
}
|
||||
|
||||
if (fbo->fbo) {
|
||||
gl_vtable->gl_delete_framebuffers(1, &fbo->fbo);
|
||||
fbo->fbo = 0;
|
||||
|
@ -1117,9 +1110,6 @@ gl_bind_framebuffer_object(GLFramebufferObject *fbo)
|
|||
glTranslatef(-1.0f, -1.0f, 0.0f);
|
||||
glScalef(2.0f / width, 2.0f / height, 1.0f);
|
||||
|
||||
if (!gl_bind_texture(&fbo->old_texture, fbo->fbo_target, fbo->fbo_texture))
|
||||
return FALSE;
|
||||
|
||||
fbo->is_bound = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -148,12 +148,15 @@ gl_get_vtable(void)
|
|||
|
||||
typedef struct _GLPixmapObject GLPixmapObject;
|
||||
struct _GLPixmapObject {
|
||||
Display *dpy;
|
||||
guint width;
|
||||
guint height;
|
||||
Pixmap pixmap;
|
||||
GLXPixmap glx_pixmap;
|
||||
guint is_bound : 1;
|
||||
Display *dpy;
|
||||
GLenum target;
|
||||
GLuint texture;
|
||||
GLTextureState old_texture;
|
||||
guint width;
|
||||
guint height;
|
||||
Pixmap pixmap;
|
||||
GLXPixmap glx_pixmap;
|
||||
guint is_bound : 1;
|
||||
};
|
||||
|
||||
GLPixmapObject *
|
||||
|
@ -177,11 +180,7 @@ struct _GLFramebufferObject {
|
|||
guint width;
|
||||
guint height;
|
||||
GLuint fbo;
|
||||
GLuint fbo_buffer;
|
||||
GLenum fbo_target;
|
||||
GLuint fbo_texture;
|
||||
GLuint old_fbo;
|
||||
GLTextureState old_texture;
|
||||
guint is_bound : 1;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue