From ee230e6a1d86725774abddcd341e0cc622d1a1ae Mon Sep 17 00:00:00 2001 From: gb Date: Mon, 29 Mar 2010 13:27:16 +0000 Subject: [PATCH] Improve VA/GLX textures test. --- tests/Makefile.am | 2 +- tests/test-textures.c | 139 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 130 insertions(+), 11 deletions(-) diff --git a/tests/Makefile.am b/tests/Makefile.am index 85e326c0c5..2055ef1026 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -46,7 +46,7 @@ test_windows_SOURCES = test-windows.c image.c test_windows_CFLAGS = $(TEST_CFLAGS) $(TEST_X11_CFLAGS) test_windows_LDADD = $(TEST_LIBS) $(TEST_X11_LIBS) -test_textures_SOURCES = test-textures.c +test_textures_SOURCES = test-textures.c image.c test_textures_CFLAGS = $(TEST_CFLAGS) $(TEST_GLX_CFLAGS) test_textures_LDADD = $(TEST_LIBS) $(TEST_GLX_LIBS) diff --git a/tests/test-textures.c b/tests/test-textures.c index 348b7f263a..2d7f1addab 100644 --- a/tests/test-textures.c +++ b/tests/test-textures.c @@ -20,6 +20,10 @@ #include #include +#include +#include +#include +#include "image.h" static inline void pause(void) { @@ -27,15 +31,27 @@ static inline void pause(void) getchar(); } +static inline guint gl_get_current_texture_2d(void) +{ + GLint texture; + glGetIntegerv(GL_TEXTURE_BINDING_2D, &texture); + return (guint)texture; +} + int main(int argc, char *argv[]) { GstVaapiDisplay *display; GstVaapiWindow *window; GstVaapiWindowGLX *glx_window; - GLXContext glx_context; - Display *x11_display; - Window x11_window; + GstVaapiSurface *surface; + GstVaapiImage *image; + GstVaapiTexture *textures[2]; + GstVaapiTexture *texture; + GLuint texture_id; + GstVaapiRectangle src_rect; + GstVaapiRectangle dst_rect; + guint flags = GST_VAAPI_PICTURE_STRUCTURE_FRAME; static const GstVaapiChromaType chroma_type = GST_VAAPI_CHROMA_TYPE_YUV420; static const guint width = 320; @@ -47,24 +63,127 @@ main(int argc, char *argv[]) display = gst_vaapi_display_glx_new(NULL); if (!display) - g_error("could not create Gst/VA display"); + g_error("could not create VA display"); + + surface = gst_vaapi_surface_new(display, chroma_type, width, height); + if (!surface) + g_error("could not create VA surface"); + + image = image_generate(display, GST_VAAPI_IMAGE_NV12, width, height); + if (!image) + g_error("could not create VA image"); + if (!image_upload(image, surface)) + g_error("could not upload VA image to surface"); window = gst_vaapi_window_glx_new(display, win_width, win_height); if (!window) g_error("could not create window"); + glx_window = GST_VAAPI_WINDOW_GLX(window); gst_vaapi_window_show(window); - glx_window = GST_VAAPI_WINDOW_GLX(window); - glx_context = gst_vaapi_window_glx_get_context(glx_window); - x11_display = gst_vaapi_display_x11_get_display(GST_VAAPI_DISPLAY_X11(display)); - x11_window = gst_vaapi_object_get_id(GST_VAAPI_OBJECT(window)); + if (!gst_vaapi_window_glx_make_current(glx_window)) + g_error("coult not bind GL context"); - if (!glXMakeCurrent(x11_display, x11_window, glx_context)) - g_error("could not make VA/GLX window context current"); + g_print("#\n"); + g_print("# Create texture with gst_vaapi_texture_new()\n"); + g_print("#\n"); + { + texture = gst_vaapi_texture_new( + display, + GL_TEXTURE_2D, + GL_RGBA, + width, + height + ); + if (!texture) + g_error("could not create VA texture"); + textures[0] = texture; + texture_id = gst_vaapi_texture_get_id(texture); + + if (!gst_vaapi_texture_put_surface(texture, surface, flags)) + g_error("could not transfer VA surface to texture"); + + if (!gst_vaapi_window_glx_put_texture(glx_window, texture, NULL, NULL)) + g_error("could not render texture into the window"); + } + + g_print("#\n"); + g_print("# Create texture with gst_vaapi_texture_new_with_texture()\n"); + g_print("#\n"); + { + const GLenum target = GL_TEXTURE_2D; + const GLenum format = GL_BGRA; + + glEnable(target); + glGenTextures(1, &texture_id); + glBindTexture(target, texture_id); + glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + glTexImage2D( + target, + 0, + GL_RGBA8, + width, height, + 0, + format, + GL_UNSIGNED_BYTE, + NULL + ); + glDisable(target); + + texture = gst_vaapi_texture_new_with_texture( + display, + texture_id, + target, + format + ); + if (!texture) + g_error("could not create VA texture"); + + if (texture_id != gst_vaapi_texture_get_id(texture)) + g_error("invalid texture id"); + + if (gl_get_current_texture_2d() != texture_id) + g_error("gst_vaapi_texture_new_with_texture() altered texture bindings"); + + textures[1] = texture; + + if (!gst_vaapi_texture_put_surface(texture, surface, flags)) + g_error("could not transfer VA surface to texture"); + + if (gl_get_current_texture_2d() != texture_id) + g_error("gst_vaapi_texture_put_surface() altered texture bindings"); + + src_rect.x = 0; + src_rect.y = 0; + src_rect.width = width; + src_rect.height = height; + + dst_rect.x = win_width/2; + dst_rect.y = win_height/2; + dst_rect.width = win_width/2; + dst_rect.height = win_height/2; + + if (!gst_vaapi_window_glx_put_texture(glx_window, texture, + &src_rect, &dst_rect)) + g_error("could not render texture into the window"); + + if (gl_get_current_texture_2d() != texture_id) + g_error("gst_vaapi_window_glx_put_texture() altered texture bindings"); + } + + gst_vaapi_window_glx_swap_buffers(glx_window); pause(); + g_object_unref(textures[0]); + g_object_unref(textures[1]); + glDeleteTextures(1, &texture_id); + g_object_unref(window); g_object_unref(display); gst_deinit();